SIG TFX-Addonsコミュニティに参加して、TFXをさらに改善してください!
このページは Cloud Translation API によって翻訳されました。
Switch to English

Dockerで提供するTensorFlow

TensorFlow Servingの使用を開始する最も簡単な方法の1つは、 Dockerを使用することです。

# Download the TensorFlow Serving Docker image and repo
docker pull tensorflow/serving
git clone https://github.com/tensorflow/serving # Location of demo models TESTDATA="$(pwd)/serving/tensorflow_serving/servables/tensorflow/testdata" # Start TensorFlow Serving container and open the REST API port docker run -t --rm -p 8501:8501 \ -v "$TESTDATA/saved_model_half_plus_two_cpu:/models/half_plus_two" \ -e MODEL_NAME=half_plus_two \ tensorflow/serving & # Query the model using the predict API curl -d '{"instances": [1.0, 2.0, 5.0]}' \ -X POST http://localhost:8501/v1/models/half_plus_two:predict
# Returns => { "predictions": [2.5, 3.0, 4.5] }

追加のサービングエンドポイントについては、クライアントRESTAPIを参照してください。

Dockerをインストールする

一般的なインストール手順はDockerサイトにありますが、ここにいくつかのクイックリンクを示します。

Dockerでのサービス

サービングイメージをプルする

Dockerをインストールしたら、次のコマンドを実行して、最新のTensorFlowServingドッカーイメージをプルできます。

docker pull tensorflow/serving

これにより、TensorFlowServingがインストールされた最小限のDockerイメージがプルダウンされます。

プルできる他のバージョンのイメージについては、 DockerHubのテンソルフロー/サービングリポジトリを参照してください。

サービングイメージの実行

サービングイメージ(CPUとGPUの両方)には、次のプロパティがあります。

  • gRPC用に公開されたポート8500
  • RESTAPI用に公開されたポート8501
  • オプションの環境変数MODEL_NAME (デフォルトはmodel
  • オプションの環境変数MODEL_BASE_PATH (デフォルトは/models

サービングイメージがModelServerを実行すると、次のように実行されます。

tensorflow_model_server --port=8500 --rest_api_port=8501 \
  --model_name=${MODEL_NAME} --model_base_path=${MODEL_BASE_PATH}/${MODEL_NAME}

Dockerでサービスを提供するには、次のものが必要です。

  • 提供するホストの開いているポート
  • 提供するSavedModel
  • クライアントが参照するモデルの名前

Dockerコンテナーを実行、コンテナーのポートをホストのポートに公開し、コンテナーがモデルを予期する場所にSavedModelへのホストのパスをマウントします。

例を見てみましょう:

docker run -p 8501:8501 \
  --mount type=bind,source=/path/to/my_model/,target=/models/my_model \
  -e MODEL_NAME=my_model -t tensorflow/serving

この場合、Dockerコンテナを起動し、REST APIポート8501をホストのポート8501にmy_modelmy_modelという名前のモデルをmy_modelして、デフォルトのモデルベースパス( ${MODEL_BASE_PATH}/${MODEL_NAME} = /models/my_model )。最後に、環境変数MODEL_NAMEmy_modelMODEL_BASE_PATHをデフォルト値のままにしました。

これはコンテナで実行されます:

tensorflow_model_server --port=8500 --rest_api_port=8501 \
  --model_name=my_model --model_base_path=/models/my_model

gRPCポートを公開する場合は、 -p 8500:8500使用します。 gRPCポートとRESTAPIポートの両方を同時に開くことも、どちらか一方のみを開くことを選択することもできます。

追加の引数を渡す

tensorflow_model_serverは、 tensorflow_model_server渡すことができる多くの追加の引数をサポートします。たとえば、モデル名を指定する代わりにモデル構成ファイルを渡したい場合は、次のようにすることができます。

docker run -p 8500:8500 -p 8501:8501 \
  --mount type=bind,source=/path/to/my_model/,target=/models/my_model \
  --mount type=bind,source=/path/to/my/models.config,target=/models/models.config \
  -t tensorflow/serving --model_config_file=/models/models.config

このアプローチは、 tensorflow_model_serverサポートする他のコマンドライン引数のいずれに対してもtensorflow_model_serverします。

独自のサービングイメージを作成する

モデルがコンテナに組み込まれているサービングイメージが必要な場合は、独自のイメージを作成できます。

まず、サービングイメージをデーモンとして実行します。

docker run -d --name serving_base tensorflow/serving

次に、SavedModelをコンテナのモデルフォルダにコピーします。

docker cp models/<my model> serving_base:/models/<my model>

最後に、モデルの名前と一致するようにMODEL_NAMEを変更して、モデルを提供しているコンテナをコミットします。 ':

docker commit --change "ENV MODEL_NAME <my model>" serving_base <my container>

これで、 serving_base停止できます

docker kill serving_base

これにより、デプロイ可能な<my container>というDockerイメージが残り、起動時に提供するためにモデルが読み込まれます。

サービングの例

SavedModelをロードし、RESTAPIを使用して呼び出す完全な例を実行してみましょう。最初にサービングイメージをプルします。

docker pull tensorflow/serving

これにより、ModelServerがインストールされた最新のTensorFlowサービングイメージがプルされます。

次に、 Half Plus Twoというおもちゃのモデルを使用します。これは、予測用に提供するxの値に対して0.5 * x + 2を生成します。

このモデルを取得するには、最初にTensorFlowServingリポジトリのクローンを作成します。

mkdir -p /tmp/tfserving
cd /tmp/tfserving
git clone https://github.com/tensorflow/serving

次に、TensorFlow Servingコンテナーを実行して、このモデルをポイントし、REST APIポート(8501)を開きます。

docker run -p 8501:8501 \
  --mount type=bind,\
source=/tmp/tfserving/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu,\
target=/models/half_plus_two \
  -e MODEL_NAME=half_plus_two -t tensorflow/serving &

これにより、Dockerコンテナーが実行され、TensorFlowサービングモデルサーバーが起動され、REST APIポート8501がバインドされ、目的のモデルがホストからコンテナー内でモデルが期待される場所にマッピングされます。また、モデルの名前を環境変数として渡します。これは、モデルをクエリするときに重要になります。

予測APIを使用してモデルをクエリするには、次のコマンドを実行できます。

curl -d '{"instances": [1.0, 2.0, 5.0]}' \
  -X POST http://localhost:8501/v1/models/half_plus_two:predict

これにより、一連の値が返されます。

{ "predictions": [2.5, 3.0, 4.5] }

RESTful APIの使用の詳細については、こちらをご覧ください

GPUを使用してDockerでサービスを提供

nvidia-dockerをインストールします

GPUを使用する前に、 Dockerのインストールに加えて、次のものが必要になります。

GPUサービングイメージの実行

GPUサービングイメージの実行は、CPUイメージの実行と同じです。詳細については、サービングイメージの実行を参照しください。

GPUサービングの例

GPUにバインドされたopsを使用してモデルをロードし、RESTAPIを使用してモデルを呼び出す完全な例を実行してみましょう。

最初にnvidia-dockerインストールします。次に、以下を実行して、最新のTensorFlow ServingGPUドッカーイメージをプルできます。

docker pull tensorflow/serving:latest-gpu

これにより、GPUで実行するために構築されたModelServerをインストールした最小限のDockerイメージがプルダウンされます。

次に、 Half Plus Twoというおもちゃのモデルを使用します。これは、予測用に提供するxの値に対して0.5 * x + 2を生成します。このモデルには、GPUデバイスにバインドされたopsがあり、CPUでは実行されません。

このモデルを取得するには、最初にTensorFlowServingリポジトリのクローンを作成します。

mkdir -p /tmp/tfserving
cd /tmp/tfserving
git clone https://github.com/tensorflow/serving

次に、TensorFlow Servingコンテナーを実行して、このモデルをポイントし、REST APIポート(8501)を開きます。

docker run --runtime=nvidia -p 8501:8501 \
--mount type=bind,\
source=/tmp/tfserving/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_gpu,\
target=/models/half_plus_two \
  -e MODEL_NAME=half_plus_two -t tensorflow/serving:latest-gpu &

これにより、 nvidia-docker dockerランタイムでdockerコンテナーが実行され、TensorFlow Serving Model Serverが起動され、REST APIポート8501がバインドされ、目的のモデルがホストからコンテナー内でモデルが期待される場所にマップされます。また、モデルの名前を環境変数として渡します。これは、モデルをクエリするときに重要になります。

ヒント:モデルをクエリする前に、サーバーがリクエストを受信する準備ができていることを示す次のようなメッセージが表示されるまで待ってください。

2018-07-27 00:07:20.773693: I tensorflow_serving/model_servers/main.cc:333]
Exporting HTTP/REST API at:localhost:8501 ...

予測APIを使用してモデルをクエリするには、次のコマンドを実行できます。

curl -d '{"instances": [1.0, 2.0, 5.0]}' \
  -X POST http://localhost:8501/v1/models/half_plus_two:predict

これにより、一連の値が返されます。

{ "predictions": [2.5, 3.0, 4.5] }

ヒント:GPUがない、またはTensorFlow Model ServerのGPUビルドが機能していないマシンでGPUモデルを実行しようとすると、次のようなエラーが発生します。

Cannot assign a device for operation 'a': Operation was explicitly assigned to /device:GPU:0

RESTful APIの使用の詳細については、こちらをご覧ください

Dockerを使用した開発

Tensorflow Servingを構築および開発する方法については、Dockerを使用した開発ガイドを参照してください。