跳到主要内容

在 AWS Fargate 上部署 PyCaret 和 Streamlit

使用 AWS Fargate 部署 PyCaret 和 Streamlit 应用 —— 无服务器基础设施

作者:Moez Ali

一步一步的初学者指南:在 AWS Fargate 上将机器学习流水线容器化和部署为无服务器应用

回顾

在我们的上一篇文章中,我们演示了如何使用 PyCaret 开发机器学习流水线,并将其作为 Streamlit 网页应用部署到 Google Kubernetes Engine。如果你之前没有听说过 PyCaret,可以阅读这篇公告来开始了解。

在本教程中,我们将使用之前构建的相同的网页应用和机器学习流水线,并演示如何使用 AWS Fargate 部署它,AWS Fargate 是一种用于容器的无服务器计算。

通过本教程,你将能够在 AWS 上构建和托管一个完全功能的容器化网页应用,而无需提供任何服务器基础设施。

网页应用

👉 本教程的学习目标

  • 什么是容器?什么是 Docker?什么是 Kubernetes?
  • 什么是 Amazon Elastic Container Service(ECS),AWS Fargate 和无服务器部署?
  • 构建并推送 Docker 镜像到 Amazon Elastic Container Registry。
  • 使用无服务器基础设施(即 AWS Fargate)部署网页应用。

本教程将涵盖从本地构建 Docker 镜像,上传到 Amazon Elastic Container Registry,创建集群,然后使用 AWS 管理的基础设施定义和执行任务的整个工作流程。

在过去,我们已经涵盖了其他云平台上的部署,比如 Azure 和 Google。如果你有兴趣了解更多相关内容,可以阅读以下教程:

💻 本教程的工具箱

PyCaret

PyCaret 是一个开源的、低代码的 Python 机器学习库,用于训练和部署机器学习流水线和模型到生产环境中。可以使用 pip 轻松安装 PyCaret。

pip install pycaret

Streamlit

Streamlit 是一个开源的 Python 库,可以轻松构建漂亮的定制化机器学习和数据科学 Web 应用。可以使用 pip 轻松安装 Streamlit。

pip install streamlit

适用于 Windows 10 Home 的 Docker Toolbox

Docker 是一个旨在通过使用容器来更轻松地创建、部署和运行应用程序的工具。容器用于将应用程序及其所需的所有组件(如库和其他依赖项)打包在一起,并将其作为一个整体进行传输。如果你之前没有使用过 Docker,本教程还涵盖了在 Windows 10 Home 上安装 Docker Toolbox(旧版)的过程。在之前的教程中,我们介绍了如何在 Windows 10 Pro 版本上安装 Docker Desktop。

亚马逊网络服务(AWS)

亚马逊网络服务(AWS)是由亚马逊提供的一个全面且广泛采用的云平台。它拥有全球数据中心的 175 多个功能齐全的服务。如果你之前没有使用过 AWS,可以注册一个免费账户。

✔️ 让我们开始吧……

什么是容器?

在我们开始使用 AWS Fargate 进行实现之前,让我们先了解一下什么是容器以及为什么我们需要它?

https://www.freepik.com/free-photos-vectors/cargo-ship 你是否曾经遇到这样的问题:你的代码在你的电脑上运行正常,但当朋友尝试运行完全相同的代码时,却无法正常工作?如果朋友重复了完全相同的步骤,他们应该得到相同的结果,对吧?这个问题的答案是“环境”。你朋友的环境与你的不同。

环境包括什么?→ 编程语言,如Python,以及构建和测试应用程序时使用的所有库和依赖项的确切版本。

如果我们可以创建一个可以转移到其他机器的环境(例如:你朋友的电脑或像谷歌云平台这样的云服务提供商),我们就可以在任何地方复制结果。因此,容器是一种软件类型,它打包了一个应用程序及其所有依赖项,使应用程序可以在一个计算环境中可靠地运行到另一个计算环境中。

什么是 Docker?

Docker 是一家提供软件(也称为 Docker)的公司,允许用户构建、运行和管理容器。虽然 Docker 的容器是最常见的,但还有其他不那么出名的替代品,如 LXDLXC

现在你理论上了解了什么是容器以及 Docker 如何用于容器化应用程序,让我们想象一个场景:你需要在一群机器上运行多个容器,以支持一个企业级机器学习应用程序,在白天和黑夜有不同的工作负载。这在现实生活中非常常见,尽管听起来很简单,但手动完成这项工作是很费力的。

你需要在正确的时间启动正确的容器,找出它们如何相互通信,处理存储考虑事项,处理失败的容器或硬件以及其他无数事情!

管理数百甚至数千个容器以保持应用程序正常运行的整个过程被称为容器编排。暂时不要陷入技术细节。

在这一点上,你必须意识到,管理现实生活中的应用程序需要不止一个容器,并且管理所有基础设施以保持容器正常运行是繁琐、手动且具有行政负担的。

这就引出了 Kubernetes。

什么是 Kubernetes?

Kubernetes 是由谷歌于2014年开发的用于管理容器化应用程序的开源系统。简单来说,Kubernetes 是一个用于在一组机器上运行和协调容器化应用程序的系统。

Photo by chuttersnap on Unsplash

虽然 Kubernetes 是由谷歌开发的开源系统,几乎所有主要的云服务提供商都提供 Kubernetes 作为托管服务。例如:由亚马逊提供的 Amazon Elastic Kubernetes Service (EKS),由谷歌提供的 Google Kubernetes Engine (GKE),以及由微软提供的 Azure Kubernetes Service (AKS)。

到目前为止,我们已经讨论并了解了:

✔️ 一个容器

✔️ Docker

✔️ Kubernetes

在介绍 AWS Fargate 之前,还有一件事需要讨论,那就是亚马逊自己的容器编排服务 Amazon Elastic Container Service (ECS)。

AWS 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),你可以通过两种方式实现底层基础设施:

  1. 手动管理集群和底层基础设施,如虚拟机/服务器/(也称为 EC2 实例)。
  2. 无服务器 — 完全不需要管理任何东西。只需上传容器,就可以了。← 这就是 AWS Fargate。

Amazon ECS underlying infrastructure

AWS Fargate — 用于容器的无服务器计算

AWS Fargate 是一种用于容器的无服务器计算引擎,可与 Amazon Elastic Container Service (ECS) 和 Amazon Elastic Kubernetes Service (EKS) 配合使用。Fargate 让您可以专注于构建应用程序。Fargate 摒弃了预配和管理服务器的需求,允许您按应用程序指定和支付资源,并通过设计实现应用程序隔离来提高安全性。

Fargate 分配适量的计算资源,无需选择实例和扩展集群容量。您只需支付运行容器所需的资源,因此无需过度预配和支付额外的服务器。

AWS Fargate 的工作原理 — https://aws.amazon.com/fargate/

对于哪种方法更好,没有一个最佳答案。选择是无服务器还是手动管理 EC2 集群取决于用例。以下是一些可帮助您做出选择的指针:

ECS EC2 (手动方法)

  • 您完全依赖 AWS。
  • 您有一个专门的运维团队来管理 AWS 资源。
  • 您已经在 AWS 上有一定的存在,即您已经在管理 EC2 实例。

AWS Fargate

  • 您没有庞大的运维团队来管理 AWS 资源。
  • 您不想要运维责任,或者想要减少运维责任。
  • 您的应用程序是无状态的(无状态应用是指在一次会话中不保存客户端生成的数据,以便在下次与该客户端的会话中使用)。

设置业务背景

一家保险公司希望通过在住院时使用人口统计和基本患者健康风险指标更好地预测患者费用,以改进现金流预测。

(数据来源)

目标

构建和部署一个 Web 应用程序,用户可以在基于 Web 的表单中输入患者的人口统计和健康信息,然后输出预测的费用金额。

任务

  • 使用 PyCaret 训练、验证和开发一个机器学习流水线。
  • 构建一个具有两个功能的前端 Web 应用程序:(i) 在线预测和 (ii) 批量预测。
  • 创建一个 Dockerfile。
  • 创建并执行一个任务,使用 AWS Fargate 无服务器基础设施部署应用程序。

由于我们已经在我们的上一篇教程中涵盖了前两个任务,我们将快速回顾它们,然后专注于上面列表中剩下的项目。如果您有兴趣了解如何使用 PyCaret 在 Python 中开发机器学习流水线,并使用 Streamlit 框架构建 Web 应用程序,请阅读这篇教程

👉 任务 1 — 模型训练和验证

我们在 Python 中使用 PyCaret 进行训练和开发机器学习流水线,该流水线将作为我们 Web 应用程序的一部分使用。机器学习流水线可以在集成开发环境 (IDE) 或笔记本中开发。我们使用笔记本来运行下面的代码:

当您在 PyCaret 中保存模型时,根据 **setup() **函数中定义的配置,将创建基于整个转换流水线。所有相互依赖关系都会自动协调。查看存储在 'deployment_28042020' 变量中的流水线和模型:

使用 PyCaret 创建的机器学习流水线

👉 任务 2 — 构建前端 Web 应用程序

现在我们的机器学习流水线和模型已经准备好,可以开始构建一个前端 Web 应用程序,该应用程序可以在新数据点上生成预测。该应用程序将通过上传 csv 文件来支持 '在线' 和 '批量' 预测。让我们将应用程序代码分解为三个主要部分:

头部 / 布局

该部分导入库,加载训练好的模型,并创建一个基本布局,顶部有一个徽标,侧边栏有一个下拉菜单,用于在 '在线' 和 '批量' 预测之间切换。

app.py — 代码片段第 1 部分

在线预测

该部分处理初始应用程序函数,即逐个进行在线预测。我们使用 streamlit 的小部件,如数字输入、文本输入、下拉菜单和复选框,来收集用于训练模型的数据点,如年龄、性别、BMI、子女数、吸烟者、地区。

app.py — 代码片段第 2 部分

批量预测

批量预测是该应用程序功能的第二层。在 streamlit 中,使用 file_uploader 小部件上传 csv 文件,然后调用 PyCaret 的本地 **predict_model() **函数生成预测结果,并使用 streamlit 的 write() 函数显示。

app.py — 代码片段部分 3

**测试应用程序 **在将应用程序部署到 AWS Fargate 之前的最后一步是在本地测试应用程序。打开 Anaconda Prompt 并导航到项目文件夹,执行以下代码:

streamlit run app.py

Streamlit 应用程序测试 — 在线预测

👉 任务 3 — 创建 Dockerfile

为了将我们的应用程序容器化以便部署,我们需要一个在运行时成为容器的 Docker 镜像。使用 Dockerfile 创建 Docker 镜像。Dockerfile 只是一个包含一组指令的文件。该项目的 Dockerfile 如下所示:

Dockerfile 的最后部分(从第 23 行开始)是与 Streamlit 相关的。Dockerfile 区分大小写,必须与其他项目文件一起位于项目文件夹中。

👉 任务 4–在 AWS Fargate 上部署:

按照以下简单的 9 个步骤在 AWS Fargate 上部署应用程序:

👉 步骤 1 — 安装 Docker Toolbox(适用于 Windows 10 Home)

为了在本地构建 Docker 镜像,您需要在计算机上安装 Docker。如果您使用的是 Windows 10 64 位:Pro、Enterprise 或 Education(版本号 15063 或更高),您可以从 DockerHub 下载 Docker Desktop。

但是,如果您使用的是 Windows 10 Home,则需要从 Dockers GitHub 页面 安装最新版本的传统 Docker Toolbox(v19.03.1)。

https://github.com/docker/toolbox/releases

下载并运行 DockerToolbox-19.03.1.exe 文件。

检查安装是否成功的最简单方法是打开命令提示符并输入 'docker'。应该打印出帮助菜单。

Anaconda Prompt 检查 docker

👉 步骤 2 — 在 Elastic Container Registry(ECR)中创建存储库

(a) 登录到您的 AWS 控制台并搜索 Elastic Container Registry:

AWS 控制台

(b) 创建新存储库:

在 Amazon Elastic Container Registry 上创建新存储库

创建存储库

点击“创建存储库”。

(c) 点击“查看推送命令”:

pycaret-streamlit-aws 存储库的推送命令

👉 步骤 3 — 执行推送命令

使用 Anaconda Prompt 导航到项目文件夹,并执行上述步骤中复制的命令。在执行这些命令之前,必须位于包含 Dockerfile 和其余代码的文件夹中。

这些命令用于构建 Docker 镜像,然后将其上传到 AWS ECR。

👉 步骤 4 — 检查已上传的镜像

点击您创建的存储库,您将在上述步骤中看到已上传镜像的镜像 URI。复制镜像 URI(在下面的步骤 6 中将需要)。

👉 步骤 5 — 创建和配置集群

(a) 在左侧菜单中点击“Clusters”:

创建集群 — 步骤 1

(b) 选择“仅网络”并点击“下一步”:

选择仅网络模板

(c) 配置集群(输入集群名称)并点击“创建”:

配置集群

点击“创建”。

(d) 集群已创建:

集群已创建

👉 步骤 6 — 创建新任务定义

在 Amazon ECS 中运行 Docker 容器需要一个 任务 定义。在 任务 定义中,您可以指定一些参数,包括:每个容器在您的 任务 中使用的 Docker 镜像。每个 任务 或每个 任务 中的每个容器使用多少 CPU 和内存。

(a) 点击“创建新任务定义”:

创建新任务定义

(b) 选择“FARGATE”作为启动类型:

选择启动类型兼容性

(c) 填写详细信息: 配置任务和容器定义(第1部分)

配置任务和容器定义(第2部分)

(d) 点击“添加容器”并填写详细信息:

在任务定义中添加容器

点击右下角的“创建任务”。

👉 第7步— 执行任务定义

在上一步中,我们创建了一个启动容器的任务。现在,我们将通过点击“操作”下的**“运行任务”**来执行该任务。

(a) 点击“切换到启动类型”以将类型更改为 Fargate:

(b) 从下拉菜单中选择 VPC 和子网:

点击右下角的“运行任务”。

👉 第8步— 允许来自网络设置的入站端口8501

在我们可以通过公共 IP 地址看到我们的应用程序之前,还有最后一步,即通过创建新规则来允许端口8501(streamlit 使用的端口)。为了做到这一点,请按照以下步骤操作:

(a) 点击任务

(b) 点击 ENI Id:

(c) 点击安全组

(d) 向下滚动并点击“编辑入站规则”

(e) 添加一个自定义 TCP 规则,端口为8501

👉 恭喜!您已经在 AWS Fargate 上无服务器地发布了您的应用程序。使用带有端口8501的公共 IP 地址访问该应用程序。

应用程序发布在99.79.189.46:8501上

**注意:**在本故事发布时,该应用程序将从公共地址中删除以限制资源消耗。

本教程的 GitHub 存储库链接

Google Kubernetes 部署的 GitHub 存储库链接

Heroku 部署的 GitHub 存储库链接

PyCaret 2.0.0 即将发布!

我们收到了社区的大力支持和反馈。我们正在积极改进 PyCaret 并准备发布下一个版本。PyCaret 2.0.0 将更加强大和优秀。如果您想分享您的反馈并帮助我们进一步改进,您可以在网站上填写此表单或在我们的GitHubLinkedIn页面上留言。

关注我们的LinkedIn并订阅我们的YouTube频道,以了解更多关于 PyCaret 的信息。

想要了解特定模块吗?

截至第一个版本1.0.0,PyCaret 提供了以下可用于使用的模块。点击下面的链接查看 Python 中的文档和工作示例。

分类 回归聚类 异常检测自然语言处理 关联规则挖掘

还可以参考:

在笔记本中的 PyCaret 入门教程:

分类 回归 聚类 异常检测 自然语言处理 关联规则挖掘

想要贡献吗?

PyCaret 是一个开源项目。欢迎大家贡献。如果您想贡献,请随时处理开放问题。我们接受在 dev-1.0.1 分支上带有单元测试的拉取请求。

如果您喜欢 PyCaret,请在我们的GitHub 存储库上给我们 ⭐️。

Medium: https://medium.com/@moez_62905/ LinkedIn: https://www.linkedin.com/in/profile-moez/

Twitter: https://twitter.com/moezpycaretorg1