

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 Amazon SageMaker AI 中使用異質叢集設定訓練任務
<a name="train-heterogeneous-cluster-configure"></a>

本節提供如何使用包含多個執行個體類型的異質叢集來執行訓練任務之說明。

開始之前，請注意下列事項。
+ 所有執行個體群組都共用相同的 Docker 映像和訓練指令碼。因此，您應該修改訓練指令碼，以偵測它所屬的執行個體群組，並相應地進行 fork 執行。
+ SageMaker AI 本機模式不相容於異質叢集功能。
+ 異質叢集訓練任務的 Amazon CloudWatch 日誌串流不會依執行個體群組分組。您需要從日誌中找出哪些節點在哪個群組中。

**Topics**
+ [選項 1：使用 SageMaker Python SDK](#train-heterogeneous-cluster-configure-pysdk)
+ [選項 2：使用低階 SageMaker API](#train-heterogeneous-cluster-configure-api)

## 選項 1：使用 SageMaker Python SDK
<a name="train-heterogeneous-cluster-configure-pysdk"></a>

請遵循有關如何使用 SageMaker Python SDK 為異質叢集設定執行個體群組的指示。

1. 若要針對訓練任務配置異質叢集的執行個體群組，請使用 `sagemaker.instance_group.InstanceGroup` 類別。您可以為每個執行個體群組指定自訂名稱、執行個體類型，以及每個執行個體群組的執行個體數目。如需更多資訊，請參閱 *SageMaker AI Python SDK 文件*中的 [sagemaker.instance\_group.InstanceGroup](https://sagemaker.readthedocs.io/en/stable/api/utility/instance_group.html)。
**注意**  
如需有關可用執行個體類型和可在異質叢集中設定的執行個體數目上限等詳細資訊，請參閱 [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 執行個體，如下圖所示。  
![如何在 SageMaker 訓練任務中指派資料的概念性範例。](http://docs.aws.amazon.com/zh_tw/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.TrainingInput](https://sagemaker.readthedocs.io/en/stable/api/utility/inputs.html) 的 `instance_group_names` 引數，將執行個體群組指派給頻道。`instance_group_names` 引數會接受執行個體群組名稱的字串清單。

   下列範例顯示如何設定兩個訓練輸入頻道，並指派在上一個步驟範例中建立的執行個體群組。您也可以指定 Amazon S3 儲存貯體的 `s3_data` 引數路徑，讓執行個體群組為您的使用目的處理資料。

   ```
   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 Python SDK 文件*中的 [sagemaker.inputs.TrainingInput](https://sagemaker.readthedocs.io/en/stable/api/utility/inputs.html) 類別
   + *SageMaker AI API 參考*中的 [S3DataSource](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_S3DataSource.html) API

1. 使用 `instance_groups` 引數設定 SageMaker AI 估算器，如下列程式碼範例所示。`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 Framework Containers](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='py{{xy}}',            
       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='py{{xy}}',
       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 Framework Containers](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 API
<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)