有关深度学习或机器学习方面的文章层出不穷,涵盖了数据收集,数据整理,网络/算法选择,训练,验证和评估等主题。
但是,当今数据科学面临的一个具有挑战性的难题是在项目的商业化中部署训练模型,对于任何的以消费者为中心的公司或想要使自己的解决方案拥有更多受众的个人来说都是如此。
大多数时候,为达到预期结果,精力和资源会花在训练模型上。因此,分配额外的时间和精力来处理计算资源以构建适当的基础设施,再进行模型复制,以便在不同的实际环境中大规模地实现类似的结果,将会是一项艰巨的任务。
这是一个漫长的过程,打从你决定使用深度学习来部署模型开始,可以轻易地占用掉数月的时间。
本文试图从头开始全面介绍整个部署过程。此外,也欢迎大家讨论评论,以免遗漏了什么。
组成部分
工作流程图
上述图片描述了整个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/