使用 Docker 是开始使用 TensorFlow Serving 的最简单方法之一。
# 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://:8501/v1/models/half_plus_two:predict
# Returns => { "predictions": [2.5, 3.0, 4.5] }
有关其他服务终端的信息,请参阅 客户端 REST API。
安装 Docker
常规安装说明请见 Docker 官网,这里我们提供一些快捷链接:
- macOS 版 Docker
- 适用于 Windows 10 专业版或更高版本的 Windows 版 Docker
- 适用于 macOS 旧版本,或 Windows 10 专业版之前版本的 Docker Toolbox
使用 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 外,您还需要:
- 系统中最新的 NVIDIA 驱动程序
nvidia-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 进行开发指南。