通过Docker使用TensorFlow服务
开始使用TensorFlow服务的最简单方法之一是使用 Docker。
安装Docker
一般安装说明 在Docker站点上,但我们在此提供一些快速链接:
- 适用于macOS的Docker
- 适用 于Windows 10 Pro或更高版本的Windows Docker
- Docker Toolbox适用于旧版本的macOS,或Windows 10 Pro之前的Windows版本
通过Docker使用服务
拉取服务镜像
安装Docker后,您可以通过运行以下命令来提取最新的TensorFlow Serving docker 镜像
docker pull tensorflow/serving
这将下载最小的含安装TensorFlow服务的Docker镜像包。
有关您可以提取的其他镜像版本,请参阅Docker Hub tensorflow / serve repo。
运行服务镜像
服务镜像(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}
tensorflow_model_server --port=8500 --rest_api_port=8501 \ --model_name=${MODEL_NAME} --model_base_path=${MODEL_BASE_PATH}/${MODEL_NAME}
要使用Docker,您需要:
- 主机上的开放端口可供使用
- 要保存的SavedModel
- 客户端将引用的模型名称
你要做的是 运行Docker容器, 将 容器的端口发布到主机的端口,并将主机的路径安装到容器所需模型的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 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
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 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
docker run -p 8500:8500 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
。
创建自己的服务镜像
如果您想要将模型内置到容器中的服务镜像,则可以创建自己的镜像
首先将服务图像作为守护程序运行:
ocker run -d --name serving_base tensorflow/serving
ocker run -d --name serving_base tensorflow/serving
接下来,将SavedModel复制到容器的模型文件夹:
ocker cp models/<my model> serving_base:/models/<my model>
ocker cp models/<my model> serving_base:/models/<my model>
最后,通过更改MODEL_NAME
以匹配模型的名称来提交为您的模型提供服务的容器“:
docker commit --change "ENV MODEL_NAME <my model>" serving_base <my container>
docker commit --change "ENV MODEL_NAME <my model>" serving_base <my container>
你现在可以停下来了 serving_base
docker kill serving_base
docker kill serving_base
这将为您留下一个<my container>
可以部署的Docker镜像,并将加载您的模型以便在启动时提供服务。
服务的例子
让我们来看一个完整的例子,我们加载一个SavedModel并使用REST API调用它。首先拉出服务图像:
docker pull tensorflow/serving
docker pull tensorflow/serving
这将使用安装的ModelServer拉出最新的TensorFlow服务图像。
接下来,我们将使用一个名为的玩具模型Half Plus Two
,它0.5 * x + 2
为x
我们提供的预测值生成。
要获得此模型,请首先克隆TensorFlow服务仓库。
mkdir -p /tmp/tfserving cd /tmp/tfserving git clone https://github.com/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 &
注意:命令间隔只能有一个空格,--mount后面的key=value之间用逗号隔开,不能有空格
https://stackoverflow.com/questions/52611080/tensor-flow-serving-docker-invalid-field
这将运行docker容器并启动TensorFlow服务模型服务器,绑定REST API端口8501,并将我们所需的模型从主机映射到容器中预期模型的位置。我们还将模型的名称作为环境变量传递,这在查询模型时非常重要。
要使用predict API查询模型,您可以运行
curl -d '{"instances": [1.0, 2.0,4.0]}' -X POST http://localhost:8501/v1/models/half_plus_two:predict
这应该返回一组值:
{"predictions": [2.5, 3.0, 4.5] }
{"predictions": [2.5, 3.0, 4.5] }
有关使用RESTful API的更多信息,请访问此处。
使用您的GPU服务Docker
安装nvidia-docker
在使用GPU之前,除了 安装Docker之外,您还需要:
- 适用于您系统的最新NVIDIA驱动程序
nvidia-docker
:您可以按照此处的 安装说明进行操作
运行GPU服务图像
运行GPU服务映像与运行CPU映像相同。有关更多详细信息,请参阅运行服务图像。
GPU服务示例
让我们来看一个完整的例子,我们用GPU绑定的ops加载一个模型,并使用REST API调用它。
首先安装nvidia-docker
。接下来,您可以通过运行以下命令来获取最新的TensorFlow服务GPU docker镜像:
docker pull tensorflow/serving:latest-gpu
docker pull tensorflow/serving:latest-gpu
这将使用为在所安装的GPU上运行而构建的ModelServer下拉最小的Docker镜像。
接下来,我们将使用一个名为的玩具模型Half Plus Two
,它0.5 * x + 2
为x
我们提供的预测值生成。此模型将操作绑定到GPU设备,并且不会在CPU上运行。
要获得此模型,请首先克隆TensorFlow服务仓库。
mkdir -p /tmp/tfserving cd /tmp/tfserving git clone https://github.com/tensorflow/serving
mkdir -p /tmp/tfserving cd /tmp/tfserving git clone https://github.com/tensorflow/serving
接下来,运行TensorFlow Serving容器,将其指向此模型并打开REST API端口(8501):
docker run --runtime=nvidia -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 run --runtime=nvidia -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容器nvidia-docker
,启动TensorFlow服务模型服务器,绑定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 ...
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 http://localhost:8501/v1/models/half_plus_two:predict
$ curl -d '{"instances": [1.0, 2.0, 5.0]}' \ -X POST http://localhost:8501/v1/models/half_plus_two:predict
注意:较旧版本的Windows和其他没有卷曲的系统可以在此处下载 。
这应该返回一组值:
{ "predictions": [2.5, 3.0, 4.5] }
{ "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
Cannot assign a device for operation 'a': Operation was explicitly assigned to /device:GPU:0
有关使用RESTful API的更多信息,请访问此处。
用Docker开发拉动开发镜像
对于可以构建TensorFlow服务的开发环境,您可以尝试:
docker pull tensorflow/serving:latest-devel
docker pull tensorflow/serving:latest-devel
对于可以使用GPU支持构建TensorFlow服务的开发环境,请使用:
docker pull tensorflow/serving:latest-devel-gpu
docker pull tensorflow/serving:latest-devel-gpu
有关您可以提取的其他图像版本,请参阅Docker Hub tensorflow / serve repo。
发展实例
拉出其中一个开发Docker镜像后,您可以在打开gRPC端口(8500)时运行它:
docker run -it -p 8500:8500 tensorflow/serving:latest-devel
docker run -it -p 8500:8500 tensorflow/serving:latest-devel
测试开发环境
要测试模型,请从容器内部尝试:
# build the exporter bazel build -c opt //tensorflow_serving/example:mnist_saved_model # train the mnist model bazel-bin/tensorflow_serving/example/mnist_saved_model /tmp/mnist_model # serve the model tensorflow_model_server --port=8500 --model_name=mnist --model_base_path=/tmp/mnist_model/ & # build the client bazel build -c opt //tensorflow_serving/example:mnist_client # test the client bazel-bin/tensorflow_serving/example/mnist_client --num_tests=1000 --server=localhost:8500
# build the exporter bazel build -c opt //tensorflow_serving/example:mnist_saved_model # train the mnist model bazel-bin/tensorflow_serving/example/mnist_saved_model /tmp/mnist_model # serve the model tensorflow_model_server --port=8500 --model_name=mnist --model_base_path=/tmp/mnist_model/ & # build the client bazel build -c opt //tensorflow_serving/example:mnist_client # test the client bazel-bin/tensorflow_serving/example/mnist_client --num_tests=1000 --server=localhost:8500
Dockerfiles
我们目前维护以下Dockerfiles:
-
Dockerfile
,这是安装了TensorFlow服务的最小VM。 -
Dockerfile.gpu
,这是一个最小的虚拟机,TensorFlow服务与GPU支持一起使用nvidia-docker
。 -
Dockerfile.devel
,这是一个最小的VM,具有构建TensorFlow服务所需的所有依赖项。 -
Dockerfile.devel-gpu
,这是一个最小的VM,具有构建具有GPU支持的TensorFlow服务所需的所有依赖关系。
从Dockerfile构建容器
如果您想从Dockerfile构建自己的Docker镜像,可以通过运行Docker构建命令来实现:
Dockerfile
:
docker build --pull -t $USER/tensorflow-serving .
docker build --pull -t $USER/tensorflow-serving .
Dockerfile.gpu
:
docker build --pull -t $USER/tensorflow-serving-gpu -f 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 .
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 build --pull -t $USER/tensorflow-serving-devel-gpu -f Dockerfile.devel-gpu .
提示:在尝试构建映像之前,请检查Docker Hub tensorflow / serve repo以确保不存在满足您需求的映像。
从源构建消耗大量RAM。如果RAM是系统上的问题,则可以通过--local_resources=2048,.5,1.0
在调用Bazel时指定来限制RAM使用率。有关 更多信息,请参阅 Bazel文档。您可以使用相同的机制来调整您正在构建TensorFlow服务的optmizations。例如:
docker build --pull --build-arg TF_SERVING_BUILD_OPTIONS="--copt=-mavx \ --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0 --local_resources 2048,.5,1.0" -t \ $USER/tensorflow-serving-devel -f Dockerfile.devel .
docker build --pull --build-arg TF_SERVING_BUILD_OPTIONS="--copt=-mavx \ --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0 --local_resources 2048,.5,1.0" -t \ $USER/tensorflow-serving-devel -f Dockerfile.devel .
运行容器
这假设您已构建Dockerfile.devel
容器。
要运行打开gRPC端口(8500)的容器:
docker run -it -p 8500:8500 $USER/tensorflow-serving-devel
docker run -it -p 8500:8500 $USER/tensorflow-serving-devel
提示:如果您正在运行GPU映像,请务必使用NVIDIA运行时运行 --runtime=nvidia
。
从这里,您可以按照测试开发环境的说明进行操作 。
构建优化的服务二进制文件
运行TensorFlow服务的ModelServer时,您可能会注意到如下所示的日志消息:
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
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.devel
或 Dockerfile.devel-gpu
文件构建Docker镜像时,将使用该标志构建ModelServer二进制文件 -march=native
。这将导致Bazel构建一个ModelServer二进制文件,其中所有CPU优化都是您在支持上构建Docker镜像的主机。
要创建完全针对您的主机优化的服务图像,只需:
-
克隆TensorFlow服务项目
git clone https://github.com/tensorflow/serving
//github.com/tensorflow/serving cd serving
-
使用优化的ModelServer构建映像
-
对于CPU:
docker build --pull -t $USER/tensorflow-serving-devel \
-f tensorflow_serving/tools/docker/Dockerfile.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 .
Dockerfile.devel-gpu .
-
-
以开发图像为基础构建服务图像
-
对于CPU:
docker build -t $USER/tensorflow-serving \ --build-arg TF_SERVING_BUILD_IMAGE=$USER/tensorflow-serving-devel \ -f tensorflow_serving/tools/docker/Dockerfile .
Dockerfile .现在
$USER/tensorflow-serving
,您可以使用新的优化Docker镜像,就像使用标准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 .
Dockerfile.gpu .现在
$USER/tensorflow-serving-gpu
,您可以使用新的优化Docker镜像,就像使用标准tensorflow/serving:latest-gpu
图像一样。
-