

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

# 在 Amazon A SageMaker I 中使用异构集群配置训练作业
<a name="train-heterogeneous-cluster-configure"></a>

此部分提供了有关如何使用由多种实例类型组成的异构集群运行训练作业的说明。

开始之前请注意以下事项。
+ 所有实例组共享相同的 Docker 映像和训练脚本。因此，应修改训练脚本以相应地检测它所属的实例组和分叉执行。
+ 异构集群功能与 SageMaker AI 本地模式不兼容。
+ 异构集群训练作业的 Amazon CloudWatch 日志流未按实例组分组。您需要从日志中查明哪些节点属于哪个组。

**Topics**
+ [选项 1：使用 SageMaker Python 开发工具包](#train-heterogeneous-cluster-configure-pysdk)
+ [选项 2：使用低级 SageMaker APIs](#train-heterogeneous-cluster-configure-api)

## 选项 1：使用 SageMaker Python 开发工具包
<a name="train-heterogeneous-cluster-configure-pysdk"></a>

按照有关如何使用 SageMaker Python SDK 为异构集群配置实例组的说明进行操作。

1. 要为训练作业配置异构集群的实例组，请使用 `sagemaker.instance_group.InstanceGroup` 类。您可以指定每个实例组的自定义名称、实例类型和每个实例组的实例数。有关更多信息，请参阅 [sagemaker.instance\$1group。 InstanceGroup](https://sagemaker.readthedocs.io/en/stable/api/utility/instance_group.html)在 *SageMaker AI Python SDK 文档*中。
**注意**  
有关可用实例类型以及您可以在异构集群中配置的最大实例组数量的更多信息，请参阅 [ InstanceGroup](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_InstanceGroup.html)API 参考。

   以下代码示例说明如何设置两个实例组，它们由两个名为 `instance_group_1` 的 `ml.c5.18xlarge` 仅 CPU 实例和一个名为 `instance_group_2` 的 `ml.p3dn.24xlarge` GPU 实例组成，如下图所示。  
![\[如何在 T SageMaker raining Job 中分配数据的概念示例。\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/HCTraining.png)

   上图显示了一个概念性示例，说明如何将数据预处理等预训练过程分配给 CPU 实例组，并将预处理的数据流式传输到 GPU 实例组。

   ```
   from sagemaker.instance_group import InstanceGroup
   
   instance_group_1 = InstanceGroup(
       "instance_group_1", "ml.c5.18xlarge", 2
   )
   instance_group_2 = InstanceGroup(
       "instance_group_2", "ml.p3dn.24xlarge", 1
   )
   ```

1. 使用实例组对象，设置训练输入通道，并通过 [sagemaker.inputs 的`instance_group_names`参数将实例组分配给通道。 TrainingInput](https://sagemaker.readthedocs.io/en/stable/api/utility/inputs.html)班级。`instance_group_names` 参数接受实例组名称的字符串列表。

   以下示例说明如何设置两个训练输入通道并分配在上一步的示例中创建的实例组。您还可以为实例组指定 `s3_data` 参数的 Amazon S3 存储桶路径，处理数据以供使用。

   ```
   from sagemaker.inputs import TrainingInput
   
   training_input_channel_1 = TrainingInput(
       s3_data_type='S3Prefix', # Available Options: S3Prefix | ManifestFile | AugmentedManifestFile
       s3_data='s3://your-training-data-storage/folder1',
       distribution='FullyReplicated', # Available Options: FullyReplicated | ShardedByS3Key 
       input_mode='File', # Available Options: File | Pipe | FastFile
       instance_groups=["instance_group_1"]
   )
   
   training_input_channel_2 = TrainingInput(
       s3_data_type='S3Prefix',
       s3_data='s3://your-training-data-storage/folder2',
       distribution='FullyReplicated',
       input_mode='File',
       instance_groups=["instance_group_2"]
   )
   ```

   有关 `TrainingInput` 的参数的更多信息，请参阅以下链接。
   + [sagemaker.inputs。 ](https://sagemaker.readthedocs.io/en/stable/api/utility/inputs.html)TrainingInput*SageMaker Python 软件开发工具包文档*中的类
   + [A DataSource I API 参考中的 S3](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_S3DataSource.html) *AP SageMaker I*

1. 使用`instance_groups`参数配置 A SageMaker I 估算器，如以下代码示例所示。`instance_groups` 参数接受 `InstanceGroup` 对象列表。
**注意**  
异构集群功能可通过 SageMaker AI [PyTorch](https://sagemaker.readthedocs.io/en/stable/frameworks/pytorch/sagemaker.pytorch.html)和[TensorFlow](https://sagemaker.readthedocs.io/en/stable/frameworks/tensorflow/sagemaker.tensorflow.html#tensorflow-estimator)框架估算器类获得。支持的框架是 PyTorch v1.10 或更高版本以及 TensorFlow v2.6 或更高版本。要查找可用框架容器、框架版本和 Python 版本的完整列表，请参阅 AWS 深度学习[容器 GitHub 存储库中的 SageMaker AI 框架](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#sagemaker-framework-containers-sm-support-only)容器。

------
#### [ PyTorch ]

   ```
   from sagemaker.pytorch import PyTorch
   
   estimator = PyTorch(
       ...
       entry_point='my-training-script.py',
       framework_version='x.y.z',    # 1.10.0 or later
       py_version='pyxy',            
       job_name='my-training-job-with-heterogeneous-cluster',
       instance_groups=[instance_group_1, instance_group_2]
   )
   ```

------
#### [ TensorFlow ]

   ```
   from sagemaker.tensorflow import TensorFlow
   
   estimator = TensorFlow(
       ...
       entry_point='my-training-script.py',
       framework_version='x.y.z', # 2.6.0 or later
       py_version='pyxy',
       job_name='my-training-job-with-heterogeneous-cluster',
       instance_groups=[instance_group_1, instance_group_2]
   )
   ```

------
**注意**  
`instance_type`和的`instance_count`参数对和 SageMaker AI 估计器类的`instance_groups`参数是相互排斥的。对于同构集群训练，请使用 `instance_type` 和 `instance_count` 参数对。对于异构集群训练，请使用 `instance_groups`。
**注意**  
要查找可用框架容器、框架版本和 Python 版本的完整列表，请参阅 AWS 深度学习[容器 GitHub 存储库中的 SageMaker AI 框架](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#sagemaker-framework-containers-sm-support-only)容器。

1. 使用配置了实例组的训练输入通道配置 `estimator.fit` 方法，然后启动训练作业。

   ```
   estimator.fit(
       inputs={
           'training': training_input_channel_1, 
           'dummy-input-channel': training_input_channel_2
       }
   )
   ```

## 选项 2：使用低级 SageMaker APIs
<a name="train-heterogeneous-cluster-configure-api"></a>

如果您使用 AWS Command Line Interface 或 适用于 Python (Boto3) 的 AWS SDK 并希望使用低级别 SageMaker APIs 来提交异构集群的训练作业请求，请参阅以下 API 参考。
+ [CreateTrainingJob](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html)
+ [ResourceConfig ](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_ResourceConfig.html)
+ [InstanceGroup](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_InstanceGroup.html)
+ [S3DataSource](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_S3DataSource.html)