> A step-by-step beginner’s guide to containerize and deploy ML pipeline serverless on AWS Fargate
概括
在上一篇有关在云中部署机器学习管道的文章中,我们演示了如何在PyCaret中开发机器学习管道,如何使用Docker对其进行容器化以及如何使用Google Kubernetes Engine将其用作Web应用程序。 如果您以前从未听说过PyCaret,请阅读此公告以了解更多信息。
在本教程中,我们将使用之前构建和部署的相同的机器学习管道和Flask应用程序。 这次,我们将演示如何使用AWS Fargate无容器化和部署机器学习管道。
本教程的学习目标
· 什么是容器? 什么是Docker? 什么是Kubernetes?
· 什么是Amazon Elastic Container Service(ECS)?
· 什么是AWS Fargate和无服务器部署?
· 将Docker映像构建并推送到Amazon Elastic Container Registry。
· 使用AWS管理的基础架构即AWS Fargate创建并执行任务定义。
· 查看实际使用的Web应用程序,该应用程序使用受过训练的机器学习管道来实时预测新数据点。
本教程将涵盖整个工作流程,包括从本地构建docker映像,将其上传到Amazon Elastic Container Registry,创建集群,然后使用AWS管理的基础架构即AWS Fargate定义和执行任务。
过去,我们介绍了在其他云平台(如Azure和Google)上的部署。 如果您有兴趣进一步了解这些内容,可以阅读以下故事:
· 在Google Kubernetes Engine上部署机器学习管道
· 在AWS Web Service上部署机器学习管道
· 在Heroku PaaS上构建和部署您的第一个机器学习Web应用程序
tutorial本教程的工具箱PyCaret
PyCaret是Python的开放源代码,低代码机器学习库,用于训练和部署机器学习管道和模型到生产中。 使用pip可以轻松安装PyCaret。
pip install pycaret
Flask
Flask是允许您构建Web应用程序的框架。 Web应用程序可以是商业网站,博客,电子商务系统,也可以是使用训练有素的模型根据实时提供的数据生成预测的应用程序。 如果您未安装Flask,则可以使用pip进行安装。
适用于Windows 10 Home的Docker Toolbox
Docker是一种工具,旨在使使用容器更轻松地创建,部署和运行应用程序。 容器用于将应用程序及其所有必需的组件(如库和其他依赖项)打包在一起,并将其全部打包为一个包。 如果您以前从未使用过Docker,则本教程还将介绍Windows 10 Home上Docker Toolbox(旧版)的安装。 在上一教程中,我们介绍了如何在Windows 10 Pro版上安装Docker Desktop。
亚马逊网络服务(AWS)
亚马逊网络服务(AWS)是由亚马逊提供的,广泛使用的云平台。 它拥有来自全球数据中心的175多种功能齐全的服务。 如果您以前从未使用过AWS,则可以注册一个免费帐户。
我们开始吧……什么是容器?
在开始使用AWS Fargate实施之前,让我们了解什么是容器以及为什么需要一个容器?
> freepik/free-photos-vectors/cargo-ship
您是否曾经遇到过这样的问题:您的代码在计算机上可以正常运行,但是当朋友尝试运行完全相同的代码却无法正常运行时,又遇到了问题? 如果您的朋友重复完全相同的步骤,那么他或她应该得到相同的结果,对吗? 一言以蔽之的答案就是环境。 您朋友的环境与您的环境不同。
环境包括什么? →诸如Python之类的编程语言以及所有库和依赖项,以及使用其构建和测试应用程序的确切版本。
如果我们可以创建一个可以转移到其他计算机(例如:您朋友的计算机或Google Cloud Platform之类的云服务提供商)的环境,那么我们可以在任何地方重现结果。 因此,容器是一种打包应用程序及其所有依赖项的软件,因此该应用程序可以从一个计算环境可靠地运行到另一个计算环境。
什么是Docker?
Docker是一家提供软件(也称为Docker)的公司,该软件允许用户构建,运行和管理容器。 尽管Docker的容器是最常见的,但是还有其他不太知名的替代方案,例如LXD和LXC。
现在,您已经从理论上了解了什么是容器以及如何使用Docker来对应用程序进行容器化,让我们设想一个场景,其中您必须在一组机器中运行多个容器,以支持日夜工作量不同的企业级机器学习应用程序。 这在现实生活中非常普遍,听起来似乎很简单,但是手动完成很多工作。
您需要在正确的时间启动正确的容器,弄清楚它们如何相互通信,处理存储注意事项,处理出现故障的容器或硬件以及数百万其他事项!
管理成千上万个容器以保持应用程序正常运行的整个过程称为容器编排。 尚未陷入技术细节中。
在这一点上,您必须认识到,管理实际应用程序需要多个容器,并且管理所有基础结构以保持容器的正常运行是繁琐的,手动的和管理负担。
这将我们带到Kubernetes。
什么是Kubernetes?
Kubernetes是Google在2014年开发的用于管理容器化应用程序的开源系统。 简而言之,Kubernetes是一个用于在一组机器集群上运行和协调容器化应用程序的系统。
> Photo by chuttersnap on Unsplash
尽管Kubernetes是Google开发的开源系统,但几乎所有主要的云服务提供商都将Kubernetes作为托管服务提供。 例如:Amazon提供的Amazon Elastic Kubernetes服务(EKS),Google提供的Google Kubernetes引擎(GKE)和Microsoft提供的Azure Kubernetes服务(AKS)。
到目前为止,我们已经讨论并理解:
一个容器
Docker
Kubernetes
在介绍AWS Fargate之前,只需要讨论一件事,那就是Amazon自己的容器编排服务Amazon Elastic Container Service(ECS)。
AWS弹性容器服务(ECS)
Amazon Elastic Container Service(Amazon ECS)是Amazon自主开发的容器编排平台。 ECS背后的想法类似于Kubernetes(它们都是业务流程服务)。
ECS是AWS本地服务,这意味着只能在AWS基础设施上使用。 另一方面,EKS基于Kubernetes,Kubernetes是一个开放源代码项目,可供在多云(AWS,GCP,Azure)甚至内部部署上运行的用户使用。
亚马逊还提供了基于Kubernetes的容器编排服务,称为Amazon Elastic Kubernetes服务(Amazon EKS)。 即使ECS和EKS的目的非常相似(即协调容器化的应用程序),但在价格,兼容性和安全性上还是有很多差异。 没有最佳答案,解决方案的选择取决于用例。
无论您使用哪种容器编排服务(ECS或EKS),都有两种方法可以实现基础基础结构:
· 手动管理集群和基础架构,例如虚拟机/服务器/(在AWS中也称为EC2实例)。
· 无服务器-完全不需要管理任何东西。 只需上传容器即可。 ←这是AWS Fargate。
> Amazon ECS underlying infrastructure
AWS Fargate —容器的无服务器计算
AWS Fargate是用于容器的无服务器计算引擎,可与Amazon Elastic Container Service(ECS)和Amazon Elastic Kubernetes Service(EKS)一起使用。 Fargate使您轻松专注于构建应用程序。 Fargate消除了配置和管理服务器的需要,使您可以为每个应用程序指定和支付资源,并通过设计隔离应用程序来提高安全性。
Fargate分配了适当的计算量,从而无需选择实例和扩展集群容量。 您只需为运行容器所需的资源付费,因此不会超额配置并为其他服务器付费。
> How AWS Fargate works — aws.amazon/fargate/
关于哪种方法更好,没有最佳答案。 转向无服务器还是手动管理EC2群集取决于使用情况。 可以帮助进行此选择的一些指针包括:
ECS EC2(手动方法)
· 您全都使用AWS。
· 您拥有一支专门的Ops团队来管理AWS资源。
· 您在AWS上已有资源,即您已经在管理EC2实例
AWS Fargate
· 您没有庞大的Ops团队来管理AWS资源。
· 您不想要操作责任或想要减少责任。
· 您的应用程序是无状态的(无状态应用程序是不保存在一个会话中生成的客户端数据以在与该客户端的下一个会话中使用的应用程序)。
设置业务环境
一家保险公司希望通过在住院时使用人口统计和基本患者健康风险指标更好地预测患者费用来改善现金流量预测。
(数据源)
目的
要构建和部署Web应用程序,将患者的人口统计和健康信息输入到基于Web的表单中,然后输出预测的费用金额。
任务
· 训练和开发用于部署的机器学习管道。
· 使用Flask框架构建Web应用。 它将使用训练有素的ML管道实时生成关于新数据点的预测。
· 将Docker映像构建并推送到Amazon Elastic Container Registry。
· 创建并执行任务以使用AWS Fargate无服务器基础架构部署应用程序。
由于我们已经在初始教程中介绍了前两个任务,因此我们将快速回顾它们,然后重点关注上面列表中的其余项目。 如果您想了解更多有关使用PyCaret在Python中开发机器学习管道以及使用Flask框架构建Web应用程序的信息,请阅读本教程。
开发机器学习管道
我们正在Python中使用PyCaret进行培训和开发机器学习管道,该管道将用作我们的Web应用程序。 机器学习管道可以在集成开发环境(IDE)或笔记本电脑中开发。 我们使用笔记本运行以下代码:
当您在PyCaret中保存模型时,将基于setup()函数中定义的配置创建整个转换管道。 所有相互依赖关系都是自动编排的。 查看存储在" deployment_28042022"变量中的管道和模型:
> Machine Learning Pipeline created using PyCaret
建立一个Web应用程序
本教程的重点不是构建Flask应用程序。 此处仅出于完整性目的进行讨论。 现在我们的机器学习管道已经准备就绪,我们需要一个Web应用程序,该应用程序可以连接到我们训练有素的管道以实时生成关于新数据点的预测。 我们已经在Python中使用Flask框架创建了Web应用程序。 此应用程序分为两部分:
· 前端(使用HTML设计)
· 后端(使用Flask开发)
这是我们的Web应用程序的外观:
> Web application on local machine
如果您到目前为止还没有跟进,那没问题。 您可以简单地从GitHub派生此存储库。 这是您的项目文件夹在此时的外观:
使用AWS Fargate部署ML管道的10个步骤:步骤1 —安装Docker Toolbox(适用于Windows 10 Home)
为了在本地构建Docker映像,您需要在计算机上安装Docker。 如果您使用的是Windows 10 64位:Pro,Enterprise或Education(Build 15063或更高版本),则可以从DockerHub下载Docker桌面。
但是,如果您使用的是Windows 10 Home,则需要从Dockers GitHub页面安装最新版本的旧版Docker Toolbox(v19.03.1)。
> github/docker/toolbox/releases
下载并运行DockerToolbox-19.03.1.exe文件。
检查安装是否成功的最简单方法是打开命令提示符,然后输入" docker"。 它应该打印帮助菜单。
> Anaconda Prompt to check docker
步骤2 —创建一个Dockerfile
创建Docker映像的第一步是在项目目录中创建Dockerfile。 Dockerfile只是具有一组指令的文件。 该项目的Dockerfile如下所示:
Dockerfile区分大小写,并且必须与其他项目文件位于项目文件夹中。 Dockerfile没有扩展名,可以使用任何文本编辑器创建。 您可以从GitHub存储库下载该项目中使用的Dockerfile。
步骤3 —在Elastic Container Registry(ECR)中创建存储库
(a)登录到您的AWS控制台并搜索Elastic Container Registry:
> AWS Console
(b)创建一个新的存储库:
> Create New Repository on Amazon Elastic Container Registry
在此演示中,我们创建了" pycaret-deployment-aws-repository"。
(c)点击"查看推送命令":
> pycaret-deployment-aws-repository
(d)复制推入命令:
> Push commands for pycaret-deployment-aws-repository
步骤4 —执行推送命令
使用Anaconda Prompt导航到您的项目文件夹,然后执行在上述步骤中复制的命令。 下面的代码仅用于演示,可能无法按原样工作。 要获取正确的代码来执行,您必须从存储库中的"查看推送命令"中获取游戏代码的副本。
在执行这些命令之前,您必须位于Dockerfile和其余代码所在的文件夹中。
Command 1
aws ecr get-login-password --region ca-central-1 | docker login --username AWS --password-stdin 212714531992.dkr.ecr.ca-central-1.amazonawsCommand 2docker build -t pycaret-deployment-aws-repository mand 3docker tag pycaret-deployment-aws-repository:latest 212714531992.dkr.ecr.ca-central-1.amazonaws/pycaret-deployment-aws-repository:latestCommand 4docker push 212714531992.dkr.ecr.ca-central-1.amazonaws/pycaret-deployment-aws-repository:latest
步骤5 —检查您上传的图片
单击您创建的存储库,您将在上面的步骤中看到上载图像的图像URI。 复制图像URI(在下面的步骤7中将需要它)。
步骤6 —创建和配置集群
(a)在左侧菜单上单击"集群":
> Create Cluster — Step 1
(b)选择"仅联网",然后单击下一步:
> Select Networking Only Template
(c)配置集群(输入集群名称),然后单击创建:
> Configure Cluster
(d)创建的集群:
> Cluster Created
步骤7 —创建一个新的任务定义
在Amazon ECS中运行Docker容器需要任务定义。 您可以在任务定义中指定的一些参数包括:与任务中的每个容器一起使用的Docker映像。 每个任务或一个任务中的每个容器使用多少CPU和内存。
(a)单击"创建新任务定义":
> Create a new task definition
(b)选择" FARGATE"作为启动类型:
> Select Launch Type Compatibility
(c)填写详细信息:
> Configure Task and container definitions (part 1)
> Configure Task and container definitions (part 2)
(d)点击"添加容器"并填写详细信息:
> Adding Container in task definitions
(e)点击右下角的"创建任务"。
步骤8-执行任务定义
在步骤7中,我们创建了一个将启动容器的任务。 现在,我们将通过单击"操作"下的"运行任务"来执行任务。
> Execute Task Definition
(a)单击"切换到启动类型"以将类型更改为Fargate:
> Running Task — Part 1
(b)从下拉列表中选择VPC和子网:
> Running Task — Part 2
(c)点击右下角的"运行任务":
> Task Created Successfully
步骤9-允许来自网络设置的入站端口5000
在看到我们的应用程序对公共IP地址起作用之前,最后一步是通过创建新规则来允许端口5000。 为此,请按照下列步骤操作:
(a)点击任务
(b)单击ENI ID:
(c)单击安全组
(d)点击"编辑入站规则"
(e)添加端口5000的自定义TCP规则
步骤10 —看到正在运行的应用程序
使用公共IP地址和端口5000来访问应用程序。
> Task definition logs