在 AWS Fargate 上部署 PyCaret 和 Streamlit
最后更新于
这有帮助吗?
最后更新于
这有帮助吗?
在本教程中,我们将使用之前构建的相同的 Web 应用和机器学习 pipeline,并演示如何使用 AWS Fargate(适用于容器的无服务器计算)对其进行部署。
学完本教程后,你将能够在 AWS 上构建并托管一个功能齐全的容器化 Web 应用,而无需预置任何服务器基础设施。
什么是容器?什么是 Docker?什么是 Kubernetes?
什么是 Amazon Elastic Container Service (ECS)、AWS Fargate 和无服务器部署?
构建 Docker 镜像并将其推送到 Amazon Elastic Container Registry。
使用无服务器基础设施(即 AWS Fargate)部署 Web 应用。
本教程将涵盖从本地构建 docker 镜像,上传到 Amazon Elastic Container Registry,创建集群,然后使用 AWS 管理的基础设施定义和执行任务的整个工作流程。
过去,我们已经介绍了在其他云平台(如 Azure 和 Google)上的部署。如果你有兴趣了解更多信息,可以阅读以下教程
在使用 AWS Fargate 进行实现之前,让我们先了解什么是容器以及为什么我们需要容器?
你是否遇到过这样的问题:你的代码在你的电脑上运行良好,但朋友尝试运行完全相同的代码时却无法工作?如果你的朋友重复完全相同的步骤,他们应该会得到相同的结果,对吗?这个问题的答案是一个词:**环境。**你朋友的环境和你的不同。
环境包括什么? → 编程语言(例如 Python)以及用于构建和测试应用程序的所有库和依赖项,并且要使用准确的版本。
如果我们能创建一个可以转移到其他机器(例如:你朋友的电脑或 Google Cloud Platform 等云服务提供商)上的环境,我们就可以在任何地方重现结果。因此,***容器*** 是一种软件类型,它将应用程序及其所有依赖项打包在一起,以便应用程序可以在不同的计算环境之间可靠地运行。
现在你已经从理论上理解了什么是容器以及如何使用 Docker 对应用程序进行容器化,让我们想象一个场景:你必须在大量机器上运行多个容器来支持一个企业级的机器学习应用程序,该应用程序在白天和晚上的工作负载各不相同。这在现实生活中非常普遍,听起来可能很简单,但手动操作需要做大量工作。
你需要准时启动正确的容器,弄清楚它们如何相互通信,处理存储问题,应对容器或硬件故障,以及处理其他数百万件事!
管理成百上千个容器以保持应用程序正常运行的整个过程被称为容器编排。暂时不要纠结于技术细节。
此时,你必须认识到管理实际应用需要不止一个容器,而且管理所有基础设施以保持容器正常运行是繁琐、手动且管理负担沉重的工作。
这引出了Kubernetes。
Kubernetes 是一个由 Google 于 2014 年开发的开源系统,用于管理容器化应用程序。简单来说,Kubernetes 是一个用于在机器集群上运行和协调容器化应用程序的系统。
虽然 Kubernetes 是由 Google 开发的开源系统,但几乎所有主要的云服务提供商都将 Kubernetes 作为托管服务提供。例如:Amazon 提供的 **Amazon Elastic Kubernetes Service (EKS)**,Google 提供的 **Google Kubernetes Engine (GKE)**,以及 Microsoft 提供的 **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),都有两种方式来实现底层基础设施
手动管理集群和底层基础设施,例如虚拟机/服务器(也称为 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 表单,然后输出预测的费用金额。
使用 PyCaret 训练、验证和开发机器学习 pipeline。
构建一个具有两种功能的前端 Web 应用:(i) 在线预测和 (ii) 批量预测。
创建 Dockerfile
创建并执行任务以使用 AWS Fargate 无服务器基础设施部署应用。
我们在 Python 中使用 PyCaret 来训练和开发机器学习 pipeline,它将作为我们 Web 应用的一部分使用。机器学习 Pipeline 可以在集成开发环境 (IDE) 或 Notebook 中开发。我们使用了一个 Notebook 来运行以下代码
当你使用 PyCaret 保存模型时,会基于 **setup()** 函数中定义的配置创建完整的转换 pipeline。所有相互依赖关系都会自动编排。请参见存储在 'deployment_28042020' 变量中的 pipeline 和模型
现在我们的机器学习 pipeline 和模型已准备就绪,可以开始构建一个前端 Web 应用,该应用可以在新数据点上生成预测。该应用将支持通过上传 csv 文件进行“在线”和“批量”预测。我们将应用代码分解为三个主要部分
本部分导入库、加载训练好的模型,并创建一个基本布局,顶部有徽标、一张 jpg 图片和侧边栏上的一个下拉菜单,用于切换“在线”和“批量”预测。
本节处理应用的初始功能,即在线一对一预测。我们使用 Streamlit 小部件,例如数字输入、文本输入、下拉菜单和复选框来收集用于训练模型的数据点,例如年龄、性别、BMI、子女数量、吸烟者、地区。
批量预测是应用功能的第二层。Streamlit 中的 file_uploader 小部件用于上传 csv 文件,然后调用 PyCaret 的原生 **predict_model()** 函数来生成预测结果,这些结果通过 Streamlit 的 write() 函数显示。
**测试应用** 在将应用程序部署到 AWS Fargate 之前,最后一步是在本地测试应用。打开 Anaconda Prompt 并导航到你的项目文件夹,执行以下代码
为了将我们的应用程序容器化以便部署,我们需要一个 Docker 镜像,它在运行时会成为一个容器。Docker 镜像使用 Dockerfile 创建。Dockerfile 只是一个包含一系列指令的文件。此项目的 Dockerfile 如下所示
此 Dockerfile 的最后一部分(从第 23 行开始)是 Streamlit 特定的。Dockerfile 区分大小写,并且必须与项目中的其他文件一起放在项目文件夹中。
按照以下 9 个简单步骤在 AWS Fargate 上部署应用
下载并运行 DockerToolbox-19.03.1.exe 文件。
检查安装是否成功的简单方法是打开命令提示符并键入 'docker'。它应该会打印帮助菜单。
(a) 登录你的 AWS 控制台并搜索 Elastic Container Registry
(b) 创建新仓库
点击“创建仓库”。
(c) 点击“查看推送命令”
使用 Anaconda Prompt 导航到你的项目文件夹,并执行你在上一步中复制的命令。在执行这些命令之前,你必须位于 Dockerfile 和其他代码所在的文件夹中。
这些命令用于构建 Docker 镜像,然后将其上传到 AWS ECR。
点击你创建的仓库,你将看到上一步中上传镜像的镜像 URI。复制该镜像 URI(在下面的步骤 6 中会用到)。
(a) 点击左侧菜单中的“集群”
(b) 选择“仅网络”,然后点击下一步
(c) 配置集群(输入集群名称)并点击创建
点击“创建”。
(d) 集群已创建
在 Amazon ECS 中运行 Docker 容器需要任务定义。你可以在任务定义中指定的一些参数包括:你的任务中每个容器要使用的 Docker 镜像。你的任务或任务内每个容器要使用的 CPU 和内存量。
(a) 点击“创建新的任务定义”
(b) 选择“FARGATE”作为启动类型
(c) 填写详细信息
(d) 点击“添加容器”并填写详细信息
点击右下角的“创建任务”。
上一步中我们创建了一个将启动容器的任务。现在我们将通过点击操作下的“运行任务”来执行任务。
(a) 点击“切换启动类型”将类型更改为 Fargate
(b) 从下拉列表中选择 VPC 和子网
点击右下角的“运行任务”。
在通过公网 IP 地址查看我们的应用程序运行之前,最后一步是通过创建新规则来允许端口 8501(由 streamlit 使用)。要做到这一点,请按照以下步骤操作
(a) 点击任务
(b) 点击 ENI Id
(c) 点击安全组
(d) 向下滚动并点击“编辑入站规则”
(e) 添加端口 8501 的自定义 TCP 规则
注意:到本文发布时,该应用程序将从公共地址移除,以限制资源消耗。
截至第一个版本 1.0.0,PyCaret 提供了以下可用的模块。点击下方链接查看 Python 中的文档和工作示例。
PyCaret Notebook 入门教程
在我们的中,我们演示了如何使用 PyCaret 开发机器学习 pipeline,并将其作为部署到 Google Kubernetes Engine 的 Streamlit Web 应用程序提供服务。如果你之前没有听说过 PyCaret,可以阅读这篇开始入门。
是一个开源、低代码的 Python 机器学习库,用于训练和部署机器学习 pipeline 和模型到生产环境。PyCaret 可以使用 pip 轻松安装。
是一个开源的 Python 库,可以轻松构建精美的机器学习和数据科学自定义 Web 应用。Streamlit 可以使用 pip 轻松安装。
** **是一款旨在通过使用容器简化应用程序创建、部署和运行的工具。容器用于将应用程序及其所有必要组件(例如库和其他依赖项)打包在一起,并作为一个包全部交付。如果你以前没有使用过 docker,本教程也涵盖了在Windows 10 家庭版上安装 Docker Toolbox(旧版)的内容。在中,我们介绍了如何在Windows 10 专业版上安装 Docker Desktop。
Amazon Web Services (AWS) 是亚马逊提供的全面且广泛采用的云平台。它在全球拥有超过 175 项功能齐全的数据中心服务。如果你之前没有使用过 AWS,你可以获取免费账户。
Docker 是一家提供软件(也称为Docker)的公司,该软件允许用户构建、运行和管理容器。虽然 Docker 的容器是最常见的,但也有其他不太出名的替代方案,例如和.
()
由于我们已经在中介绍了前两个任务,我们将快速回顾它们,然后重点关注上面列表中的其余项。如果你有兴趣了解更多关于使用 PyCaret 在 Python 中开发机器学习 pipeline 以及使用 Streamlit 框架构建 Web 应用程序的信息,请阅读.
为了在本地构建 Docker 镜像,你需要在电脑上安装 Docker。如果你使用的是 Windows 10 64 位:专业版、企业版或教育版(Build 15063 或更高版本),可以从.
然而,如果你使用的是 Windows 10 家庭版,则需要从.
我们收到了社区压倒性的支持和反馈。我们正在积极改进 PyCaret 并为下一个版本做准备。PyCaret 2.0.0 将更大更好。如果你想分享你的反馈并帮助我们进一步改进,你可以在网站上或在我们的或页面留言。
关注我们的并订阅我们的频道,了解更多关于 PyCaret 的信息。
PyCaret 是一个开源项目。欢迎所有人贡献。如果你想贡献,请随时处理。在 dev-1.0.1 分支上接受包含单元测试的 Pull 请求。
请在我们的点亮 ⭐️,如果你喜欢 PyCaret。
Medium