使用 TensorFlow Serving 入门最简单的方法之一是使用 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 https://127.0.0.1:8501/v1/models/half_plus_two:predict
# Returns => { "predictions": [2.5, 3.0, 4.5] }
有关其他服务端点,请参阅 客户端 REST API.
安装 Docker
一般安装说明在 Docker 网站 上,但我们在这里提供一些快速链接
- 适用于 macOS 的 Docker
- 适用于 Windows 的 Docker,适用于 Windows 10 专业版或更高版本
- Docker 工具箱,适用于更旧版本的 macOS 或 Windows 10 专业版之前的 Windows 版本
使用 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 之外,您还需要
- 系统最新的 NVIDIA 驱动程序
nvidia-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 开发指南。