TensorFlow Serving の使用を開始する最も簡単な方法の 1 つは、Dockerを使用することです。
# Download the TensorFlow Serving Docker image and repodocker pull tensorflow/serving
git clone https://github.com/tensorflow/serving
# Location of demo modelsTESTDATA="$(pwd)/serving/tensorflow_serving/servables/tensorflow/testdata"
# Start TensorFlow Serving container and open the REST API portdocker 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 APIcurl -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 サイトにありますが、いくつかの簡単なリンクをここに示します。
- macOS 用の Docker
- Windows 10 Pro 以降のDocker for Windows
- はるかに古いバージョンの macOS または Windows 10 Pro より前のバージョンの Windows 用のDocker Toolbox
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_NAME
にmy_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 のインストールに加えて、以下が必要になります。
- システム用の最新のNVIDIA ドライバー
nvidia-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 を使用した開発ガイド」を参照してください。