在 AWS Fargate 上部署机器学习管线
最后更新时间
这有帮助吗?
最后更新时间
这有帮助吗?
在本教程中,我们将使用之前构建和部署的相同机器学习管线和 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 等其他云平台上进行部署。如果您有兴趣了解更多信息,可以阅读以下文章
在深入使用 AWS Fargate 进行实施之前,让我们先了解一下什么是容器,以及为什么我们需要容器?
您是否遇到过这样的问题:您的代码在您的计算机上运行正常,但当朋友尝试运行完全相同的代码时,却无法运行?如果您的朋友重复完全相同的步骤,他或她应该得到相同的结果,对吗?对此问题的简单回答是**环境。**您朋友的环境与您的不同。
环境包括什么?→ 例如 Python 等编程语言,以及构建和测试应用程序时使用的所有库和依赖项及其确切版本。
如果我们可以创建一个可以转移到其他机器(例如:您朋友的计算机或像 Google Cloud Platform 这样的云服务提供商)的环境,我们就可以在任何地方重现结果。因此,***容器***是一种将应用程序及其所有依赖项打包在一起的软件类型,以便应用程序可以在一个计算环境到另一个计算环境之间可靠地运行。
既然您已经从理论上理解了什么是容器以及如何使用 Docker 将应用程序容器化,让我们想象一个场景:您必须在一组机器上运行多个容器来支持具有昼夜不同工作负载的企业级机器学习应用程序。这在现实生活中非常常见,听起来可能很简单,但手动操作起来需要大量工作。
您需要在正确的时间启动正确的容器,弄清楚它们如何相互通信,处理存储方面的考虑,应对失败的容器或硬件,以及无数其他事情!
管理成百上千个容器以保持应用程序正常运行的整个过程称为容器编排。暂时不要纠结于技术细节。
在这一点上,您必须认识到管理实际应用需要不止一个容器,并且管理所有基础设施以保持容器正常运行既繁琐又费力,还会带来管理负担。
这就引出了Kubernetes。
Kubernetes 是 Google 在 2014 年开发的开源系统,用于管理容器化应用程序。简单来说,Kubernetes ****是一个用于在一组机器集群上运行和协调容器化应用程序的系统。
虽然 Kubernetes 是 Google 开发的开源系统,但几乎所有主要的云服务提供商都提供 Kubernetes 作为托管服务。例如:亚马逊提供的 **Amazon Elastic Kubernetes Service (EKS), Google 提供的 **Google Kubernetes Engine (GKE), 以及微软提供的 **Azure Kubernetes Service (AKS)**。
到目前为止,我们已经讨论并理解了
✔️ 容器
✔️ Docker
✔️ Kubernetes
在介绍 AWS Fargate 之前,只剩下最后一件事需要讨论,那就是亚马逊自己的容器编排服务Amazon Elastic Container Service (ECS)。
Amazon Elastic Container Service (Amazon ECS) 是亚马逊自主研发的容器编排平台。ECS 背后的理念与 Kubernetes 类似(它们都是编排服务)。
ECS 是一种 AWS 原生服务,这意味着它只能在 AWS 基础设施上使用。另一方面,EKS 基于 Kubernetes,一个开源项目,可供在多云(AWS、GCP、Azure)甚至本地运行的用户使用。
亚马逊还提供了一种基于 Kubernetes 的容器编排服务,称为 **Amazon Elastic Kubernetes Service (Amazon EKS)。** 尽管 ECS 和 EKS 的目的非常相似,即编排容器化应用程序,但在定价、兼容性和安全性方面存在不少差异。没有最好的答案,解决方案的选择取决于用例。
无论您使用哪种容器编排服务(ECS 或 EKS),都有两种方式可以实现底层基础设施
手动管理集群和底层基础设施,例如虚拟机 / 服务器 /(在 AWS 中也称为 EC2 实例)。
无服务器 — 完全无需管理任何东西。只需上传容器即可。← 这就是 AWS Fargate。
AWS Fargate 是一种适用于容器的无服务器计算引擎,可与 Amazon Elastic Container Service (ECS) 和 Amazon Elastic Kubernetes Service (EKS) 配合使用。Fargate 让您可以轻松专注于构建应用程序。Fargate 消除了预置和管理服务器的需要,允许您按应用程序指定和支付资源费用,并通过应用程序隔离从设计上提高了安全性。
Fargate 会分配适量的计算资源,无需选择实例和扩展集群容量。您只需为您运行容器所需的资源付费,因此不会过度预置并为额外的服务器付费。
哪种方法更好,没有最佳答案。选择无服务器还是手动管理 EC2 集群取决于用例。一些有助于做出此选择的参考包括
ECS EC2(手动方法)
您完全依赖 AWS。
您有专门的运维团队来管理 AWS 资源。
您在 AWS 上已有现有足迹,即您已经在管理 EC2 实例
AWS Fargate
您没有庞大的运维团队来管理 AWS 资源。
您不想承担或想减少运营责任。
您的应用程序是无状态的(无状态应用是指不会保存一个会话中生成的客户端数据,以供与该客户端的下一个会话使用的应用程序)。
一家保险公司希望通过在住院时使用人口统计学和基本的患者健康风险指标更好地预测患者费用来改善其现金流预测。
构建并部署一个 Web 应用程序,在该应用程序中,将患者的人口统计学和健康信息输入到基于 Web 的表单中,然后输出预测的费用金额。
训练和开发用于部署的机器学习管线。
使用 Flask 框架构建一个 Web 应用。它将使用训练好的机器学习管线实时生成新数据点的预测。
构建 Docker 镜像并推送到 Amazon Elastic Container Registry。
创建并执行任务,使用 AWS Fargate 无服务器基础设施部署应用。
我们正在使用 Python 中的 PyCaret 来训练和开发一个机器学习管线,该管线将用作我们 Web 应用的一部分。机器学习管线可以在集成开发环境 (IDE) 或 Notebook 中开发。我们使用了 Notebook 来运行以下代码
在 PyCaret 中保存模型时,会创建基于 **setup() **函数中定义的配置的整个转换管线。所有相互依赖关系都会自动协调。查看存储在“deployment_28042020”变量中的管线和模型
本教程不专注于构建 Flask 应用。在此讨论仅为了完整性。现在我们的机器学习管线已准备就绪,我们需要一个 Web 应用程序,它可以连接到我们训练好的管线,以实时生成新数据点的预测。我们使用 Python 中的 Flask 框架创建了 Web 应用程序。此应用程序包含两部分
前端(使用 HTML 设计)
后端(使用 Flask 开发)
我们的 Web 应用程序看起来像这样
下载并运行DockerToolbox-19.03.1.exe 文件。
检查安装是否成功的简便方法是打开命令提示符并输入“docker”。它应该打印帮助菜单。
创建 Docker 镜像的第一步是在项目目录中创建 Dockerfile。Dockerfile 只是一个包含一系列指令的文件。本项目使用的 Dockerfile 如下所示
(a) 登录您的 AWS 控制台并搜索 Elastic Container Registry
(b) 创建一个新的存储库
在此演示中,我们创建了“pycaret-deployment-aws-repository”。
(c) 点击“查看推送命令”
(d) 复制推送命令
使用 Anaconda Prompt 导航到您的项目文件夹,并执行您在上述步骤中复制的命令。下面的代码仅用于演示,可能无法直接工作。要获取要执行的正确代码,您必须从存储库中的“查看推送命令”获取代码副本。
在执行这些命令之前,您必须位于 Dockerfile 和其余代码所在的文件夹中。
点击您创建的存储库,您将看到在上述步骤中上传的镜像的镜像 URI。复制该镜像 URI(在下面的步骤 7 中会用到)。
(a) 点击左侧菜单上的“集群”
(b) 选择“仅限网络”,然后点击下一步
(c) 配置集群(输入集群名称)并点击创建
(d) 集群已创建
在 Amazon ECS 中运行 Docker 容器需要一个任务定义。您可以在任务定义中指定的一些参数包括:每个任务中的容器使用的 Docker 镜像。每个任务或任务中每个容器使用的 CPU 和内存量。
(a) 点击“创建新任务定义”
(b) 选择“FARGATE”作为启动类型
(c) 填写详细信息
(d) 点击“添加容器”并填写详细信息
(e) 点击右下角的“创建任务”。
在步骤 7 中,我们创建了一个启动容器的任务。现在,我们将通过点击 Actions 下的“运行任务”来执行该任务。
(a) 点击“切换到启动类型”将类型更改为 Fargate
(b) 从下拉菜单中选择 VPC 和子网
(c) 点击右下角的“运行任务”
在我们能在公共 IP 地址上看到应用程序实际运行之前,最后一步是通过创建新规则来允许端口 5000。为此,请按照以下步骤操作
(a) 点击任务
(b) 点击 ENI Id
(c) 点击安全组
(d) 点击“编辑入站规则”
(e) 添加一个端口为 5000 的自定义 TCP 规则
使用公共 IP 地址和端口 5000 访问应用程序。
注意: 本文发布时,为限制资源消耗,该应用程序将从公共地址移除。
截至 1.0.0 首个版本,PyCaret 提供以下模块供使用。点击下方链接可查看文档和 Python 中的示例代码。
PyCaret Notebook 入门教程
在我们的关于在云端部署机器学习管线,我们演示了如何使用 PyCaret 开发机器学习管线,使用 Docker 将其容器化,并使用 Google Kubernetes Engine 将其作为 Web 应用程序提供服务。如果您之前没有听说过 PyCaret,请阅读此文以了解更多信息。
是一个开源的、低代码的 Python 机器学习库,用于训练机器学习管线和模型并将其部署到生产环境。PyCaret 可以使用 pip 轻松安装。
是一个允许您构建 Web 应用程序的框架。Web 应用程序可以是商业网站、博客、电子商务系统,或者一个使用训练好的模型实时从提供的数据生成预测的应用程序。如果您没有安装 Flask,可以使用 pip 进行安装。
Docker 是一个旨在通过使用容器更轻松地创建、部署和运行应用程序的工具。容器用于将应用程序及其所有必需组件(例如库和其他依赖项)打包在一起,并作为一个包发布。如果您之前没有使用过 docker,本教程还涵盖了在Windows 10 家庭版上安装旧版 Docker Toolbox (v19.03.1)。在中,我们介绍了如何在Windows 10 专业版上安装 Docker Desktop。
亚马逊云服务 (AWS) 是亚马逊提供的全面且广泛采用的云平台。它在全球数据中心拥有超过 175 项功能齐全的服务。如果您以前没有使用过 AWS,您可以注册免费账户。
Docker 是一家提供软件(也称为Docker)的公司,该软件允许用户构建、运行和管理容器。虽然 Docker 的容器是最常见的,但也有其他不太知名的替代品,例如和.
()
由于我们已经在初始教程中涵盖了前两个任务,我们将快速回顾它们,然后重点介绍上面列表中的其余项目。如果您有兴趣了解更多关于使用 Python 中的 PyCaret 开发机器学习管线以及使用 Flask 框架构建 Web 应用的信息,请阅读.
如果您还没有跟上进度,没问题。您可以简单地 Fork 这个来自 GitHub 的仓库。此时您的项目文件夹应如下所示
为了在本地构建 docker 镜像,您需要在计算机上安装 Docker。如果您使用的是 Windows 10 64 位:专业版、企业版或教育版(内部版本 15063 或更高版本),您可以从这里下载 Docker Desktop.
但是,如果您使用的是 Windows 10 家庭版,则需要从这里安装旧版 Docker Toolbox (v19.03.1) 的最后一个发布版本.
Dockerfile 是区分大小写的,并且必须与项目中的其他文件一起放在项目文件夹中。Dockerfile 没有扩展名,可以使用任何文本编辑器创建。您可以从这里下载本项目中使用的 Dockerfile.
我们收到了社区的巨大支持和反馈。我们正在积极改进 PyCaret 并准备下一个版本。PyCaret 2.0.0 将更大更好。如果您想分享您的反馈并帮助我们进一步改进,您可以在网站上或在我们的或页面上留言。
关注我们的并订阅我们的频道以了解更多关于 PyCaret 的信息。
PyCaret 是一个开源项目。欢迎所有人贡献力量。如果您想贡献,请随时进行。dev-1.0.1 分支接受包含单元测试的 Pull Request。
请在我们的如果您喜欢 PyCaret。
Medium