雪清、小七、Charlene、Alieen编译

关于商业部署机器学习,这有一篇详尽指南

有关深度学习机器学习方面的文章层出不穷,涵盖了数据收集,数据整理,网络/算法选择,训练,验证和评估等主题。

但是,当今数据科学面临的一个具有挑战性的难题是在项目的商业化中部署训练模型,对于任何的以消费者为中心的公司或想要使自己的解决方案拥有更多受众的个人来说都是如此。

大多数时候,为达到预期结果,精力和资源会花在训练模型上。因此,分配额外的时间和精力来处理计算资源以构建适当的基础设施,再进行模型复制,以便在不同的实际环境中大规模地实现类似的结果,将会是一项艰巨的任务。

这是一个漫长的过程,打从你决定使用深度学习来部署模型开始,可以轻易地占用掉数月的时间。

本文试图从头开始全面介绍整个部署过程。此外,也欢迎大家讨论评论,以免遗漏了什么。

组成部分

工作流程图

上述图片描述了整个API的工作流程,让我们把它分解一下,并理解每个组件。

客户端:架构中的客户端可以是任何设备或第三方应用程序,由它们向搭建有预测模型的服务器发出请求。打个比方,Facebook试图在新上传的图片上标记你的脸。

负载均衡器:负载均衡器尝试在群集中的多个服务器或实例之间分配工作负载(请求)。负载均衡器的目标是通过避免任何单个资源上的过载来最小化响应时间并最大化输出。在上图中,负载均衡面向大众开放,并将来自客户端的所有请求分发到群集中的多个Ubuntu服务器。

Nginx:Nginx是一个开源的Web服务器,但也可以用作负载均衡器。Nginx以其高性能和小内存占用而闻名。它可以在繁重的工作负载下通过开启一个个新的工作进程来达到目的,每个进程都可以处理数千个连接。

在上述架构图中,nginx是一个服务器或实例的本地处理器,用于处理来自公共负载均衡器的所有请求。Nginx的一个替代服务器是Apache HTTP Server。

Gunicorn:它是一个Python WSGI HTTP Server,从Ruby的Unicorn项目移植而来。这是一个pre-fork worker模型,意味着一个主文件创建多个被称作workers的复制文件来处理请求。

由于Python不是多线程的,因此我们尝试创建多个gunicorn worker,其作为独立进程拥有自己的内存分配,以此补偿处理请求的并行性。Gunicorn适用于各种Python Web框架,还有一个众所周知的替代方案是uWSGI。

Flask:这是一个用Python编写的微型web框架。它可以帮助我们开发API或响应请求的Web应用。Flask的其他替代方案是Django,Pyramid和web2py。Flask-RESTful提供了Flask的一个扩展,以支持快速构建REST API。

Keras:这是一个用Python编写的开源神经网络库。它能够在TensorFlow,CNTK,Theano或MXNet上运行。Keras也有很多替代品:TensorFlow,Caffe2(Caffe),CNTK,PyTorch,MXNet,Chainer和Theano(已停止更新)。

云平台:如果有一个与上述所有组件都关联的平台,那么它就是云。云是人工智能研究激增的主要催化剂之一,无论是在计算机视觉自然语言处理机器学习机器翻译机器人,还是在医学成像方面,云以合理的成本为更广泛的受众提供了计算资源。

云Web服务的提供商很少,较为知名的是Amazon Web Services(AWS),Google Cloud和Microsoft Azure。

架构设置

到目前为止,您应该熟悉上一节中提到的组件。在下一节中,我们将从API的角度来理解架构设置,因为它也构成了Web应用程序的基础。

注意:这个架构设置将基于Python。

开发设置

训练模型:第一步是基于用例训练模型,可以使用Keras,TensorFlow或PyTorch。确保你在虚拟环境中执行此操作,因为这有助于隔离多个Python环境,并且还能将所有必要的依赖打包到单独的文件夹中。

构建API:如果模型足够好以至于可以开始构建API的话,你可以使用Flask 或是Django来根据需求构建它们。理想情况下,你必须构建Restful API,因为它有助于分离客户端和服务器,提高可视性、可靠性和可扩展性,并且它是平台无关的。你可以执行一次彻底的测试,以确保模型根据API的正确预测做出响应。

Web服务器:现在不妨测试一下你构建好了的API的Web服务器。如果你是使用Flask构建的,Gunicorn会是一个不错的选择。运行gunicorn web服务器的命令如下:

gunicorn --workers 1--timeout 300 --bind 0.0.0.0:8000 api:app

- workers(INT): The number of worker processes for handling requests.
- timeout (INT): Workers silent for more than this many seconds arekilled and restarted.
- bind (ADDRESS): The socket to bind. [['127.0.0.1:8000']]
- api: The main Python file containing the Flask application.
- app: An instance of the Flask class in the main Python file 'api.py'.

负载平衡器:你可以通过配置nginx来处理gunicorn workers的测试请求,每个worker都有自己的DL模型API。请参阅给出的资源了解nginx和gunicorn的相关配置。

资源链接:

https://www.digitalocean.com/community/tutorials/how-to-serve-flask-applications-with-gunicorn-and-nginx-on-ubuntu-16-04

负载/性能测试:尝试使用Apache Jmeter,这是一个旨在加载测试和测量性能的开源应用程序。它也有助于理解nginx的负载分配。另一个选择是Locust。

生产设置

云平台:选择好云服务后,要从标准Ubuntu映像(最好是最新的LTS版本)中设置一种机器或实例,而CPU的选择实际上取决于深度学习模型和用例。机器可以运行后,就可以设置nginx和Python虚拟环境,安装所有的依赖项并复制API。最后就可以尝试使用模型运行API了(这需要一定的时间,因为这个是根据为gunicorn定义的工作组数以及要加载所有模型来决定的)。

自定义API映像:确保API运行正常后,可以快照实例,创建一个包含API和模型的自定义图像,它将保留应用程序的所有设置。

参考资料:

AWS:

https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/tkv-create-ami-from-instance.html

Google:

https://cloud.google.com/compute/docs/images/create-delete-deprecate-private-images

Azure:

https://docs.microsoft.com/en-us/azure/virtual-machines/linux/tutorial-custom-images

负载均衡器:接下来从云服务创建负载均衡器,可以根据需要设置为公共的或私有的。

参考资料:

AWS:

https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-getting-started.html

Google:

https://cloud.google.com/load-balancing/

Azure:

https://docs.microsoft.com/en-us/azure/load-balancer/quickstart-create-basic-load-balancer-portal

一组实例:使用先前创建的自定义API映像来启动一组实例。

参考资料:

AWS:

https://aws.amazon.com/premiumsupport/knowledge-center/launch-instance-custom-ami/

Google:

https://cloud.google.com/compute/docs/instances/creating-instance-with-custom-machine-type

Azure:

https://docs.microsoft.com/en-us/azure/virtual-machines/windows/create-vm-generalized-managed

集群的负载均衡器:现在可以将实例集群链接到负载均衡器,这将确保负载均衡器在所有实例之间平均分配工作。

参考资料:

AWS:

https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-deregister-register-instances.html

Google:

https://cloud.google.com/compute/docs/load-balancing/http/backend-service

Azure:

https://docs.microsoft.com/en-us/azure/load-balancer/quickstart-create-basic-load-balancer-portal

负载/性能测试:就像开发中的负载/性能测试一样,类似的过程在生产环境也可以进行,但因为现在有数百万个请求,所以需要去尝试打破架构,来检查它的稳定性和可靠性(并不一定总是有用的)。

总结:现在,如果一切正常,你将能用你的第一个可以投入生产级别的深度学习架构来处理数百万个请求。

其他设置(附加组件)

除了通用设置外,还有其他一些事项需要注意,以确保我们搭建的环境能够在长时间内自我维护。

自动缩放:这是云服务中的一项功能,它可以根据收到的请求数量来帮助扩展应用程序中的实例。我们可以在请求激增时进行横向扩展,在请求减少时进行iLocustn扩展。

应用程序更新:更新应用程序中的深度学习模型或其他功能都是需要时间的,但是如何能在不影响生产环境运行的前提下,更新所有实例,这是个问题。云服务就提供了一种可以用多种形式来执行此任务的方式,而且具体的云服务提供商可以提供具体的定制服务。

参考资料:

AWS:

https://aws.amazon.com/premiumsupport/knowledge-center/auto-scaling-group-rolling-updates/

Google:

https://cloud.google.com/compute/docs/instance-groups/updating-managed-instance-groups

Azure:

https://azure.microsoft.com/en-in/updates/auto-os-upgrades/

持续集成:它指的是软件发布过程的构建和单元测试阶段。每个提交的修订都会触发自动构建和测试过程,用它可以将最新版本的模型部署到生产环境中。

其他平台

还有一些其他的系统,可以提供一种结构化的方式在生产环境中部署和设置模型,以下是几个其他类型系统的介绍:

TensorFlow服务:它是一个开源平台软件库,服务于机器学习模型。基于机器学习的推测作用,它的主要目标是接收训练后的模型,并管控模型的整个生命周期,它为TensorFlow模型提供了直接可以使用的支持。

官网链接:

https://www.tensorflow.org/serving/  

来源: googleblog

Docker:它是一种容器虚拟化技术,其行为与轻量级虚拟机类似。它提供了一种简洁的方法来把应用程序从其依赖项中隔离,以便应用程序在不同操作系统中都可以使用。我们可以在不用共享资源的情况下,在同一个实例上运行多个不同应用程序的docker镜像。

资料链接:

https://github.com/floydhub/dl-docker

来源:

https://codingpackets.com/virtualization/docker/

Michelangelo:它是Uber的机器学习平台,其包括在Uber所分析的数据的数量及范围内建设、部署和运营机器学习解决方案。

来源:

https://eng.uber.com/michelangelo/

大数据文摘
大数据文摘

秉承“普及数据思维,传播数据文化,助⼒产业发展”的企业⽂化,我们专注于数据领域的资讯、案例、技术,形成了“媒体+教育+⼈才服务”的良性⽣态,致⼒于打造精准数据科学社区。

入门机器学习
5
相关数据
深度学习技术

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

机器学习技术

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

张量技术

张量是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数,这些线性关系的基本例子有内积、外积、线性映射以及笛卡儿积。其坐标在 维空间内,有 个分量的一种量,其中每个分量都是坐标的函数,而在坐标变换时,这些分量也依照某些规则作线性变换。称为该张量的秩或阶(与矩阵的秩和阶均无关系)。 在数学里,张量是一种几何实体,或者说广义上的“数量”。张量概念包括标量、矢量和线性算子。张量可以用坐标系统来表达,记作标量的数组,但它是定义为“不依赖于参照系的选择的”。张量在物理和工程学中很重要。例如在扩散张量成像中,表达器官对于水的在各个方向的微分透性的张量可以用来产生大脑的扫描图。工程上最重要的例子可能就是应力张量和应变张量了,它们都是二阶张量,对于一般线性材料他们之间的关系由一个四阶弹性张量来决定。

计算机视觉技术

计算机视觉(CV)是指机器感知环境的能力。这一技术类别中的经典任务有图像形成、图像处理、图像提取和图像的三维推理。目标识别和面部识别也是很重要的研究领域。

机器人技术技术

机器人学(Robotics)研究的是「机器人的设计、制造、运作和应用,以及控制它们的计算机系统、传感反馈和信息处理」 [25] 。 机器人可以分成两大类:固定机器人和移动机器人。固定机器人通常被用于工业生产(比如用于装配线)。常见的移动机器人应用有货运机器人、空中机器人和自动载具。机器人需要不同部件和系统的协作才能实现最优的作业。其中在硬件上包含传感器、反应器和控制器;另外还有能够实现感知能力的软件,比如定位、地图测绘和目标识别。之前章节中提及的技术都可以在机器人上得到应用和集成,这也是人工智能领域最早的终极目标之一。

机器翻译技术

机器翻译(MT)是利用机器的力量「自动将一种自然语言(源语言)的文本翻译成另一种语言(目标语言)」。机器翻译方法通常可分成三大类:基于规则的机器翻译(RBMT)、统计机器翻译(SMT)和神经机器翻译(NMT)。

神经网络技术

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

MXNet技术

MXNet是开源的,用来训练部署深层神经网络的深度学习框架。它是可扩展的,允许快速模型训练,并灵活支持多种语言(C ++,Python,Julia,Matlab,JavaScript, Go,R,Scala,Perl,Wolfram语言)

自然语言处理技术

自然语言处理(英语:natural language processing,缩写作 NLP)是人工智能和语言学领域的分支学科。此领域探讨如何处理及运用自然语言;自然语言认知则是指让电脑“懂”人类的语言。自然语言生成系统把计算机数据转化为自然语言。自然语言理解系统把自然语言转化为计算机程序更易于处理的形式。

推荐文章
暂无评论
暂无评论~