Docker を使用した開発

開発イメージの取得

TensorFlow Serving を構築できる開発環境については、以下を試すことができます。

docker pull tensorflow/serving:latest-devel

GPU サポートを備えた TensorFlow Serving を構築できる開発環境の場合は、以下を使用します。

docker pull tensorflow/serving:latest-devel-gpu

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

開発例

開発 Docker イメージの 1 つをプルした後、gRPC ポート (8500) を開いてそれを実行できます。

docker run -it -p 8500:8500 --gpus all tensorflow/serving:latest-devel

開発環境のテスト

モデルをテストするには、コンテナー内から次を試してください。

# train the mnist model
python tensorflow_serving/example/mnist_saved_model.py /tmp/mnist_model
# serve the model
tensorflow_model_server --port=8500 --model_name=mnist --model_base_path=/tmp/mnist_model/ &
# test the client
python tensorflow_serving/example/mnist_client.py --num_tests=1000 --server=localhost:8500

Dockerfile

現在、次の Dockerfile を保守しています。

  • Dockerfile : TensorFlow Serving がインストールされた最小限の VM です。

  • Dockerfile.gpunvidia-dockerで使用される GPU サポートを備えた TensorFlow Serving を備えた最小限の VM です。

  • Dockerfile.devel : TensorFlow Serving を構築するために必要なすべての依存関係を備えた最小限の VM です。

  • Dockerfile.devel-gpu 。これは、GPU サポートを備えた TensorFlow Serving を構築するために必要なすべての依存関係を備えた最小限の VM です。

Dockerfile からコンテナを構築する

Dockerfile から独自の Docker イメージを構築したい場合は、Docker build コマンドを実行して実行できます。

Dockerfile :

docker build --pull -t $USER/tensorflow-serving .

Dockerfile.gpu :

docker build --pull -t $USER/tensorflow-serving-gpu -f Dockerfile.gpu .

Dockerfile.devel :

docker build --pull -t $USER/tensorflow-serving-devel -f Dockerfile.devel .

Dockerfile.devel-gpu :

docker build --pull -t $USER/tensorflow-serving-devel-gpu -f Dockerfile.devel-gpu .

ヒント: イメージを構築する前に、Docker Hub tensorflow/serving リポジトリをチェックして、ニーズを満たすイメージがまだ存在していないことを確認してください。

ソースからビルドすると、大量の RAM が消費されます。システム上で RAM が問題になる場合は、Bazel の起動時に--local_ram_resources=2048を指定することで RAM の使用量を制限できます。詳細については、 Bazel のドキュメントを参照してください。これと同じメカニズムを使用して、TensorFlow Serving を構築している最適化を微調整することができます。例えば:

docker build --pull --build-arg TF_SERVING_BUILD_OPTIONS="--copt=-mavx \
  --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0 --local_ram_resources=2048" -t \
  $USER/tensorflow-serving-devel -f Dockerfile.devel .

コンテナの実行

これは、 Dockerfile.develコンテナーが構築されていることを前提としています。

gRPC ポート (8500) を開いてコンテナを実行するには:

docker run -it -p 8500:8500 $USER/tensorflow-serving-devel

ヒント: GPU イメージを実行している場合は、必ず NVIDIA ランタイム--runtime=nvidiaを使用して実行してください。

ここから、開発環境をテストするための手順に従うことができます。

最適化されたサービングバイナリの構築

TensorFlow Serving の ModelServer を実行すると、次のようなログ メッセージが表示される場合があります。

I external/org_tensorflow/tensorflow/core/platform/cpu_feature_guard.cc:141]
Your CPU supports instructions that this TensorFlow binary was not compiled to
use: AVX2 FMA

これは、ModelServer バイナリが、実行されている CPU に対して完全には最適化されていないことを示しています。提供しているモデルによっては、さらに最適化する必要がない場合があります。ただし、最適化されたバイナリの構築は簡単です。

提供されたDockerfile.develまたはDockerfile.devel-gpuファイルから Docker イメージをビルドする場合、ModelServer バイナリはフラグ-march=nativeを使用してビルドされます。これにより、Bazel は、Docker イメージを構築しているホストがサポートするすべての CPU 最適化を使用して ModelServer バイナリを構築します。

ホスト向けに完全に最適化された提供イメージを作成するには、次の手順を実行します。

  1. TensorFlow Serving プロジェクトのクローンを作成する

    git clone https://github.com/tensorflow/serving
    cd serving
    
  2. 最適化された ModelServer を使用してイメージを構築する

    • CPUの場合:

      docker build --pull -t $USER/tensorflow-serving-devel \
        -f tensorflow_serving/tools/docker/Dockerfile.devel .
      
    • GPU の場合: `

      docker build --pull -t $USER/tensorflow-serving-devel-gpu \
        -f tensorflow_serving/tools/docker/Dockerfile.devel-gpu .
      
  3. 開発イメージをベースとして提供イメージを構築する

    • CPUの場合:

      docker build -t $USER/tensorflow-serving \
        --build-arg TF_SERVING_BUILD_IMAGE=$USER/tensorflow-serving-devel \
        -f tensorflow_serving/tools/docker/Dockerfile .
      

      新しい最適化された Docker イメージは$USER/tensorflow-servingになり、標準のtensorflow/serving:latestイメージと同じように使用できます。

    • GPUの場合:

      docker build -t $USER/tensorflow-serving-gpu \
        --build-arg TF_SERVING_BUILD_IMAGE=$USER/tensorflow-serving-devel-gpu \
        -f tensorflow_serving/tools/docker/Dockerfile.gpu .
      

      新しい最適化された Docker イメージは$USER/tensorflow-serving-gpuになり、標準のtensorflow/serving:latest-gpuイメージと同じように使用できます。