如今,许多 AWS 客户正在构建企业级机器学习 (ML) 平台 Amazon Elastic Kubernetes服务 (亚马逊 EKS)使用 AWS 上的 Kubeflow (Kubeflow 的 AWS 特定发行版)跨越许多用例,包括计算机视觉、自然语言理解、语音翻译和金融建模。
随着 最新发布的开源 Kubeflow v1.6.1,Kubeflow 社区继续支持企业用例大规模采用 Kubeflow。 最新版本包括许多令人兴奋的新功能,例如支持 Kubernetes v1.22,结合用于 PyTorch 的 Python SDK、MXNet、MPI、Kubeflow 分布式训练运算符中的 XGBoost、用于模型服务的新 ClusterServingRuntime 和 ServingRuntime CRD 等等。
AWS 对 Kubeflow 的贡献最近在 AWS 1.6.1 上推出了 Kubeflow,它支持所有上游开源 Kubeflow 功能,并包括许多与高度优化、云原生、企业就绪的 AWS 服务的新集成,这些服务将帮助您构建高度可靠、安全、便携和可扩展的 ML 系统。
在这篇文章中,我们讨论了 AWS v1.6.1 上的新 Kubeflow 功能,并强调了捆绑在一个平台上的三个重要集成,可为您提供:
- 基础架构即代码 (IaaC) 一键式解决方案,可自动完成 Kubeflow 的端到端安装,包括 EKS 集群创建
- 支持分布式训练 亚马逊SageMaker 运用 适用于 Kubernetes 的 Amazon SageMaker 操作员 (确认)和 Kubeflow 管道的 SageMaker 组件 并在 Kubernetes 本地使用 Kubeflow 培训操作员. 许多客户正在使用此功能构建混合机器学习架构,他们在实验阶段利用 Kubernetes 计算并利用 SageMaker 运行生产规模的工作负载。
- 使用 Prometheus、Grafana 和 亚马逊CloudWatch 集成
本博客中的用例将特别关注 SageMaker 与 AWS 上的 Kubeflow 的集成,可以将其添加到您现有的 Kubernetes 工作流中,从而使您能够构建混合机器学习架构。
AWS 上的 Kubeflow
AWS 1.6.1 上的 Kubeflow 提供了使用 Kubeflow 的清晰路径,并在现有功能之上添加了以下 AWS 服务:
- SageMaker 与 Kubeflow 集成,使用 SageMaker Operators for Kubernetes (ACK) 和 SageMaker Components for Kubeflow Pipelines 运行混合机器学习工作流。
- 使用 Kustomize 脚本和 Helm 图表改进和简化了自动化部署选项。
- 添加了对基础设施即代码 (IaC) 的支持,使用 Terraform 在 AWS 上为 Kubeflow 一键部署所有可用的 部署选项. 此脚本自动创建以下 AWS 资源:
- 经验 AWS私有链接 适用于 Amazon S3,使非商业区域用户能够连接到他们各自的 S3 端点。
- 添加了集成 亚马逊普罗米修斯托管服务 (AMP) 和 亚马逊托管 Grafana 在 AWS 上使用 Kubeflow 监控指标。
- 使用基于 TensorFlow 2.10.0 和 PyTorch 1.12.1 的最新深度学习容器映像更新了 Kubeflow 笔记本服务器容器。
- 与 AWS DLC 集成以运行分布式 训练 和 推理 工作量。
以下架构图是可用于 AWS 上的 Kubeflow 控制和数据平面组件的所有服务集成(包括已经提到的那些)的快速快照。 Kubeflow 控制平面安装在 Amazon EKS 之上,这是一种托管容器服务,用于在云中运行和扩展 Kubernetes 应用程序。 这些 AWS 服务集成使您能够将 Kubeflow 控制平面的关键部分与 Kubernetes 分离,从而提供安全、可扩展、有弹性且成本优化的设计。 有关这些服务集成为开源 Kubeflow 添加的价值的更多详细信息,请参阅 使用 AWS 上的 Kubeflow 在 Kubernetes 上构建和部署可扩展的机器学习系统.
让我们更详细地讨论 Kubeflow on AWS 1.6.1 的主要功能如何对您的组织有所帮助。
AWS 上的 Kubeflow 功能详细信息
在 Kubeflow 1.6.1 版本中,我们试图为不同类型的客户提供更好的工具,无论您选择哪种选项,都可以轻松开始使用 Kubeflow。 这些工具提供了一个很好的起点,并且可以进行修改以满足您的具体需求。
部署选项
我们为不同的客户用例提供不同的部署选项。 在这里,您可以选择要将 Kubeflow 部署与哪些 AWS 服务集成。 如果您决定稍后更改部署选项,我们建议您为新部署执行全新安装。 以下部署选项可用:
如果您想以最少的更改部署 Kubeflow,请考虑 香草 部署选项。 所有可用的部署选项都可以使用 Kustomize、Helm 或 Terraform 安装。
我们还有不同的附加部署,可以安装在这些部署选项之上:
安装选项
在确定了最适合您需要的部署选项后,您可以选择安装这些部署的方式。 为了同时为专家和新手提供服务,我们采用了不同级别的自动化和配置。
选项 1:Terraform (IaC)
这将创建一个 EKS 集群和所有相关的 AWS 基础设施资源,然后使用 Terraform 在一个命令中部署 Kubeflow。 在内部,这使用 EKS 蓝图和 Helm 图表。
此选项具有以下优点:
- 它为企业提供了灵活性,可以通过一条命令部署 Amazon EKS 和 Kubeflow,而无需担心特定的 Kubeflow 组件配置。 这将极大地帮助加快技术评估、原型设计和产品开发生命周期,提供使用 Terraform 模块和修改它以满足任何项目特定需求的灵活性。
- 如今,许多将 Terraform 作为其云战略中心的组织现在可以使用 Kubeflow on AWS Terraform 解决方案来实现其云目标。
选项 2:Kustomize 或 Helm 图表:
此选项允许您分两步部署 Kubeflow:
- 通过 AWS 发行版中包含的自动化脚本或手动遵循 一步一步的指导.
- 使用 Helm 图表或 Kustomize 安装 Kubeflow 部署。
此选项具有以下优点:
- 此安装选项的主要目标是提供与 Kubeflow 相关的 Kubernetes 配置。 因此,您可以选择创建或引入现有的 EKS 集群或任何相关的 AWS 资源,如 Amazon RDS、Amazon S3 和 Amazon Cognito,并配置和管理它以与 AWS 上的 Kubeflow 一起使用。
- 从开源 Kustomize Kubeflow 清单迁移到 AWS Kubeflow 分布更容易。
下图说明了这两个选项的体系结构。
与 SageMaker 集成
SageMaker 是一项完全托管的服务,专为管理 ML 工作流而设计和优化。 它消除了基础设施管理的无差别繁重工作,并且无需投资 IT 和 DevOps 来管理用于 ML 模型构建、训练和推理的集群。
许多有可移植性要求或本地标准限制的 AWS 客户使用 Amazon EKS 来设置可重复的 ML 管道来运行训练和推理工作负载。 然而,这需要开发人员编写自定义代码来优化底层 ML 基础架构,提供高可用性和可靠性,并遵守适当的安全和法规要求。 因此,这些客户希望将 SageMaker 用于模型训练和部署的成本优化和托管基础设施,并继续使用 Kubernetes 进行编排和 ML 管道以保持标准化和可移植性。
为满足这一需求,AWS 允许您使用以下两个选项从 Amazon EKS 在 SageMaker 中训练、调整和部署模型:
- Amazon SageMaker ACK Operators for Kubernetes,基于 适用于 Kubernetes 的 AWS 控制器 (ACK) 框架。 ACK 是 AWS 策略,它引入了构建 Kubernetes 自定义控制器的标准化,允许 Kubernetes 用户通过使用 Kubernetes API 来配置数据库或消息队列等 AWS 资源。 SageMaker ACK Operators 使使用 Kubernetes 作为控制平面的 ML 开发人员和数据科学家可以更轻松地在 SageMaker 中训练、调整和部署 ML 模型,而无需登录 SageMaker 控制台。
- 用于Kubeflow管道的SageMaker组件,它允许您将 SageMaker 与 Kubeflow Pipelines 的可移植性和编排功能相集成。 使用 SageMaker 组件,管道工作流中的每个作业都在 SageMaker 而不是本地 Kubernetes 集群上运行。 这允许您从 Kubeflow 管道创建和监控本地 SageMaker 训练、调整、端点部署和批量转换作业,从而允许您将包括数据处理和训练作业在内的完整计算从 Kubernetes 集群移动到 SageMaker 的机器学习优化托管服务。
从 AWS v1.6.1 上的 Kubeflow 开始,所有可用的 Kubeflow 部署选项默认将两个 Amazon SageMaker 集成选项结合在一个平台上。 这意味着,您现在可以使用 SageMaker ACK 运算符从 Kubeflow 笔记本服务器本身提交自定义 SageMaker 资源或使用 SageMaker 组件从 Kubeflow 管道步骤提交 SageMaker 作业。
SageMaker 组件有两个版本 – 博托3 (适用于 Python 的 AWS 开发工具包的 AWS 开发工具包)基于版本 1 的组件和基于 SageMaker Operator for K8s (ACK) 的版本 2 组件。 新的 SageMaker 组件版本 2 支持最新的 SageMaker 培训 api,我们将继续向该版本的组件添加更多 SageMaker 功能。 但是,您可以灵活地将 Sagemaker 组件版本 2 用于训练,将版本 1 用于其他 SageMaker 功能,例如超参数调整、处理作业、托管等。
与 Prometheus 和 Grafana 集成
Prometheus 是一种开源指标聚合工具,您可以将其配置为在 Kubernetes 集群上运行。 在 Kubernetes 集群上运行时,主 Prometheus 服务器会定期抓取 pod 端点。
Kubeflow 组件,例如 Kubeflow Pipelines (KFP) 和 Notebook,发出 Prometheus 指标以允许监控组件资源,例如运行实验的数量或笔记本计数。
这些指标可以由在 Kubernetes 集群中运行的 Prometheus 服务器聚合,并使用 Prometheus 查询语言 (PromQL) 进行查询。 有关 Prometheus 支持的功能的更多详细信息,请查看 普罗米修斯文档.
Kubeflow on AWS 发行版支持与以下 AWS 托管服务的集成:
- Amazon Managed Prometheus (AMP) 是一个 普罗米修斯兼容的容器基础设施监控服务和容器应用指标,使客户可以轻松安全地大规模监控容器环境。 使用 AMP,您可以对从可观察性系统中的多个数据源(包括 AWS、第三方 ISV 和 IT 产品组合中的其他资源)收集的指标、日志和跟踪进行可视化、分析和警报。
- Amazon Managed Grafana,一个基于开源的完全托管和安全的数据可视化服务 格拉法纳 项目,使客户能够即时查询、关联和可视化来自多个数据源的应用程序的操作指标、日志和跟踪。 Amazon Managed Grafana 通过随着使用需求的增加自动扩展计算和数据库基础设施,以及自动版本更新和安全补丁,从而减轻了 Grafana 的运营管理负担。
Kubeflow on AWS 发行版为 Amazon Managed Service for Prometheus 和 Amazon Managed Grafana 的集成提供支持,以促进 Prometheus 指标的大规模安全摄取和可视化。
以下指标被摄取并可以可视化:
- 从 Kubeflow 组件(例如 Kubeflow 管道和笔记本服务器)发出的指标
- Kubeflow 控制平面指标
要为您的 Kubeflow 集群配置 Amazon Managed Service for Prometheus 和 Amazon Managed Grafana,请参阅 使用 Prometheus、Amazon Managed Service for Prometheus 和 Amazon Managed Grafana 通过 Kubeflow on AWS 监控指标.
解决方案概述
在此用例中,我们使用使用 Terraform 安装选项的 Kubeflow vanilla 部署。 安装完成后,我们登录到 Kubeflow 仪表板。 在仪表板上,我们启动了一个 Kubeflow Jupyter 笔记本服务器来构建一个 Kubeflow 管道,该管道使用 SageMaker 为图像分类模型运行分布式训练,并使用 SageMaker 端点进行模型部署。
先决条件
确保您满足以下先决条件:
- 你有一个 AWS账户.
- 确保您在
us-west-2
运行此示例的区域。 - 使用谷歌浏览器与 AWS管理控制台 和库贝流。
- 使用 Service Quotas 控制台确保您的账户将 ml.p3.2xlarge 的 SageMaker 培训资源类型限制增加到 2。
- 或者,您可以使用 AWS 云9,一个基于云的集成开发环境 (IDE),可以通过 Web 浏览器完成所有工作。 有关设置说明,请参阅 设置 Cloud9 IDE. 在 AWS Cloud18.04 设置中选择 Ubuntu Server 9 作为平台。然后从您的 AWS Cloud9 环境中,选择加号并打开新终端。
您还配置了一个 AWS命令行界面 (AWS CLI) 配置文件。 为此,您需要一个访问密钥 ID 和秘密访问密钥 AWS身份和访问管理 (我是) 用户 具有管理权限(附加现有托管策略)和编程访问权限的帐户。 请参阅以下代码:
验证 cloud9 将用于调用 AWS 资源的权限。
从以下输出中验证您是否看到您在 AWS CLI 配置文件中配置的管理员用户的 arn。 在这个例子中它是“kubeflow-user”
在 AWS 上安装 Amazon EKS 和 Kubeflow
要在 AWS 上安装 Amazon EKS 和 Kubeflow,请完成以下步骤:
- 设置用于在 AWS 上部署 Kubeflow 的环境:
- 使用 Terraform 在 AWS 和相关 AWS 资源(如 EKS)上部署原始版本的 Kubeflow。 请注意,EKS 节点组中使用的 EBS 卷在默认情况下未加密:
设置 Kubeflow 权限
- 向 Notebook pod 和 Pipeline component pod 添加权限以使用以下方式调用 SageMaker、S3 和 IAM api
kubeflow_iam_permissions.sh
脚本。 - 创建 SageMaker 执行角色,使 SageMaker 训练作业能够使用 S3 服务访问训练数据集
sagemaker_role.sh
脚本。
访问 Kubeflow 仪表板
要访问 Kubeflow 仪表板,请完成以下步骤:
- 您可以在 Cloud9 环境中本地运行 Kubeflow 仪表板,而无需通过运行以下命令将您的 URL 暴露给公共互联网。
- 预览正在运行的应用程序.
- 选择 Kubeflow 仪表板一角的图标,将其作为 Chrome 中的单独选项卡打开。
- 输入默认凭据(
user@example.com/12341234
) 登录到 Kubeflow 仪表板。
在 AWS 环境中设置 Kubeflow
登录到 Kubeflow 仪表板后,请确保您拥有正确的命名空间 (kubeflow-user-example-com
)选择。 完成以下步骤以设置您的 Kubeflow on AWS 环境:
- 在 Kubeflow 仪表板上,选择 笔记本电脑 在导航窗格中。
- 新笔记本.
- 针对 名字,输入
aws-nb
. - 针对 Jupyter 案卷图像, 选择图像
jupyter-pytorch:1.12.0-cpu-py38-ubuntu20.04-ec2-2022-09-20
(最新可用jupyter-pytorch
DLC图像)。 - 针对 中央处理器,输入
1
. - 针对 内存,输入
5
. - 针对 图形处理器, 离开为 不包含.
- 不要对 工作区 和 数据量 部分。
- 选择 允许访问 Kubeflow Pipelines ,在 配置结构图 部分并选择启动。
- 验证您的笔记本是否已成功创建(可能需要几分钟)。
- 分享链接 登录 JupyterLab。
- 通过输入克隆回购
https://github.com/aws-samples/eks-kubeflow-cloudformation-quick-start.git
,在 克隆一个仓库 领域。 - 克隆.
运行分布式训练示例
设置 Jupyter 笔记本后,您可以使用文件夹中的以下高级步骤运行整个演示 eks-kubeflow-cloudformation-quick-start/workshop/pytorch-distributed-training
在克隆的存储库中:
- 运行 PyTorch 分布式数据并行 (DDP) 训练脚本 – 参考PyTorch DDP训练脚本
cifar10-distributed-gpu-final.py
,其中包括示例卷积神经网络和在多节点 CPU 和 GPU 集群上分发训练的逻辑。 - 创建 Kubeflow 流水线 – 运行笔记本
STEP1.0_create_pipeline_k8s_sagemaker.ipynb
创建在 SageMaker 上运行和部署模型的管道。 确保将 SageMaker 库安装为第一个笔记本单元的一部分,并在运行其余笔记本单元之前重新启动内核。 - 调用 SageMaker 端点 – 运行笔记本
STEP1.1_invoke_sagemaker_endpoint.ipynb
调用和测试在上一个笔记本中创建的 SageMaker 模型推理端点。
在随后的部分中,我们将详细讨论这些步骤中的每一个。
运行 PyTorch DDP 训练脚本
作为分布式训练的一部分,我们训练了一个由在 CIFAR10 数据集上运行的简单卷积神经网络创建的分类模型。 训练脚本 cifar10-distributed-gpu-final.py
仅包含开源库,并且兼容在 GPU 设备或 CPU 实例上的 Kubernetes 和 SageMaker 训练集群上运行。 在运行笔记本示例之前,让我们先看看训练脚本的几个重要方面。
我们使用 torch.distributed
模块,其中包含 PyTorch 支持和通信原语,用于集群中跨节点的多进程并行:
我们使用卷积层、最大池化层和线性层的组合创建一个简单的图像分类模型,其中 relu
激活函数应用于模型训练的前向传播:
如果训练集群有 GPU,则脚本在 CUDA 设备上运行训练,并且 device 变量保存默认的 CUDA 设备:
在使用 PyTorch 运行分布式训练之前 DistributedDataParallel
要在多个节点上运行分布式处理,您需要通过调用初始化分布式环境 init_process_group
. 这是在训练集群的每台机器上初始化的。
我们实例化分类器模型并将模型复制到目标设备。 如果启用分布式训练以在多个节点上运行,则 DistributedDataParallel
类用作模型对象的包装对象,允许跨多台机器进行同步分布式训练。 输入数据在批次维度上被拆分,模型的副本被放置在每台机器和每台设备上。 请参见以下代码:
创建 Kubeflow 流水线
笔记本使用了 Kubeflow管道SDK 及其提供的一组 Python 包,用于指定和运行 ML 工作流管道。 作为此 SDK 的一部分,我们使用领域特定语言 (DSL) 包装饰器 dsl.pipeline
,它修饰 Python 函数以返回管道。
Kubeflow 管道使用 SageMaker 组件 V2,使用 SageMaker ACK 运算符将训练提交给 SageMaker。 SageMaker 模型创建和模型部署使用 SageMaker 组件 V1,它是基于 Boto3 的 SageMaker 组件。 我们在此示例中结合使用了这两个组件,以展示您在选择方面的灵活性。
- 使用以下代码加载 SageMaker 组件:
在以下代码中,我们创建了 Kubeflow 管道,我们在其中使用两个运行 SageMaker 分布式训练
ml.p3.2xlarge
实例:定义管道后,您可以使用 Kubeflow Pipelines SDK 将管道编译为 Argo YAML 规范
kfp.compiler
包裹。 您可以使用 Kubeflow Pipelines SDK 客户端运行此管道,该客户端调用 Pipelines 服务端点并直接从笔记本传入适当的身份验证标头。 请参见以下代码: - 选择 运行详情 最后一个单元格下的链接可查看 Kubeflow 管道。 以下屏幕截图显示了 SageMaker 培训和部署组件的管道详细信息。
- 选择训练作业步骤并在 日志 选项卡,选择 CloudWatch 日志链接以访问 SageMaker 日志。
以下屏幕截图显示了两个 ml.p3.2xlarge 实例中每个实例的 CloudWatch 日志。 - 选择任何组以查看日志。
- 通过选择 Sagemaker – 部署模型 步骤并复制
endpoint_name
输出神器值。
调用 SageMaker 端点
笔记本 STEP1.1_invoke_sagemaker_endpoint.ipynb
调用在上一步中创建的 SageMaker 推理端点。 确保更新端点名称:
清理
要清理您的资源,请完成以下步骤:
- 在 AWS Cloud9 中运行以下命令以删除 AWS 资源:
- 删除 IAM 角色“
sagemakerrole
” 使用以下 AWS CLI 命令: - 使用以下 AWS CLI 命令删除 SageMaker 终端节点:
总结
在本文中,我们强调了 AWS 1.6.1 上的 Kubeflow 通过本地 AWS 托管服务集成提供的价值,以满足企业级 AI 和 ML 用例的需求。 您可以从多个部署选项中进行选择,以使用 Terraform、Kustomize 或 Helm 通过各种服务集成在 AWS 上安装 Kubeflow。 这篇博文中的用例演示了 Kubeflow 与 SageMaker 的集成,它使用 SageMaker 托管训练集群为图像分类模型运行分布式训练,并使用 SageMaker 端点进行模型部署。
我们还提供了一个 示例管道示例 使用最新的 SageMaker 组件; 您可以直接从 Kubeflow 仪表板运行它。 该管道需要 亚马逊 S3 数据 和 SageMaker 执行 IAM 角色 作为所需的输入。
要开始使用 AWS 上的 Kubeflow,请参阅可用的 AWS 集成部署选项 AWS 上的 Kubeflow. 您可以按照 AWS 实验室存储库 跟踪所有 AWS 对 Kubeflow 的贡献。 您也可以在 Kubeflow #AWS Slack 频道; 您的反馈将帮助我们优先考虑为 Kubeflow 项目做出贡献的下一个功能。
关于作者
坎瓦尔吉特·库尔米 是 Amazon Web Services 的高级解决方案架构师。 他与 AWS 客户合作,提供指导和技术援助,帮助他们在使用 AWS 时提高解决方案的价值。 Kanwaljit 专门帮助客户使用容器化和机器学习应用程序。
卡尔蒂克·卡拉马迪 是 Amazon AI 的一名软件开发工程师。 目前专注于机器学习 Kubernetes 开源项目,例如 Kubeflow 和 AWS SageMaker Controller for k8s。 在业余时间,我喜欢玩 PC 游戏和使用 Unity 引擎摆弄 VR。
拉胡尔卡斯 是 Amazon Web Services 的软件开发工程师。 他的工作重点是将 AWS 服务与开源容器化 ML Ops 平台集成,以提高其可扩展性、可靠性和安全性。 除了关注客户对功能的要求外,Rahul 还喜欢尝试该领域的最新技术发展。