在 AWS Fargate 上部署 PyCaret 和 Streamlit
使用 AWS Fargate 部署 PyCaret 和 Streamlit 应用程序 —— 无服务器基础设施
作者:Moez Ali
回顾
在我们的上一篇文章中,我们演示了如何使用 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。如果你对这些感兴趣,可以阅读以下教程:
- 将 Streamlit 应用程序部署到 Google Kubernetes Engine
- 使用 PyCaret 和 Streamlit 构建和部署机器学习网络应用程序
- 在 AWS Fargate 上部署机器学习流水线
- 在 Google Kubernetes Engine 上部署机器学习流水线
- 在 AWS Web Service 上部署机器学习流水线
- 在 Heroku PaaS 上构建和部署你的第一个机器学习网络应用程序
💻 本教程的工具箱
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 进行实现之前,让我们了解一下什么是容器,以及为什么我们需要它?
你是否遇到过这样的问题:你的代码在你的电脑上运行得很好,但是当朋 友尝试运行完全相同的代码时,却无法正常工作?如果你的朋友重复了完全相同的步骤,他们应该得到相同的结果,对吗?这个问题的答案是环境。你朋友的环境与你的不同。
环境包括什么?→ 编程语言,如Python,以及使用该语言构建和测试应用程序时所使用的所有库和依赖项的确切版本。
如果我们可以创建一个可以传输到其他机器上的环境(例如:你朋友的电脑或像Google Cloud Platform这样的云服务提供商),我们就可以在任何地方重现结果。因此,容器是一种软件类型,它将应用程序及其所有依赖项打包起来,以便应用程序可以在不同的计算环境中可靠地运行。
什么是Docker?
Docker是一家提供软件(也称为Docker)的公司,允许用户构建、运行和管理容器。虽然Docker的容器是最常见的,但还有其他不太出名的替代品,如LXD和LXC。
现在你理论上理解了容器是什么,以及Docker如何用于容器化应用程序,让我们想象一个场景:你需要在一群机器上运行多个容器,以支持一个企业级机器学习应用程序,在白天和晚上有不同的工作负载。这在现实生活中非常常见,尽管听起来很简单,但手动完成这项工作是很费力的。
你需要在正确的时间启动正确的容器,弄清它们如何相互通信,处理存储考虑事项,处理失败的容器或硬件以及其他无数的事情!
管理数百甚至数千个容器以保持应用程序运行的整个过程被称为容器编排。现在不要陷入技术细节中。
此时,你必须认识到管理现实生活中的应用程序需要不止一个容器,并且管理所有基础设施以保持容器运行是繁琐、手动且具有行政负担的。
这就引出了Kubernetes。
什么是Kubernetes?
Kubernetes是由Google于2014年开发的用于管理容器化应用程序的开源系统。简单来说,Kubernetes是一种在一组机器上运行和协调容器化应用程序的系统。
虽然Kubernetes是由Google开发的开源系统,几乎所有主要的云服务提供商都提供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这样的容器编排服务,你都可以通过以下两种方式实现底层基础设施:
- 手动管理集群和底层基础设施,如虚拟机/服务器/(也称为EC2实例)。
- 无服务器——完全不需要管理任何东西。只需上传容器,就完成了。← 这就是AWS Fargate。
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训练、验证和开发一个机器学习流水线。
- 构建一个具有两个功能的前端Web应用程序:(i)在线预测和(ii)批量预测。
- 创建一个Dockerfile。
- 创建并执行一个任务,使用AWS Fargate无服务器基础架 构部署应用程序。
由于我们已经在我们的上一篇教程中涵盖了前两个任务,我们将快速回顾它们,然后专注于上面列表中剩下的项目。如果您有兴趣了解如何使用PyCaret在Python中开发机器学习流水线,并使用Streamlit框架构建Web应用程序,请阅读这篇教程。
👉 任务1 - 模型训练和验证
我们使用Python中的PyCaret来训练和开发一个机器学习流水线,该流水线将作为我们Web应用程序的一部分使用。机器学习流水线可以在集成开发环境(IDE)或笔记本中开发。我们使用笔记本来运行以下代码:
当您在PyCaret中保存一个模型时,根据**setup() **函数中定义的配置创建整个转换流水线。所有相互依赖关系都会自动协调。请参见存储在“deployment_28042020”变量中的流水线和模型:
👉 任务2 - 构建前端Web应用程序
现在我们的机器学习流水线和模型已经准备好了,我们可以开始构建一个前端Web应用程序,该应用程序可以对新数据点进行预测。该应用程序将通过csv文件上传支持“在线”和“批量”预测。让我们将应用程序代码分解为三个主要部分:
头部/布局
此部分导入库,加载训练好的模型,并创建一个基本布局,顶部有一个徽标,侧边栏有一个下拉菜单,用于在“在线”和“批量”预测之间切换。
在线预测
此部分处理初始应用程序函数,即逐个进行在线预测。我们使用Streamlit的小部件,如数字输入、文本输入、下拉菜单和复选框,收集用于训练模型的数据点,如年龄、性别、BMI、子女、吸烟者、地区。
批量预测
批量预测是该应用程序功能的第二层。在streamlit中使用file_uploader小部件上传csv文件,然后调用PyCaret的本地**predict_model() **函数生成预测结果,并使用streamlit的write()函数显示。
测试应用程序在将应用程序部署到AWS Fargate之前,我们需要在本地测试应用程序。打开Anaconda Prompt并导航到项目文件夹,执行以下代码:
streamlit run app.py
👉 任务3 — 创建Dockerfile
为了将应用程序容器化以进行部署,我们需要一个Docker镜像,该镜像在运行时成为一个容器。使用Dockerfile创建Docker镜像。Dockerfile只是一个带有一组指令的文件。该项目的Dockerfile如下所示:
Dockerfile的最后部分(从第23行开始)是特定于Streamlit的。Dockerfile区分大小写,并且必须与其他项目文件放在同一个文件夹中。
👉 任务4 — 在AWS Fargate上部署:
按照以下简单的9个步骤在AWS Fargate上部署应用程序: