

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

# 修改訓練指令碼以指派執行個體群組
<a name="train-heterogeneous-cluster-modify-training-script"></a>

完成前幾個章節中的異質叢集組態，您已經為訓練任務備妥了 SageMaker 訓練環境和執行個體。若要將執行個體群組進一步指派給特定訓練和資料處理任務，下個步驟為修改訓練指令碼。根據預設，訓練任務只會為所有節點建立訓練指令碼複本，不論執行個體的大小皆如此，而這可能導致效能的損失。

例如，如果您在異質叢集中混合 CPU 執行個體和 GPU 執行個體，同時將深度神經網路訓練指令碼傳遞給 SageMaker AI 估算器的 `entry_point` 引數，則 `entry_point` 指令碼會複寫至每個執行個體。換句話說，如果沒有適當的任務指派，CPU 執行個體也會執行整個指令碼，並開始針對 GPU 執行個體進行分散式訓練所設計的訓練任務。因此，您必須變更要卸載並在 CPU 執行個體上執行的特定處理函式。您可以使用 SageMaker AI 環境變數擷取異質叢集的資訊，並讓特定程序相應地執行。

訓練任務開始時，訓練指令碼會讀取 SageMaker 訓練環境資訊，其中包含異質叢集組態。組態包含目前執行個體群組、每個群組中目前的主機，以及目前主機所在的群組等資訊。

您可以透過以下方式，在 SageMaker AI 訓練任務的初始化階段期間查詢執行個體群組資訊。

**(建議) 使用 SageMaker 訓練工具組讀取執行個體群組資訊**

使用 [SageMaker 訓練工具組程式庫](https://github.com/aws/sagemaker-training-toolkit)所提供的環境 Python 模組。工具組程式庫已預先安裝在 TensorFlow 和 PyTorch 的 [SageMaker 架構容器](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#sagemaker-framework-containers-sm-support-only)中，因此您在使用預先建置的容器時不需要額外的安裝步驟。這是在訓練指令碼中以較少的程式碼變更來擷取 SageMaker AI 環境變數的建議方式。

```
from sagemaker_training import environment

env = environment.Environment()
```

與一般 SageMaker 訓練和異質叢集相關的環境變數：
+ `env.is_hetero` — 無論是否已設定異質叢集，都會傳回布林值結果。
+ `env.current_host` — 傳回目前的主機。
+ `env.current_instance_type` — 傳回目前主機的執行個體類型。
+ `env.current_instance_group` — 傳回目前執行個體群組的名稱。
+ `env.current_instance_group_hosts` — 傳回目前執行個體群組中的主機清單。
+ `env.instance_groups` — 傳回用於訓練的執行個體群組名稱清單。
+ `env.instance_groups_dict` — 傳回訓練任務的整個異質叢集組態。
+ `env.distribution_instance_groups` — 傳回指派給 SageMaker AI 估算器類別 `distribution` 參數的執行個體群組清單。
+ `env.distribution_hosts` — 傳回屬於指派給 SageMaker AI 估算器類別 `distribution` 參數之執行個體群組的主機清單。

例如，請考慮下列包含兩個執行個體群組的異質叢集範例。

```
from sagemaker.instance_group import InstanceGroup

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

範例異質叢集 `env.instance_groups_dict` 的輸出格式應類似以下內容。

```
{
    "instance_group_1": {
        "hosts": [
            "algo-2"
        ],
        "instance_group_name": "instance_group_1",
        "instance_type": "ml.c5.18xlarge"
    },
    "instance_group_2": {
        "hosts": [
            "algo-3",
            "algo-1"
        ],
        "instance_group_name": "instance_group_2",
        "instance_type": "ml.p3dn.24xlarge"
    }
}
```

**(選用) 從資源組態 JSON 檔案讀取執行個體群組資訊**

如果您希望以 JSON 格式擷取環境變數，則可直接使用資源組態 JSON 檔案。根據預設，SageMaker 訓練執行個體中的 JSON 檔案位於 `/opt/ml/input/config/resourceconfig.json`。

```
file_path = '/opt/ml/input/config/resourceconfig.json'
config = read_file_as_json(file_path)
print(json.dumps(config, indent=4, sort_keys=True))
```