在 Google Kubernetes 上部署 ML 应用
上次更新于
这有帮助吗?
上次更新于
这有帮助吗?
在本教程中,我们将使用相同的机器学习流水线和 Streamlit 应用,并演示如何将它们容器化并部署到 Google Kubernetes Engine 上。
通过本教程,你将能够在 Google Kubernetes Engine 上构建并托管一个功能齐全的容器化 Web 应用。这个 Web 应用可以使用训练好的机器学习模型来生成在线预测(一对一)以及批量预测(通过上传 CSV 文件)。最终的应用界面如下所示:
什么是容器,什么是 Docker,什么是 Kubernetes,以及什么是 Google Kubernetes Engine?
构建一个 Docker 镜像并上传到 Google Container Registry (GCR)。
在 GCP 上创建一个集群,并将机器学习应用部署为 Web 服务。
查看一个正在运行的 Web 应用,它使用训练好的机器学习流水线实时预测新的数据点。
在过去,我们已经介绍了使用 Docker 进行容器化以及在 Azure、GCP 和 AWS 等云平台上进行部署。如果你有兴趣了解更多,可以阅读以下教程:
在我们深入了解 Kubernetes 之前,先来了解一下什么是容器,以及为什么我们需要它?
你是否遇到过这样的问题:你的代码在你的电脑上运行良好,但当朋友尝试运行完全相同的代码时,却无法正常工作?如果你的朋友遵循了完全相同的步骤,他或她应该得到相同的结果,对吧?对此问题的简短回答是:**环境**。你朋友的环境与你的不同。
环境包括什么?→ 编程语言,例如 Python,以及构建和测试应用时使用的所有库和依赖项,且版本完全一致。
如果我们能创建一个可以转移到其他机器(例如:你朋友的电脑或 Google Cloud Platform 这样的云服务提供商)的环境,我们就可以在任何地方重现结果。因此,***容器***是一种软件类型,它将应用及其所有依赖项打包在一起,以便应用能够在不同的计算环境中可靠地运行。
那么 Docker 是什么?
现在你已经了解了容器,特别是 Docker,接下来我们来了解一下 Kubernetes 是什么。
Kubernetes 是一个强大的开源系统,由 Google 在 2014 年开发,用于管理容器化应用。简单来说,Kubernetes 是一个用于在机器集群中运行和协调容器化应用的系统。它是一个旨在完全管理容器化应用生命周期的平台。
✔️ **负载均衡:**自动在容器之间分配负载。
✔️ **扩缩容:**当需求变化时(例如高峰时段、周末和节假日),通过添加或删除容器来自动向上或向下扩缩容。
✔️ **存储:**保持应用的多个实例的存储一致性。
✔️ 自修复:自动重启失败的容器,并终止对用户定义的健康检查无响应的容器。
✔️ **自动化部署:**你可以自动化 Kubernetes 为你的部署创建新容器,移除现有容器,并将它们的所有资源转移到新容器上。
想象一个场景:你需要在一夜之间在多台机器上运行多个 Docker 容器,以支持一个在白天和晚上工作负载各不相同的企业级 ML 应用。这听起来可能很简单,但手动操作起来非常繁琐。
你需要准时启动正确的容器,弄清楚它们如何相互通信,处理存储考虑事项,以及应对失败的容器或硬件。这就是 Kubernetes 正在解决的问题,它允许大量容器协同工作,从而减轻了运维负担。
Google Kubernetes Engine 是 Google 开源 Kubernetes 在 Google Cloud Platform 上的实现。就这么简单!
**容器**是一种软件类型,它将应用及其所有依赖项打包在一起,以便应用能够在不同的计算环境中可靠地运行。
**Docker** 是一种用于构建和管理容器的软件。
**Kubernetes** 是一种用于在集群环境中管理容器化应用的开源系统。
Google Kubernetes Engine 是开源 Kubernetes 框架在 Google Cloud Platform 上的实现。
一家保险公司希望通过更好地预测住院时的患者费用来改善其现金流预测,预测依据是患者的人口统计学信息和基本健康风险指标。
构建一个 Web 应用,支持使用训练好的机器学习模型和流水线进行在线(一对一)预测以及批量预测。
使用 PyCaret 训练、验证和开发机器学习流水线。
构建一个具有两种功能的前端 Web 应用:(i) 在线预测和 (ii) 批量预测。
创建一个 Dockerfile
在 Google Kubernetes Engine 上部署 Web 应用。部署后,它将公开可用,并通过 Web URL 进行访问。
在本教程中,我们进行了两次实验。第一次实验使用 PyCaret 的默认预处理设置。第二次实验包含一些额外的预处理任务,例如缩放和归一化、自动化特征工程以及将连续数据分箱到区间。请参阅第二次实验的 setup 代码:
只需要几行代码就能实现魔法。请注意,在实验 2 中,转换后的数据集有 62 个用于训练的特征,而原始数据集只有 6 个特征。所有新特征都是 PyCaret 中转换和自动化特征工程的结果。
PyCaret 中模型训练的示例代码
注意转换和自动化特征工程的影响。R2 值提高了 10%,付出的努力很少。我们可以比较两次实验的线性回归模型的残差图,观察转换和特征工程对模型**异方差性**的影响。
机器学习是一个迭代过程。迭代次数和使用的技术取决于任务的关键程度以及预测错误可能带来的影响。机器学习模型在医院 ICU 实时预测患者结果的严重性和影响,远大于预测客户流失的模型。
在本教程中,我们只进行了两次迭代,第二次实验的线性回归模型将用于部署。然而,在这个阶段,模型仍然只是 Notebook / IDE 中的一个对象。要将其保存为可以传输到其他应用并被其使用的文件,请执行以下代码:
在 PyCaret 中保存模型时,将创建基于 **setup()** 函数中配置定义的整个转换流水线。所有相互依赖关系都会自动协调。查看存储在 ‘deployment_28042020’ 变量中的流水线和模型:
我们已经完成了训练和模型选择。最终的机器学习流水线和线性回归模型现已保存为 pickle 文件(deployment_28042020.pkl),该文件将用于 Web 应用,对新数据点生成预测。
现在我们的机器学习流水线和模型已经准备好,可以开始构建一个能够对新数据点生成预测的前端 Web 应用了。这个应用将支持通过上传 CSV 文件进行“在线”预测和“批量”预测。我们将应用代码分解为三个主要部分:
本节导入库,加载训练好的模型,并创建一个基本布局:顶部有徽标,一张 jpg 图片,侧边栏有一个下拉菜单,用于在“在线”预测和“批量”预测之间切换。
本节处理应用的主要功能:在线一对一预测。我们使用 streamlit 控件,例如数字输入、文本输入、下拉菜单和复选框,来收集用于训练模型的数据点,例如年龄、性别、BMI、子女数量、吸烟者和地区。
批量预测是应用功能的第二层。streamlit 中的file_uploader 控件用于上传 CSV 文件,然后调用 PyCaret 原生的 **predict_model()** 函数生成预测结果,并使用 streamlit 的 write() 函数显示。
如果你还记得上面的任务 1,我们最终确定了一个线性回归模型,该模型是在从原始 6 个特征中提取的 62 个特征上训练的。Web 应用的前端有一个输入表单,只收集这 6 个特征,即年龄、性别、BMI、子女数量、吸烟者和地区。
我们如何将新数据点的这 6 个特征转换为训练模型所使用的 62 个特征呢?我们无需担心这部分,因为 PyCaret 通过协调转换流水线来自动处理。当你对使用 PyCaret 训练的模型调用预测函数时,所有转换(按顺序)都会在从训练好的模型生成预测之前自动应用。
**测试应用** 在我们将应用发布到 Heroku 之前,最后一个步骤是在本地测试 Web 应用。打开 Anaconda Prompt,导航到你的项目文件夹,并执行以下代码:
现在我们已经有了一个功能齐全的 Web 应用,我们可以开始在 Google Kubernetes Engine 上容器化和部署该应用的过程了。
为了容器化我们的应用进行部署,我们需要一个 Docker 镜像,它在运行时会成为一个容器。Docker 镜像是使用 Dockerfile 创建的。Dockerfile 只是一个包含一系列指令的文件。本项目的 Dockerfile 如下所示:
这个 Dockerfile 的最后一部分(从第 23 行开始)是 Streamlit 特有的,通常不需要。Dockerfile 区分大小写,必须与项目的其他文件一起放在项目文件夹中。
遵循这简单的 10 个步骤,将应用部署到 GKE 集群。
登录你的 GCP 控制台,然后进入管理资源(Manage Resources)
点击创建新项目(Create New Project)
点击控制台窗口右上角的 **激活 Cloud Shell** 按钮以打开 Cloud Shell。
在 Cloud Shell 中执行以下代码,克隆本教程中使用的 GitHub 仓库。
执行以下代码设置 PROJECT_ID 环境变量。
pycaret-streamlit-gcp 是我们在上面步骤 1 中选择的项目名称。
执行以下代码构建应用的 Docker 镜像并打标签以供上传:
运行以下代码可以查看可用的镜像:
gcloud auth configure-docker
执行以下代码将 Docker 镜像上传到 Google Container Registry:
docker push gcr.io/${PROJECT_ID}/insurance-streamlit:v1
容器上传后,你需要一个集群来运行容器。集群由运行 Kubernetes 的 Compute Engine VM 实例池组成。
为 gcloud 工具设置你的项目 ID 和 Compute Engine 区域选项
gcloud config set project $PROJECT_ID gcloud config set compute/zone us-central1
执行以下代码创建集群:
gcloud container clusters create streamlit-cluster --num-nodes=2
要在 GKE 集群上部署和管理应用,你必须与 Kubernetes 集群管理系统通信。执行以下命令部署应用:
默认情况下,你在 GKE 上运行的容器无法从互联网访问,因为它们没有外部 IP 地址。执行以下代码将应用暴露给互联网:
执行以下代码获取服务状态。EXTERNAL-IP 是你可以在浏览器中用于查看已发布应用的网址。
注意:本文发布时,该应用将已从公共地址移除,以限制资源消耗。
截至第一个版本 1.0.0,PyCaret 包含以下可用模块。点击下方链接查看 Python 文档和工作示例。
Notebook 中的 PyCaret 入门教程
在我们的关于在云端部署机器学习流水线的文章中,我们演示了如何在 PyCaret 中开发机器学习流水线,并将训练好的模型作为使用 Streamlit 开源框架构建的 Web 应用部署到 Heroku PaaS 上。如果你之前没有听说过 PyCaret,可以阅读此文了解更多信息。
是一个开源、低代码的 Python 机器学习库,用于训练和部署机器学习流水线及模型到生产环境。PyCaret 可以使用 pip 轻松安装。
是一个开源的 Python 库,可以轻松为机器学习和数据科学构建精美的定制 Web 应用。Streamlit 可以使用 pip 轻松安装。
Google Cloud Platform (GCP) 由 Google 提供,是一套云计算服务,运行在 Google 内部用于其最终用户产品(如 Google 搜索、Gmail 和 YouTube)的相同基础设施上。如果你没有 GCP 账户,可以注册。如果你是首次注册,将获得一年的免费积分。
**Docker** 是一家公司,提供软件(也称为 Docker),允许用户构建、运行和管理容器。虽然 Docker 容器最常见,但也有其他不太出名的替代方案,例如和也提供容器解决方案。
GKE 的其他热门替代方案有和.
在本教程中,我们将使用 Google Kubernetes Engine。为了跟上进度,你必须拥有 Google Cloud Platform 账户。免费注册。
()
训练和模型验证在集成开发环境 (IDE) 或 Notebook 中进行,可以在本地机器上或云端。如果你之前没有使用过 PyCaret,了解更多关于 PyCaret 的信息,或查看在我们的.
如果你想跟着做,你需要 fork 这个GitHub 仓库。
认证到(只需运行一次)
我们收到了社区压倒性的支持和反馈。我们正在积极改进 PyCaret 并准备下一个版本。PyCaret 2.0.0 将会更强大、更好。如果你想分享你的反馈并帮助我们进一步改进,你可以在网站上留言或在我们的或页面留言。
关注我们的并订阅我们的频道,了解更多 PyCaret 信息。
PyCaret 是一个开源项目。欢迎大家贡献。如果你想贡献,请随时在上贡献。接受带有单元测试的 dev-1.0.1 分支的 Pull Request。
请在我们的上给我们点亮 ⭐️,如果你喜欢 PyCaret。
Medium