您好、欢迎来到现金彩票网!
当前位置:88彩票 > 服务器模型 >

手把手:我的深度学习模型训练好了然后要做啥?

发布时间:2019-05-29 06:27 来源:未知 编辑:admin

  本文讲的是如何快速而不求完美地部署一个训练好的机器学习模型并应用到实际中。如果你已经成功地使用诸如Tensorflow或Caffe这样的框架训练好了一个机器学习模型,现在你正在试图让这个模型能够快速的演示,那么读这篇文章就对了。

  当我们第一次进入Hive的机器学习空间时,针对我们的实际应用场景,我们已经拥有了数百万张准确标记的图像,这些图像使我们能够在一周之内,从头开始训练最先进的深度卷积神经网络图像分类模型(即随机权重)。然而,在更典型的应用场景中,图像的数量级通常只有数百幅,这种情况下,我建议微调现有的模型。比如,有一个关于如何微调Imagenet模型(在1.2M图像上训练1000个类别)以对花进行分类的样本数据集(3647个图像, 5个类别)。

  上面的Tensorflow教程简要而言,是在安装bazel和tensorflow之后,需要运行以下代码,用大约30分钟的来建模,5分钟来训练:

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

  这将进入容器内部的交互式shell中并运行上述命令; 如果你愿意的话,也可以按照容器内的其余部分进行操作。

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

  然而,从性能的角度来看这样糟糕透了——每一个输入都要重新加载神经网络,权重,整个Tensorflow框架和python本身!

  当然可以改进。先修改label_image.py 脚本。对我而言,这个脚本的位置在:

  原因在于用with tf.Session()构建对话。Tensorflow本质上是在每次调用run_graph时将所有的计算加载到内存中。一旦开始尝试在GPU上进行运算,这一点就会变得很明显——可以看到GPU内存使用随着Tensorflow加载和卸载GPU的模型参数而上下波动。据我所知,这种结构并不存在于Caffe或Pytorch框架中。

  解决方法是把with命令去掉,传递一个sess变量到run_graph:

  如果你运行完这一段,你会发现每张图只需要大约0.1秒,对于在线应用来说已经够快了。

  Caffe使用net.forward代码,很容易被放入一个可调用的框架中:see

  我们的计划是,将这些代码包装到一个Flask应用程序中。如果你没有听说Flask,简单解释一下,Flask是一个非常轻量级的Python Web框架,它允许你以最少的工作启动一个http api服务器。

  作为一个快速参考,这里是一个Flask应用程序,它接收包含多部分表单数据的POST请求:

  模型部署至此看起来还是相当不错的。除了一点——需要FlASK和Tensorflow完全同步——Flask按照接收的顺序一次处理一个请求,并且Tensorflow在进行图像分类时完全占用线程。

  速度瓶颈可能还是在实际的计算工作中,所以升级Flask包装代码没有太多的意义。现在,也许这个代码足以处理你的负载。

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

  那么,假设现在你只有一台服务器来部署模型,由于它太慢了,或者我们的负载变得太高了,此时你想要启动更多服务器——如何在每个服务器上分配请求?

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

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

  每秒几十到几百张图像,这个系统就会成为网络带宽的瓶颈。在目前的设置中,所有的数据都必须通过我们的单个seaport 主节点,这也是呈现给客户端的端点。

  为了解决这个问题,我们需要我们的客户端不要访问这个端点,而是要在后端服务器之间通过自动轮换来访问。如果你懂网络,一定会想:这不就是DNS干的活嘛!

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

  至此你的系统应该可以进入实际应用了,但它总是要发展的。本指南中未涉及几个重要的主题:

  o Tensorflow Serving是一个很好的工具,可以非常彻底地处理这个问题,以及批处理和整体部署。 缺点是设置和编写客户端代码有点难,另外不支持Caffe / PyTorch。

  o 一旦你在生产中得到了一些不同的ML模型,你可能会开始想要混合和匹配不同的用例——只有在模型B不确定的情况下才运行模型A,在Caffe中运行模型C并将结果传递给模型D在Tensorflow 等等。

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