使用 SageMaker AI 和 Hydra,简化从本地开发到可扩展实验的机器学习工作流
David Sauerwein、Marco Geiger 和 Julian Ferdinand Grueber,Amazon Web Services
摘要
此模式提供统一的方法,用于在 Amazon SageMaker AI 上配置和运行从本地测试到生产的机器学习(ML)算法。尽管此模式以 ML 算法为核心,但该方法的适用范围可扩展至特征工程、推理以及整个 ML 管道。此模式通过示例使用案例演示了如何从本地脚本开发过渡到 SageMaker AI 训练作业。
典型的 ML 工作流如下:在本地计算机上开发并测试解决方案,在云端运行大规模实验(例如使用不同参数的实验),然后在云端部署经批准的解决方案。然后,必须对已部署的解决方案进行监控和维护。如果该工作流缺乏统一方法,开发人员通常需要在每个阶段重构代码。如果解决方案依赖大量可能在工作流任一阶段发生变化的参数,那么保持流程的条理性和一致性就会变得愈发困难。
此模式可应对这些挑战。首先,通过提供统一的工作流,消除了不同环境间代码重构的需求——无论在本地计算机上、容器中还是在 SageMaker AI 上运行,该工作流始终保持一致。其次,通过 Hydra 的配置系统简化参数管理,在该系统中,参数是在单独的配置文件中定义的,可轻松修改和组合,并自动记录每次运行的配置。有关此模式如何应对这些挑战的更多详细信息,请参阅其他信息。
先决条件和限制
先决条件
限制
该代码目前仅针对 SageMaker AI 训练作业。将其扩展到处理作业及整个 SageMaker AI 管道的操作较为简单。
要进行完全生产级别的 SageMaker AI 设置,需要完善其他详细信息。例如,用于计算和存储的自定义 AWS Key Management Service(AWS KMS)密钥、网络配置等。您也可通过在
config文件夹的专用子文件夹中使用 Hydra,来配置这些额外选项。部分 AWS 服务在有些 AWS 区域不可用。有关区域可用性,请参阅按区域划分的 AWS 服务
。有关特定端点,请参阅服务端点和配额,然后选择相应服务的链接。
架构
下图展示了该解决方案的架构。

下图显示了如下工作流:
数据科学家可在本地环境中对算法进行小规模迭代、调整参数,并快速测试训练脚本,无需依赖 Docker 或 SageMaker AI。(有关更多详细信息,请参阅操作说明中的“在本地运行以快速测试”任务。)
对算法感到满意后,数据科学家会构建 Docker 映像,并将其推送到名为
hydra-sm-artifact的 Amazon Elastic Container Registry(Amazon ECR)存储库。(有关更多详细信息,请参阅操作说明中的“在 SageMaker AI 上运行工作流”。)数据科学家使用 Python 脚本启动 SageMaker AI 训练作业或超参数优化(HPO)作业。对于常规训练作业,调整后的配置会写入名为
hydra-sample-config的 Amazon Simple Storage Service(Amazon S3)存储桶。对于 HPO 作业,则会应用位于config文件夹中的默认配置集。SageMaker AI 训练作业提取 Docker 映像,从 Amazon S3 存储桶
hydra-sample-data读取输入数据,然后从 Amazon S3 存储桶hydra-sample-config获取配置或使用默认配置。训练完成后,该作业会将输出数据保存到 Amazon S3 存储桶hydra-sample-data。
自动化和扩缩
如需实现自动化训练、重新训练或推理,可将 AWS CLI 代码与 AWS Lambda、AWS CodePipeline 或 Amazon EventBridge 等服务集成。
可通过更改实例大小的配置或为分布式训练添加配置来实现扩展。
工具
AWS 服务
AWS CloudFormation 可帮助您设置 AWS 资源,快速、一致地预调配这些资源,并在资源的整个生命周期内跨 AWS 账户 和 AWS 区域 来管理这些资源。
AWS Command Line Interface(AWS CLI)是一款开源工具,可帮助您在命令行 Shell 中通过命令与 AWS 服务进行交互。在此模式中,AWS CLI 对于初始资源配置和测试都很有用。
Amazon Elastic Container Registry (Amazon ECR) 是一项安全、可扩展且可靠的托管容器映像注册表服务。
Amazon SageMaker AI 是一项托管机器学习(ML)服务,可帮助您构建和训练 ML 模型,然后将其部署到生产就绪的托管环境中。SageMaker AI Training 是 SageMaker AI 中一项完全托管的机器学习服务,支持大规模训练机器学习模型。该工具利用内置的可扩展性以及与其他 AWS 服务 模型的集成,可以有效地处理训练模型的计算需求。此外,SageMaker AI Training 还支持自定义算法和容器,使其灵活适用于各种机器学习工作流。
Amazon Simple Storage Service (Amazon S3) 是一项基于云的对象存储服务,可帮助您存储、保护和检索任意数量的数据。
其他工具
Docker
是一组平台即服务(PaaS)产品,它们使用操作系统级别的虚拟化技术在容器中交付软件。在此模式中,Docker 用于确保从开发到部署的各个阶段的环境保持一致,同时可靠地打包依赖项和代码。借助 Docker 的容器化技术,工作流可轻松实现扩展与版本控制。 Hydra
是一款配置管理工具,为处理多种配置和动态资源管理提供了灵活性。它在管理环境配置方面发挥了重要作用,支持在不同的环境间无缝部署。有关 Hydra 的更多详细信息,请参阅其他信息。 Python
是通用的计算机编程语言。Python 用于编写机器学习代码和部署工作流。 Poetry
是 Python 中用于管理和打包依赖项的工具。
代码存储库
此模式的代码可在 GitHub configuring-sagemaker-training-jobs-with-hydra
最佳实践
操作说明
| 任务 | 描述 | 所需技能 |
|---|---|---|
创建和激活虚拟环境。 | 要创建和激活虚拟环境,请在存储库的根目录中运行以下命令:
| 常规 AWS |
部署基础设施。 | 要使用 CloudFormation 部署基础设施,请运行以下命令:
| 常规 AWS、DevOps 工程师 |
下载示例数据。 | 要将输入数据从 openml
| 常规 AWS |
在本地运行以快速测试。 | 要在本地运行训练代码以进行测试,请运行以下命令:
所有执行的日志会按执行时间存储在名为 您还可以使用 | 数据科学家 |
| 任务 | 描述 | 所需技能 |
|---|---|---|
设置环境变量。 | 要在 SageMaker AI 上运行作业,请设置以下环境变量,并提供您的 AWS 区域和 AWS 账户 ID:
| 常规 AWS |
创建和推送 Docker 映像。 | 要创建 Docker 映像并将其推送至 Amazon ECR 存储库,请运行以下命令:
此任务假设您的环境中已配置有效的凭证。Docker 映像被推送到上一个任务的环境变量中指定的 Amazon ECR 存储库,用于激活将在其中运行训练作业的 SageMaker AI 容器。 | ML 工程师,常规 AWS |
将输入数据复制到 Amazon S3。 | SageMaker AI 训练作业需要获取输入数据。要将输入数据复制到 Amazon S3 存储桶以获取数据,请运行以下命令:
| 数据工程师、常规 AWS |
提交 SageMaker AI 训练作业 | 为简化脚本的执行流程,请在
| 常规 AWS、ML 工程师、数据科学家 |
运行 SageMaker AI 超参数调优。 | 运行 SageMaker AI 超参数调优与提交 SageMaker AI 训练作业类似。但如 start_sagemaker_hpo_job.py 要启动超参数优化(HPO)作业,请运行以下命令:
| 数据科学家 |
故障排除
| 问题 | 解决方案 |
|---|---|
令牌已过期 | 导出新的 AWS 凭证。 |
缺少 IAM 权限 | 确保导出的 IAM 角色凭证具备部署 CloudFormation 模板和启动 SageMaker AI 训练作业所需的全部 IAM 权限。 |
相关资源
其他信息
此模式可应对以下挑战:
从本地开发到大规模部署的一致性 – 通过此模式,无论开发人员是使用本地 Python 脚本、运行本地 Docker 容器、在 SageMaker AI 上开展大规模实验,还是还是在 SageMaker AI 上进行生产环境部署,都能使用相同的工作流。这种一致性之所以重要,原因如下:
更快的迭代速度 – 支持快速开展本地实验,纵向扩展时无需进行重大调整。
无需重构 – 可无缝过渡到 SageMaker AI 上的大规模实验,无需对现有设置进行彻底修改。
持续改进 – 开发新功能和不断改进算法非常简单,因为在不同的环境中代码保持不变。
配置管理 - 此模式利用配置管理工具 Hydra
参数是在配置文件中定义的,与代码无关。
可轻松切换或组合不同的参数集。
每次运行的配置都会自动记录,简化了实验跟踪流程。
云端实验可使用与本地运行相同的配置结构,确保一致性。
通过 Hydra,您能高效管理配置,并实现以下功能:
划分配置 – 将项目配置拆分为更小、更易于管理的模块,每个模块可独立修改。采用这种方法,可以更轻松地处理复杂的项目。
轻松调整默认值 – 快速更改基准配置,让测试新想法变得更加简单。
统一 CLI 输入和配置文件 – 顺畅组合命令行输入和配置文件。这种方法可以减少混乱和混淆,使您的项目随着时间的推移更易于管理。