ホーム » Kubernetes

Kubernetes」カテゴリーアーカイブ

TensorFlow : Deploy : TensorFlow Serving と Kubernetes で Inception モデルをサービス提供する

TensorFlow : Deploy : TensorFlow Serving と Kubernetes で Inception モデルをサービス提供する (翻訳)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 09/09/2017

* 本ページは、TensorFlow 本家サイトの Deploy : TensorFlow Serving – Serving Inception Model with TensorFlow Serving and Kubernetes を翻訳した上で適宜、補足説明したものです:

* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

このチュートリアルでは、Docker コンテナで動作する TensorFlow Serving コンポーネントを TensorFlow Inception モデルをサービス提供するためにどのように使用するかそして serving クラスタを Kubernetes でどのように配備するかを示します。

TensorFlow Serving についてより学習するためには、TensorFlow Serving 基本チュートリアルTensorFlow Serving 上級チュートリアル を推奨します。

TensorFlow Inception モデルについてより学習するためには、Inception in TensorFlow を推奨します。

  • パート 0 は配備のための TensorFlow Serving Docker イメージをどのように作成するかを示します。
  • パート 1 はローカル・コンテナでイメージをどのように実行するかを示します。
  • パート 2 は Kubernetes でどのように配備するかを示します。

 

パート 0: Docker イメージを作成する

TensorFlow Serving Docker イメージを構築することについての詳細は Using TensorFlow Serving via Docker を参照してください。

コンテナを実行する

Dockerfile.devel を使用してベースイメージ $USER/tensorflow-serving-devel を構築します。そしてビルド・イメージを使用してコンテナをローカルでスタートさせます。

$ docker build --pull -t $USER/tensorflow-serving-devel -f tensorflow_serving/tools/docker/Dockerfile.devel .
$ docker run --name=inception_container -it $USER/tensorflow-serving-devel

コンテナで TensorFlow Serving を clone、configure そしてビルドする

Note: 後述のすべての bazel ビルド・コマンドは標準的な -c opt フラグを使用します。ビルドをさらに最適化するためには、ここの手順 を参照してください。

実行中のコンテナ内で、clone して configure して、そして TensorFlow Serving サンプル・コードをビルドします。

root@c97d8e820ced:/# git clone --recurse-submodules https://github.com/tensorflow/serving
root@c97d8e820ced:/# cd serving/tensorflow
root@c97d8e820ced:/serving/tensorflow# ./configure
root@c97d8e820ced:/serving# cd ..
root@c97d8e820ced:/serving# bazel build -c opt tensorflow_serving/example/...

次に TensorFlow ModelServer を ここの手順 を使用して apt-get でインストールするか、以下を使用して ModelServer バイナリをビルドします :

root@c97d8e820ced:/serving# bazel build -c opt tensorflow_serving/model_servers:tensorflow_model_server

このチュートリアルの残りでは貴方が ModelServer をローカルでコンパイルしたことを仮定します、その場合はそれを実行するためにコマンドは bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server です。けれどももし apt-get を使用して ModelServer をインストールした場合には、単にそのコマンドを tensorflow_model_server で置き換えてください。

コンテナで Inception モデルをエクスポートする

実行中のコンテナで、リリースされた Inception モデル訓練チェックポイント を使用して inception モデルをエクスポートするために inception_saved_model.py を実行します。ゼロから訓練する代わりに、推論グラフをリストアしてそれを直接エクスポートするために良く訓練された variable の容易に利用可能なチェックポイントを使用します。

root@c97d8e820ced:/serving# curl -O http://download.tensorflow.org/models/image/imagenet/inception-v3-2016-03-01.tar.gz
root@c97d8e820ced:/serving# tar xzf inception-v3-2016-03-01.tar.gz
root@c97d8e820ced:/serving# ls inception-v3
README.txt  checkpoint  model.ckpt-157585
root@c97d8e820ced:/serving# bazel-bin/tensorflow_serving/example/inception_saved_model --checkpoint_dir=inception-v3 --output_dir=inception-export
Successfully loaded model from inception-v3/model.ckpt-157585 at step=157585.
Successfully exported model to inception-export
root@c97d8e820ced:/serving# ls inception-export
1
root@c97d8e820ced:/serving# [Ctrl-p] + [Ctrl-q]

配備のためにイメージを Commit

上の手順の最後で (コンテナを) 停止する代わりにコンテナからデタッチしていることに注意してください、何故ならば Kubernetes 配備のために総ての変更を新しいイメージ $USER/inception_serving に commit したいからです。

$ docker commit inception_container $USER/inception_serving
$ docker stop inception_container

 

パート 1: ローカル Docker コンテナ内で実行する

ビルドしたイメージを使用して serving ワークフローをローカルでテストしましょう。

$ docker run -it $USER/inception_serving

サーバをスタートする

コンテナで gRPC tensorflow_model_server を実行する。

root@f07eec53fd95:/# cd serving
root@f07eec53fd95:/serving# bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server --port=9000 --model_name=inception --model_base_path=inception-export &> inception_log &
[1] 45

サーバに問い合わせる

inception_client.py でサーバに問い合わせます。クライアントはコマンドライン・パラメータで指定された画像を ImageNet カテゴリの人間に読める説明への分類のために gRPC を通してサーバに送ります。

root@f07eec53fd95:/serving# bazel-bin/tensorflow_serving/example/inception_client --server=localhost:9000 --image=/path/to/my_cat_image.jpg
outputs {
  key: "classes"
  value {
    dtype: DT_STRING
    tensor_shape {
      dim {
        size: 1
      }
      dim {
        size: 5
      }
    }
    string_val: "tiger cat"
    string_val: "Egyptian cat"
    string_val: "tabby, tabby cat"
    string_val: "lynx, catamount"
    string_val: "Cardigan, Cardigan Welsh corgi"
  }
}
outputs {
  key: "scores"
  value {
    dtype: DT_FLOAT
    tensor_shape {
      dim {
        size: 1
      }
      dim {
        size: 5
      }
    }
    float_val: 9.5486907959
    float_val: 8.52025032043
    float_val: 8.05995368958
    float_val: 4.30645561218
    float_val: 3.93207240105
  }
}

root@f07eec53fd95:/serving# exit

 
動きました!サーバは貴方の猫の画像を成功的に分類しました。

 

パート 2: Kubernetes 内で配備する

このセクションでは Google Cloud Platform において Kubernetes で serving クラスタを配備するためにパート 0 でビルドしたコンテナ・イメージを使用します。

GCloud プロジェクト・ログイン

ここでは貴方が tensorflow-serving という名前の gcloud project を作成してログインしていることを仮定しています。

$ gcloud auth login --project tensorflow-serving

コンテナ・クラスタを作成する

最初にサービス配備のために Google Container Engine クラスタを作成します。

$ gcloud container clusters create inception-serving-cluster --num-nodes 5
Creating cluster inception-serving-cluster...done.
Created [https://container.googleapis.com/v1/projects/tensorflow-serving/zones/us-central1-f/clusters/inception-serving-cluster].
kubeconfig entry generated for inception-serving-cluster.
NAME                       ZONE           MASTER_VERSION  MASTER_IP        MACHINE_TYPE   NODE_VERSION  NUM_NODES  STATUS
inception-serving-cluster  us-central1-f  1.1.8           104.197.163.119  n1-standard-1  1.1.8         5          RUNNING

 
gcloud container コマンドのためのデフォルト・クラスタを設定して kubectl にクラスタ credentials を渡します。

$ gcloud config set container/cluster inception-serving-cluster
$ gcloud container clusters get-credentials inception-serving-cluster
Fetching cluster endpoint and auth data.
kubeconfig entry generated for inception-serving-cluster.

Docker イメージをアップロードする

さて私たちのイメージを Google Cloud Platform 上でそれを実行できるように Google Container Registry に push しましょう。

最初に Container Registry フォーマットとプロジェクト名を使用して $USER/inception_serving イメージにタグ付けします、

$ docker tag $USER/inception_serving gcr.io/tensorflow-serving/inception

次にイメージをレジストリに push します。

$ gcloud docker -- push gcr.io/tensorflow-serving/inception

Kubernetes Deployment とサービスを作成する

配備は、Kubernetes Deployment で制御される inception_inference サーバの3つのレプリカから成ります。レプリカは Kubernetes サービス により External ロードバランサと共に外部的に晒されます。

サンプル Kubernetes config inception_k8s.yaml を使用してそれらを作成します。

$ kubectl create -f tensorflow_serving/example/inception_k8s.yaml
deployment "inception-deployment" created
service "inception-service" created

deployment と pods のステータスを見るためには :

$ kubectl get deployments
NAME                    DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
inception-deployment    3         3         3            3           5s
$ kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
inception-deployment-bbcbc   1/1       Running   0          10s
inception-deployment-cj6l2   1/1       Running   0          10s
inception-deployment-t1uep   1/1       Running   0          10s

サービスのステータスを見るためには :

$ kubectl get services
NAME                    CLUSTER-IP       EXTERNAL-IP       PORT(S)     AGE
inception-service       10.239.240.227   104.155.184.157   9000/TCP    1m

総てがアップして実行中になるにはしばらくかかります。

$ kubectl describe service inception-service
Name:           inception-service
Namespace:      default
Labels:         run=inception-service
Selector:       run=inception-service
Type:           LoadBalancer
IP:         10.239.240.227
LoadBalancer Ingress:   104.155.184.157
Port:           <unset> 9000/TCP
NodePort:       <unset> 30334/TCP
Endpoints:      <none>
Session Affinity:   None
Events:
  FirstSeen LastSeen    Count   From            SubobjectPath   Type        Reason      Message
  --------- --------    -----   ----            -------------   --------    ------      -------
  1m        1m      1   {service-controller }           Normal      CreatingLoadBalancer    Creating load balancer
  1m        1m      1   {service-controller }           Normal      CreatedLoadBalancer Created load balancer

サービス外部 IP アドレスは LoadBalancer Ingress のすぐ次にリストされています。

モデルを問い合わせる

今、ローカルホストから (サービスの) 外部アドレスのサービスを問い合わせることができます。

$ bazel-bin/tensorflow_serving/example/inception_client --server=104.155.184.157:9000 --image=/path/to/my_cat_image.jpg
outputs {
  key: "classes"
  value {
    dtype: DT_STRING
    tensor_shape {
      dim {
        size: 1
      }
      dim {
        size: 5
      }
    }
    string_val: "tiger cat"
    string_val: "Egyptian cat"
    string_val: "tabby, tabby cat"
    string_val: "lynx, catamount"
    string_val: "Cardigan, Cardigan Welsh corgi"
  }
}
outputs {
  key: "scores"
  value {
    dtype: DT_FLOAT
    tensor_shape {
      dim {
        size: 1
      }
      dim {
        size: 5
      }
    }
    float_val: 9.5486907959
    float_val: 8.52025032043
    float_val: 8.05995368958
    float_val: 4.30645561218
    float_val: 3.93207240105
  }
}

 
Kubernetes のサービスとしてサーブする Inception モデルを成功的に配備しました!

 
以上


AI導入支援 #2 ウェビナー

スモールスタートを可能としたAI導入支援   Vol.2
[無料 WEB セミナー] [詳細]
「画像認識 AI PoC スターターパック」の紹介
既に AI 技術を実ビジネスで活用し、成果を上げている日本企業も多く存在しており、競争優位なビジネスを展開しております。
しかしながら AI を導入したくとも PoC (概念実証) だけでも高額な費用がかかり取組めていない企業も少なくないようです。A I導入時には欠かせない PoC を手軽にしかも短期間で認知度を確認可能とするサービの紹介と共に、AI 技術の特性と具体的な導入プロセスに加え運用時のポイントについても解説いたします。
日時:2021年10月13日(水)
会場:WEBセミナー
共催:クラスキャット、日本FLOW(株)
後援:働き方改革推進コンソーシアム
参加費: 無料 (事前登録制)
人工知能開発支援
◆ クラスキャットは 人工知能研究開発支援 サービスを提供しています :
  • テクニカルコンサルティングサービス
  • 実証実験 (プロトタイプ構築)
  • アプリケーションへの実装
  • 人工知能研修サービス
◆ お問合せ先 ◆
(株)クラスキャット
セールス・インフォメーション
E-Mail:sales-info@classcat.com