使用 Docker 开发

拉取开发镜像

对于可以构建 TensorFlow Serving 的开发环境,您可以尝试

docker pull tensorflow/serving:latest-devel

对于可以构建支持 GPU 的 TensorFlow Serving 的开发环境,请使用

docker pull tensorflow/serving:latest-devel-gpu

查看 Docker Hub tensorflow/serving 仓库 以了解您可以拉取的其他镜像版本。

开发示例

拉取其中一个开发 Docker 镜像后,您可以在打开 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.gpu,这是一个安装了支持 GPU 的 TensorFlow Serving 的最小 VM,可与 nvidia-docker 一起使用。

  • 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 仓库,确保不存在满足您需求的镜像。

从源代码构建会消耗大量内存。如果您的系统内存不足,可以通过在调用 Bazel 时指定 --local_ram_resources=2048 来限制内存使用。有关更多信息,请参阅 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.develDockerfile.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 镜像一样。