

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 SageMaker AI 和 Hydra 简化从本地开发到可扩展实验的机器学习工作流程
<a name="streamline-machine-learning-workflows-by-using-amazon-sagemaker"></a>

*David Sauerwein、Marco Geiger 和 Julian Ferdinand Grueber，Amazon Web Services*

## Summary
<a name="streamline-machine-learning-workflows-by-using-amazon-sagemaker-summary"></a>

这种模式为在 Amazon A SageMaker I 上配置和运行从本地测试到生产的机器学习 (ML) 算法提供了一种统一的方法。尽管此模式以 ML 算法为核心，但该方法的适用范围可扩展至特征工程、推理以及整个 ML 管道。此模式通过示例用例演示了从本地脚本开发到 SageMaker AI 训练作业的过渡。

典型的 ML 工作流如下：在本地计算机上开发并测试解决方案，在云端运行大规模实验（例如使用不同参数的实验），然后在云端部署经批准的解决方案。然后，必须对已部署的解决方案进行监控和维护。如果该工作流缺乏统一方法，开发人员通常需要在每个阶段重构代码。如果解决方案依赖大量可能在工作流任一阶段发生变化的参数，那么保持流程的条理性和一致性就会变得愈发困难。

此模式可应对这些挑战。首先，它提供了一个统一的工作流程，无论是在本地计算机、容器中还是在人工智能上运行，都能保持一致，从而无需在环境之间进行 SageMaker 代码重构。其次，通过 Hydra 的配置系统简化参数管理，在该系统中，参数是在单独的配置文件中定义的，可轻松修改和组合，并自动记录每次运行的配置。有关此模式如何应对这些挑战的更多详细信息，请参阅[其他信息](#streamline-machine-learning-workflows-by-using-amazon-sagemaker-additional)。

## 先决条件和限制
<a name="streamline-machine-learning-workflows-by-using-amazon-sagemaker-prereqs"></a>

**先决条件**
+ 活跃的 AWS 账户
+ 用于部署和启动 A SageMaker I 训练作业的 AWS Identity and Access Management (IAM) [用户角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html)
+ AWS Command Line Interface (AWS CLI) [已安装](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html)并[配置](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html) 2.0 或更高版本
+ 已安装 [Poetry](https://python-poetry.org/) 版本 1.8 或更高版本（但低于 2.0 版本）
+ [Docker](https://www.docker.com/) 已安装
+ Python [版本 3.10.x](https://www.python.org/downloads/release/python-31011/)

**限制**
+ 该代码目前仅针对 A SageMaker I 训练作业。将其扩展到处理任务和整个 SageMaker AI 管道非常简单。
+ 对于完全生产化的 SageMaker AI 设置，需要准备其他细节。示例可以是用于计算和存储的自定义 AWS Key Management Service (AWS KMS) 密钥，也可以是网络配置。您也可通过在 `config` 文件夹的专用子文件夹中使用 Hydra，来配置这些额外选项。
+ 有些 AWS 服务 并非全部可用 AWS 区域。有关区域可用性，请参阅[按区域划分的AWS 服务](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。有关特定端点，请参阅[服务端点和配额](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)，然后选择相应服务的链接。

## 架构
<a name="streamline-machine-learning-workflows-by-using-amazon-sagemaker-architecture"></a>

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

![创建和运行 SageMaker AI 训练或 HPO 作业的工作流程。](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/1db57484-f85c-49a6-b870-471dade02b26/images/d80e7474-a975-4d92-8f66-2d34e33053fd.png)


下图显示了如下工作流：

1. 数据科学家无需使用 Docker 或 SageMaker AI 即可在本地环境中对算法进行小规模迭代，调整参数并快速测试训练脚本。（有关更多详细信息，请参阅[操作说明](#streamline-machine-learning-workflows-by-using-amazon-sagemaker-epics)中的“在本地运行以快速测试”任务。）

1. 对算法感到满意后，数据科学家会构建 Docker 映像，并将其推送到名为 `hydra-sm-artifact` 的 Amazon Elastic Container Registry（Amazon ECR）存储库。（有关更多详细信息，请参阅 [Epics](#streamline-machine-learning-workflows-by-using-amazon-sagemaker-epics) 中的 “在 SageMaker AI 上运行工作流程”。）

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

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

**自动化和扩展**
+ [对于自动训练、再训练或推理，您可以将 AWS CLI 代码与、或 Amazon 等[AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)服务集成。[AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html)
+ 可通过更改实例大小的配置或为分布式训练添加配置来实现扩展。

## 工具
<a name="streamline-machine-learning-workflows-by-using-amazon-sagemaker-tools"></a>

**AWS 服务**
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)帮助您设置 AWS 资源，快速一致地配置资源，并在和的整个 AWS 账户 生命周期中对其进行管理 AWS 区域。
+ [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) 是一个开源工具，可帮助您 AWS 服务 通过命令行 shell 中的命令进行交互。对于这种模式， AWS CLI 对于初始资源配置和测试都很有用。
+ [Amazon Elastic Container Registry（Amazon ECR）](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html)是一项安全、可扩展且可靠的托管容器映像注册表服务。
+ [Amazon SageMaker AI](https://docs.aws.amazon.com/sagemaker/?id=docs_gateway) 是一项托管机器学习 (ML) 服务，可帮助您构建和训练机器学习模型，然后将其部署到生产就绪的托管环境中。 SageMaker AI Training 是 SageMaker AI 中一项完全托管的机器学习服务，支持大规模训练机器学习模型。该工具利用内置的可扩展性以及与其他 AWS 服务模型的集成，可以有效地处理训练模型的计算需求。 SageMaker AI Training 还支持自定义算法和容器，使其灵活适用于各种机器学习工作流程。
+ [Amazon Simple Storage Service（Amazon S3）](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)是一项基于云的对象存储服务，可帮助您存储、保护和检索任意数量的数据。

**其他工具**
+ [Docker](https://www.docker.com/) 是一组平台即服务（PaaS）产品，它们利用操作系统级的虚拟化技术在容器中提供软件。在此模式中，Docker 用于确保从开发到部署的各个阶段的环境保持一致，同时可靠地打包依赖项和代码。借助 Docker 的容器化技术，工作流可轻松实现扩展与版本控制。
+ [Hydra](https://hydra.cc/) 是一款配置管理工具，为处理多种配置和动态资源管理提供了灵活性。它在管理环境配置方面发挥了重要作用，支持在不同的环境间无缝部署。有关 Hydra 的更多详细信息，请参阅[其他信息](#streamline-machine-learning-workflows-by-using-amazon-sagemaker-additional)。
+ [Python](https://www.python.org/) 是一种通用的计算机编程语言。Python 用于编写机器学习代码和部署工作流。
+ [Poetry](https://python-poetry.org/) 是 Python 中用于管理和打包依赖项的工具。

**代码存储库**

此模式的代码可在-w GitHub [configuring-sagemaker-training-jobsith-h](https://github.com/aws-samples/configuring-sagemaker-training-jobs-with-hydra) ydra 存储库中找到。

## 最佳实践
<a name="streamline-machine-learning-workflows-by-using-amazon-sagemaker-best-practices"></a>
+ 选择一个 IAM 角色来部署和启动 SageMaker AI 训练作业，该角色遵循最低权限原则，并授予执行任务所需的最低权限。有关详情，请参阅 IAM 文档中的[授予最低权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#grant-least-priv)和[安全最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。
+ 在终端中使用临时凭证访问该 IAM 角色。

## 操作说明
<a name="streamline-machine-learning-workflows-by-using-amazon-sagemaker-epics"></a>

### 设置环境
<a name="set-up-the-environment"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建和激活虚拟环境。 | 要创建和激活虚拟环境，请在存储库的根目录中运行以下命令：<pre>poetry install <br />poetry shell</pre> | 常规 AWS | 
| 部署基础设施。 | 要使用部署基础架构 CloudFormation，请运行以下命令：<pre>aws cloudformation deploy --template-file infra/hydra-sagemaker-setup.yaml --stack-name hydra-sagemaker-setup  --capabilities CAPABILITY_NAMED_IAM</pre> | 通用 AWS， DevOps 工程师 | 
| 下载示例数据。 | 要将输入数据从 [openml](https://www.openml.org/) 下载到本地计算机，请运行以下命令：<pre>python scripts/download_data.py</pre> | 常规 AWS | 
| 在本地运行以快速测试。 | 要在本地运行训练代码以进行测试，请运行以下命令：<pre>python mypackage/train.py data.train_data_path=data/train.csv evaluation.base_dir_path=data</pre><br />所有执行的日志会按执行时间存储在名为 `outputs` 的文件夹中。有关更多信息，请参阅[GitHub 存储库](https://github.com/aws-samples/configuring-sagemaker-training-jobs-with-hydra)中的 “输出” 部分。<br />您还可以使用 `--multirun` 功能，通过不同参数并行执行多次训练。有关更多详细信息，请参阅 [Hydra 文档](https://hydra.cc/docs/tutorials/basic/running_your_app/multi-run/)。 | 数据科学家 | 

### 在 SageMaker AI 上运行工作流程
<a name="run-workflows-on-sm"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 设置环境变量。 | 要在 SageMaker AI 上运行作业，请设置以下环境变量，并提供您 AWS 区域 和您的 AWS 账户 ID：<pre>export ECR_REPO_NAME=hydra-sm-artifact<br />export image_tag=latest<br />export AWS_REGION="<your_aws_region>" # for instance, us-east-1<br />export ACCOUNT_ID="<your_account_id>"<br />export BUCKET_NAME_DATA=hydra-sample-data-$ACCOUNT_ID<br />export BUCKET_NAME_CONFIG=hydra-sample-config-$ACCOUNT_ID<br />export AWS_DEFAULT_REGION=$AWS_REGION<br />export ROLE_ARN=arn:aws:iam::${ACCOUNT_ID}:role/hydra-sample-sagemaker<br />export INPUT_DATA_S3_PATH=s3://$BUCKET_NAME_DATA/hydra-on-sm/input/<br />export OUTPUT_DATA_S3_PATH=s3://$BUCKET_NAME_DATA/hydra-on-sm/output/</pre> | 常规 AWS | 
| 创建和推送 Docker 映像。 | 要创建 Docker 映像并将其推送至 Amazon ECR 存储库，请运行以下命令：<pre>chmod +x scripts/create_and_push_image.sh<br />scripts/create_and_push_image.sh $ECR_REPO_NAME $image_tag $AWS_REGION $ACCOUNT_ID</pre><br />此任务假设您的环境中已配置有效的凭证。Docker 映像被推送到上一个任务中环境变量中指定的 Amazon ECR 存储库，用于激活将在其中运行训练作业的 SageMaker AI 容器。 | ML 工程师，常规 AWS | 
| 将输入数据复制到 Amazon S3。 | A SageMaker I 训练作业需要获取输入数据。要将输入数据复制到 Amazon S3 存储桶以获取数据，请运行以下命令：<pre>aws s3 cp data/train.csv "${INPUT_DATA_S3_PATH}train.csv" </pre> | 数据工程师、常规 AWS | 
| 提交 SageMaker AI 训练作业。 | 为简化脚本的执行流程，请在 `default.yaml` 文件中指定默认配置参数。这种方法不仅能确保多次运行的一致性，还提供了根据需要轻松覆盖默认设置的灵活性。请参见以下示例：<pre>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</pre> | 常规 AWS、ML 工程师、数据科学家 | 
| 运行 SageMaker AI 超参数调整。 | 运行 SageMaker AI 超参数调整与提交 SageMaker AII 训练作业类似。但如 [start\_sagemaker\_hpo\_job.py](https://github.com/aws-samples/configuring-sagemaker-training-jobs-with-hydra/blob/main/scripts/start_sagemaker_hpo_job.py) 文件所示，其执行脚本在一些关键方面存在差异。待调优的超参数必须通过 boto3 有效载荷传递，而非通过训练作业的通道传递。<br />要启动超参数优化（HPO）作业，请运行以下命令：<pre>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</pre> | 数据科学家 | 

## 问题排查
<a name="streamline-machine-learning-workflows-by-using-amazon-sagemaker-troubleshooting"></a>


| 问题 | 解决方案 | 
| --- | --- | 
| 令牌已过期 | 导出新的 AWS 凭证。 | 
| 缺少 IAM 权限 | 请务必导出具有部署 CloudFormation 模板和启动 A SageMaker I 训练任务所需的所有 IAM 权限的 IAM 角色的证书。 | 

## 相关资源
<a name="streamline-machine-learning-workflows-by-using-amazon-sagemaker-resources"></a>
+ [使用 Amazon A SageMaker I 训练模型](https://docs.aws.amazon.com/sagemaker/latest/dg/how-it-works-training.html)（AWS 文档）
+ [什么是超参数调优？](https://aws.amazon.com/what-is/hyperparameter-tuning/#:~:text=Hyperparameter%20tuning%20allows%20data%20scientists,the%20model%20as%20a%20hyperparameter.)

## 附加信息
<a name="streamline-machine-learning-workflows-by-using-amazon-sagemaker-additional"></a>

此模式可应对以下挑战：

**从本地开发到大规模部署的一致性** — 通过这种模式，开发人员可以使用相同的工作流程，无论他们是在使用本地 Python 脚本、运行本地 Docker 容器、在 SageMaker AI 上进行大型实验，还是在生产中在 AI 上 SageMaker 部署。这种一致性之所以重要，原因如下：
+ **更快的迭代速度** – 支持快速开展本地实验，纵向扩展时无需进行重大调整。
+ **无需重构** — 可以无缝过渡到更大规模的 SageMaker AI 实验，无需对现有设置进行全面改革。
+ **持续改进** – 开发新功能和不断改进算法非常简单，因为在不同的环境中代码保持不变。

**配置管理** - 此模式利用配置管理工具 [Hydra](https://hydra.cc/)，提供以下好处：
+ 参数是在配置文件中定义的，与代码无关。
+ 可轻松切换或组合不同的参数集。
+ 每次运行的配置都会自动记录，简化了实验跟踪流程。
+ 云端实验可使用与本地运行相同的配置结构，确保一致性。

通过 Hydra，您能高效管理配置，并实现以下功能：
+ **划分配置** – 将项目配置拆分为更小、更易于管理的模块，每个模块可独立修改。采用这种方法，可以更轻松地处理复杂的项目。
+ **轻松调整默认值** – 快速更改基准配置，让测试新想法变得更加简单。
+ **统一 CLI 输入和配置文件** – 顺畅组合命令行输入和配置文件。这种方法可以减少混乱和混淆，使您的项目随着时间的推移更易于管理。

 