通过Docker使用TensorFlow服务

16 篇文章 0 订阅
3 篇文章 0 订阅

 

通过Docker使用TensorFlow服务

开始使用TensorFlow服务的最简单方法之一是使用 Docker

安装Docker

一般安装说明 在Docker站点上,但我们在此提供一些快速链接:

通过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/servingdocker 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_NAMEmy_model,离开MODEL_BASE_PATH它的默认值。

这将在容器中运行:


tensorflow_model_server --port=8500 --rest_api_port=8501 \
  --model_name=my_model --model_base_path=/models/my_modeltensorflow_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.configdocker 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/servingocker 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_basedocker kill serving_base

这将为您留下一个<my container>可以部署的Docker镜像,并将加载您的模型以便在启动时提供服务。

服务的例子

让我们来看一个完整的例子,我们加载一个SavedModel并使用REST API调用它。首先拉出服务图像:


docker pull tensorflow/servingdocker pull tensorflow/serving

这将使用安装的ModelServer拉出最新的TensorFlow服务图像。

接下来,我们将使用一个名为的玩具模型Half Plus Two,它0.5 * x + 2x我们提供的预测值生成。

要获得此模型,请首先克隆TensorFlow服务仓库。


mkdir -p /tmp/tfserving
cd /tmp/tfserving
git clone https://github.com/tensorflow/servingmkdir -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之外,您还需要:

运行GPU服务图像

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

GPU服务示例

让我们来看一个完整的例子,我们用GPU绑定的ops加载一个模型,并使用REST API调用它。

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


docker pull tensorflow/serving:latest-gpudocker pull tensorflow/serving:latest-gpu

这将使用为在所安装的GPU上运行而构建的ModelServer下拉最小的Docker镜像。

接下来,我们将使用一个名为的玩具模型Half Plus Two,它0.5 * x + 2x我们提供的预测值生成。此模型将操作绑定到GPU设备,并且不会在CPU上运行。

要获得此模型,请首先克隆TensorFlow服务仓库。


mkdir -p /tmp/tfserving
cd /tmp/tfserving
git clone https://github.com/tensorflow/servingmkdir -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:0Cannot assign a device for operation 'a': Operation was explicitly assigned to /device:GPU:0

有关使用RESTful API的更多信息,请访问此处

用Docker开发拉动开发镜像

对于可以构建TensorFlow服务的开发环境,您可以尝试:


docker pull tensorflow/serving:latest-develdocker pull tensorflow/serving:latest-devel

对于可以使用GPU支持构建TensorFlow服务的开发环境,请使用:


docker pull tensorflow/serving:latest-devel-gpudocker pull tensorflow/serving:latest-devel-gpu

有关您可以提取的其他图像版本,请参阅Docker Hub tensorflow / serve repo

发展实例

拉出其中一个开发Docker镜像后,您可以在打开gRPC端口(8500)时运行它:


docker run -it -p 8500:8500 tensorflow/serving:latest-develdocker 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-develdocker 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 FMAexternal/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镜像的主机。

要创建完全针对您的主机优化的服务图像,只需:

  1. 克隆TensorFlow服务项目

    
    git clone https://github.com/tensorflow/serving
    //github.com/tensorflow/serving
    
  2. cd serving
  3. 使用优化的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 .
  4. 以开发图像为基础构建服务图像

    • 对于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图像一样。

    • 源文https://www.tensorflow.org/serving/docker

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值