使用 SageMaker AI 和 Hydra,简化从本地开发到可扩展实验的机器学习工作流 - AWS Prescriptive Guidance

使用 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 的配置系统简化参数管理,在该系统中,参数是在单独的配置文件中定义的,可轻松修改和组合,并自动记录每次运行的配置。有关此模式如何应对这些挑战的更多详细信息,请参阅其他信息

先决条件和限制

先决条件

  • 一个活跃的 AWS 账户

  • 一个用于部署和启动 SageMaker AI 训练作业的 AWS Identity and Access Management(IAM)用户角色

  • 已安装已配置 AWS Command Line Interface(AWS CLI)版本 2.0 或更高版本

  • 已安装 Poetry 版本 1.8 或更高版本(但低于 2.0 版本)

  • Docker 已安装

  • Python 版本 3.10.x

限制

  • 该代码目前仅针对 SageMaker AI 训练作业。将其扩展到处理作业及整个 SageMaker AI 管道的操作较为简单。

  • 要进行完全生产级别的 SageMaker AI 设置,需要完善其他详细信息。例如,用于计算和存储的自定义 AWS Key Management Service(AWS KMS)密钥、网络配置等。您也可通过在 config 文件夹的专用子文件夹中使用 Hydra,来配置这些额外选项。

  • 部分 ‭AWS 服务在有些 ‭AWS 区域不可用。有关区域可用性,请参阅按区域划分的 AWS 服务。有关特定端点,请参阅服务端点和配额,然后选择相应服务的链接。

架构

下图展示了该解决方案的架构。

创建和运行 SageMaker AI 训练或 HPO 作业的工作流。

下图显示了如下工作流:

  1. 数据科学家可在本地环境中对算法进行小规模迭代、调整参数,并快速测试训练脚本,无需依赖 Docker 或 SageMaker AI。(有关更多详细信息,请参阅操作说明中的“在本地运行以快速测试”任务。)

  2. 对算法感到满意后,数据科学家会构建 Docker 映像,并将其推送到名为 hydra-sm-artifact 的 Amazon Elastic Container Registry(Amazon ECR)存储库。(有关更多详细信息,请参阅操作说明中的“在 SageMaker AI 上运行工作流”。)

  3. 数据科学家使用 Python 脚本启动 SageMaker AI 训练作业或超参数优化(HPO)作业。对于常规训练作业,调整后的配置会写入名为 hydra-sample-config 的 Amazon Simple Storage Service(Amazon S3)存储桶。对于 HPO 作业,则会应用位于 config 文件夹中的默认配置集。

  4. SageMaker AI 训练作业提取 Docker 映像,从 Amazon S3 存储桶 hydra-sample-data 读取输入数据,然后从 Amazon S3 存储桶 hydra-sample-config 获取配置或使用默认配置。训练完成后,该作业会将输出数据保存到 Amazon S3 存储桶 hydra-sample-data

自动化和扩缩

  • 如需实现自动化训练、重新训练或推理,可将 AWS CLI 代码与 AWS LambdaAWS CodePipelineAmazon 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 存储库中找到。

最佳实践

  • 选择一个用于部署和启动 SageMaker AI 训练作业的 IAM 角色,该角色需遵循最低权限原则,即仅授予执行任务所需的最低权限。有关更多信息,请参阅 IAM 文档中的授予最低权限安全最佳实践

  • 在终端中使用临时凭证访问该 IAM 角色。

操作说明

任务描述所需技能

创建和激活虚拟环境。

要创建和激活虚拟环境,请在存储库的根目录中运行以下命令:

poetry install poetry shell
常规 AWS

部署基础设施。

要使用 CloudFormation 部署基础设施,请运行以下命令:

aws cloudformation deploy --template-file infra/hydra-sagemaker-setup.yaml --stack-name hydra-sagemaker-setup --capabilities CAPABILITY_NAMED_IAM
常规 AWS、DevOps 工程师

下载示例数据。

要将输入数据从 openml 下载到本地计算机,请运行以下命令:

python scripts/download_data.py
常规 AWS

在本地运行以快速测试。

要在本地运行训练代码以进行测试,请运行以下命令:

python mypackage/train.py data.train_data_path=data/train.csv evaluation.base_dir_path=data

所有执行的日志会按执行时间存储在名为 outputs 的文件夹中。有关更多信息,请参阅 GitHub 存储库中的“输出”部分。

您还可以使用 --multirun 功能,通过不同参数并行执行多次训练。有关更多详细信息,请参阅 Hydra 文档

数据科学家
任务描述所需技能

设置环境变量。

要在 SageMaker AI 上运行作业,请设置以下环境变量,并提供您的 AWS 区域和 AWS 账户 ID:

export ECR_REPO_NAME=hydra-sm-artifact export image_tag=latest export AWS_REGION="<your_aws_region>" # for instance, us-east-1 export ACCOUNT_ID="<your_account_id>" export BUCKET_NAME_DATA=hydra-sample-data-$ACCOUNT_ID export BUCKET_NAME_CONFIG=hydra-sample-config-$ACCOUNT_ID export AWS_DEFAULT_REGION=$AWS_REGION export ROLE_ARN=arn:aws:iam::${ACCOUNT_ID}:role/hydra-sample-sagemaker export INPUT_DATA_S3_PATH=s3://$BUCKET_NAME_DATA/hydra-on-sm/input/ export OUTPUT_DATA_S3_PATH=s3://$BUCKET_NAME_DATA/hydra-on-sm/output/
常规 AWS

创建和推送 Docker 映像。

要创建 Docker 映像并将其推送至 Amazon ECR 存储库,请运行以下命令:

chmod +x scripts/create_and_push_image.sh scripts/create_and_push_image.sh $ECR_REPO_NAME $image_tag $AWS_REGION $ACCOUNT_ID

此任务假设您的环境中已配置有效的凭证。Docker 映像被推送到上一个任务的环境变量中指定的 Amazon ECR 存储库,用于激活将在其中运行训练作业的 SageMaker AI 容器。

ML 工程师,常规 AWS

将输入数据复制到 Amazon S3。

SageMaker AI 训练作业需要获取输入数据。要将输入数据复制到 Amazon S3 存储桶以获取数据,请运行以下命令:

aws s3 cp data/train.csv "${INPUT_DATA_S3_PATH}train.csv"
数据工程师、常规 AWS

提交 SageMaker AI 训练作业

为简化脚本的执行流程,请在 default.yaml 文件中指定默认配置参数。这种方法不仅能确保多次运行的一致性,还提供了根据需要轻松覆盖默认设置的灵活性。请参见以下示例:

python scripts/start_sagemaker_training_job.py sagemaker.role_arn=$ROLE_ARN sagemaker.config_s3_bucket=$BUCKET_NAME_CONFIG sagemaker.input_data_s3_path=$INPUT_DATA_S3_PATH sagemaker.output_data_s3_path=$OUTPUT_DATA_S3_PATH
常规 AWS、ML 工程师、数据科学家

运行 SageMaker AI 超参数调优。

运行 SageMaker AI 超参数调优与提交 SageMaker AI 训练作业类似。但如 start_sagemaker_hpo_job.py 文件所示,其执行脚本在一些关键方面存在差异。待调优的超参数必须通过 boto3 有效载荷传递,而非通过训练作业的通道传递。

要启动超参数优化(HPO)作业,请运行以下命令:

python scripts/start_sagemaker_hpo_job.py sagemaker.role_arn=$ROLE_ARN sagemaker.config_s3_bucket=$BUCKET_NAME_CONFIG sagemaker.input_data_s3_path=$INPUT_DATA_S3_PATH sagemaker.output_data_s3_path=$OUTPUT_DATA_S3_PATH
数据科学家

故障排除

问题解决方案

令牌已过期

导出新的 AWS 凭证。

缺少 IAM 权限

确保导出的 IAM 角色凭证具备部署 CloudFormation 模板和启动 SageMaker AI 训练作业所需的全部 IAM 权限。

相关资源

其他信息

此模式可应对以下挑战:

从本地开发到大规模部署的一致性 – 通过此模式,无论开发人员是使用本地 Python 脚本、运行本地 Docker 容器、在 SageMaker AI 上开展大规模实验,还是还是在 SageMaker AI 上进行生产环境部署,都能使用相同的工作流。这种一致性之所以重要,原因如下:

  • 更快的迭代速度 – 支持快速开展本地实验,纵向扩展时无需进行重大调整。

  • 无需重构 – 可无缝过渡到 SageMaker AI 上的大规模实验,无需对现有设置进行彻底修改。

  • 持续改进 – 开发新功能和不断改进算法非常简单,因为在不同的环境中代码保持不变。

配置管理 - 此模式利用配置管理工具 Hydra,提供以下好处:

  • 参数是在配置文件中定义的,与代码无关。

  • 可轻松切换或组合不同的参数集。

  • 每次运行的配置都会自动记录,简化了实验跟踪流程。

  • 云端实验可使用与本地运行相同的配置结构,确保一致性。

通过 Hydra,您能高效管理配置,并实现以下功能:

  • 划分配置 – 将项目配置拆分为更小、更易于管理的模块,每个模块可独立修改。采用这种方法,可以更轻松地处理复杂的项目。

  • 轻松调整默认值 – 快速更改基准配置,让测试新想法变得更加简单。

  • 统一 CLI 输入和配置文件 – 顺畅组合命令行输入和配置文件。这种方法可以减少混乱和混淆,使您的项目随着时间的推移更易于管理。