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] }

追加のサービス提供エンドポイントについては、 「クライアント REST API」を参照してください。

Dockerをインストールする

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

Docker を使用してサービスを提供する

提供イメージのプル

Docker をインストールしたら、以下を実行して最新の TensorFlow Serving Docker イメージをプルできます。

docker pull tensorflow/serving

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

プルできる他のバージョンのイメージについては、Docker Hub tensorflow/serving リポジトリを参照してください。

提供イメージの実行

提供イメージ (CPU と GPU の両方) には次のプロパティがあります。

  • gRPC 用に公開されたポート 8500
  • REST API 用に公開されたポート 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_modelという名前のモデルを取得して、デフォルトのモデル ベース パス ( ${MODEL_BASE_PATH}/${MODEL_NAME}にバインドしました。 = /models/my_model )。最後に、環境変数MODEL_NAMEmy_modelを入力し、 MODEL_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 ポートと REST API ポートの両方を同時に開くことも、どちらか一方のみを開くことを選択することもできます。

追加の引数を渡す

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

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がサポートする他のコマンドライン引数のいずれに対しても機能します。

独自の提供イメージの作成

モデルをコンテナーに組み込んだ提供イメージが必要な場合は、独自のイメージを作成できます。

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

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 をロードし、REST API を使用して呼び出す完全な例を見てみましょう。まず、提供イメージをプルします。

docker pull tensorflow/serving

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

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

このモデルを取得するには、まず TensorFlow Serving リポジトリをクローンします。

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 Serving Model Server が起動され、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 バウンドの演算を含むモデルをロードし、REST API を使用してそれを呼び出す完全な例を実行してみましょう。

まず、 nvidia-dockerをインストールします。次に、以下を実行して、最新の TensorFlow Serving GPU Docker イメージをプルできます。

docker pull tensorflow/serving:latest-gpu

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

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

このモデルを取得するには、まず TensorFlow Serving リポジトリをクローンします。

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

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

docker run --gpus all -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 &

これにより、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 を使用した開発ガイド」を参照してください。