使用 Docker 进行 TensorFlow Serving

使用 Docker 是开始使用 TensorFlow Serving 的最简单方法之一。

# 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 https://: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 版本)具有以下属性:

  • 端口 8500:用于 gRPC
  • 端口 8501:用于 REST API
  • 可选环境变量 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 容器,将容器端口发布 (publish) 到主机的端口,并将主机上的 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,并将主机上的目标模型映射到容器内预期的模型目录中。我们还将模型名称作为环境变量传递,这在查询模型时非常重要。

要使用 predict API 查询模型,可以运行:

curl -d '{"instances": [1.0, 2.0, 5.0]}' \
  -X POST https://: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 ...

要使用 predict API 查询模型,可以运行:

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

这应该会返回一组值:

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

提示:在没有 GPU 或没有可用的 GPU 版 TensorFlow Model Server 的机器上尝试运行 GPU 模型,会导致类似以下的错误:

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

有关使用 RESTful API 的更多信息,请参阅这里

使用 Docker 进行开发

有关如何构建和开发 TensorFlow Serving 的说明,请参阅使用 Docker 进行开发指南