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 モデルを成功的に配備しました!
以上