2018年11月3日
发布者:技术项目经理Gautam Vasudevan和Google Brain团队软件工程师Abhijit Karmarkar
快速,轻松地提供机器学习模型是从实验转向生产的关键挑战之一。服务机器学习模型是采用训练模型并使其可用于服务预测请求的过程。在生产中使用时,您需要确保您的环境可重现,强制隔离并且安全。为此,提供机器学习模型的最简单方法之一是使用TensorFlow服务与Docker。Docker是一种将软件打包成称为容器的单元的工具,其中包含运行软件所需的一
TensorFlow服务在Docker容器中运行
自TensorFlow服务1.8发布以来,我们一直在改进对Docker的支持。我们现在提供Docker镜像,用于CPU和GPU模型的服务和开发。为了了解使用TensorFlow服务部署模型是多么容易,让我们尝试将ResNet模型投入生产。此模型在ImageNet数据集上进行训练,并将JPEG图像作为输入并返回图像的分类类别。
我们的示例将假设您正在运行Linux,但它应该可以在macOS或Windows上进行很少甚至不需要修改。
第一步是安装Docker CE。这将为您提供运行和管理Docker容器所需的所有工具。
TensorFlow Serving 为其ML模型使用SavedModel格式。SavedModel是一种语言中立的,可恢复的,密集的序列化格式,使更高级别的系统和工具能够生成,使用和转换TensorFlow模型。有几种方法可以导出SavedModel(包括来自Keras)。在本练习中,我们只需下载预先培训的ResNet SavedModel:
$ mkdir / tmp / resnet
$curl -s https://storage.googleapis.com/download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v2_fp32_savedmodel_NHWC_jpg.tar.gz | tar --strip-components=2 -C /tmp/resnet -xvz
我们现在应该在/ tmp / resnet中有一个包含我们模型的文件夹。我们可以通过运行验证这一点:
$ ls / tmp / resnet
1538687457
现在我们有了我们的模型,使用Docker服务就像拉动最新发布的TensorFlow服务服务环境镜像一样简单,并将其指向模型:
$ docker pull tensorflow/serving
$ docker run -p 8501:8501 --name tfserving_resnet \
--mount type=bind,source=/tmp/resnet,target=/models/resnet \
-e MODEL_NAME=resnet -t tensorflow/serving &
…
… main.cc:327] Running ModelServer at 0.0.0.0:8500…
… main.cc:337] Exporting HTTP/REST API at:localhost:8501 …
分解命令行参数,我们是:
-p 8501:8501
:将容器的端口8501(TF服务响应REST API请求)发布到主机的端口8501--name tfserving_resnet
:给容器我们创建名称“tfserving_resnet”,以便我们稍后可以参考它--mount type=bind,source=/tmp/resnet,target=/models/resnet
:在主机(/ models / resnet)上安装主机的本地目录(/ tmp / resnet),以便TF服务可以从容器内部读取模型。-e MODEL_NAME=resnet
:Telling TensorFlow服务加载名为“resnet”的模型-t tensorflow/serving
:根据服务图像“tensorflow / serving”运行Docker容器接下来,让我们下载python客户端脚本,它将发送服务的模型图像并获取预测。我们还将测量服务器响应时间。
$ curl -o /tmp/resnet/resnet_client.py https://raw.githubusercontent.com/tensorflow/serving/master/tensorflow_serving/example/resnet_client.py
此脚本将下载猫的图像并在测量响应时间时将其重复发送到服务器,如脚本的主循环中所示:
此脚本使用请求模块,因此如果您尚未安装request,则需要安装。通过运行此脚本,您应该看到如下所示的输出:
测试时由于cat image 地址被屏蔽,运行出错,resnet_client.py换一个图片地址即可
IMAGE_URL = 'https://img.purch.com/h/1400/aHR0cDovL3d3dy5saXZlc2NpZW5jZS5jb20vaW1hZ2VzL2kvMDAwLzEwMy83MjAvb3JpZ2luYWwvY2F0cy1idWJvbmljLXBsYWd1ZQ=='
$ python /tmp/resnet/resnet_client.py
Prediction class: 282, avg latency: 185.644 ms
As you can see, bringing up a model using TensorFlow Serving and Docker is pretty straight forward. You can even create your own custom Docker imagethat has your model embedded, for even easier deployment.
既然我们在Docker中提供了一个模型,您可能已经注意到来自TensorFlow服务的日志消息如下所示:
您的CPU支持未编译此TensorFlow二进制文件的指令:AVX2 FMA
TensorFlow服务的已发布Docker镜像旨在尽可能多地使用CPU架构,因此省略了一些优化以最大限度地提高兼容性。如果您没有看到此消息,则您的二进制文件可能已针对您的CPU进行了优化。
根据您的模型执行的操作,这些优化可能会对您的服务性能产生重大影响。值得庆幸的是,将您自己的优化服务图像组合在一起非常简单。
首先,我们要构建TensorFlow服务的优化版本。最简单的方法是构建官方的Tensorflow服务开发环境Docker镜像。这具有为图像构建的系统自动生成优化的TensorFlow服务二进制文件的良好特性。为了区分我们创建的图像和官方图像,我们将$ USER /添加到图像名称之前。让我们称这个开发图像为$ USER / tensorflow-serving-devel:
$ docker build -t $USER/tensorflow-serving-devel \
-f Dockerfile.devel \
https://github.com/tensorflow/serving.git#:tensorflow_serving/tools/docker
构建TensorFlow服务开发映像可能需要一段时间,具体取决于计算机的速度。完成后,让我们使用优化的二进制文件构建一个新的服务图像,并将其命名为$ USER / tensorflow-serving:
$ docker build -t $USER/tensorflow-serving \
--build-arg TF_SERVING_BUILD_IMAGE=$USER/tensorflow-serving-devel \ https://github.com/tensorflow/serving.git#:tensorflow_serving/tools/docker
现在我们有了新的服务图像,让我们再次启动服务器::
$ docker kill tfserving_resnet
$ docker run -p 8501:8501 --name tfserving_resnet \
--mount type=bind,source=/tmp/resnet,target=/models/resnet \
-e MODEL_NAME=resnet -t $USER/tensorflow-serving &
最后运行我们的客户端程序:
$ python /tmp/resnet/resnet_client.py
Prediction class: 282, avg latency: 84.8849 ms
在我们的机器上,我们看到使用我们的原生优化二进制文件,每次预测平均加速超过100毫秒(119%)。根据您的机器(和型号),您可能会看到不同的结果。
最后,随意杀死TensorFlow Serving容器:
$ docker kill tfserving_resnet
现在您已经使用Docker运行TensorFlow服务,您可以轻松地在容器中部署机器学习模型,同时最大限度地提高部署和性能。
请阅读我们的使用TensorFlow服务通过Docker文档获取更多详细信息,并为我们的GitHub项目加注星标以保持最新。
Please read our documentation for more details, and star our GitHub project to stay up to date.
源文地址:https://medium.com/tensorflow/serving-ml-quickly-with-tensorflow-serving-and-docker-7df7094aa008