使用 Docker 的 TensorFlow Serving

使用 TensorFlow Serving 入门最简单的方法之一是使用 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 https://127.0.0.1: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 容器,发布 容器的端口到主机的端口,并将主机的路径挂载到容器期望模型的位置。

让我们看一个例子

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)。最后,我们用 my_model 填充了环境变量 MODEL_NAME,并将 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

这将拉取最新的 TensorFlow Serving 镜像,其中安装了 ModelServer。

接下来,我们将使用一个名为 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 https://127.0.0.1:8501/v1/models/half_plus_two:predict

这应该返回一组值

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

有关使用 RESTful API 的更多信息,请 点击此处

使用 Docker 和 GPU 进行服务

安装 nvidia-docker

在使用 GPU 进行服务之前,除了 安装 Docker 之外,您还需要

运行 GPU 服务镜像

运行 GPU 服务镜像与运行 CPU 镜像相同。有关更多详细信息,请参阅 运行服务镜像

GPU 服务示例

让我们完成一个完整的示例,在其中加载具有 GPU 绑定操作的模型并使用 REST API 调用它。

首先安装 nvidia-docker。接下来,您可以通过运行以下命令拉取最新的 TensorFlow Serving GPU docker 镜像

docker pull tensorflow/serving:latest-gpu

这将拉取一个最小的 Docker 镜像,其中安装了为在 GPU 上运行而构建的 ModelServer。

接下来,我们将使用一个名为 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 https://127.0.0.1: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 开发指南