

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

# 使用 開始使用 SageMaker HyperPod AWS CLI
<a name="smcluster-getting-started-slurm-cli"></a>

下列教學課程示範如何透過 SageMaker HyperPod [AWS CLI 的命令，使用 Slurm 建立新的 SageMaker HyperPod](sagemaker-hyperpod-ref.md#sagemaker-hyperpod-ref-cli) 叢集。在本教學課程結束時，您將有一個工作中的 Slurm 叢集，其中包含控制器節點、登入節點和運算工作者群組，準備好排程和執行 ML 工作負載。本教學課程涵蓋 Slurm 拓撲設定、節點生命週期組態選項、選用的 FSx 共用儲存，以及如何連線至叢集。

開始之前，請確定您已完成 [使用 SageMaker HyperPod 的先決條件](sagemaker-hyperpod-prerequisites.md)(VPC、配額、FSx) 和 [AWS Identity and Access Management for SageMaker HyperPod](sagemaker-hyperpod-prerequisites-iam.md)(IAM 角色、具有 的執行角色`AmazonSageMakerClusterInstanceRolePolicy`)。

## 重要概念
<a name="smcluster-getting-started-slurm-cli-key-concepts"></a>

本節涵蓋建立 SageMaker HyperPod Slurm 叢集的核心組態概念。了解這些概念可協助您在設定叢集時做出明智的選擇，但如果您想要立即開始，您可以直接跳到 [建立 叢集](#smcluster-getting-started-slurm-cli-create-cluster) ，並視需要參考這裡。

建立 Slurm 協調叢集時，您有兩個獨立的組態選擇：

1. **Slurm 拓撲組態** – 如何定義 Slurm 叢集拓撲 （節點角色、分割區）？

1. **節點生命週期組態** – 如何佈建和自訂節點？

對於 Slurm 拓撲，本教學課程使用 API 驅動的組態方法，您可以在每個執行個體群組和`Orchestrator.Slurm`叢集層級`SlurmConfig`使用 直接在`CreateCluster`請求中定義節點角色和分割區。這是新叢集的建議方法。它提供單一來源的事實、內建驗證和分割區組態偏離偵測，無需管理其他檔案。或者，您可以使用存放在 Amazon S3 中的舊版`provisioning_parameters.json`檔案，與現有叢集回溯相容。如需舊版方法的詳細資訊，請參閱 [SageMaker HyperPod Slurm 組態](sagemaker-hyperpod-ref.md#sagemaker-hyperpod-ref-slurm-configuration)。

對於節點生命週期組態，SageMaker HyperPod 支援三個選項。在最簡單的情況下，您`LifeCycleConfig`完全省略 ，HyperPod 會使用 AMI 型組態自動設定節點，設定 Slurm 和基本套件，例如 Docker、Enroot 和 Pyxis，以執行 ML 工作負載，而不需要指令碼或 Amazon S3 儲存貯體。如果您需要在 AMI 型組態上進行自訂，您可以透過 `OnInitComplete` 在組態完成後執行的 提供延伸指令碼。為了完全控制整個佈建序列， `OnCreate` 路徑可讓您的指令碼擁有一切，包括 Slurm 啟動的時間。

對於 ML 工作負載，您通常還需要共用的高效能檔案系統來訓練資料、檢查點和共用程式庫。SageMaker HyperPod 支援 Amazon FSx for Lustre 和 FSx for OpenZFS，透過 為每個執行個體群組設定`InstanceStorageConfigs`。FSx 組態是建立叢集的選用組態，但建議用於生產工作負載。

### 透過 API 設定 Slurm 拓撲
<a name="smcluster-getting-started-slurm-cli-slurm-topology"></a>

本教學課程中的所有範例都使用 API 驅動的 Slurm 拓撲組態，您可以在 API `CreateCluster`請求中直接定義 Slurm 叢集結構，而不是透過單獨的組態檔案。

Slurm 叢集至少需要一個控制器節點 `slurmctld` （執行協助程式並協調任務排程） 和一或多個運算節點 （執行任務）。或者，您可以新增登入節點，為使用者提供提交和管理任務的專用存取點，而無需直接登入控制器。在 API 請求中，您可以使用 為每個執行個體群組指派其 Slurm 角色`SlurmConfig`，指定群組是做為控制器、登入或運算節點。運算群組也會對應至一或多個 Slurm 分割區，做為邏輯佇列來組織任務在不同節點集之間的排程方式。

在叢集層級， 會`Orchestrator.Slurm`控制 HyperPod 在 中管理分割區組態的方式`slurm.conf`。您可以選擇策略，以判斷 HyperPod 是否為分割區拓撲的單一事實來源、是否覆寫手動變更，或是否將 API 定義的組態與您所做的任何手動編輯合併。以下是所使用欄位的參考。

**SlurmConfig** （每個執行個體群組）：

```
"SlurmConfig": {
    "NodeType": "Controller | Login | Compute",
    "PartitionNames": ["partition-name"]
}
```


| 欄位 | 說明 | 
| --- | --- | 
| NodeType | 必要. 此執行個體群組的 Slurm 角色。有效值：Controller、Login、Compute。確切一個執行個體群組必須是 Controller。 | 
| PartitionNames | 條件式。Slurm 分割區名稱。Compute 節點類型為必要； Controller或 不允許Login。 | 

**Orchestrator.Slurm** （叢集層級）：

```
"Orchestrator": {
    "Slurm": {
        "SlurmConfigStrategy": "Managed | Overwrite | Merge"
    }
}
```

`SlurmConfigStrategy` 決定 HyperPod 如何在控制器節點`slurm.conf`上管理 中的partition-to-node映射。當您建立或更新叢集時，HyperPod `slurm.conf`會根據`SlurmConfig`您在每個執行個體群組上定義的 將分割區組態寫入 ，將運算執行個體群組映射至其指派的分割區，並使用適當的 Slurm 角色註冊控制器和登入節點。

您選擇的策略會控制`slurm.conf`在 API 外部修改 中的分割區組態時會發生的情況，例如，管理員直接在控制器節點上編輯檔案。使用 `Managed`時，HyperPod 會將 API 視為單一事實來源，並在磁碟`slurm.conf`上發生漂移時偵測和封鎖更新。使用 `Overwrite`時，HyperPod 會在控制器上強制 API 定義的組態，捨棄對 的任何手動編輯`slurm.conf`。這對於從意外變更中復原很有用。透過 `Merge`，HyperPod 會保留對 的手動編輯`slurm.conf`，並將其與 API 組態合併，讓進階使用者能夠彈性地與 API 受管分割區一起維護自訂`slurm.conf`設定。


| 策略 | 分割區偏離偵測 | 手動變更 | 使用案例 | 
| --- | --- | --- | --- | 
| Managed (default) | 已啟用；如果找到偏離，則封鎖更新 | 不支援 | 單一事實來源 | 
| Overwrite | Disabled | 更新時覆寫 | 從偏離中復原 | 
| Merge | Disabled | 保留和合併 | 自訂slurm.conf需求 | 

**重要**  
偏離偵測僅適用於 中的 Slurm 分割區組態 `slurm.conf`(partition-to-node映射）。HyperPod 不會監控其他`slurm.conf`設定的變更，例如排程參數、資源限制或會計組態，也不會偵測到或報告。

**注意**  
如果您偏好使用`provisioning_parameters.json`檔案而非 API 來定義 Slurm 拓撲，`SlurmConfig`請省略執行個體群組和叢集請求`Orchestrator.Slurm`中的 ，然後將檔案與您的節點生命週期指令碼一起上傳至 Amazon S3。如需詳細資訊，請參閱[SageMaker HyperPod Slurm 組態](sagemaker-hyperpod-ref.md#sagemaker-hyperpod-ref-slurm-configuration)。

### 節點生命週期組態選項
<a name="smcluster-getting-started-slurm-cli-lifecycle-options"></a>

建立 SageMaker HyperPod Slurm 叢集時，您可以透過在`CreateCluster`請求中設定 `LifeCycleConfig`區塊，選擇如何佈建每個執行個體群組的節點。SageMaker HyperPod 支援三個節點生命週期組態選項，每個選項都提供不同層級的佈建程序控制。

僅使用 **AMI 型組態**，您可以`LifeCycleConfig`完全省略 。HyperPod 會使用 AMI 型組態自動設定節點、設定 Slurm、安裝基本套件，以及啟動所有必要的服務。這是最簡單的路徑，不需要 Amazon S3 儲存貯體或指令碼。

使用**擴充**功能選項，您可以在 `OnInitComplete` 中指定 ，`LifeCycleConfig`並`SourceS3Uri`指向 Amazon S3 中的擴充功能指令碼。HyperPod 會先執行完整的 AMI 型組態，然後執行您的指令碼。這可讓您新增自訂，例如監控代理程式、LDAP 整合或其他儲存掛載，而無需管理基準佈建。

使用**自訂**選項，您可以在 `OnCreate` 中指定 ，`LifeCycleConfig`並`SourceS3Uri`指向 Amazon S3 中設定的完整生命週期指令碼。HyperPod 不會執行 AMI 型組態，也不會啟動 Slurm。您的指令碼擁有整個佈建序列。這可讓您完全控制已安裝的軟體、設定方式，以及 Slurm 何時啟動。


| 節點生命週期選項 | 需要 Amazon S3 儲存貯體？ | 要上傳的指令碼？ | API 中的 LifeCycleConfig？ | 
| --- | --- | --- | --- | 
| 僅限 AMI 型組態 （簡單） | 否 | 否 | 完全省略 | 
| 延伸模組 (OnInitComplete) | 是 | 只有您的延伸指令碼 | OnInitComplete \+ SourceS3Uri | 
| 自訂 (OnCreate) | 是 | 完整生命週期指令碼集 | OnCreate \+ SourceS3Uri | 

**注意**  
只有 Slurm 協調叢集才支援選用的節點生命週期組態。使用 Continuous 的 EKS 協調叢集和 Slurm 叢集會`NodeProvisioningMode`繼續要求在每個執行個體群組`SourceS3Uri`上使用 `LifeCycleConfig` `OnCreate`和 。

**注意**  
`OnCreate` 和 `OnInitComplete` 是互斥的。在相同的執行個體群組上指定兩者會導致驗證錯誤。

### FSx 和 VPC 組態
<a name="smcluster-getting-started-slurm-cli-fsx-vpc"></a>

對於 ML 工作負載，共用的高效能檔案系統對於跨叢集節點存放訓練資料、模型檢查點和共用程式庫至關重要。SageMaker HyperPod 支援 Amazon FSx for Lustre 和 FSx for OpenZFS，透過 為每個執行個體群組設定`InstanceStorageConfigs`。FSx 檔案系統位於您的 VPC 中，因此使用 FSx 時需要自訂 VPC 組態 (`VpcConfig`)。

FSx 組態適用於所有三個節點生命週期組態選項。使用 AMI 型組態或 時`OnInitComplete`，HyperPod 會自動處理 FSx 掛載。使用 時`OnCreate`，您的生命週期指令碼負責掛載。

**FSx for Lustre：**

```
"InstanceStorageConfigs": [
    {
        "FsxLustreConfig": {
            "DnsName": "fs-0abc123def456789.fsx.us-west-2.amazonaws.com",
            "MountPath": "/fsx",
            "MountName": "abcdefgh"
        }
    }
]
```


| 欄位 | 說明 | 
| --- | --- | 
| DnsName | 必要. FSx for Lustre 檔案系統的 DNS 名稱。 | 
| MountPath | 選用。執行個體上的本機掛載路徑。預設：/fsx | 
| MountName | 必要. FSx for Lustre 檔案系統的掛載名稱。在 FSx for Lustre 主控台或透過 找到。 aws fsx describe-file-systems | 

**FSx for OpenZFS：**

```
"InstanceStorageConfigs": [
    {
        "FsxOpenZfsConfig": {
            "DnsName": "fs-0xyz789abc123456.fsx.us-west-2.amazonaws.com",
            "MountPath": "/shared"
        }
    }
]
```


| 欄位 | 說明 | 
| --- | --- | 
| DnsName | 必要. FSx for OpenZFS 檔案系統的 DNS 名稱。 | 
| MountPath | 選用。執行個體上的本機掛載路徑。預設：/home | 

**注意**  
每個執行個體群組最多可以有一個 FSx for Lustre 和一個 FSx for OpenZFS 組態。不同的執行個體群組可以掛載不同的檔案系統。

**VPC 組態** (FSx 需要）：

`VpcConfig` 在`CreateCluster`請求中的叢集層級新增 ：

```
"VpcConfig": {
    "SecurityGroupIds": ["sg-0abc123def456789a"],
    "Subnets": ["subnet-0abc123def456789a"]
}
```

如需設定 VPC 的詳細資訊，請參閱 [使用 SageMaker HyperPod 的先決條件](sagemaker-hyperpod-prerequisites.md)。如需 FSx 設定的詳細資訊，請參閱 [使用 SageMaker HyperPod 的先決條件](sagemaker-hyperpod-prerequisites.md)。

## 建立 叢集
<a name="smcluster-getting-started-slurm-cli-create-cluster"></a>

本節將逐步引導您使用 中所述的三個節點生命週期組態選項中的每一個來建立叢集[節點生命週期組態選項](#smcluster-getting-started-slurm-cli-lifecycle-options)。對於大多數使用者，我們建議從**選項 A** 開始，僅限以 AMI 為基礎的組態。它不需要指令碼或 Amazon S3 儲存貯體，並立即交付功能完整的叢集。如果您需要在 AMI 型組態上新增自訂，請選擇選項 B；如果您需要完全控制佈建程序，請選擇選項 C。

對於所有範例中`ExecutionRole`的 ，請提供您使用 `AmazonSageMakerClusterInstanceRolePolicy`中受管 所建立之 IAM 角色的 ARN[使用 SageMaker HyperPod 的先決條件](sagemaker-hyperpod-prerequisites.md)。

### 選項 A：僅限 AMI 型組態 （不含生命週期組態）
<a name="smcluster-getting-started-slurm-cli-option-a"></a>

這是最簡單的路徑。不需要 Amazon S3 儲存貯體、指令碼或組態檔案。SageMaker HyperPod 會使用 AMI 型組態自動設定節點、安裝基本軟體和套用組態，讓叢集準備好立即執行 ML 工作負載。所有軟體套件都內嵌在 AMI 中，因此在佈建期間不需要網際網路存取。

下表列出 AMI 型組態中包含的功能：


| 功能 | 說明 | 
| --- | --- | 
| Slurm 協助程式 | 控制器和運算協助程式會自動啟動 | 
| Docker | 用於建置和執行 ML 容器的容器執行時間 | 
| 根目錄 | Slurm 工作負載的無根容器執行 | 
| Pyxis | 容器整合的 Slurm 外掛程式 | 
| Slurm 會計 | 設定 Slurm 任務會計以追蹤任務歷史記錄和資源消耗 | 
| MariaDB | 在控制器節點上部署 MariaDB 做為 Slurm 會計的備份資料庫 | 
| SSH 金鑰產生 | 預設 ubuntu 使用者產生的金鑰對 | 
| SSH 傳播 | 多節點任務在運算節點之間傳播的使用者登入資料 | 
| Slurm 日誌輪換 | 防止日誌膨脹和磁碟完整問題 | 
| 主目錄設定 | 掛載至共用檔案系統的 Ubuntu 使用者主目錄 | 

1. 將下列項目儲存為 `create_cluster.json`：

   ```
   {
       "ClusterName": "my-hyperpod-cluster",
       "InstanceGroups": [
           {
               "InstanceGroupName": "my-controller-group",
               "InstanceType": "ml.c5.xlarge",
               "InstanceCount": 1,
               "SlurmConfig": {
                   "NodeType": "Controller"
               },
               "ExecutionRole": "arn:aws:iam::{{111122223333}}:role/HyperPodExecutionRole",
               "InstanceStorageConfigs": [
                   {
                       "EbsVolumeConfig": {
                           "VolumeSizeInGB": 500
                       }
                   }
               ]
           },
           {
               "InstanceGroupName": "my-login-group",
               "InstanceType": "ml.m5.4xlarge",
               "InstanceCount": 1,
               "SlurmConfig": {
                   "NodeType": "Login"
               },
               "ExecutionRole": "arn:aws:iam::{{111122223333}}:role/HyperPodExecutionRole"
           },
           {
               "InstanceGroupName": "worker-group-1",
               "InstanceType": "ml.trn1.32xlarge",
               "InstanceCount": 1,
               "SlurmConfig": {
                   "NodeType": "Compute",
                   "PartitionNames": ["partition-1"]
               },
               "ExecutionRole": "arn:aws:iam::{{111122223333}}:role/HyperPodExecutionRole",
               "InstanceStorageConfigs": [
                   {
                       "FsxLustreConfig": {
                           "DnsName": "{{fs-0abc123def456789.fsx.us-west-2.amazonaws.com}}",
                           "MountPath": "/fsx",
                           "MountName": "{{abcdefgh}}"
                       }
                   }
               ]
           }
       ],
       "Orchestrator": {
           "Slurm": {
               "SlurmConfigStrategy": "Managed"
           }
       },
       "VpcConfig": {
           "SecurityGroupIds": ["{{sg-0abc123def456789a}}"],
           "Subnets": ["{{subnet-0abc123def456789a}}"]
       }
   }
   ```

   請注意，任何執行個體群組上`LifeCycleConfig`都不會指定 。

   每個執行個體群組`SlurmConfig`上的 Slurm 拓撲是透過 定義： `my-controller-group` 獲指派`Controller`角色 （執行 `slurmctld`)、`my-login-group`做為使用者存取的`Login`節點，以及 `worker-group-1` 獲指派任務排程`partition-1`的`Compute`節點。在叢集層級， `SlurmConfigStrategy: "Managed"`可確保 HyperPod 是分割區組態的單一事實來源。工作者群組包含掛載在 的 FSx for Lustre 檔案系統，`/fsx`用於共用儲存，並根據需要在叢集層級`VpcConfig`指定 FSx。
**提示**  
如果您是在沒有 FSx 的情況下進行測試，則可以省略`FsxLustreConfig`請求中的 `InstanceStorageConfigs`和 `VpcConfig` 。建立叢集不需要 FSx，但建議用於生產 ML 工作負載。

1. 建立叢集：

   ```
   aws sagemaker create-cluster \
       --cli-input-json {{file://create_cluster.json}}
   ```

1. 檢查狀態：

   ```
   aws sagemaker describe-cluster --cluster-name {{my-hyperpod-cluster}}
   ```

   僅使用 AMI 型組態，回應中的執行個體群組不會包含`LifeCycleConfig`區塊。以下是顯示控制器執行個體群組的截斷範例：

   ```
   {
       "ClusterName": "my-hyperpod-cluster",
       "ClusterStatus": "InService",
       "InstanceGroups": [
           {
               "InstanceGroupName": "my-controller-group",
               "SlurmConfig": { "NodeType": "Controller" }
           }
       ]
   }
   ```

   狀態變為 之後**InService**，請繼續執行 [連線至您的叢集](#smcluster-getting-started-slurm-cli-connect)。

### 選項 B：使用 OnInitComplete 擴展 AMI 型組態
<a name="smcluster-getting-started-slurm-cli-option-b"></a>

當您需要自訂 AMI 型組態，例如監控代理程式、LDAP/SSSD 整合或其他儲存體掛載時，請使用此選項。SageMaker HyperPod 會先執行 AMI 型組態，然後執行您的延伸指令碼。

1. 撰寫您的延伸指令碼。例如，`extend-defaults.sh`：

   ```
   #!/bin/bash
   set -e
   
   echo "Running post-initialization customizations..."
   
   # Example: Install a monitoring agent
   # apt-get install -y my-monitoring-agent
   
   # Example: Configure LDAP integration
   # /opt/custom/setup-ldap.sh
   
   # Example: Mount an additional S3 bucket
   # mount-s3 my-data-bucket /mnt/s3-data
   
   echo "Custom extensions complete."
   ```
**從 Awsome 分散式訓練儲存庫使用延伸指令碼**  
Awsome 分散式訓練儲存庫中的[延伸項目資料夾](https://github.com/awslabs/awsome-distributed-training/tree/main/1.architectures/5.sagemaker-hyperpod/Extensions)為常見任務提供ready-to-use延伸項目指令碼，例如新增使用者和啟用可觀測性。每個功能都在自己的目錄中獨立，具有自己的進入點指令碼，可以直接作為`OnInitComplete`指令碼提供。  
對於需要多個功能的叢集，我們建議您使用延伸資料夾最上層可用的`run_extensions.sh`指令碼。此指令碼會協調所有可用的延伸指令碼，並提供簡單的布林切換來啟用或停用每個功能。若要使用它，請將整個 Extensions 資料夾上傳到您的 Amazon S3 儲存貯體，並指定 `run_extensions.sh`做為`OnInitComplete`指令碼：  

   ```
   s3://<bucket>/<prefix>/
   |-- run_extensions.sh          (OnInitComplete target)
   |-- detect-node/               (node type detection utility)
   |-- add-users/                 (user management scripts + config)
   |-- observability/             (observability scripts + config)
   ```
在 中`run_extensions.sh`，透過設定對應的旗標來啟用或停用每個功能：  

   ```
   ENABLE_ADD_USERS="true"
   ENABLE_OBSERVABILITY="true"
   ```
必須先填入每個已啟用功能的組態檔案，才能上傳至 Amazon S3。如需組態詳細資訊，請參閱每個功能目錄中的 README。

1. 上傳至 Amazon S3 （儲存貯體路徑必須以 開頭`s3://sagemaker-`)：

   ```
   aws s3 cp extend-defaults.sh \
       s3://sagemaker-{{amzn-s3-demo-bucket}}/scripts/
   ```

1. 將下列項目儲存為 `create_cluster.json`：

   ```
   {
       "ClusterName": "my-hyperpod-cluster",
       "InstanceGroups": [
           {
               "InstanceGroupName": "my-controller-group",
               "InstanceType": "ml.c5.xlarge",
               "InstanceCount": 1,
               "SlurmConfig": {
                   "NodeType": "Controller"
               },
               "LifeCycleConfig": {
                   "OnInitComplete": "extend-defaults.sh",
                   "SourceS3Uri": "s3://sagemaker-{{amzn-s3-demo-bucket}}/scripts/"
               },
               "ExecutionRole": "arn:aws:iam::{{111122223333}}:role/HyperPodExecutionRole",
               "InstanceStorageConfigs": [
                   {
                       "EbsVolumeConfig": {
                           "VolumeSizeInGB": 500
                       }
                   }
               ]
           },
           {
               "InstanceGroupName": "my-login-group",
               "InstanceType": "ml.m5.4xlarge",
               "InstanceCount": 1,
               "SlurmConfig": {
                   "NodeType": "Login"
               },
               "LifeCycleConfig": {
                   "OnInitComplete": "extend-defaults.sh",
                   "SourceS3Uri": "s3://sagemaker-{{amzn-s3-demo-bucket}}/scripts/"
               },
               "ExecutionRole": "arn:aws:iam::{{111122223333}}:role/HyperPodExecutionRole"
           },
           {
               "InstanceGroupName": "worker-group-1",
               "InstanceType": "ml.trn1.32xlarge",
               "InstanceCount": 1,
               "SlurmConfig": {
                   "NodeType": "Compute",
                   "PartitionNames": ["partition-1"]
               },
               "LifeCycleConfig": {
                   "OnInitComplete": "extend-defaults.sh",
                   "SourceS3Uri": "s3://sagemaker-{{amzn-s3-demo-bucket}}/scripts/"
               },
               "ExecutionRole": "arn:aws:iam::{{111122223333}}:role/HyperPodExecutionRole"
           }
       ],
       "Orchestrator": {
           "Slurm": {
               "SlurmConfigStrategy": "Managed"
           }
       }
   }
   ```
**重要**  
指定 `OnInitComplete` 時， `SourceS3Uri` 為必要項目。 `OnCreate`和 `OnInitComplete`無法同時用於相同的執行個體群組。
**提示**  
您可以在叢集中混合選項。例如，僅在控制器和工作者`OnInitComplete`上使用 AMI 型組態。

   Slurm 拓撲與選項 A 中的相同。每個執行個體群組都有`SlurmConfig`定義其節點角色和分割區指派，並在叢集層級`SlurmConfigStrategy: "Managed"`設定。唯一的區別是新增 `LifeCycleConfig`與 `OnInitComplete`，這會指示 HyperPod 在 AMI 型組態在每個節點上完成之後執行延伸指令碼。若要新增 FSx，請在相關執行個體群組`InstanceStorageConfigs`上包含 `FsxLustreConfig`或 `FsxOpenZfsConfig` ，並在`VpcConfig`叢集層級新增 ，如中所述[FSx 和 VPC 組態](#smcluster-getting-started-slurm-cli-fsx-vpc)。

1. 建立叢集：

   ```
   aws sagemaker create-cluster \
       --cli-input-json {{file://create_cluster.json}}
   ```

1. 檢查狀態：

   ```
   aws sagemaker describe-cluster --cluster-name {{my-hyperpod-cluster}}
   ```

   使用 時`OnInitComplete`，回應會顯示在 `OnInitComplete`中`LifeCycleConfig`。以下是顯示控制器執行個體群組的截斷範例：

   ```
   {
       "ClusterName": "my-hyperpod-cluster",
       "ClusterStatus": "InService",
       "InstanceGroups": [
           {
               "InstanceGroupName": "my-controller-group",
               "SlurmConfig": { "NodeType": "Controller" },
               "LifeCycleConfig": {
                   "SourceS3Uri": "s3://sagemaker-{{amzn-s3-demo-bucket}}/scripts/",
                   "OnInitComplete": "extend-defaults.sh"
               }
           }
       ]
   }
   ```

   狀態變為 之後**InService**，請繼續執行 [連線至您的叢集](#smcluster-getting-started-slurm-cli-connect)。

### 選項 C：使用 OnCreate 進行完全自訂控制 （進階）
<a name="smcluster-getting-started-slurm-cli-option-c"></a>

當您需要完全控制佈建時，請使用此選項，包括安裝軟體、進行基礎設施變更，以及決定何時啟動 Slurm。使用 `OnCreate`時，SageMaker HyperPod **不會**執行 AMI 型組態，**也不會**自動啟動 Slurm。

**注意**  
如果您是初次使用 SageMaker HyperPod，而且沒有特定的自訂需求，建議您從選項 A 或選項 B 開始。您稍後可以隨時遷移至自訂模式。

1. 準備生命週期指令碼並將其上傳至 Amazon S3。如果從頭開始，請使用 [Awsome 分散式訓練 GitHub 儲存庫](https://github.com/aws-samples/awsome-distributed-training/)中的範例指令碼：

   ```
   git clone https://github.com/aws-samples/awsome-distributed-training/
   cd awsome-distributed-training/1.architectures/5.sagemaker_hyperpods/LifecycleScripts/base-config
   ```

   上傳至 Amazon S3 （儲存貯體路徑必須以 開頭`s3://sagemaker-`)：

   ```
   aws s3 sync . \
       s3://sagemaker-{{amzn-s3-demo-bucket}}/lifecycle/src
   ```

   若要進一步了解生命週期指令碼，請參閱 [使用生命週期指令碼自訂 SageMaker HyperPod 叢集](sagemaker-hyperpod-lifecycle-best-practices-slurm.md)。

1. 將下列項目儲存為 `create_cluster.json`：

   ```
   {
       "ClusterName": "my-hyperpod-cluster",
       "InstanceGroups": [
           {
               "InstanceGroupName": "my-controller-group",
               "InstanceType": "ml.c5.xlarge",
               "InstanceCount": 1,
               "SlurmConfig": {
                   "NodeType": "Controller"
               },
               "LifeCycleConfig": {
                   "SourceS3Uri": "s3://sagemaker-{{amzn-s3-demo-bucket}}/lifecycle/src",
                   "OnCreate": "on_create.sh"
               },
               "ExecutionRole": "arn:aws:iam::{{111122223333}}:role/HyperPodExecutionRole",
               "InstanceStorageConfigs": [
                   {
                       "EbsVolumeConfig": {
                           "VolumeSizeInGB": 500
                       }
                   }
               ]
           },
           {
               "InstanceGroupName": "my-login-group",
               "InstanceType": "ml.m5.4xlarge",
               "InstanceCount": 1,
               "SlurmConfig": {
                   "NodeType": "Login"
               },
               "LifeCycleConfig": {
                   "SourceS3Uri": "s3://sagemaker-{{amzn-s3-demo-bucket}}/lifecycle/src",
                   "OnCreate": "on_create.sh"
               },
               "ExecutionRole": "arn:aws:iam::{{111122223333}}:role/HyperPodExecutionRole"
           },
           {
               "InstanceGroupName": "worker-group-1",
               "InstanceType": "ml.trn1.32xlarge",
               "InstanceCount": 1,
               "SlurmConfig": {
                   "NodeType": "Compute",
                   "PartitionNames": ["partition-1"]
               },
               "LifeCycleConfig": {
                   "SourceS3Uri": "s3://sagemaker-{{amzn-s3-demo-bucket}}/lifecycle/src",
                   "OnCreate": "on_create.sh"
               },
               "ExecutionRole": "arn:aws:iam::{{111122223333}}:role/HyperPodExecutionRole"
           }
       ],
       "Orchestrator": {
           "Slurm": {
               "SlurmConfigStrategy": "Managed"
           }
       }
   }
   ```

   Slurm 拓撲遵循與其他選項相同的`SlurmConfig`模式。關鍵差異在於 `LifeCycleConfig` `OnCreate`。這可讓 HyperPod 完全略過 AMI 型組態，並改為執行您的`on_create.sh`指令碼。您的指令碼負責完整的佈建序列，包括安裝軟體、設定 Slurm 和啟動 Slurm 協助程式。若要新增 FSx，請在相關執行個體群組`InstanceStorageConfigs`上包含 `FsxLustreConfig`或 `FsxOpenZfsConfig` ，並在`VpcConfig`叢集層級新增 ，如中所述[FSx 和 VPC 組態](#smcluster-getting-started-slurm-cli-fsx-vpc)。

1. 建立叢集：

   ```
   aws sagemaker create-cluster \
       --cli-input-json {{file://create_cluster.json}}
   ```

1. 檢查狀態：

   ```
   aws sagemaker describe-cluster --cluster-name {{my-hyperpod-cluster}}
   ```

   使用 時`OnCreate`，回應會顯示在 `OnCreate`中`LifeCycleConfig`。以下是顯示控制器執行個體群組的截斷範例：

   ```
   {
       "ClusterName": "my-hyperpod-cluster",
       "ClusterStatus": "InService",
       "InstanceGroups": [
           {
               "InstanceGroupName": "my-controller-group",
               "SlurmConfig": { "NodeType": "Controller" },
               "LifeCycleConfig": {
                   "SourceS3Uri": "s3://sagemaker-{{amzn-s3-demo-bucket}}/lifecycle/src",
                   "OnCreate": "on_create.sh"
               }
           }
       ]
   }
   ```

   狀態變為 之後**InService**，請繼續執行 [連線至您的叢集](#smcluster-getting-started-slurm-cli-connect)。

### 常見的驗證錯誤
<a name="smcluster-getting-started-slurm-cli-validation-errors"></a>


| 錯誤 | Resolution | 
| --- | --- | 
| 「叢集必須只有一個具有控制器節點類型的 InstanceGroup」 | 確保只有一個執行個體群組具有 SlurmConfig.NodeType： "Controller" | 
| 「分割區只能指派給運算節點類型」 | PartitionNames 從 Controller或 Login 執行個體群組移除 | 
| 「FSx 組態僅支援自訂 VPC」 | 使用 FSx 時VpcConfig新增至您的請求 | 
| 「執行個體群組需要 LifeCycleConfig...」 | EKS 叢集或 Slurm Continuous NodeProvisioningMode。不支援選用的節點生命週期組態。 | 
| 「OnCreate 和 OnInitComplete in LifeCycleConfig 是互斥的...」 | 移除 OnCreate或 OnInitComplete。您不能同時指定兩者。 | 
| 「執行個體群組的 LifeCycleConfig 不完整...」 | 指定 OnInitComplete OnCreate或 時，SourceS3Uri也必須提供 。 | 
| 「LifeCycleConfig 是選用項目，但需要相容的 AMI...」 | 執行 UpdateClusterSoftware 以更新至支援選用節點生命週期組態的 AMI。 | 
| 「已提供執行個體群組的 LifeCycleConfig，但不包含組態...」 | SourceS3Uri 使用 OnCreate或 指定 OnInitComplete，或LifeCycleConfig完全省略 。 | 

## 連線至您的叢集
<a name="smcluster-getting-started-slurm-cli-connect"></a>

在叢集狀態變為 **InService**（通常為 10 到 15 分鐘） 之後，請連線並驗證。

1. 列出叢集節點以取得執行個體 IDs：

   ```
   aws sagemaker list-cluster-nodes --cluster-name {{my-hyperpod-cluster}}
   ```

1. 使用 AWS Systems Manager Session Manager 連線：

   ```
   aws ssm start-session \
       --target sagemaker-cluster:{{my-hyperpod-cluster}}_{{my-login-group}}-{{i-0abc123def456789b}} \
       --region {{us-west-2}}
   ```

1. 確認 Slurm 已正確設定：

   ```
   # Check Slurm nodes
   sinfo
   
   # Check Slurm partitions
   sinfo -p partition-1
   
   # Submit a test job
   srun -p partition-1 --nodes=1 hostname
   ```

如需執行 ML 工作負載的詳細資訊，請參閱 [SageMaker HyperPod 叢集上的任務](sagemaker-hyperpod-run-jobs-slurm.md)。

## 刪除叢集並清理資源
<a name="smcluster-getting-started-slurm-cli-delete-cluster-and-clean"></a>

測試之後，請刪除叢集以避免繼續收費：

```
aws sagemaker delete-cluster --cluster-name {{my-hyperpod-cluster}}
```

如果您使用節點生命週期指令碼 （選項 B 或選項 C)，請清除 Amazon S3 儲存貯體：

```
aws s3 rm s3://sagemaker-{{amzn-s3-demo-bucket}}/{{lifecycle/src}} --recursive
```

如果您僅使用 AMI 型組態 （選項 A)，則節點生命週期指令碼不需要 Amazon S3 清除。

如果您執行訓練工作負載，也請檢查 Amazon S3、Amazon FSx for Lustre 或 Amazon Elastic File System 中的資料或成品，並將其刪除以避免產生費用。

## 相關主題
<a name="smcluster-getting-started-slurm-cli-related-topics"></a>
+ [SageMaker HyperPod Slurm 組態](sagemaker-hyperpod-ref.md#sagemaker-hyperpod-ref-slurm-configuration)
+ [使用生命週期指令碼自訂 SageMaker HyperPod 叢集](sagemaker-hyperpod-lifecycle-best-practices-slurm.md)
+ [透過 InstanceStorageConfigs 的 FSx 組態](sagemaker-hyperpod-ref.md#sagemaker-hyperpod-ref-slurm-fsx-config)
+ [SageMaker HyperPod Slurm 叢集操作](sagemaker-hyperpod-operate-slurm.md)
+ [SageMaker HyperPod 的延伸指令碼](https://github.com/awslabs/awsome-distributed-training/tree/main/1.architectures/5.sagemaker-hyperpod/Extensions)
+ [使用生命週期指令碼自訂 SageMaker HyperPod 叢集](sagemaker-hyperpod-lifecycle-best-practices-slurm.md)