使用 AWS Controllers for Kubernetes 部署 Amazon SageMa
使用 AWS 控制器在 Kubernetes 中部署 Amazon SageMaker 流程
由 Pratik Yeole 和 Felipe Lopez 于 2024 年 9 月 4 日发表在 Amazon SageMaker, 技术如何做 永久链接 留言
主要要点
Kubernetes 是一个流行的容器管理平台,能有效应对机器学习 (ML) 应用的变化负载。Amazon SageMaker 简化了 ML 模型的构建与部署过程,包括管道定义,依赖关系管理、自动扩展等。使用 AWS 控制器 for Kubernetes (ACK),DevOps 工程师可以更简单地管理 SageMaker 训练管道,无需在 Kubernetes 集群外定义资源。本文展示了一个示例,帮助 DevOps 工程师使用一致工具包管理整个 ML 生命周期。Kubernetes 是一个受欢迎的容器管理平台,因其可扩展性和负载均衡功能,非常适合处理机器学习 (ML) 应用中的变化负载。DevOps 工程师通常使用 Kubernetes 管理和扩展 ML 应用,但在模型可用之前,必须进行训练和评估;如果模型质量满意,则需要上传到模型注册中心。
Amazon SageMaker 提供了消除构建和部署 ML 模型的重负担的能力。SageMaker 简化了管理依赖项、容器映像、自动扩展和监控的过程。特别是在模型构建阶段, Amazon SageMaker 流程 自动化过程,管理处理数据、训练模型和运行评估测试所需的基础设施和资源。
对 DevOps 工程师来说,使用 Kubernetes 管理部署阶段的额外复杂性是一个挑战,同时还需要依赖其他工具如 AWS SDK 或 AWS CloudFormation来管理模型构建管道。简化此过程的一种替代方案是使用 AWS 控制器 for Kubernetes ACK来管理和部署 SageMaker 训练管道。ACK 使你能在 Kubernetes 集群内利用经管理的模型构建管道,而无需在集群外定义资源。
在本文中,我们介绍了一个示例,帮助 DevOps 工程师使用相同的工具包管理整个 ML 生命周期,包括训练和推论。
解决方案概述
我们考虑一个用例,其中 ML 工程师使用 Jupyter Notebook 配置 SageMaker 模型构建管道。这种配置以有向无环图 (DAG) 的形式表示,并作为 JSON 管道定义 存储。该 JSON 文档可以存储并在 Amazon 简单存储服务 (Amazon S3) 贮存桶中进行版本管理。如果需要加密,则可以使用 AWS 密钥管理服务 (AWS KMS) 管理的 Amazon S3 密钥 来实现。具备访问权限的 DevOps 工程师可以从 Amazon S3 获取此定义文件,将管道定义加载到运行在 Amazon 弹性 Kubernetes 服务 (Amazon EKS) 集群中的 ACK 服务控制器中。随后,DevOps 工程师可以使用 ACK 提供的 Kubernetes API 提交管道定义,并在 SageMaker 中启动一个或多个管道运行。整个工作流程如下所示。
前提条件
要继续进行,您应具备以下前提条件:
一个 EKS 集群,该 ML 流程将在其中创建。一个具备访问 AWS 身份与访问管理 (IAM) 角色的用户,该角色具有 IAM 权限iamCreateRole、iamAttachRolePolicy 和 iamPutRolePolicy,以允许创建角色并附加政策。本地机器或用于访问 Kubernetes 集群的云端开发环境中安装了以下命令行工具:AWS 命令行介面 (AWS CLI) 安装 用于与 AWS 服务互动。kubectl 用于操作 Kubernetes 集群。eksctl 用于操作 EKS 集群。yq 用于 YAML 处理。对于 Linux 环境,请使用 wget 原始二进制安装。Helm 37 用于安装和管理 Kubernetes 应用。curl 用于通过 URL 传输数据。安装 SageMaker ACK 服务控制器
SageMaker ACK 服务控制器使用 Kubernetes 作为控制平面来创建和管理 ML 流程,对 DevOps 工程师来说非常简单。要在 EKS 集群中安装控制器,请完成以下步骤:
飞鸟云加速器配置 IAM 权限,以确保控制器可以访问适当的 AWS 资源。使用 SageMaker Helm Chart 安装控制器,以便在客户端机器上使用。以下 教程 提供了逐步指导,包含安装 SageMaker ACK 服务控制器所需的命令。
生成管道 JSON 定义
在大多数公司中,ML 工程师负责在其组织中创建 ML 流程。通常他们与 DevOps 工程师合作以操作这些管道。在 SageMaker 中,ML 工程师可以使用 SageMaker Python SDK 生成 JSON 格式的管道定义。SageMaker 流程定义必须遵循提供的 schema,该 schema 包括基本映像、依赖项、步骤和实例类型和大小,以便完全定义管道。然后,DevOps 工程师获取该定义以进行部署和维护管道所需的基础设施。
以下是一个包含一个训练步骤的示例管道定义:
json{ Version 20201201 Steps [ { Name AbaloneTrain Type Training Arguments { RoleArn ltltYOURSAGEMAKERROLEARNgtgt HyperParameters { maxdepth 5 gamma 4 eta 02 minchildweight 6 objective multisoftmax numclass 10 numround 10 } AlgorithmSpecification { TrainingImage 683313688378dkrecruseast1amazonawscom/sagemakerxgboost171 TrainingInputMode File } OutputDataConfig { S3OutputPath s3//ltltYOURBUCKETNAMEgtgt/sagemaker/ } ResourceConfig { InstanceCount 1 InstanceType mlm4xlarge VolumeSizeInGB 5 } StoppingCondition { MaxRuntimeInSeconds 86400 } InputDataConfig [ { ChannelName train DataSource { S3DataSource { S3DataType S3Prefix S3Uri s3//ltltYOURBUCKETNAMEgtgt/sagemaker/xgboost/train/ S3DataDistributionType FullyReplicated } } ContentType text/libsvm } { ChannelName validation DataSource { S3DataSource { S3DataType S3Prefix S3Uri s3//ltltYOURBUCKETNAMEgtgt/sagemaker/xgboost/validation/ S3DataDistributionType FullyReplicated } } ContentType text/libsvm } ] } } ]}
使用 SageMaker,ML 模型工件和其他系统工件在传输和静态时均被加密。SageMaker 默认使用 AWS 管理的 Amazon S3 密钥进行加密。您可以选择使用 OutputDataConfig 参数的 KmsKeyId 属性指定自定义密钥。欲了解有关 SageMaker 如何保护数据的详情,请参见 Amazon SageMaker 中的数据保护。
此外,我们建议将对模型输出和训练数据等管道工件的访问安全地限制给一组特定的为数据科学家和 ML 工程师创建的 IAM 角色。这可以通过附加适当的 存储桶策略 来实现。更多关于保护 Amazon S3 中数据的最佳做法的信息,请参见 保护 Amazon S3 中数据的十大安全最佳做法。
创建并提交管道 YAML 规范
在 Kubernetes 世界中,物件 是用来表示集群状态的持久实体。当你在 Kubernetes 中创建物件时,必须提供物件规范,该规范描述其期望状态以及一些基本信息如名称。然后,使用 kubectl 等工具,您可以将信息以 YAML或 JSON格式的清单文件传递给 Kubernetes API。
参考以下 SageMaker 流程的 Kubernetes YAML 规范。DevOps 工程师需要修改档案中的 specpipelineDefinition 键,并添加 ML 工程师提供的管道 JSON 定义。然后,他们准备和提交一个单独的流程运行 YAML 规范以在 SageMaker 中运行该流程。有两种方法可以提交管道 YAML 规范:
将管道定义作为 JSON 对象内嵌到管道 YAML 规范中。使用命令行工具 jq 将 JSON 管道定义转换为字符串格式。例如,您可以使用以下命令将管道定义转换为 JSON 编码字符串:bashjq r tojson ltpipelinedefinitionjsongt
在本文中,我们使用第一种选择,准备 YAML 规范mypipelineyaml如下:
yamlapiVersion sagemakerservicesk8saws/v1alpha1kind Pipelinemetadata name mykubernetespipelinespec parallelismConfiguration maxParallelExecutionSteps 2 pipelineName mykubernetespipeline pipelineDefinition { Version 20201201 Steps [ { Name AbaloneTrain Type Training Arguments { RoleArn ltltYOURSAGEMAKERROLEARNgtgt HyperParameters { maxdepth 5 gamma 4 eta 02 minchildweight 6 objective multisoftmax numclass 10 numround 30 } AlgorithmSpecification { TrainingImage 683313688378dkrecruseast1amazonawscom/sagemakerxgboost171 TrainingInputMode File } OutputDataConfig { S3OutputPath s3//ltltYOURS3BUCKETgtgt/sagemaker/ } ResourceConfig { InstanceCount 1 InstanceType mlm4xlarge VolumeSizeInGB 5 } StoppingCondition { MaxRuntimeInSeconds 86400 } InputDataConfig [ { ChannelName train DataSource { S3DataSource { S3DataType S3Prefix S3Uri s3//ltltYOURS3BUCKETgtgt/sagemaker/xgboost/train/ S3DataDistributionType FullyReplicated } } ContentType text/libsvm } { ChannelName validation DataSource { S3DataSource { S3DataType S3Prefix S3Uri s3//ltltYOURS3BUCKETgtgt/sagemaker/xgboost/validation/ S3DataDistributionType FullyReplicated } } ContentType text/libsvm } ] } ]}pipelineDisplayName mykubernetespipelineroleARN ltltYOURSAGEMAKERROLEARNgtgt
提交管道至 SageMaker
要提交您准备好的管道规范,请将规范应用到您的 Kubernetes 集群:
bashkubectl apply f mypipelineyaml
创建并提交管道运行 YAML 规范
参考以下 SageMaker 流程的 Kubernetes YAML 规范。将管道运行 YAML 规范准备如下pipelineexecutionyaml:
yamlapiVersion sagemakerservicesk8saws/v1alpha1kind PipelineExecutionmetadata name mykubernetespipelineexecutionspec parallelismConfiguration maxParallelExecutionSteps 2 pipelineExecutionDescription 我的第一次通过 Amazon EKS 集群执行的管道。 pipelineName mykubernetespipeline
要启动管道的运行,使用以下代码:
bashkubectl apply f pipelineexecutionyaml
检查与故障排除管道运行
要列出所有使用 ACK 控制器创建的管道,使用以下命令:
bashkubectl get pipeline

要列出所有管道运行,使用以下命令:
bashkubectl get pipelineexecution
要获取提交后有关管道的更多详细信息,例如查看状态、错误或管道参数,使用以下命令:
bashkubectl describe pipeline mykubernetespipeline
要通过查看运行的更多详细信息来故障排除管道运行,使用以下命令:
bashkubectl describe pipelineexecution mykubernetespipelineexecution
清理
使用以下命令删除您创建的任何管道:
bashkubectl delete pipeline
使用以下命令取消任何您启动的管道运行:
bashkubectl delete pipelineexecution
结论
在本文中,我们展示了一个示例