您好、欢迎来到现金彩票网!
当前位置:刘伯温四肖中特料 > 推理模型 >

手把手教你如何部署深度学习模型

发布时间:2019-06-16 14:28 来源:未知 编辑:admin

  我刚刚训练了机器学习模型——那么现在呢?这篇文章介绍了一种快速的方法,将经过训练的机器学习模型部署到生产中。请阅读以下内容:如果您已经成功地使用诸如Tensorflow或Caffe这样的ML框架来培训ML模型,那么您最好先做一个演示,最好早一点而不是晚一点,而且您更喜欢更便捷的解决方案,而不是将整个技术堆栈都打包。

  当我们第一次进入Hive的机器学习空间时,我们已经拥有了数百万个标记为图像的地面实况,这使得我们可以在一个星期内训练一个最先进的深度卷积图像分类模型(即随机权重),专门用于我们的用例。 然而,更典型的ML使用案例通常是数百幅图像的数量级,为此我建议微调现有的模型。例如,有一个很好的教程关于如何微调Imagenet模型(训练1.2图片,1000类)来对花卉样本数据(3647图片,5类)进行分类。

  对于连接Tensorflow教程的快速tl;dr,在安装bazel和tensorflow之后,您需要运行以下代码,这需要大约30分钟的时间来搭建和5分钟的时间来训练:

  或者,如果您安装了Docker,则可以使用以下预构建的Docker镜像:

  在容器内的交互式shell中运行上述命令;如果您愿意,您也可以跟着这个文章的其他部分在容器内操作。

  如果我们只想接受来自标准输入的文件名,每行一个,我们就可以很容易地进行“在线”推断:

  从性能的角度来看,这很糟糕——我们正在重新加载神经网络、权重、整个Tensorflow框架和python本身,对于每个输入示例都是如此!

  原因是tf.Session()在第100行上的sess构造。Tensorflow基本上每次调用run_graph时都将所有的计算加载到内存中。当您开始尝试在GPU上进行推理时,这一点就变得很明显了——您可以看到GPU内存随着Tensorflow在GPU上加载和卸载模型参数而上下移动。据我所知,这种结构并不存在于其他ML框架中,比如Caffe或Pytorch。

  然后解决方案是拉出with语句,并传递一个sess变量到run_graph:

  如果你运行这个程序,你会发现每张图片加载大约需要0.1秒,对于在线使用来说足够快。

  Caffe使用它的net.forward代码,这个代码很容易放入可调用的框架中:请参阅

  Mxnet也是非常独特的:它实际上具有开源的随时可用的推理服务器代码:。

  计划是将这些代码包装在Flask应用程序中。 如果您还没有听说过它,Flask是一个非常轻量级的Python Web框架,它允许您用最少的工作来创建一个http api服务器。

  作为一个快速的参考,这是一个flask应用程序,它接收来自多个表单数据的POST请求:

  这看起来很好,除了flask和tensorflow都是完全同步的——按照接收到的顺序一次处理一个请求,而Tensorflow在进行图像分类时完全占用线程。

  正如它所写的那样,速度瓶颈可能还在实际的计算工作中,所以升级Flask包装代码没有太多的意义。现在,也许这段代码足够处理您的负载了。

  有两种很明显的方法可以提高请求的通用性:通过增加worker的数量来横向放大,这在下一节将会介绍,或者通过使用GPU和批处理逻辑来纵向扩展。实现后者需要一个能够同时处理多个挂起请求的web服务器,并决定是否继续等待更大的批处理,或者将其发送到Tensorflow图形线程,以便进行分类,而这对于Flask应用程序是非常不适合。有两种可能性,使用Twisted + Klein来保存Python代码,或者如果您更喜欢第一个类的事件循环支持,并且能够连接到非Python ML框架(如Torch),则可以使用Node.js + ZeroMQ。

  好的,现在我们有一台服务器来服务我们的模型,但也许它太慢了,或者我们的负载变得太高了。我们想要启动更多的这些服务器——我们如何在每个服务器上分配请求?

  普通的方法是添加一个代理层,可能是haproxy或nginx,它平衡后端服务器之间的负载,同时向客户机提供一个统一的接口。为了在本节稍后使用,以下是运行基本Node.js负载均衡器http代理的一些示例代码:

  为了自动检测后端服务器的数量和位置,人们通常会使用“服务发现”工具,该工具可能与负载平衡器捆绑在一起或者是单独的。一些知名的是Consul和Zookeeper。设置和学习如何使用它不在本文的讨论范围之内,所以我使用了node.js服务发现包seaport来包含一个非常基本的代理。

  在任何地方,每秒几十到几百张图像,系统就会被网络带宽阻塞。在目前的设置中,所有的数据都必须通过我们的单个seaport 主站,这是呈现给客户端的单个端点。

  为了解决这个问题,我们要求我们的客户端不在点击单个端点,而是在后端服务器之间自动轮换点击。如果你知道一些网络,这听起来就像DNS的工作!

  但是,设置自定义的DNS服务器已经超出了本文的范围。 相反,通过更改客户端来遵循两步“手动DNS”协议,我们可以重新使用我们的基本seaport代理来实现客户端直接连接到其服务器的“点对点”协议:

  在这一点上,你应该有一些在生产中工作的东西,但它肯定不是未来的保障。本指南中没有涉及到的几个重要的主题:

http://mojdzwonek.com/tuilimoxing/235.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有