0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

机器学习模型的最简单方法之一将TensorFlow Serving与Docker结合起来

Tensorflowers 来源:未知 作者:李倩 2018-11-06 11:12 次阅读

能够简单快捷地提供机器学习模型是从试验转向生产的关键挑战之一。服务机器学习模型就是采用经训练的模型并使其能够应对预测请求的过程。在生产中服务时,您需要确保您的环境可重现,强制隔离并且是安全的。为此,提供机器学习模型的最简单方法之一是就是将 TensorFlow Serving 与 Docker 结合起来。 Docker 是一种将软件打包成单元(我们称之为容器)的工具,其中包含运行软件所需的一切。

TensorFlowServing 在 Docker 容器中运行

自 TensorFlowServing 1.8 发布以来,我们一直在改进对 Docker 的支持。 我们现在提供 Docker images 用于 CPUGPU 模型的服务和开发。为了解使用 TensorFlowServing 部署模型究竟有多么容易,让我们尝试将 ResNet 模型投入生产。 此模型在 ImageNet 数据集上进行训练,并将 JPEG 镜像作为输入并返回镜像的分类类别。

我们的示例将假设您正在运行 Linux,不过它在 macOS 或 Windows 应该也可以运行,仅需少量修改,甚至不需要修改。

使用 TensorFlowServing 和 Docker 服务 ResNet

第一步安装 Docker CE。 这将为您提供运行和管理 Docker 容器所需的所有工具。

TensorFlow Serving 为其 ML 模型使用 SavedModel 格式。SavedModel 是一种语言中立的,可恢复的,密集的序列化格式,使更高级别的系统和工具能够生成,使用和转换 TensorFlow 模型。 有几种方法可以导出 SavedModel(包括来自 Keras)。 在本练习中,我们只需下载预先训练的 pre-trained ResNetSavedModel:

$ 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 服务就像拉来最新发布的 TensorFlowServing 来服务环境镜像一样简单,并将其指向模型:

$ 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]在0.0.0.0:8500运行ModelServer ...... ... main.cc:337]导出HTTP / REST API:localhost:8501 ...

分解命令行参数,我们:

-p 8501:8501 : 将容器的端口 8501(TensorFlow 服务响应 REST API 请求)发布到主机的端口 8501

--name tfserving_resnet : 我们为容器创建名称为 “tfserving_resnet”,这样稍后我们可以作参考

--mount type=bind,source=/tmp/resnet,target=/models/resnet : 在容器(/ models / resnet)上安装主机的本地目录(/ tmp / resnet),以便 TensorFlow 服务可以从容器内部读取模型。

-e MODEL_NAME=resnet : 告诉 TensorFlow Serving 下载名为 “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

此脚本将下载猫的镜像并在测量响应时间时将其重复发送到服务器,如脚本的主循环中所示:

1# The server URL specifies the endpoint of your server running the ResNet

2# model with the name "resnet" and using the predict interface.

3SERVER_URL = 'http://localhost:8501/v1/models/resnet:predict'

4

5...

6

7# Send few actual requests and time average latency.

8total_time = 0

9num_requests = 10

10for _ in xrange(num_requests):

11response = requests.post(SERVER_URL, data=predict_request)

12response.raise_for_status()

13total_time += response.elapsed.total_seconds()

14prediction = response.json()['predictions'][0]

15

16print('Prediction class: {}, avg latency: {} ms'.format(

17prediction['classes'], (total_time*1000)/num_requests))

此脚本使用请求模块,因此如果您尚未安装,则需要安装它。通过运行此脚本,您应该看到如下所示的输出:

$ python /tmp/resnet/resnet_client.py

Prediction class: 282, avg latency: 185.644 ms

如您所见,使用 TensorFlow Serving 和 Docker 创建模型非常简单直白。您甚至可以创建自己的嵌入式模型的自定义 Docker 镜像,以便更轻松地进行部署。

通过构建优化的 TensorFlow Serving 二进制文件来提高性能

既然我们在 Docker 中提供了一个模型,您可能已经注意到来自 TensorFlowServing 的日志消息如下所示:

Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA

TensorFlowServing 已发布的 Docker 镜像旨在竭尽所能来使用 CPU 架构,因此省略了一些优化以最大限度地提高兼容性。如果您没有看到此消息,则您的二进制文件可能已针对您的 CPU 进行了优化。

根据您的模型执行的操作,这些优化可能会对您的服务性能产生重大影响。值得庆幸的是,将您自己的优化服务镜像组合在一起非常简单。

首先,我们要构建 TensorFlowServing 的优化版本。最简单的方法是构建官方的 TensorFlowServing 开发环境 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.pyPrediction class: 282, avg latency: 84.8849 ms

在我们的机器上,我们看到使用原生优化二进制文件,每次预测平均加速超过 100 毫秒(119%)。在不同的机器(和型号)上您可能会看到不同的结果。

最后,随意销毁 TensorFlow Serving 容器:

$ docker kill tfserving_resnet

现在您已经使用 Docker 运行 TensorFlowServing,您可以轻松地在容器中部署机器学习模型,同时最大限度地提高部署和性能。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 机器学习
    +关注

    关注

    66

    文章

    8416

    浏览量

    132619
  • tensorflow
    +关注

    关注

    13

    文章

    329

    浏览量

    60532

原文标题:使用 TensorFlow Serving 和 Docker 快速服务于机器学习

文章出处:【微信号:tensorflowers,微信公众号:Tensorflowers】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    请问STM32 Nucleo系列与Arduino具体怎么结合起来用?

    STM32 Nucleo系列与Arduino具体怎么结合起来用?
    发表于 05-14 07:00

    设计个信号发生器的电路,而且具有数字时钟的功能,就是如何两者结合起来

    设计个信号发生器的电路,而且具有数字时钟的功能,就是如何两者结合起来
    发表于 06-23 09:40

    让python跟labview相结合起来搞些小动作怎么样,相互学习

    本帖最后由 你挺能闹啊 于 2017-8-16 11:26 编辑 这段时间致在弄这个python,做UI界面不合适,只能与labview的强大仪器结合起来玩玩了,下面都是写简单的调用,有没有兴趣
    发表于 08-16 11:26

    准备做个电子diy太阳能和led结合起来,大家有什么好的创意吗?

    准备做个电子diy太阳能和led结合起来,大家有什么好的创意吗?
    发表于 04-21 09:56

    请问STM32怎么和lora结合起来做无线串口?

    我是新人,没有积分,抱歉了大家,但是我想问问怎么和LORA结合起来,麻烦回答的大佬详细些,谢谢。另外就是求套教程,好些的教程,谢谢!
    发表于 01-21 06:35

    四轴姿态怎么和电机结合起来

    最近做DIY小四轴,硬件基本已搭好,是个x模式的,有个疑惑 ,希望大家看看,发表下意见,,我已经从6050中得到姿态角了,,1.那我该怎么把他和电机结合起来呢?2.都说调pid,那我pid 是谁的pid呢,,,角度?它有跟姿态有什么关系呢
    发表于 06-17 04:36

    如何把库函数和寄存器结合起来

    没有和我们讲清楚,所以在这里提问下.接着,有个更严重的问题,刚我介绍的是原子书上讲的寄存器程序的建立过程,如果想建立个库函数的程序那么整个程序是样的?能不能
    发表于 07-29 03:02

    如何把库函数写的文件和寄存器写的文件结合起来用?

    库函数写的文件 怎么样和 寄存器写的文件 结合起来用啊?库函数写的文件 怎么样和 寄存器写的文件 结合起来用啊?库函数写的文件 怎么样和 寄存器写的文件 结合起来用啊?库函数写的文件 怎么样
    发表于 08-07 02:49

    这款语音套件与micro bit结合起来,看下小车效果

    。该项目主要定位在青少年编程教学:庆科的这款语音套件与micro bit结合起来,通过在编程中增加语音互动,来增加青少年学习编程的乐趣。 通过自己组装、改装小车,DIY小车轨道,改装电路等,提高
    发表于 09-24 20:31

    怎样把Matlab和STM32结合起来

    文章目录前言、软件的安装二、使用步骤1.先配置stm32cubeMX(我这里做的是个串口通讯)2.matlab的配置3.工程生成总结前言今天带大家把Matlab和STM32结合起来,强强联合
    发表于 07-16 06:37

    微机原理与单片机结合起来

    专业测控技术与仪器系 班级测控0601-03 任课教师周静职称教授教学目的和要求本课程是一门将微机原理与单片机结合起来的技术基础课,通过本课程的学习,目的是使学生能...
    发表于 07-16 06:27

    如何STM32的IO口与外部中断结合起来

    如何使用STM32的外部输入中断?STM32的外部中断输入口需要做哪些设置?如何STM32的IO口与外部中断结合起来
    发表于 11-17 06:51

    把STM32CubeMX和TrueSTUDIO结合起来

    STM32CubeMX和TrueSTUDIO结合起来用。终于,ST官方看到客户需求了,2019年推出了STM32CubeIDE,直接把STM32CubeMX和TrueSTUDIO整合起来。当时是1.0版本,我
    发表于 01-13 07:47

    有什么方法可以把单片机和java结合起来

    wifi模块该怎样去使用呢?有什么方法可以把单片机和java结合起来呢?
    发表于 02-22 07:45

    WRLDSAR与户外游戏结合起来,推出款AR智能弹跳球

    过去年,增强现实(AR)的知名度大幅提升,比如ARKit的推出,以及随后支持AR的智能手机应用程序数量的增加。WRLDS是家玩具公司,它希望通过推出AR智能弹跳球,AR与户外游戏结合起
    发表于 08-17 09:10 1366次阅读