

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

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

以下教程演示了如何通过的[AWS CLI 命令](sagemaker-hyperpod-ref.md#sagemaker-hyperpod-ref-cli)使用 Slurm 创建新 SageMaker HyperPod 集群。 SageMaker HyperPod在本教程结束时，您将拥有一个正在运行的 Slurm 集群，其中包含控制器节点、登录节点和计算工作组，可以调度和运行 ML 工作负载。本教程介绍了 Slurm 拓扑设置、节点生命周期配置选项、可选的 FSx 共享存储以及如何连接到集群。

在开始之前，请确保您已完成[使用的先决条件 SageMaker HyperPod](sagemaker-hyperpod-prerequisites.md)（VPC、配额、FSx）和[AWS Identity and Access Management 对于 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-orchestrated 集群时，您可以做出两个独立的配置选择：

1. **Slurm 拓扑配置** — Slurm 集群拓扑（节点角色、分区）是如何定义的？

1. **节点生命周期配置** — 如何配置和自定义节点？

对于 Slurm 拓扑，本教程使用 API-driven 配置方法，即在`CreateCluster`请求中使用`SlurmConfig`每个实例组和集群`Orchestrator.Slurm`级别直接定义节点角色和分区。这是新集群的推荐方法。它提供单一事实来源、内置验证和分区配置偏差检测，无需管理其他文件。或者，您可以使用存储在 Amazon S3 中的旧`provisioning_parameters.json`文件来向后兼容现有集群。有关传统方法的详细信息，请参阅[SageMaker HyperPod Slurm 配置](sagemaker-hyperpod-ref.md#sagemaker-hyperpod-ref-slurm-configuration)。

对于节点生命周期配置， SageMaker HyperPod 支持三个选项。在最简单的情况下，你可以`LifeCycleConfig`完全省略节点，使用 AMI-based 配置、设置 Slurm 和运行机器学习工作负载的基本软件包（例如 Docker、Enroot 和 Pyxis） HyperPod自动配置节点，无需脚本或 Amazon S3 存储桶。如果您需要在 AMI-based 配置之上进行自定义，则可以通过提供扩展脚本`OnInitComplete`，该脚本将在配置完成后运行。为了完全控制整个配置顺序，该`OnCreate`路径允许您的脚本拥有所有内容，包括 Slurm 何时启动。

对于 ML 工作负载，您通常还需要一个共享的高性能文件系统来存储训练数据、检查点和共享库。 SageMaker HyperPod 支持 Amazon for Lustre 的 Amazon FSx 和 OpenZFS 的 fsX，通过按实例组进行配置。`InstanceStorageConfigs`FSx 配置对于集群创建是可选的，但建议用于生产工作负载。

### 通过 API 配置 Slurm 拓扑
<a name="smcluster-getting-started-slurm-cli-slurm-topology"></a>

本教程中的所有示例都使用 API-driven Slurm 拓扑配置，在这种配置中，您可以直接在 `CreateCluster` API 请求中定义 Slurm 集群结构，而不是通过单独的配置文件定义。

Slurm 集群至少需要一个控制器节点（运行`slurmctld`守护程序并协调作业调度）和一个或多个计算节点（执行作业）。或者，您可以添加登录节点，为用户提供用于提交和管理作业的专用访问点，而无需直接登录控制器。在 API 请求中，您可以使用为每个实例组分配其 Slurm 角色`SlurmConfig`，指定该组是用作控制器、登录还是计算节点。计算组还映射到一个或多个 Slurm 分区，这些分区充当逻辑队列，用于组织在不同节点集间调度作业的方式。

在群集级别，`Orchestrator.Slurm`控制如何 HyperPod 管理中的分区配置`slurm.conf`。您可以选择一种策略，以确定分区拓扑 HyperPod 是否为单一事实来源，它是否覆盖手动更改，或者是否将 API-defined 配置与您所做的任何手动编辑合并。以下是所用字段的参考资料。

**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`上的分区到节点映射。创建或更新集群时，`slurm.conf`根据您在每个实例组上定义的分区配置 HyperPod 写入到，将计算实例组映射到其分配的分区，并使用相应的 Slurm 角色注册控制器和登录节点。`SlurmConfig`

您选择的策略控制在 API 之外修改中的`slurm.conf`分区配置时会发生什么，例如，管理员直接在控制器节点上编辑文件。使用`Managed`， HyperPod 将 API 视为单一事实来源，如果磁盘`slurm.conf`上有漂移，则会检测和阻止更新。使用`Overwrite`， HyperPod 强制在控制器上进行 API-defined 配置，放弃对控制器的任何手动编辑。`slurm.conf`这对于从意外更改中恢复非常有用。使用`Merge`， HyperPod 保留对 API 配置的手动编辑并将其与 API 配置合并，从而使高级用户可以灵活地在分区旁边 API-managed 维护自定义`slurm.conf`设置。`slurm.conf`


| Strategy | 分区漂移检测 | 手动更改 | 使用案例 | 
| --- | --- | --- | --- | 
| Managed（默认值） | 已启用；如果发现偏差，则阻止更新 | 不支持 | 单一真相来源 | 
| Overwrite | 已禁用 | 更新时被覆盖 | 从漂移中恢复 | 
| Merge | 已禁用 | 保留并合并 | 定制slurm.conf需求 | 

**重要**  
偏差检测仅适用于中的 Slurm 分区配置`slurm.conf`（通过 API 定义的分区到节点的映射）。对其他`slurm.conf`设置（例如计划参数、资源限制或记账配置）的更改不受监控，也不会被检测或报告 HyperPod。

**注意**  
如果您更喜欢使用`provisioning_parameters.json`文件而不是 API 来定义 Slurm 拓扑，请在实例组和`Orchestrator.Slurm`集群请求`SlurmConfig`中省略，然后将文件与节点生命周期脚本一起上传到 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 集群时，您可以通过配置请求中的`LifeCycleConfig`区块来选择如何配置每个实例组的节点。`CreateCluster` SageMaker HyperPod 支持三个节点生命周期配置选项，每个选项都提供对配置过程的不同级别的控制。

如果仅使用**AMI-based 配置**，则可以`LifeCycleConfig`完全省略。 HyperPod 使用 AMI-based 配置、设置 Slurm、安装基本软件包和启动所有必需的服务自动配置节点。这是最简单的路径，不需要 Amazon S3 存储桶或脚本。

使用 “**扩展**” 选项，您可以`OnInitComplete`在 `LifeCycleConfig` Amazon S3 中指定并`SourceS3Uri`指向您的扩展脚本。 HyperPod 首先运行完整 AMI-based 配置，然后执行您的脚本。这使您可以添加自定义设置，例如监控代理、LDAP 集成或其他存储装载，而无需管理基准配置。

使用 “**自定义**” 选项，您可以在`OnCreate`中指定，`LifeCycleConfig`同时`SourceS3Uri`指向 Amazon S3 中的完整生命周期脚本集。 HyperPod 不运行 AMI-based 配置，也不会启动 Slurm。您的脚本拥有整个配置序列。这使您可以完全控制安装了哪些软件、如何配置以及何时启动 Slurm。


| 节点生命周期选项 | 需要亚马逊 S3 存储桶吗？ | 要上传的脚本？ | LifeCycleConfig 在 API 中？ | 
| --- | --- | --- | --- | 
| AMI-based 仅限@@ 配置（最简单） | 否 | 否 | 完全省略 | 
| 扩展 (OnInitComplete) | 是 | 只有你的扩展脚本 | OnInitComplete \+ SourceS3Uri | 
| 自定义 (OnCreate) | 是 | 完整生命周期脚本集 | OnCreate \+ SourceS3Uri | 

**注意**  
只有 Slurm-orchestrated 集群支持可选的节点生命周期配置。 EKS-orchestrated 使用连续的集群和 Slurm 集群`NodeProvisioningMode`仍然需要`LifeCycleConfig``SourceS3Uri`在每个实例组上使用。`OnCreate`

**注意**  
`OnCreate`并且`OnInitComplete`是相互排斥的。在同一个实例组上同时指定两者会导致验证错误。

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

对于 ML 工作负载，共享的高性能文件系统对于跨群集节点存储训练数据、模型检查点和共享库至关重要。 SageMaker HyperPod 支持 Amazon for Lustre 的 Amazon FSx 和 OpenZFS 的 fsX，通过按实例组进行配置。`InstanceStorageConfigs`FSx 文件系统位于您的 VPC 中，因此在使用 FSx 时需要自定义 VPC 配置 (`VpcConfig`)。

FSx 配置适用于所有三个节点生命周期配置选项。使用 AMI-based 配置或时`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 | 

**适用于 OpenZFS 的 FSX：**

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


| 字段 | 说明 | 
| --- | --- | 
| DnsName | 必需。适用于 OpenZFS 文件系统的 FSX 的 DNS 名称。 | 
| MountPath | 可选。实例上的本地挂载路径。默认值：/home | 

**注意**  
每个实例组最多可以有一个用于 Lustre 的 FSX 和一个用于 OpenZFS 配置的 FSX。不同的实例组可以挂载不同的文件系统。

**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-based 配置。它不需要脚本或 Amazon S3 存储桶，开箱即用即可提供功能齐全的集群。如果您需要在配置之上添加自定义项，请选择选项 B；如果您需要完全控制 AMI-based 配置过程，请选择选项 C。

`ExecutionRole`在所有示例中，请提供您在中使用托管`AmazonSageMakerClusterInstanceRolePolicy`创建的 IAM 角色的 ARN。[使用的先决条件 SageMaker HyperPod](sagemaker-hyperpod-prerequisites.md)

### 选项 A：仅限 AMI-based 配置（不包括生命周期配置）
<a name="smcluster-getting-started-slurm-cli-option-a"></a>

这是最简单的路径。不需要 Amazon S3 存储桶、脚本或配置文件。 SageMaker HyperPod 使用 AMI-based配置、安装基本软件和应用配置自动配置节点，这样集群就可以开箱即用地运行机器学习工作负载。所有软件包都嵌入在 AMI 中，因此在配置期间无需访问互联网。

下表列出了 AMI-based配置中包含的功能：


| 能力 | 说明 | 
| --- | --- | 
| Slurm 守护程序 | 控制器和计算守护程序自动启动 | 
| Docker | 用于构建和运行 ML 容器的容器运行时 | 
| Enroot | 适用于 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`指定。

   Slurm 拓扑是通过`SlurmConfig`在每个实例组上定义`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-based 配置的情况下，响应中的实例组不包含`LifeCycleConfig`块。以下是显示控制器实例组的截断示例：

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

   状态变为后**InService**，继续执行[Connect 连接到您的集群](#smcluster-getting-started-slurm-cli-connect)。

### 选项 B：使用扩展 AMI-based 配置 OnInitComplete
<a name="smcluster-getting-started-slurm-cli-option-b"></a>

当您需要在 AMI-based配置之上进行自定义（例如监视代理、 LDAP/SSSD 集成或其他存储装载）时，请使用此选项。 SageMaker HyperPod 首先运行 AMI-based 配置，然后执行您的扩展脚本。

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 Distributed Training 存储库中的 Extensions [文件夹](https://github.com/awslabs/awsome-distributed-training/tree/main/1.architectures/5.sagemaker-hyperpod/Extensions)为添加用户和启用可观察性等常见任务提供了即用型扩展脚本。每项功能都独立包含在自己的目录中，有自己的入口点脚本，可以直接作为`OnInitComplete`脚本提供。  
对于需要多种功能的集群，我们建议使用 Ex `run_extensions.sh` tensions 文件夹顶层提供的脚本。该脚本编排了所有可用的扩展脚本，并提供了简单的布尔值切换来启用或禁用每种功能。要使用它，请将整个 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 之前，必须先填充每项已启用功能的配置文件。有关配置的详细信息，请参阅每项功能目录中的自述文件。

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-based配置。

   Slurm 拓扑与选项 A 中的拓扑结构相同。每个实例组都有其`SlurmConfig`定义的节点角色和分区分配，并在`SlurmConfigStrategy: "Managed"`集群级别进行设置。唯一的区别是添加了 w `LifeCycleConfig` it `OnInitComplete` h，它告诉 HyperPod 你在每个节点上完成 AMI-based配置后运行扩展脚本。要添加 FSx，请在相关实例组`FsxOpenZfsConfig`中`InstanceStorageConfigs`加入`FsxLustreConfig`或包括在内，然后在集群`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**，继续执行[Connect 连接到您的集群](#smcluster-getting-started-slurm-cli-connect)。

### 选项 C：使用 OnCreate （高级）实现完全自定义控件
<a name="smcluster-getting-started-slurm-cli-option-c"></a>

当您需要完全控制配置（包括安装软件、更改基础架构以及决定何时启动 Slurm）时，请使用此选项。使用`OnCreate`， SageMaker HyperPod **不**运行 AMI-based 配置，也**不会**自动启动 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-based 配置，改为运行你的`on_create.sh`脚本。您的脚本负责完整的配置顺序，包括安装软件、配置 Slurm 和启动 Slurm 守护程序。要添加 FSx，请在相关实例组`FsxOpenZfsConfig`中`InstanceStorageConfigs`加入`FsxLustreConfig`或包括在内，然后在集群`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**，继续执行[Connect 连接到您的集群](#smcluster-getting-started-slurm-cli-connect)。

### 常见的验证错误
<a name="smcluster-getting-started-slurm-cli-validation-errors"></a>


| 错误 | 解决方案 | 
| --- | --- | 
| “集群必须只有一个控制 InstanceGroup 器节点类型” | 确保只有一个实例组具有SlurmConfig.NodeType："Controller" | 
| “只能将分区分配给计算节点类型” | PartitionNames从Controller或Login实例组中移除 | 
| “只有自定义 VPC 支持 FSx 配置” | 使用 FSx 时VpcConfig添加到您的请求中 | 
| “实例组LifeCycleConfig 为必填项...” | EKS 集群或 Slurm Continue。NodeProvisioningMode不支持可选的节点生命周期配置。 | 
| “OnCreate 和 OnInitComplete in LifeCycleConfig 是相互排斥的...” | 移除OnCreate或OnInitComplete。不能同时指定两者。 | 
| “LifeCycleConfig 例如，群组不完整...” | 如果指定了OnCreate或，OnInitComplete则还SourceS3Uri必须提供。 | 
| “LifeCycleConfig 是可选的，但需要兼容的 AMI...” | 运行UpdateClusterSoftware以更新到支持可选节点生命周期配置的 AMI。 | 
| “LifeCycleConfig 例如，提供了组但不包含任何配置...” | SourceS3Uri使用OnCreate或指定OnInitComplete，或者LifeCycleConfig完全省略。 | 

## Connect 连接到您的集群
<a name="smcluster-getting-started-slurm-cli-connect"></a>

集群状态变为**InService**（通常为 10 到 15 分钟）后，进行连接并进行验证。

1. 列出集群节点以获取实例 ID：

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

1. 使用 AWS Systems 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-based 配置（选项 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)
+ [通过 FSx 进行配置 InstanceStorageConfigs](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)