

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

# 使用 Slurm 编排 SageMaker HyperPod 集群
<a name="sagemaker-hyperpod-slurm"></a>

中的 Slurm 支持 SageMaker HyperPod 可帮助您配置弹性集群，以运行机器学习 (ML) 工作负载和开发 state-of-the-art大型语言模型 (LLMs)、扩散模型和基础模型 (FMs) 等模型。它 FMs 通过消除构建和维护由数千个加速器（例如 AWS Trainium 和 NVIDIA A100 和 H100 图形处理单元）提供支持的大型计算集群所涉及的无差别繁重的工作（）来加速开发。GPUs当加速器出现故障时， SageMaker HyperPod 监控集群实例的弹性功能会自动检测并即时更换故障硬件，这样您就可以专注于运行 ML 工作负载。此外，借助生命周期配置支持 SageMaker HyperPod，您可以自定义您的计算环境以最好地满足您的需求，并使用 Amazon A SageMaker I 分布式训练库对其进行配置以实现最佳性能 AWS。

**操作集群**

您可以通过控制台用户界面 (UI) 以图形方式创建、配置和维护 SageMaker HyperPod 集群，也可以通过 AWS 命令行界面 (CLI) 以编程方式创建、配置和维护集群。 适用于 Python (Boto3) 的 AWS SDK借助 Amazon VPC，您可以保护集群网络，还可以利用您的 VPC 中的资源配置集群，例如吞吐量最快的 Amazon FSx for Lustre。您还可以为集群实例组赋予不同的 IAM 角色，并限制集群资源和用户可以执行的操作。要了解更多信息，请参阅[SageMaker HyperPod Slurm 集群操作](sagemaker-hyperpod-operate-slurm.md)。

**配置您的 ML 环境**

SageMaker HyperPod 运行[SageMaker HyperPod DLAMI](sagemaker-hyperpod-ref.md#sagemaker-hyperpod-ref-hyperpod-ami)，这将在集 HyperPod 群上设置 ML 环境。您可以通过提供生命周期脚本为 DLAMI 配置其他自定义功能，以支持您的使用场景。要进一步了解如何设置生命周期脚本，请参阅 [入门 SageMaker HyperPod](smcluster-getting-started-slurm.md) 和 [使用生命周期脚本自定义 SageMaker HyperPod 集群](sagemaker-hyperpod-lifecycle-best-practices-slurm.md)。

**安排作业**

成功创建 HyperPod 集群后，集群用户可以登录集群节点（例如头节点或控制器节点、登录节点和工作节点），并安排运行机器学习工作负载的作业。要了解更多信息，请参阅[SageMaker HyperPod 集群上的作业](sagemaker-hyperpod-run-jobs-slurm.md)。

**硬件故障恢复能力**

SageMaker HyperPod 在群集节点上运行运行状况检查并提供工作负载自动恢复功能。借助的集群弹性功能 HyperPod，在节点数超过 16 的集群中将故障节点替换为运行正常的节点之后，您可以从保存的最后一个检查点恢复工作负载。要了解更多信息，请参阅[SageMaker HyperPod 集群弹性](sagemaker-hyperpod-resiliency-slurm.md)。

**记录和管理集群**

您可以在 Amazon 中找到 SageMaker HyperPod 资源利用率指标和生命周期日志 CloudWatch，并通过标记来管理 SageMaker HyperPod 资源。每个 `CreateCluster` API 运行都会创建一个不同的日志流，以 `<cluster-name>-<timestamp>` 格式命名。在日志流中，可以查看主机名、失败的生命周期脚本名称以及失败脚本的输出，如 `stdout` 和 `stderr`。有关更多信息，请参阅 [SageMaker HyperPod 集群管理](sagemaker-hyperpod-cluster-management-slurm.md)。

**与 SageMaker AI 工具兼容**

使用 SageMaker HyperPod，您可以使用 SageMaker AI 提供的 AWS 经过优化的集体通信库（例如 A [SageMaker I 分布式数据并行度 (SMDDP)](data-parallel.md) 库）来配置集群。SMDDP 库实现了针对 AWS 计算和网络基础架构优化的`AllGather`操作，适用于由 NVIDIA A100 提供支持的最高性能的 SageMaker AI 机器学习实例。 GPUs要了解更多信息，请参阅[在 Slurm 开启的情况下运行分布式训练工作负载 HyperPod](sagemaker-hyperpod-run-jobs-slurm-distributed-training-workload.md)。

**实例放置使用 UltraServers**

SageMaker AI 会 UltraServer 根据一种尽力而为的策略自动将任务分配给您内部的实例，即在使用另一个实例 UltraServer之前先使用一个中的所有实例。例如，如果您请求 14 个实例，并且您的训练计划 UltraServers 中有 2 个实例， SageMaker AI 将使用第一个实例中的所有实例 UltraServer。如果您请求了 20 个实例，并且您的训练计划 UltraServers 中有 2 个实例， SageMaker AI 将在第一个实例中使用所有 17 个实例， UltraServer 然后使用第二个实例中的 3 个实例 UltraServer。

**Topics**
+ [

# 入门 SageMaker HyperPod
](smcluster-getting-started-slurm.md)
+ [

# SageMaker HyperPod Slurm 集群操作
](sagemaker-hyperpod-operate-slurm.md)
+ [

# 使用生命周期脚本自定义 SageMaker HyperPod 集群
](sagemaker-hyperpod-lifecycle-best-practices-slurm.md)
+ [

# SageMaker HyperPod 多头节点支持
](sagemaker-hyperpod-multihead-slurm.md)
+ [

# SageMaker HyperPod 集群上的作业
](sagemaker-hyperpod-run-jobs-slurm.md)
+ [

# SageMaker HyperPod 集群资源监控
](sagemaker-hyperpod-cluster-observability-slurm.md)
+ [

# SageMaker HyperPod 集群弹性
](sagemaker-hyperpod-resiliency-slurm.md)
+ [

# 使用 Slurm 持续配置以增强集群操作
](sagemaker-hyperpod-scaling-slurm.md)
+ [

# SageMaker HyperPod 集群管理
](sagemaker-hyperpod-cluster-management-slurm.md)
+ [

# SageMaker HyperPod FAQs
](sagemaker-hyperpod-faq-slurm.md)

# 入门 SageMaker HyperPod
<a name="smcluster-getting-started-slurm"></a>

开始创建您的第一个 SageMaker HyperPod 集群，并学习的集群操作功能。 SageMaker HyperPod您可以通过 SageMaker AI 控制台 UI 或 AWS CLI 命令创建 SageMaker HyperPod 集群。本教程介绍如何使用流行的工作负载调度器软件 Slurm 创建新 SageMaker HyperPod集群。完成本教程后，您将知道如何使用 AWS Systems Manager 命令 (`aws ssm`) 登录到集群节点。完成本教程后，另请参阅[SageMaker HyperPod Slurm 集群操作](sagemaker-hyperpod-operate-slurm.md)以了解有关 SageMaker HyperPod 基本操作的更多信息，并了解[SageMaker HyperPod 集群上的作业](sagemaker-hyperpod-run-jobs-slurm.md)如何在已配置的集群上安排作业。

**提示**  
要查找实际示例和解决方案，另请参阅[SageMaker HyperPod研讨会](https://catalog.workshops.aws/sagemaker-hyperpod)。

**Topics**
+ [

# 开始 SageMaker HyperPod 使用 SageMaker AI 控制台
](smcluster-getting-started-slurm-console.md)
+ [

# 使用 CloudFormation 模板创建 SageMaker HyperPod 集群
](smcluster-getting-started-slurm-console-create-cluster-cfn.md)
+ [

# 开始 SageMaker HyperPod 使用 AWS CLI
](smcluster-getting-started-slurm-cli.md)

# 开始 SageMaker HyperPod 使用 SageMaker AI 控制台
<a name="smcluster-getting-started-slurm-console"></a>

以下教程演示如何创建新 SageMaker HyperPod 集群并通过 SageMaker AI 控制台 UI 使用 Slurm 对其进行设置。按照教程，您将创建一个包含三个 Slurm 节点的 HyperPod 集群，`my-controller-group``my-login-group`、和。`worker-group-1`

**Topics**
+ [

## 创建集群
](#smcluster-getting-started-slurm-console-create-cluster-page)
+ [

## 部署资源
](#smcluster-getting-started-slurm-console-create-cluster-deploy)
+ [

## 删除集群并清理资源
](#smcluster-getting-started-slurm-console-delete-cluster-and-clean)

## 创建集群
<a name="smcluster-getting-started-slurm-console-create-cluster-page"></a>

要导航到**SageMaker HyperPod 集群**页面并选择 **Slurm** 编排，请按照以下步骤操作。

1. 打开 Amazon A SageMaker I 控制台，网址为[https://console.aws.amazon.com/sagemaker/](https://console.aws.amazon.com/sagemaker/)。

1. 在左侧导航窗格中选择集**HyperPod 群**，然后选择**集群管理**。

1. 在**SageMaker HyperPod 集群**页面上，选择**创建 HyperPod 集群**。

1. 在**创建 HyperPod 集群**下拉列表中，选择**由 Slurm 编排**。

1. 在 Slurm 集群创建页面上，您将看到两个选项。选择最适合您需求的选项。

   1. **快速设置** – 要立即开始使用默认设置，请选择**快速设置**。使用此选项， SageMaker AI 将在创建集群的过程中为 Lustre 创建新资源，例如 VPC、子网、安全组、Amazon S3 存储桶、IAM 角色和 FSx for Lustre。

   1. **自定义设置** – 要与现有 AWS 资源集成或有特定的联网、安全或存储要求，请选择**自定义设置**。利用此选项，您可以选择使用现有资源或创建新资源，还可以自定义最适合您需求的配置。

## 快速设置
<a name="smcluster-getting-started-slurm-console-create-cluster-default"></a>

在 “**快速设置**” 部分，按照以下步骤使用 Slurm 编排创建 HyperPod 集群。

### 常规设置
<a name="smcluster-getting-started-slurm-console-create-cluster-default-general"></a>

指定新集群的名称。创建集群后，无法更改该名称。

### 实例组
<a name="smcluster-getting-started-slurm-console-create-cluster-default-instance-groups"></a>

要添加实例组，请选择**添加组**。每个实例组都可以进行不同的配置，您可以创建一个异构集群，该集群由具有不同实例类型的多个实例组组成。要部署集群，您必须为控制器和计算组类型添加至少一个实例组。

**重要**  
一次可添加一个实例组。要创建多个实例组，请为每个实例组重复此过程。

执行以下步骤来创建实例组。

1. 对于**实例组类型**，为实例组选择类型。在本教程中，为 `my-controller-group` 选择**控制器（主）**，为 `my-login-group` 选择**登录**，为 `worker-group-1` 选择**计算（worker）**。

1. 对于**名称**，指定实例组的名称。在本教程中，创建三个实例组，分别命名为 `my-controller-group`、`my-login-group` 和 `worker-group-1`。

1.  对于**实例容量**，选择按需容量或训练计划来预留计算资源。

1. 对于**实例类型**，为实例组选择实例。本教程中，选择 `ml.c5.xlarge` 为 `my-controller-group`，`ml.m5.4xlarge` 为 `my-login-group`，`ml.trn1.32xlarge` 为 `worker-group-1`。
**重要**  
请确保为账户选择具有足够配额以及充足的未分配 IP 地址的实例类型。要查看或请求更多配额，请参阅 [SageMaker HyperPod 配额](sagemaker-hyperpod-prerequisites.md#sagemaker-hyperpod-prerequisites-quotas)。

1. 对于**实例数量**，指定一个不超过集群使用实例配额的整数。在本教程中，为所有三个组输入 **1**。

1. 对于**目标可用区**，选择将在其中预调配实例的可用区。可用区应与加速计算容量所在的位置相对应。

1. 对于**每个实例的附加存储卷(GB) – 可选**，指定 1 到 16384 之间的整数，以千兆字节（GB）为单位设置附加 Elastic Block Store（EBS）卷的大小。EBS 卷附加到实例组的每个实例。附加 EBS 卷的默认挂载路径为 `/opt/sagemaker`。成功创建集群后，您可以 SSH 登录集群实例（节点），并通过运行 `df -h` 命令验证 EBS 卷是否已正确加载。如 [Amazon Elastic Block Store 用户指南](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-volumes.html)中的 *Amazon EBS 卷*部分所述，附加 EBS 卷可提供稳定、非实例和独立持久化的存储。

1. 选择**添加实例组**。

### 快速设置默认值
<a name="smcluster-getting-started-slurm-console-create-cluster-default-settings"></a>

本部分列出了创建集群的所有默认设置，包括将在集群创建过程中创建的所有新 AWS 资源。检查默认设置。

## 自定义设置
<a name="smcluster-getting-started-slurm-console-create-cluster-custom"></a>

在 “**自定义设置**” 部分，按照以下步骤使用 Slurm 编排创建 HyperPod 集群。

### 常规设置
<a name="smcluster-getting-started-slurm-console-create-cluster-custom-general"></a>

指定新集群的名称。创建集群后，无法更改该名称。

对于**实例恢复**，选择**自动 – *推荐***或**无**。

### Networking
<a name="smcluster-getting-started-slurm-console-create-cluster-custom-network"></a>

配置网络设置以创建集群。创建集群后，无法修改这些设置。

1. 对于 **VPC**，如果您已经拥有可以让 SageMaker AI 访问您的 VPC 的 VPC，请选择您自己的 VPC。要创建新的 VPC，请按照 [Amazon Virtual Private Cloud 用户指南](https://docs.aws.amazon.com/vpc/latest/userguide/create-vpc.html)中的*创建 VPC* 进行操作。您可以将其保留为 “**无**” 以使用默认 SageMaker AI VPC。

1. 对于 **VPC IPv4 网段**，请输入您的 VPC 的起始 IP。

1. 对于**可用区**，请选择 HyperPod 将在其中为您的集群创建子网的可用区 (AZ)。选择 AZs 与您的加速计算容量位置相匹配的选项。

1. 对于**安全组**，创建一个安全组，或选择最多五个已配置规则的安全组，以允许 VPC 内资源之间的通信。

### 实例组
<a name="smcluster-getting-started-slurm-console-create-cluster-custom-instance-groups"></a>

要添加实例组，请选择**添加组**。每个实例组都可以进行不同的配置，您可以创建一个异构集群，该集群由具有不同实例类型的多个实例组组成。要部署集群，您必须添加至少一个实例组。

**重要**  
一次可添加一个实例组。要创建多个实例组，请为每个实例组重复此过程。

执行以下步骤来创建实例组。

1. 对于**实例组类型**，为实例组选择类型。在本教程中，为 `my-controller-group` 选择**控制器（主）**，为 `my-login-group` 选择**登录**，为 `worker-group-1` 选择**计算（worker）**。

1. 对于**名称**，指定实例组的名称。在本教程中，创建三个实例组，分别命名为 `my-controller-group`、`my-login-group` 和 `worker-group-1`。

1.  对于**实例容量**，选择按需容量或训练计划来预留计算资源。

1. 对于**实例类型**，为实例组选择实例。本教程中，选择 `ml.c5.xlarge` 为 `my-controller-group`，`ml.m5.4xlarge` 为 `my-login-group`，`ml.trn1.32xlarge` 为 `worker-group-1`。
**重要**  
请确保为账户选择具有足够配额以及充足的未分配 IP 地址的实例类型。要查看或请求更多配额，请参阅 [SageMaker HyperPod 配额](sagemaker-hyperpod-prerequisites.md#sagemaker-hyperpod-prerequisites-quotas)。

1. 对于**实例数量**，指定一个不超过集群使用实例配额的整数。在本教程中，为所有三个组输入 **1**。

1. 对于**目标可用区**，选择将在其中预调配实例的可用区。可用区应与加速计算容量所在的位置相对应。

1. 对于**每个实例的附加存储卷(GB) – 可选**，指定 1 到 16384 之间的整数，以千兆字节（GB）为单位设置附加 Elastic Block Store（EBS）卷的大小。EBS 卷附加到实例组的每个实例。附加 EBS 卷的默认挂载路径为 `/opt/sagemaker`。成功创建集群后，您可以 SSH 登录集群实例（节点），并通过运行 `df -h` 命令验证 EBS 卷是否已正确加载。如 [Amazon Elastic Block Store 用户指南](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-volumes.html)中的 *Amazon EBS 卷*部分所述，附加 EBS 卷可提供稳定、非实例和独立持久化的存储。

1. 选择**添加实例组**。

### 生命周期脚本
<a name="smcluster-getting-started-slurm-console-create-cluster-custom-lifecycle"></a>

您可以选择使用默认生命周期脚本或自定义生命周期脚本，这些脚本将存储在 Amazon S3 存储桶中。您可以在 Aw [esome 分布式培训 GitHub 存储库](https://github.com/aws-samples/awsome-distributed-training/tree/main/1.architectures/7.sagemaker-hyperpod-eks/LifecycleScripts)中查看默认生命周期脚本。要了解有关生命周期脚本的更多信息，请参阅[使用生命周期脚本自定义 SageMaker HyperPod 集群](sagemaker-hyperpod-lifecycle-best-practices-slurm.md)。

1. 对于**生命周期脚本**，选择使用默认生命周期脚本或自定义生命周期脚本。

1. 对于**生命周期脚本的 S3 存储桶**，选择创建新的存储桶或使用现有存储桶来存储生命周期脚本。

### Permissions
<a name="smcluster-getting-started-slurm-console-create-cluster-custom-permissions"></a>

选择或创建允许 HyperPod 代表您运行和访问必要 AWS 资源的 IAM 角色。

### 仓储服务
<a name="smcluster-getting-started-slurm-console-create-cluster-custom-storage"></a>

配置要在 FSx 集群上配置 Lustre 文件系统。 HyperPod 

1. 对于**文件系统**，请为 Lustre 文件系统选择现有的， FSx 为 Lustre 文件系统创建一个新的 FSx 文件系统，或者不要 FSx 为 Lustre 文件系统置备。

1. 对于**每单位存储的吞吐量**，选择预调配存储中每 TiB 可用的吞吐量。

1. 在**存储容量**中，输入以 TB 为单位的容量值。

1. 对于**数据压缩类型**，选择**LZ4**启用数据压缩。

1. 对于 **Lustre 版本**，查看为新文件系统推荐的值。

### 标签 – 可选
<a name="smcluster-getting-started-slurm-console-create-cluster-tags"></a>

对于**标签-*可选***，向新集群添加密钥和值对，并将集群作为 AWS 资源进行管理。要了解更多信息，请参阅[标记您的 AWS 资源](https://docs.aws.amazon.com/tag-editor/latest/userguide/tagging.html)。

## 部署资源
<a name="smcluster-getting-started-slurm-console-create-cluster-deploy"></a>

使用**快速设置**或**自定义设置**完成集群配置后，选择以下选项以启动资源预调配和集群创建。
+  **提交**- SageMaker AI 将开始配置默认配置资源并创建集群。
+ **下载 CloudFormation 模板参数**-您将下载配置参数 JSON 文件并运行 AWS CLI 命令部署 CloudFormation 堆栈以配置配置资源并创建集群。如果需要，您可以编辑已下载的参数 JSON 文件。如果选择此选项，请在[使用 CloudFormation 模板创建 SageMaker HyperPod 集群](smcluster-getting-started-slurm-console-create-cluster-cfn.md)中查看更多说明。

## 删除集群并清理资源
<a name="smcluster-getting-started-slurm-console-delete-cluster-and-clean"></a>

成功测试创建 SageMaker HyperPod 集群后，它会继续以该`InService`状态运行，直到您删除该集群。我们建议您在不使用按需 SageMaker AI 实例时删除任何使用按需 AI 实例创建的集群，以免产生基于按需定价的持续服务费用。在本教程中，您创建了一个由两个实例组组成的集群。其中一个使用 C5 实例，因此请确保按照 [删除集 SageMaker HyperPod 群](sagemaker-hyperpod-operate-slurm-console-ui.md#sagemaker-hyperpod-operate-slurm-console-ui-delete-cluster) 中的说明删除集群。

但是，如果您创建了具有预留计算容量的集群，则集群的状态不会影响服务计费。

要从本教程使用的 S3 存储桶中清理生命周期脚本，请转到集群创建过程中使用的 S3 存储桶并完全删除文件。

如果您已经测试了在集群上运行任何工作负载，请确保您是否上传了任何数据，或者您的任务是否将任何项目保存到不同的 S3 存储桶或文件系统服务，例如 Amazon for Lustre 和 Amazon Elastic File System 和 Amazon FSx Elastic File System。为防止产生任何费用，请删除存储或文件系统中的所有构件和数据。

# 使用 CloudFormation 模板创建 SageMaker HyperPod 集群
<a name="smcluster-getting-started-slurm-console-create-cluster-cfn"></a>

您可以使用的 CloudFormation 模板创建 SageMaker HyperPod 集群 HyperPod。必须安装 AWS CLI 才能继续。

**Topics**
+ [

## 在控制台中配置资源并使用进行部署 CloudFormation
](#smcluster-getting-started-slurm-console-create-cluster-deploy-console)
+ [

## 使用配置资源和部署 CloudFormation
](#smcluster-getting-started-slurm-console-create-cluster-deploy-cfn)

## 在控制台中配置资源并使用进行部署 CloudFormation
<a name="smcluster-getting-started-slurm-console-create-cluster-deploy-console"></a>

您可以使用配置资源 AWS 管理控制台 并使用 CloudFormation模板进行部署。

执行以下步骤。

1. 不要@@ *选择 “**提交**”，而*是在教程结尾处选择 “**下载 CloudFormation 模板参数**” [开始 SageMaker HyperPod 使用 SageMaker AI 控制台](smcluster-getting-started-slurm-console.md)。本教程包含成功创建集群所需的重要配置信息。
**重要**  
如果您选择**提交**，则在删除集群之前，无法部署同名集群。

   选择**下载 CloudFormation 模板参数**后，页面右侧将出现 “**使用配置文件使用该 AWS CLI窗口创建集群**”。

1. 在**使用配置文件通过 AWS CLI创建集群**窗口上，选择**下载配置参数文件**。该文件将下载到您的计算机上。可以根据需要编辑配置 JSON 文件，如果不需要进行更改，也可以将其保持原样。

1. 在终端，导航到参数文件 `file://params.json` 的位置。

1. 运行 [create-stack](https://docs.aws.amazon.com//cli/latest/reference/cloudformation/create-stack.html) AWS CLI 命令部署 CloudFormation 堆栈，该堆栈将预配置的资源并创建集群。 HyperPod

   ```
   aws cloudformation create-stack 
       --stack-name my-stack
       --template-url https://aws-sagemaker-hyperpod-cluster-setup.amazonaws.com/templates-slurm/main-stack-slurm-based-template.yaml
       --parameters file://params.json
       --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM
   ```

1. 要查看资源配置的状态，请导航到[CloudFormation 控制台](https://console.aws.amazon.com/cloudformation)。

   集群创建完成后，在 SageMaker HyperPod控制台主窗格的 “**集群**” 下查看新集群。您可以查看**状态**栏下显示的状态。

1. 集群状态变为 `InService` 后，即可开始登录集群节点。要访问集群节点并开始运行 ML 工作负载，请参阅 [SageMaker HyperPod 集群上的作业](sagemaker-hyperpod-run-jobs-slurm.md)。

## 使用配置资源和部署 CloudFormation
<a name="smcluster-getting-started-slurm-console-create-cluster-deploy-cfn"></a>

您可以使用的 CloudFormation 模板配置资源和部署 SageMaker HyperPod。

执行以下步骤。

1.  SageMaker HyperPod 从[sagemaker-hyperpod-cluster-setup](https://github.com/aws/sagemaker-hyperpod-cluster-setup) GitHub 存储库下载的 CloudFormation 模板。

1. 运行 [create-stack](https://docs.aws.amazon.com//cli/latest/reference/cloudformation/create-stack.html) AWS CLI 命令部署 CloudFormation 堆栈，该堆栈将预配置的资源并创建集群。 HyperPod

   ```
   aws cloudformation create-stack 
       --stack-name my-stack
       --template-url URL_of_the_file_that_contains_the_template_body
       --parameters file://params.json
       --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM
   ```

1. 要查看资源预置的状态，请导航到 CloudFormation 控制台。

   集群创建完成后，在 SageMaker HyperPod控制台主窗格的 “**集群**” 下查看新集群。您可以查看**状态**栏下显示的状态。

1. 集群状态变为 `InService` 后，即可开始登录集群节点。要访问集群节点并开始运行 ML 工作负载，请参阅 [SageMaker HyperPod 集群上的作业](sagemaker-hyperpod-run-jobs-slurm.md)。

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

使用中的 AWS CLI 命令创建您的第一个 SageMaker HyperPod 集群 HyperPod。

## 使用 Slurm 创建你的第一个 SageMaker HyperPod 集群
<a name="smcluster-getting-started-slurm-cli-create-cluster"></a>

以下教程演示了如何创建新 SageMaker HyperPod 集群并通过的[AWS CLI 命令](sagemaker-hyperpod-ref.md#sagemaker-hyperpod-ref-cli)使用 Slurm 对其进行设置。 SageMaker HyperPod按照教程，您将创建一个包含三个 Slurm 节点的 HyperPod 集群：`my-controller-group``my-login-group`、和。`worker-group-1`

使用 API 驱动的配置方法，您可以使用直接在 API 请求中定义 Slurm 节点类型和分区分配。 CreateCluster `SlurmConfig`这消除了对单独`provisioning_parameters.json`文件的需求，并提供了内置的验证、偏差检测和 per-instance-group FSx 配置。

1. 首先，准备生命周期脚本并将其上传到 Amazon S3 存储桶。在创建集群期间，在每个实例组中 HyperPod 运行它们。使用以下命令将生命周期脚本上传到 Amazon S3。

   ```
   aws s3 sync \
       ~/local-dir-to-lifecycle-scripts/* \
       s3://sagemaker-<unique-s3-bucket-name>/<lifecycle-script-directory>/src
   ```
**注意**  
S3 存储桶路径应以前缀开头`sagemaker-`，因为 with [的 IAM 角色](sagemaker-hyperpod-prerequisites-iam.md#sagemaker-hyperpod-prerequisites-iam-role-for-hyperpod)`AmazonSageMakerClusterInstanceRolePolicy`仅允许访问以特定前缀开头的 Amazon S3 存储桶。 SageMaker HyperPod

   如果您是从头开始，请使用 [Awsome 分布式训练 GitHub 存储库](https://github.com/aws-samples/awsome-distributed-training/)中提供的示例生命周期脚本。以下子步骤说明如何下载示例生命周期脚本并将其上传到 Amazon S3 存储桶。

   1. 下载生命周期脚本示例到本地计算机的一个目录中。

      ```
      git clone https://github.com/aws-samples/awsome-distributed-training/
      ```

   1. 进入目录 [https://github.com/aws-samples/awsome-distributed-training/tree/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config](https://github.com/aws-samples/awsome-distributed-training/tree/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config)，可以找到一组生命周期脚本。

      ```
      cd awsome-distributed-training/1.architectures/5.sagemaker_hyperpods/LifecycleScripts/base-config
      ```

      要了解生命周期脚本示例的更多信息，请参阅 [使用生命周期脚本自定义 SageMaker HyperPod 集群](sagemaker-hyperpod-lifecycle-best-practices-slurm.md)。

   1. 将脚本上传到 `s3://sagemaker-<unique-s3-bucket-name>/<lifecycle-script-directory>/src`。您可以使用 Amazon S3 管理控制台或运行以下 AWS CLI Amazon S3 命令来完成此操作。

      ```
      aws s3 sync \
          ~/local-dir-to-lifecycle-scripts/* \
          s3://sagemaker-<unique-s3-bucket-name>/<lifecycle-script-directory>/src
      ```
**注意**  
使用 API 驱动的配置，您无需创建或上传文件。`provisioning_parameters.json`Slurm 配置将在下一步的 CreateCluster API 请求中直接定义。

1. 准备一个 JSON 格式的[CreateCluster](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateCluster.html)请求文件并另存为`create_cluster.json`。

   使用 API 驱动的配置，您可以使用字段为每个实例组指定 Slurm 节点类型和分区分配。`SlurmConfig`您还可以使用配置集群级别的 Slurm 设置。`Orchestrator.Slurm`

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

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

   **SlurmConfig 字段**：    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/smcluster-getting-started-slurm-cli.html)

   **Orchestrator.Slurm 字段：**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/smcluster-getting-started-slurm-cli.html)

   **SlurmConfigStrategy 选项：**
   + `Managed`（推荐）： HyperPod 完全`slurm.conf`管理和检测未经授权的更改（偏差检测）。如果检测到偏差，更新将失败。
   + `Overwrite`: 更新`slurm.conf`时 HyperPod 覆盖，忽略任何手动更改。
   + `Merge`: HyperPod 保留手动更改并将其与 API 配置合并。

   ** FSx 为光泽添加（可选）：**

   要将 fo FSx r Lustre 文件系统挂载到您的计算节点，请将其`FsxLustreConfig`添加到实例组中。`InstanceStorageConfigs`这需要自定义 VPC 配置。

   ```
   {
       "InstanceGroupName": "worker-group-1",
       "InstanceType": "ml.trn1.32xlarge",
       "InstanceCount": 1,
       "SlurmConfig": {
           "NodeType": "Compute",
           "PartitionNames": ["partition-1"]
       },
       "InstanceStorageConfigs": [
           {
               "FsxLustreConfig": {
                   "DnsName": "fs-0abc123def456789.fsx.us-west-2.amazonaws.com",
                   "MountPath": "/fsx",
                   "MountName": "abcdefgh"
               }
           }
       ],
       "LifeCycleConfig": {
           "SourceS3Uri": "s3://sagemaker-<unique-s3-bucket-name>/<lifecycle-script-directory>/src",
           "OnCreate": "on_create.sh"
       },
       "ExecutionRole": "arn:aws:iam::<account-id>:role/HyperPodExecutionRole"
   }
   ```

   ** FSx 为 OpenZFS 添加内容（可选）：**

   你也可以 FSx 为 OpenZFS 文件系统进行挂载：

   ```
   "InstanceStorageConfigs": [
       {
           "FsxOpenZfsConfig": {
               "DnsName": "fs-0xyz789abc123456.fsx.us-west-2.amazonaws.com",
               "MountPath": "/shared"
           }
       }
   ]
   ```
**注意**  
每个实例组最多可以有一个用 FSx 于 Lustre 的实例组和一个用于 OpenZFS 配置 FSx 的实例组。不同的实例组可以挂载不同的文件系统。

   **添加 VPC 配置（必填项 FSx）：**

   如果使用 FSx，则必须指定自定义 VPC 配置：

   ```
   {
       "ClusterName": "my-hyperpod-cluster",
       "InstanceGroups": [
           {
               "InstanceGroupName": "my-controller-group",
               "InstanceType": "ml.c5.xlarge",
               "InstanceCount": 1,
               "SlurmConfig": {
                   "NodeType": "Controller"
               },
               "LifeCycleConfig": {
                   "SourceS3Uri": "s3://sagemaker-<unique-s3-bucket-name>/<lifecycle-script-directory>/src",
                   "OnCreate": "on_create.sh"
               },
               "ExecutionRole": "arn:aws:iam::<account-id>:role/HyperPodExecutionRole"
           },
       ],
       "Orchestrator": {
           "Slurm": {
               "SlurmConfigStrategy": "Managed"
           }
       },
       "VpcConfig": {
           "SecurityGroupIds": ["sg-0abc123def456789a"],
           "Subnets": ["subnet-0abc123def456789a"]
       }
   }
   ```

1. 运行以下命令创建集群。

   ```
   aws sagemaker create-cluster --cli-input-json file://complete/path/to/create_cluster.json
   ```

   这将返回已创建集群的 ARN。

   ```
   {
       "ClusterArn": "arn:aws:sagemaker:us-west-2:111122223333:cluster/my-hyperpod-cluster"
   }
   ```

   如果因资源限制而出现错误，请确保将实例类型更改为账户中有足够配额的类型，或按照 [SageMaker HyperPod 配额](sagemaker-hyperpod-prerequisites.md#sagemaker-hyperpod-prerequisites-quotas)中的说明操作来请求额外配额。

   **常见的验证错误：**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/smcluster-getting-started-slurm-cli.html)

1. 运行 `describe-cluster` 查看集群状态。

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

   示例响应：

   ```
   {
       "ClusterArn": "arn:aws:sagemaker:us-west-2:111122223333:cluster/my-hyperpod-cluster",
       "ClusterName": "my-hyperpod-cluster",
       "ClusterStatus": "Creating",
       "InstanceGroups": [
           {
               "InstanceGroupName": "my-controller-group",
               "InstanceType": "ml.c5.xlarge",
               "InstanceCount": 1,
               "CurrentCount": 0,
               "TargetCount": 1,
               "SlurmConfig": {
                   "NodeType": "Controller"
               },
               "LifeCycleConfig": {
                   "SourceS3Uri": "s3://sagemaker-<bucket>/src",
                   "OnCreate": "on_create.sh"
               },
               "ExecutionRole": "arn:aws:iam::111122223333:role/HyperPodExecutionRole"
           },
           {
               "InstanceGroupName": "my-login-group",
               "InstanceType": "ml.m5.4xlarge",
               "InstanceCount": 1,
               "CurrentCount": 0,
               "TargetCount": 1,
               "SlurmConfig": {
                   "NodeType": "Login"
               },
               "LifeCycleConfig": {
                   "SourceS3Uri": "s3://sagemaker-<bucket>/src",
                   "OnCreate": "on_create.sh"
               },
               "ExecutionRole": "arn:aws:iam::111122223333:role/HyperPodExecutionRole"
           },
           {
               "InstanceGroupName": "worker-group-1",
               "InstanceType": "ml.trn1.32xlarge",
               "InstanceCount": 1,
               "CurrentCount": 0,
               "TargetCount": 1,
               "SlurmConfig": {
                   "NodeType": "Compute",
                   "PartitionNames": ["partition-1"]
               },
               "LifeCycleConfig": {
                   "SourceS3Uri": "s3://sagemaker-<bucket>/src",
                   "OnCreate": "on_create.sh"
               },
               "ExecutionRole": "arn:aws:iam::111122223333:role/HyperPodExecutionRole"
           }
       ],
       "Orchestrator": {
           "Slurm": {
               "SlurmConfigStrategy": "Managed"
           }
       },
       "CreationTime": "2024-01-15T10:30:00Z"
   }
   ```

   集群状态变为 **InService** 后，进入下一步。创建集群通常需要 10-15 分钟。

1. 运行 `list-cluster-nodes` 检查集群节点的详细信息。

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

   示例响应：

   ```
   {
       "ClusterNodeSummaries": [
           {
               "InstanceGroupName": "my-controller-group",
               "InstanceId": "i-0abc123def456789a",
               "InstanceType": "ml.c5.xlarge",
               "InstanceStatus": {
                   "Status": "Running",
                   "Message": ""
               },
               "LaunchTime": "2024-01-15T10:35:00Z"
           },
           {
               "InstanceGroupName": "my-login-group",
               "InstanceId": "i-0abc123def456789b",
               "InstanceType": "ml.m5.4xlarge",
               "InstanceStatus": {
                   "Status": "Running",
                   "Message": ""
               },
               "LaunchTime": "2024-01-15T10:35:00Z"
           },
           {
               "InstanceGroupName": "worker-group-1",
               "InstanceId": "i-0abc123def456789c",
               "InstanceType": "ml.trn1.32xlarge",
               "InstanceStatus": {
                   "Status": "Running",
                   "Message": ""
               },
               "LaunchTime": "2024-01-15T10:36:00Z"
           }
       ]
   }
   ```

   `InstanceId`这是您的集群用户登录 (`aws ssm`) 所需的内容。有关登录集群节点和运行 ML 工作负载的更多信息，请参阅 [SageMaker HyperPod 集群上的作业](sagemaker-hyperpod-run-jobs-slurm.md)。

1. 使用 AWS Systems Manager 会话管理器连接到您的集群。

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

   连接后，验证 Slurm 的配置是否正确：

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

## 删除集群并清理资源
<a name="smcluster-getting-started-slurm-cli-delete-cluster-and-clean"></a>

成功测试创建 SageMaker HyperPod 集群后，它会继续以该`InService`状态运行，直到您删除该集群。我们建议您在不使用按需 SageMaker AI 容量时删除任何使用按需 AI 容量创建的集群，以免产生基于按需定价的持续服务费。在本教程中，您创建了一个由三个实例组组成的集群。确保通过运行以下命令删除集群。

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

要从本教程使用的 Amazon S3 存储桶中清理生命周期脚本，请转到集群创建过程中使用的 Amazon S3 存储桶并完全删除文件。

```
aws s3 rm s3://sagemaker-<unique-s3-bucket-name>/<lifecycle-script-directory>/src --recursive
```

如果您已测试在集群上运行任何模型训练工作负载，还要检查您是否上传了任何数据，或者您的任务是否已将任何项目保存到不同的 Amazon S3 存储桶或文件系统服务（例如 Amazon for Lustre 和 Amazon FSx 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 Slurm 集群操作
<a name="sagemaker-hyperpod-operate-slurm"></a>

本节提供有关 SageMaker HyperPod 通过 SageMaker AI 控制台 UI 或 AWS Command Line Interface (CLI) 进行管理的指导。无论你更喜欢可视化界面还是使用命令 SageMaker HyperPod，你都将学习如何执行与之相关的各种任务。

**Topics**
+ [

# 使用控制 SageMaker HyperPod 台管理 Slurm 集群 SageMaker
](sagemaker-hyperpod-operate-slurm-console-ui.md)
+ [

# 使用管理 SageMaker HyperPod Slurm 集群 AWS CLI
](sagemaker-hyperpod-operate-slurm-cli-command.md)

# 使用控制 SageMaker HyperPod 台管理 Slurm 集群 SageMaker
<a name="sagemaker-hyperpod-operate-slurm-console-ui"></a>

以下主题提供了有关如何 SageMaker HyperPod 通过控制台 UI 进行管理的指导。

**Topics**
+ [

## 创建集 SageMaker HyperPod 群
](#sagemaker-hyperpod-operate-slurm-console-ui-create-cluster)
+ [

## 浏览您的 SageMaker HyperPod 集群
](#sagemaker-hyperpod-operate-slurm-console-ui-browse-clusters)
+ [

## 查看每个 SageMaker HyperPod 集群的详细信息
](#sagemaker-hyperpod-operate-slurm-console-ui-view-details-of-clusters)
+ [

## 编辑集 SageMaker HyperPod 群
](#sagemaker-hyperpod-operate-slurm-console-ui-edit-clusters)
+ [

## 删除集 SageMaker HyperPod 群
](#sagemaker-hyperpod-operate-slurm-console-ui-delete-cluster)

## 创建集 SageMaker HyperPod 群
<a name="sagemaker-hyperpod-operate-slurm-console-ui-create-cluster"></a>

[开始 SageMaker HyperPod 使用 SageMaker AI 控制台](smcluster-getting-started-slurm-console.md)要通过 SageMaker HyperPod 控制台 UI 创建新 SageMaker HyperPod 集群，请参阅中的说明。

## 浏览您的 SageMaker HyperPod 集群
<a name="sagemaker-hyperpod-operate-slurm-console-ui-browse-clusters"></a>

在控制台主页面 SageMaker HyperPod 控制台主窗格的集**群**下，所有已创建的集群都应显示在 “**集群**” 部分下，该部分提供了集群及其 ARNs状态和创建时间的摘要视图。 SageMaker HyperPod 

## 查看每个 SageMaker HyperPod 集群的详细信息
<a name="sagemaker-hyperpod-operate-slurm-console-ui-view-details-of-clusters"></a>

在管理控制台主页的**集群**下，集群**名称**已作为链接激活。选择集群名称链接，查看每个集群的详细信息。

## 编辑集 SageMaker HyperPod 群
<a name="sagemaker-hyperpod-operate-slurm-console-ui-edit-clusters"></a>

1. 在 SageMaker HyperPod控制台主窗格的集**群**下，选择要更新的集群。

1. 选择您的集群，并选择**编辑**。

1. 在**编辑 <your-cluster>** 页面上，可以编辑现有实例组的配置，添加更多实例组，并更改集群的标签。更改后，选择**提交**。

   1. 在**配置实例组**部分，可以通过选择**创建实例组**来添加更多实例组。

   1. 在**配置实例组**部分，可以选择**编辑**以更改其配置，或选择**删除**以永久性移除实例组。
**重要**  
在删除实例组时，请注意以下几点：  
您的 SageMaker HyperPod 集群必须始终维护至少一个实例组。
确保在删除前备份所有关键数据
删除过程无法撤销。
**注意**  
删除实例组将终止与该组关联的所有计算资源。

   1. 在**标签**部分，您可以更新集群的标记。

## 删除集 SageMaker HyperPod 群
<a name="sagemaker-hyperpod-operate-slurm-console-ui-delete-cluster"></a>

1. 在 SageMaker HyperPod控制台主窗格的集**群**下，选择要删除的集群。

1. 选择您的集群，并选择**删除**。

1. 在弹出的集群删除窗口中，仔细查看集群信息，确认选择了正确的集群进行删除。

1. 查看集群信息后，选择**是，删除集群**。

1. 在确认删除的文本字段中键入 **delete**。

1. 在弹出窗口的右下角选择**删除**，完成集群删除请求的发送。

# 使用管理 SageMaker HyperPod Slurm 集群 AWS CLI
<a name="sagemaker-hyperpod-operate-slurm-cli-command"></a>

以下主题提供了如何以 JSON 格式编写 SageMaker HyperPod API 请求文件并使用 AWS CLI 命令运行这些文件的指导。

**Topics**
+ [

## 创建新集群
](#sagemaker-hyperpod-operate-slurm-cli-command-create-cluster)
+ [

## 描述集群
](#sagemaker-hyperpod-operate-slurm-cli-command-describe-cluster)
+ [

## 列出集群节点的详细信息
](#sagemaker-hyperpod-operate-slurm-cli-command-list-cluster-nodes)
+ [

## 描述集群节点的详细信息
](#sagemaker-hyperpod-operate-slurm-cli-command-describe-cluster-node)
+ [

## 列出集群
](#sagemaker-hyperpod-operate-slurm-cli-command-list-clusters)
+ [

## 更新集群配置
](#sagemaker-hyperpod-operate-slurm-cli-command-update-cluster)
+ [

## 更新集群的 SageMaker HyperPod 平台软件
](#sagemaker-hyperpod-operate-slurm-cli-command-update-cluster-software)
+ [

## 缩减集群
](#sagemaker-hyperpod-operate-slurm-cli-command-scale-down)
+ [

## 删除集群
](#sagemaker-hyperpod-operate-slurm-cli-command-delete-cluster)

## 创建新集群
<a name="sagemaker-hyperpod-operate-slurm-cli-command-create-cluster"></a>

1. 准备生命周期配置脚本并将其上传到 S3 存储桶，如 `s3://sagemaker-amzn-s3-demo-bucket/lifecycle-script-directory/src/`。下面的步骤 2 假设在指定的 S3 存储桶中有一个名为 `on_create.sh` 的入口点脚本。
**重要**  
确保设置的 S3 路径以 `s3://sagemaker-` 开头。[的 IAM 角色适用于 SageMaker HyperPod](sagemaker-hyperpod-prerequisites-iam.md#sagemaker-hyperpod-prerequisites-iam-role-for-hyperpod) 附带托管的 [https://docs.aws.amazon.com/sagemaker/latest/dg/security-iam-awsmanpol-cluster.html](https://docs.aws.amazon.com/sagemaker/latest/dg/security-iam-awsmanpol-cluster.html)，允许访问带有特定前缀 `sagemaker-` 的 S3 存储桶。

1. 准备一个 JSON 格式的 [CreateCluster](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateCluster.html)API 请求文件。您应配置实例组，使其与您在 `provisioning_parameters.json` 文件中设计的 Slurm 集群相匹配，该文件将在创建集群时使用，是运行一组生命周期脚本的一部分。要了解更多信息，请参阅[使用生命周期脚本自定义 SageMaker HyperPod 集群](sagemaker-hyperpod-lifecycle-best-practices-slurm.md)。下面的模板有两个实例组，以满足 Slurm 集群的最低要求：一个控制器（主）节点和一个计算（Worker）节点。对于 `ExecutionRole`，请提供使用托管的 `AmazonSageMakerClusterInstanceRolePolicy` 从 [的 IAM 角色适用于 SageMaker HyperPod](sagemaker-hyperpod-prerequisites-iam.md#sagemaker-hyperpod-prerequisites-iam-role-for-hyperpod) 部分创建的 IAM 角色的 ARN。

   ```
   // create_cluster.json
   {
       "ClusterName": "your-hyperpod-cluster",
       "InstanceGroups": [
           {
               "InstanceGroupName": "controller-group",
               "InstanceType": "ml.m5.xlarge",
               "InstanceCount": 1,
               "LifeCycleConfig": {
                   "SourceS3Uri": "s3://amzn-s3-demo-bucket-sagemaker/lifecycle-script-directory/src/",
                   "OnCreate": "on_create.sh"
               },
               "ExecutionRole": "arn:aws:iam::111122223333:role/iam-role-for-cluster",
               // Optional: Configure an additional storage per instance group.
               "InstanceStorageConfigs": [
                   {
                      // Attach an additional EBS volume to each instance within the instance group.
                      // The default mount path for the additional EBS volume is /opt/sagemaker.
                      "EbsVolumeConfig":{
                         // Specify an integer between 1 and 16384 in gigabytes (GB).
                         "VolumeSizeInGB": integer,
                      }
                   }
               ]
           }, 
           {
               "InstanceGroupName": "worker-group-1",
               "InstanceType": "ml.p4d.xlarge",
               "InstanceCount": 1,
               "LifeCycleConfig": {
                   "SourceS3Uri": "s3://amzn-s3-demo-bucket-sagemaker/lifecycle-script-directory/src/",
                   "OnCreate": "on_create.sh"
               },
               "ExecutionRole": "arn:aws:iam::111122223333:role/iam-role-for-cluster"
           }
       ],
       // Optional
       "Tags": [ 
           { 
              "Key": "string",
              "Value": "string"
           }
       ],
       // Optional
       "VpcConfig": { 
           "SecurityGroupIds": [ "string" ],
           "Subnets": [ "string" ]
       }
   }
   ```

   根据生命周期脚本设计集群结构的方式，在 `InstanceGroups` 参数下最多可配置 20 个实例组。

   对于`Tags`请求参数，您可以添加用于将 SageMaker HyperPod 集群作为 AWS 资源进行管理的自定义标签。您可以像在其他支持标记的 AWS 服务中添加标签一样向集群添加标签。要了解有关为 AWS 资源添加标签的更多信息，请参阅《[标记 AWS 资源用户](https://docs.aws.amazon.com/tag-editor/latest/userguide/tagging.html)指南》。

   对于 `VpcConfig` 请求参数，请指定要使用的 VPC 信息。有关更多信息，请参阅 [SageMaker HyperPod 使用自定义 Amazon VPC 进行设置](sagemaker-hyperpod-prerequisites.md#sagemaker-hyperpod-prerequisites-optional-vpc)。

1. 运行 [create-cluster](https://docs.aws.amazon.com/cli/latest/reference/sagemaker/create-cluster.html) 命令如下。

   ```
   aws sagemaker create-cluster \
       --cli-input-json file://complete/path/to/create_cluster.json
   ```

   这将返回新集群的 ARN。

## 描述集群
<a name="sagemaker-hyperpod-operate-slurm-cli-command-describe-cluster"></a>

运行 [describe-cluster](https://docs.aws.amazon.com/cli/latest/reference/sagemaker/describe-cluster.html) 查看集群状态。您可以指定集群的名称或 ARN。

```
aws sagemaker describe-cluster --cluster-name your-hyperpod-cluster
```

集群状态变为 **InService** 后，进入下一步。使用此 API，您还可以从运行其他 HyperPod API 操作中检索失败消息。

## 列出集群节点的详细信息
<a name="sagemaker-hyperpod-operate-slurm-cli-command-list-cluster-nodes"></a>

运行[list-cluster-nodes](https://docs.aws.amazon.com/cli/latest/reference/sagemaker/list-cluster-nodes.html)以检查群集节点的密钥信息。

```
aws sagemaker list-cluster-nodes --cluster-name your-hyperpod-cluster
```

这将返回一个响应，`InstanceId` 是您需要用来登录（使用 `aws ssm`）的内容。

## 描述集群节点的详细信息
<a name="sagemaker-hyperpod-operate-slurm-cli-command-describe-cluster-node"></a>

运行[describe-cluster-node](https://docs.aws.amazon.com/cli/latest/reference/sagemaker/describe-cluster-node.html)以检索群集节点的详细信息。您可以从 list-cluster-nodes输出中获取群集节点 ID。您可以指定集群的名称或 ARN。

```
aws sagemaker describe-cluster-node \
    --cluster-name your-hyperpod-cluster \
    --node-id i-111222333444555aa
```

## 列出集群
<a name="sagemaker-hyperpod-operate-slurm-cli-command-list-clusters"></a>

运行 [list-clusters](https://docs.aws.amazon.com/cli/latest/reference/sagemaker/list-clusters.html) 列出账户中的所有集群。

```
aws sagemaker list-clusters
```

您还可以添加其他标签来筛选集群列表。要详细了解此命令在低级别运行的内容以及用于过滤的其他标志，请参阅 [ListClusters](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_ListClusters.html)API 参考。

## 更新集群配置
<a name="sagemaker-hyperpod-operate-slurm-cli-command-update-cluster"></a>

运行 [update-cluster](https://docs.aws.amazon.com/cli/latest/reference/sagemaker/update-cluster.html) 更新集群配置。

**注意**  
您可以使用 `UpdateCluster` API 缩小集群规模或从 SageMaker HyperPod 集群中移除整个实例组。有关如何缩减或删除实例组的更多说明，请参阅[缩减集群](#sagemaker-hyperpod-operate-slurm-cli-command-scale-down)。

1. 创建 JSON 格式的 `UpdateCluster` 请求文件。确保指定正确的集群名称和实例组名称进行更新。您可以更改实例类型、实例数量、生命周期配置入口点脚本以及脚本的路径。

   1. 对于 `ClusterName`，指定要更新的集群名称。

   1. 对于 `InstanceGroupName`

      1. 要更新现有实例组，请指定要更新的实例组名称。

      1. 要添加新的实例组，请指定一个集群中不存在的新名称。

   1. 对于 `InstanceType`

      1. 要更新现有实例组，必须将最初指定的实例类型与组匹配。

      1. 要添加新实例组，请指定要配置该组的实例类型。

   1. 对于 `InstanceCount`

      1. 要更新现有实例组，请指定与所需的实例数对应的整数。您可以提供更高或更低的值（最低可至 0）以纵向扩展或缩减实例组。

      1. 要添加新的实例组，请指定一个大于或等于 1 的整数。

   1. 对于 `LifeCycleConfig`，您可以同时更改 `SourceS3Uri` 和 `OnCreate` 值，以更新实例组。

   1. 对于 `ExecutionRole`

      1. 要更新现有实例组，请继续使用创建集群时附加的相同 IAM 角色。

      1. 要添加新的实例组，请指定要附加的 IAM 角色。

   1. 对于 `ThreadsPerCore`

      1. 更新现有实例组时，请继续使用创建集群时指定的相同值。

      1. 添加新实例组时，您可以从每个实例类型允许的选项中选择任意值。如需了解更多信息，请搜索实例类型，并查看**《Amazon EC2 用户指南》**中 [CPU 内核和线程/CPU 内核/实例类型](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/cpu-options-supported-instances-values.html)参考表中的*每个内核的有效线程*列。

   下面的代码片段是您可以使用的 JSON 请求文件模板。有关此 API 的请求语法和参数的更多信息，请参阅 [UpdateCluster](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_UpdateCluster.html)API 参考。

   ```
   // update_cluster.json
   {
       // Required
       "ClusterName": "name-of-cluster-to-update",
       // Required
       "InstanceGroups": [
           {
               "InstanceGroupName": "name-of-instance-group-to-update",
               "InstanceType": "ml.m5.xlarge",
               "InstanceCount": 1,
               "LifeCycleConfig": {
                   "SourceS3Uri": "s3://amzn-s3-demo-bucket-sagemaker/lifecycle-script-directory/src/",
                   "OnCreate": "on_create.sh"
               },
               "ExecutionRole": "arn:aws:iam::111122223333:role/iam-role-for-cluster",
               // Optional: Configure an additional storage per instance group.
               "InstanceStorageConfigs": [
                   {
                      // Attach an additional EBS volume to each instance within the instance group.
                      // The default mount path for the additional EBS volume is /opt/sagemaker.
                      "EbsVolumeConfig":{
                         // Specify an integer between 1 and 16384 in gigabytes (GB).
                         "VolumeSizeInGB": integer,
                      }
                   }
               ]
           },
           // add more blocks of instance groups as needed
           { ... }
       ]
   }
   ```

1. 运行以下 `update-cluster` 命令提交请求。

   ```
   aws sagemaker update-cluster \
       --cli-input-json file://complete/path/to/update_cluster.json
   ```

## 更新集群的 SageMaker HyperPod 平台软件
<a name="sagemaker-hyperpod-operate-slurm-cli-command-update-cluster-software"></a>

运行[update-cluster-software](https://docs.aws.amazon.com/cli/latest/reference/sagemaker/update-cluster-software.html)以使用 SageMaker HyperPod 服务提供的软件和安全补丁更新现有集群。对于 `--cluster-name`，请指定要更新的集群名称或 ARN。

**重要**  
请注意，在运行此 API 之前必须备份您的工作。打补丁过程会用更新的 AMI 替换根卷，这意味着存储在实例根卷中的先前数据将丢失。请务必将实例根卷中的数据备份到 Amazon S3 或 Amazon for Lustre。 FSx 有关更多信息，请参阅 [使用提供的备份脚本 SageMaker HyperPod](#sagemaker-hyperpod-operate-slurm-cli-command-update-cluster-software-backup)。

```
aws sagemaker update-cluster-software --cluster-name your-hyperpod-cluster
```

此命令调用 [UpdateClusterSoftware](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_UpdateClusterSoftware.html)API。API 调用后， SageMaker HyperPod 检查集群实例是否有更新的 DLAMI 可用。如果需要更新 DLAMI SageMaker HyperPod ，则会将集群实例更新为使用[SageMaker HyperPod DLAMI](sagemaker-hyperpod-ref.md#sagemaker-hyperpod-ref-hyperpod-ami)最新版本，并在集群创建或更新期间指定的 Amazon S3 存储桶中运行生命周期脚本。如果集群已经在使用最新的 DLAMI SageMaker HyperPod ，则不会对集群进行任何更改或再次运行生命周期脚本。 SageMaker HyperPod 服务团队定期推出新[SageMaker HyperPod DLAMI](sagemaker-hyperpod-ref.md#sagemaker-hyperpod-ref-hyperpod-ami)产品，以增强安全性和改善用户体验。我们建议您随时更新到最新的 SageMaker HyperPod DLAMI。如需了解 SageMaker HyperPod Future DLAMI 的安全补丁更新，请跟进。[亚马逊 SageMaker HyperPod 发行说明](sagemaker-hyperpod-release-notes.md)

**提示**  
如果安全补丁失败，您可以按照 [描述集群](#sagemaker-hyperpod-operate-slurm-cli-command-describe-cluster) 中的指示运行 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DescribeCluster.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DescribeCluster.html) API，获取失败信息。API。

**注意**  
您只能以编程方式运行此 API。 SageMaker HyperPod 控制台 UI 中未实现修补功能。

### 使用提供的备份脚本 SageMaker HyperPod
<a name="sagemaker-hyperpod-operate-slurm-cli-command-update-cluster-software-backup"></a>

SageMaker HyperPod 提供了一个脚本，用于在 *Awsome Distributed T [https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/patching-backup.sh](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/patching-backup.sh)raining GitHub 存储库*中备份和恢复数据。脚本提供以下两个功能。

**要在打补丁之前将数据备份到 S3 存储桶**

```
sudo bash patching-backup.sh --create <s3-buckup-bucket-path>
```

运行该命令后，脚本会检查 `squeue` 是否有排队作业，如果队列中没有作业则停止 Slurm，备份 `mariadb`，并将定义在 `LOCAL_ITEMS` 下的本地项目复制到磁盘上。您可以向 `LOCAL_ITEMS` 添加更多文件和目录。

```
# Define files and directories to back up.
LOCAL_ITEMS=(
    "/var/spool/slurmd"
    "/var/spool/slurmctld"
    "/etc/systemd/system/slurmctld.service"
    "/home/ubuntu/backup_slurm_acct_db.sql"
    # ... Add more items as needed
)
```

此外，您还可以在所提供的脚本中添加自定义代码，为您的使用场景备份任何应用程序。

**要在打补丁后从 S3 存储桶恢复数据**

```
sudo bash patching-backup.sh --restore <s3-buckup-bucket-path>
```

## 缩减集群
<a name="sagemaker-hyperpod-operate-slurm-cli-command-scale-down"></a>

您可以缩减 SageMaker HyperPod 集群中的实例数量或删除实例组，以优化资源分配或降低成本。

您可以使用 `UpdateCluster` API 操作随机终止实例组中的实例，直至实例数量减少到指定数量，或者使用 `BatchDeleteClusterNodes` API 操作终止特定的实例，从而进行缩减。您也可以使用 `UpdateCluster` API 完全移除整个实例组。有关如何使用这些方法进行缩减的更多信息，请参阅[缩小 SageMaker HyperPod 集群规模](smcluster-scale-down.md)。

**注意**  
您无法移除配置为 Slurm 控制器节点的实例。尝试删除 Slurm 控制器节点会导致验证错误，错误代码为 `NODE_ID_IN_USE`。

## 删除集群
<a name="sagemaker-hyperpod-operate-slurm-cli-command-delete-cluster"></a>

运行 [delete-cluster](https://docs.aws.amazon.com/cli/latest/reference/sagemaker/delete-cluster.html) 删除集群。您可以指定集群的名称或 ARN。

```
aws sagemaker delete-cluster --cluster-name your-hyperpod-cluster
```

# 使用生命周期脚本自定义 SageMaker HyperPod 集群
<a name="sagemaker-hyperpod-lifecycle-best-practices-slurm"></a>

SageMaker HyperPod 始终提供 up-and-running计算集群，这些集群是高度可定制的，因为您可以编写生命周期脚本来告诉 SageMaker HyperPod 如何设置集群资源。以下主题是准备生命周期脚本以使用开源工作负载管理器工具设置 SageMaker HyperPod 集群的最佳实践。

以下主题深入探讨了准备用于设置 Slurm 配置的生命周期脚本的最佳实践。 SageMaker HyperPod

## 高级概述
<a name="sagemaker-hyperpod-lifecycle-best-practices-slurm-slurm-highlevel-overview"></a>

以下过程是配置 HyperPod 集群并使用 Slurm 对其进行设置的主要流程。这些步骤按照***自下而上***的顺序进行。

1. 规划如何在集群上创建 Slurm 节点。 HyperPod 例如，如果要配置两个 Slurm 节点，则需要在集群中设置两个实例组。 HyperPod 

1. 准备 Slurm 配置。选择以下方法之一：
   + **选项 A：API 驱动的配置（推荐）**— 使用`SlurmConfig`每个实例组中的 `CreateCluster` API 负载直接定义 Slurm 节点类型和分区。使用这种方法：
     + 不需要任何`provisioning_parameters.json`文件
     + Slurm 拓扑在 API 负载中与实例组定义一起定义
     + FSx 文件系统是通过以下方式配置的 per-instance-group `InstanceStorageConfigs`
     + 配置策略通过以下方式控制 `Orchestrator.Slurm.SlurmConfigStrategy`

     实例组`SlurmConfig`中的示例：

     ```
     {
         "InstanceGroupName": "gpu-compute",
         "InstanceType": "ml.p4d.24xlarge",
         "InstanceCount": 8,
         "SlurmConfig": {
             "NodeType": "Compute",
             "PartitionNames": ["gpu-training"]
         }
     }
     ```
   + **选项 B：旧版配置**-准备一个`provisioning_parameters.json`文件，即 a[用于配置\$1parameters.json 的配置表单](sagemaker-hyperpod-ref.md#sagemaker-hyperpod-ref-provisioning-forms-slurm). `provisioning_parameters.json`应包含要在集群上配置的 Slurm 节点配置信息。 HyperPod这应反映步骤 1 中 Slurm 节点的设计。

1. 准备一组生命周期脚本来设置 Slurm HyperPod 以安装软件包并在集群中为您的用例设置环境。您应构建生命周期脚本，以便在一个中心 Python 脚本 (`lifecycle_script.py`) 中按顺序集体运行，并编写一个入口点 shell 脚本 (`on_create.sh`) 来运行 Python 脚本。稍后在步骤 5 中，您需要向 HyperPod集群创建请求提供入口点 shell 脚本。

   另外，请注意，您应该编写预期的脚本`resource_config.json`，这些脚本将在集群创建 HyperPod 期间生成。 `resource_config.json`包含 HyperPod 群集资源信息，例如 IP 地址、实例类型和 ARNs，是配置 Slurm 时需要使用的信息。

1. 将前面步骤中的所有文件收集到一个文件夹中。文件夹结构取决于您在步骤 2 中选择的配置方法。

   如果您选择了选项 A（API 驱动的配置）：

   您的文件夹只需要生命周期脚本来执行自定义安装任务。Slurm 的配置和 FSx 安装由 HyperPod根据 API 有效负载自动处理。

   ```
   └── lifecycle_files // your local folder
   
       ├── on_create.sh
       ├── lifecycle_script.py
       └── ... // more setup scripts to be fed into lifecycle_script.py
   ```
**注意**  
使用 API 驱动的配置时，不需要该`provisioning_parameters.json`文件。

   如果您选择了选项 B（旧配置）：

   您的文件夹必须包含`provisioning_parameters.json`全套生命周期脚本。

   ```
   └── lifecycle_files // your local folder
   
       ├── provisioning_parameters.json
       ├── on_create.sh
       ├── lifecycle_script.py
       └── ... // more setup scrips to be fed into lifecycle_script.py
   ```

1. 将所有文件上传到 S3 存储桶。复制并保留 S3 存储桶路径。请注意，您应该创建以 `sagemaker-` 开头的 S3 存储桶路径，因为您需要选择附加的 [`AmazonSageMakerClusterInstanceRolePolicy`](security-iam-awsmanpol-AmazonSageMakerClusterInstanceRolePolicy.md) 的 [的 IAM 角色适用于 SageMaker HyperPod](sagemaker-hyperpod-prerequisites-iam.md#sagemaker-hyperpod-prerequisites-iam-role-for-hyperpod)，而这只允许以 `sagemaker-` 前缀开头的 S3 存储桶路径。以下命令是将所有文件上传到 S3 存储桶的示例命令。

   ```
   aws s3 cp --recursive ./lifecycle_files s3://sagemaker-hyperpod-lifecycle/src
   ```

1. 准备集 HyperPod 群创建请求。
   + 选项 1：如果您使用 AWS CLI，请按照中的说明以 JSON 格式 (`create_cluster.json`) 编写集群创建请求[创建新集群](sagemaker-hyperpod-operate-slurm-cli-command.md#sagemaker-hyperpod-operate-slurm-cli-command-create-cluster)。
   + 选项 2：如果您使用 SageMaker AI 控制台用户界面，请按照中的说明在 HyperPod 控制台 UI 中填写**创建集群**申请表[创建集 SageMaker HyperPod 群](sagemaker-hyperpod-operate-slurm-console-ui.md#sagemaker-hyperpod-operate-slurm-console-ui-create-cluster)。

   在此阶段，请确保按照步骤 1 和 2 中的计划结构创建实例组。此外，请确保在请求表单中指定步骤 5 中的 S3 存储桶。

1. 提交集群创建请求。 HyperPod 根据请求配置集群，然后在集 HyperPod 群实例中创建`resource_config.json`文件，并在运行生命周期脚本的集群上设置 Slurm。

以下主题将引导您完成并深入探讨如何组织配置文件和生命周期脚本以在创建 HyperPod集群期间正常运行的详细信息。

**Topics**
+ [

## 高级概述
](#sagemaker-hyperpod-lifecycle-best-practices-slurm-slurm-highlevel-overview)
+ [

# 提供的基本生命周期脚本 HyperPod
](sagemaker-hyperpod-lifecycle-best-practices-slurm-slurm-base-config.md)
+ [

# Slurm 配置 HyperPod 文件中管理哪些特定的配置
](sagemaker-hyperpod-lifecycle-best-practices-slurm-what-hyperpod-overrides-in-slurm-conf.md)
+ [

# Slurm 日志轮换
](sagemaker-hyperpod-slurm-log-rotation.md)
+ [

# 将 FSx 适用于 Lustre 的 Amazon 和 FSx 适用于 OpenZFS 的亚马逊安装到集群 HyperPod
](sagemaker-hyperpod-lifecycle-best-practices-slurm-slurm-setup-with-fsx.md)
+ [

# 在上创建 Slurm 集群之前验证 JSON 配置文件 HyperPod
](sagemaker-hyperpod-lifecycle-best-practices-slurm-slurm-validate-json-files.md)
+ [

# 在 HyperPod Slurm 集群上运行生产工作负载之前验证运行时间
](sagemaker-hyperpod-lifecycle-best-practices-slurm-slurm-validate-runtime.md)
+ [

# 在 HyperPod 群集节点上以交互方式开发生命周期脚本
](sagemaker-hyperpod-lifecycle-best-practices-slurm-slurm-develop-lifecycle-scripts.md)

# 提供的基本生命周期脚本 HyperPod
<a name="sagemaker-hyperpod-lifecycle-best-practices-slurm-slurm-base-config"></a>

本节将引导你了解以自上而***下的***方法开启 Slurm 的基本流程 HyperPod 的每个组成部分。它从准备用于运行 `CreateCluster` API 的 HyperPod 集群创建请求开始，然后深入研究生命周期脚本的层次结构。使用 [Awsome 分布式训练 GitHub 存储库](https://github.com/aws-samples/awsome-distributed-training/)中提供的示例生命周期脚本。运行以下命令克隆版本存储库。

```
git clone https://github.com/aws-samples/awsome-distributed-training/
```

用于在上设置 Slurm 集群的基本生命周期脚本 SageMaker HyperPod 可在中找到。[https://github.com/aws-samples/awsome-distributed-training/tree/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config](https://github.com/aws-samples/awsome-distributed-training/tree/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config)

```
cd awsome-distributed-training/1.architectures/5.sagemaker_hyperpods/LifecycleScripts/base-config
```

下面的流程图详细概述了如何设计基本生命周期脚本。图表下方的描述和程序指南解释了它们在 HyperPod `CreateCluster` API 调用期间的工作原理。

![\[HyperPod 集群创建和生命周期脚本结构的详细流程图。\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/hyperpod-lifecycle-structure.png)


***图：** HyperPod 集群创建和生命周期脚本结构的详细流程图。(1) 虚线箭头指向“调用”方框的位置，显示了配置文件和生命周期脚本的准备流。它从准备 `provisioning_parameters.json` 和生命周期脚本开始。然后将这些代码编入 `lifecycle_script.py`，按顺序集体执行。`lifecycle_script.py`脚本的执行由 `on_create.sh` shell 脚本完成，该脚本将在 HyperPod实例终端中运行。(2) 实心箭头显示了主 HyperPod 集群的创建流程以及方框是如何 “调入” 或 “提交给” 的。 `on_create.sh`是创建集群请求的必填项，可以在控制台用户界面中的**创建集群**请求表中找到。`create_cluster.json`提交请求后，根据请求和生命周期脚本中的给定配置信息 HyperPod 运行 `CreateCluster` API。(3) 虚线箭头表示 HyperPod 平台在集群资源配置期间`resource_config.json`在集群中创建的实例。 `resource_config.json`包含 HyperPod 群集资源信息，例如集群 ARN、实例类型和 IP 地址。需要注意的是，您应该准备生命周期脚本，以便在集群创建期间找到 `resource_config.json` 文件。有关更多信息，请参阅下面的程序指南。*

以下程序指南解释了 HyperPod 集群创建期间发生的事情以及基本生命周期脚本是如何设计的。

1. `create_cluster.json`— 要提交 HyperPod集群创建请求，您需要准备一个 JSON 格式的`CreateCluster`请求文件。在本最佳实践示例中，我们假设请求文件名为 `create_cluster.json`。写信`create_cluster.json`给集 HyperPod 群配置实例组。最佳做法是添加与您计划在集群上配置的 Slurm 节点数量相同的实例组。 HyperPod 确保为将分配给计划建立的 Slurm 节点的实例组赋予独特的名称。

   此外，您还需要在 `CreateCluster` 请求表中的字段名 `InstanceGroups.LifeCycleConfig.SourceS3Uri` 中指定一个 S3 存储桶路径，用于存储整套配置文件和生命周期脚本，并在 `InstanceGroups.LifeCycleConfig.OnCreate` 中指定入口点 shell 脚本的文件名（假设其名为 `on_create.sh`）。
**注意**  
如果您在 HyperPod 控制台用户界面中使用**创建集群**提交表单，则控制台会代表您管理填写和提交`CreateCluster`请求，并在后端运行 `CreateCluster` API。在这种情况下，您无需创建 `create_cluster.json`；相反，请确保在**创建集群**提交表中指定正确的集群配置信息。

1. `on_create.sh`— 对于每个实例组，您需要提供一个入口点 shell 脚本，以运行命令`on_create.sh`、运行脚本来安装软件包，以及使用 Slurm 设置 HyperPod集群环境。您需要准备的两件事是设置 Slurm 所`provisioning_parameters.json` HyperPod 必需的，以及一组用于安装软件包的生命周期脚本。编写此脚本时，应按照 [https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/on_create.sh](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/on_create.sh) 的示例脚本所示，查找并运行以下文件。
**注意**  
确保将整套生命周期脚本上传到在 `create_cluster.json` 中指定的 S3 位置。您还应将 `provisioning_parameters.json` 放在同一位置。

   1. `provisioning_parameters.json`：这是 [用于配置\$1parameters.json 的配置表单](sagemaker-hyperpod-ref.md#sagemaker-hyperpod-ref-provisioning-forms-slurm)。`on_create.sh` 脚本会找到此 JSON 文件，并定义环境变量以确定文件路径。通过这个 JSON 文件，你可以配置 Slurm 节点和要与之通信的存储选项，例如 Ama FSx zon for Lustre for Slurm。在中`provisioning_parameters.json`，请确保根据计划设置方式，使用您在中`create_cluster.json`指定的名称将 HyperPod 集群实例组适当地分配给 Slurm 节点。

      下图显示了如何编写两个 JSON 配置文件`create_cluster.json`和`provisioning_parameters.json`以将 HyperPod 实例组分配给 Slurm 节点的示例。在本例中，我们假设设置了三个 Slurm 节点：控制器（管理）节点、登录节点（可选）和计算（Worker）节点。
**提示**  
为了帮助您验证这两个 JSON 文件， HyperPod服务团队提供了一个验证脚本[https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/validate-config.py](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/validate-config.py)。要了解更多信息，请参阅[在上创建 Slurm 集群之前验证 JSON 配置文件 HyperPod](sagemaker-hyperpod-lifecycle-best-practices-slurm-slurm-validate-json-files.md)。  
![\[在 .json 文件之间进行直接比较。\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/hyperpod-lifecycle-slurm-config.png)

      ***图：** HyperPod集群创建和 Slurm 配置之间的`create_cluster.json`直接比较。`provisiong_params.json``create_cluster.json` 中的实例组数量应与要配置为 Slurm 节点的节点数量一致。对于图中的示例，将在由三个实例组组组成的 HyperPod 集群上配置三个 Slurm 节点。您应通过相应地指定实例组名称将 HyperPod 集群实例组分配给 Slurm 节点。*

   1. `resource_config.json`— 在创建集群期间，编写`lifecycle_script.py`脚本是为了期望有来自的`resource_config.json`文件 HyperPod。该文件包含有关集群的信息，如实例类型和 IP 地址。

      运行 `CreateCluster` API 时， HyperPod会`/opt/ml/config/resource_config.json`根据该文件在上创建资源配置`create_cluster.json`文件。文件路径会保存到名为 `SAGEMAKER_RESOURCE_CONFIG_PATH` 的环境变量中。
**重要**  
该`resource_config.json`文件由 HyperPod 平台自动生成，您无需创建。下面的代码展示了一个 `resource_config.json` 示例，该示例将根据上一步中的 `create_cluster.json` 创建集群，并帮助您了解后端发生的情况以及自动生成的 `resource_config.json` 的外观。

      ```
      {
      
          "ClusterConfig": {
              "ClusterArn": "arn:aws:sagemaker:us-west-2:111122223333:cluster/abcde01234yz",
              "ClusterName": "your-hyperpod-cluster"
          },
          "InstanceGroups": [
              {
                  "Name": "controller-machine",
                  "InstanceType": "ml.c5.xlarge",
                  "Instances": [
                      {
                          "InstanceName": "controller-machine-1",
                          "AgentIpAddress": "111.222.333.444",
                          "CustomerIpAddress": "111.222.333.444",
                          "InstanceId": "i-12345abcedfg67890"
                      }
                  ]
              },
              {
                  "Name": "login-group",
                  "InstanceType": "ml.m5.xlarge",
                  "Instances": [
                      {
                          "InstanceName": "login-group-1",
                          "AgentIpAddress": "111.222.333.444",
                          "CustomerIpAddress": "111.222.333.444",
                          "InstanceId": "i-12345abcedfg67890"
                      }
                  ]
              },
              {
                  "Name": "compute-nodes",
                  "InstanceType": "ml.trn1.32xlarge",
                  "Instances": [
                      {
                          "InstanceName": "compute-nodes-1",
                          "AgentIpAddress": "111.222.333.444",
                          "CustomerIpAddress": "111.222.333.444",
                          "InstanceId": "i-12345abcedfg67890"
                      },
                      {
                          "InstanceName": "compute-nodes-2",
                          "AgentIpAddress": "111.222.333.444",
                          "CustomerIpAddress": "111.222.333.444",
                          "InstanceId": "i-12345abcedfg67890"
                      },
                      {
                          "InstanceName": "compute-nodes-3",
                          "AgentIpAddress": "111.222.333.444",
                          "CustomerIpAddress": "111.222.333.444",
                          "InstanceId": "i-12345abcedfg67890"
                      },
                      {
                          "InstanceName": "compute-nodes-4",
                          "AgentIpAddress": "111.222.333.444",
                          "CustomerIpAddress": "111.222.333.444",
                          "InstanceId": "i-12345abcedfg67890"
                      }
                  ]
              }
          ]
      }
      ```

   1. `lifecycle_script.py`— 这是主要 Python 脚本，它在配置时共同运行在 HyperPod 集群上设置 Slurm 的生命周期脚本。该脚本从 `on_create.sh` 中指定或标识的路径读入 `provisioning_parameters.json` 和 `resource_config.json`，将相关信息传递给每个生命周期脚本，然后按顺序运行生命周期脚本。

      生命周期脚本是一组脚本，您可以完全灵活地自定义这些脚本，以便在集群创建过程中安装软件包和设置必要或自定义配置，例如设置 Slurm、创建用户、安装 Conda 或 Docker。该示例[https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/lifecycle_script.py](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/lifecycle_script.py)脚本已准备好在存储库中运行其他基本生命周期脚本，例如启动 Slurm deamons () [https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/start_slurm.sh](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/start_slurm.sh)、安装 Ama FSx zon for Lustre ([https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/mount_fsx.sh](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/mount_fsx.sh)) 以及设置 MariaDB 会计 () 和 RDS 会计 ([https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/setup_mariadb_accounting.sh](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/setup_mariadb_accounting.sh))。[https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/setup_rds_accounting.sh](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/setup_rds_accounting.sh)您还可以添加更多脚本，将它们打包到同一个目录下，然后向中添加代码行`lifecycle_script.py`以让脚本 HyperPod 运行。有关基本生命周期脚本的更多信息，另请参阅 *Awsome Distributed Training GitHub 存储库*中的 [3.1 生命周期脚本](https://github.com/aws-samples/awsome-distributed-training/tree/main/1.architectures/5.sagemaker-hyperpod#31-lifecycle-scripts)。
**注意**  
HyperPod 在集群的每个实例[SageMaker HyperPod DLAMI](sagemaker-hyperpod-ref.md#sagemaker-hyperpod-ref-hyperpod-ami)上运行，并且 AMI 已预先安装了软件包，这些软件包符合它们与功能之间的兼容性。 HyperPod请注意，如果您重新安装任何预安装的软件包，则需要负责安装兼容的软件包，并且请注意，某些 HyperPod 功能可能无法按预期运行。

      除默认设置外，[https://github.com/aws-samples/awsome-distributed-training/tree/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/utils](https://github.com/aws-samples/awsome-distributed-training/tree/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/utils) 文件夹下还有更多用于安装以下软件的脚本。`lifecycle_script.py` 文件中已经包含了运行安装脚本的代码行，请参阅以下项目搜索这些行，并取消注释以激活它们。

      1. 以下代码行用于安装 [Docker](https://www.docker.com/)、[Enroot](https://github.com/NVIDIA/enroot) 和 [Pyxis](https://github.com/NVIDIA/pyxis)。在 Slurm 集群上运行 Docker 容器需要这些软件包。

         要启用此安装步骤，请在 [https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/config.py](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/config.py) 文件中将 `enable_docker_enroot_pyxis` 参数设置为 `True`。

         ```
         # Install Docker/Enroot/Pyxis
         if Config.enable_docker_enroot_pyxis:
             ExecuteBashScript("./utils/install_docker.sh").run()
             ExecuteBashScript("./utils/install_enroot_pyxis.sh").run(node_type)
         ```

      1. 您可以将集 HyperPod 群与[适用于 Prometheus 的亚马逊托管服务](https://docs.aws.amazon.com/prometheus/latest/userguide/what-is-Amazon-Managed-Service-Prometheus.html)和 Amazon Managed Grafana 集成，将有关 HyperPod集群和集群节点的指标导出到[亚马逊托管](https://docs.aws.amazon.com/grafana/latest/userguide/what-is-Amazon-Managed-Service-Grafana.html) Grafana 控制面板。要在 Amazon Managed Grafana 上导出指标并使用 [Slurm 控制面板](https://grafana.com/grafana/dashboards/4323-slurm-dashboard/)、[NVIDIA DCGM 导出器控制面板](https://grafana.com/grafana/dashboards/12239-nvidia-dcgm-exporter-dashboard/)和 [EFA 指标控制面板](https://grafana.com/grafana/dashboards/20579-efa-metrics-dev/)，您需要安装[用于 Prometheus 的 Slurm 导出器](https://github.com/vpenso/prometheus-slurm-exporter)、[NVIDIA DCGM 导出器](https://github.com/NVIDIA/dcgm-exporter)和 [EFA 节点导出器](https://github.com/aws-samples/awsome-distributed-training/blob/main/4.validation_and_observability/3.efa-node-exporter/README.md)。有关在 Amazon Managed Grafana 工作区安装导出程序包和使用 Grafana 控制面板的更多信息，请参阅 [SageMaker HyperPod 集群资源监控](sagemaker-hyperpod-cluster-observability-slurm.md)。

         要启用此安装步骤，请在 [https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/config.py](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/config.py) 文件中将 `enable_observability` 参数设置为 `True`。

         ```
         # Install metric exporting software and Prometheus for observability
         
         if Config.enable_observability:
             if node_type == SlurmNodeType.COMPUTE_NODE:
                 ExecuteBashScript("./utils/install_docker.sh").run()
                 ExecuteBashScript("./utils/install_dcgm_exporter.sh").run()
                 ExecuteBashScript("./utils/install_efa_node_exporter.sh").run()
             
             if node_type == SlurmNodeType.HEAD_NODE:
                 wait_for_scontrol()
                 ExecuteBashScript("./utils/install_docker.sh").run()
                 ExecuteBashScript("./utils/install_slurm_exporter.sh").run()
                 ExecuteBashScript("./utils/install_prometheus.sh").run()
         ```

1. 确保将**步骤 2** 中的所有配置文件和设置脚本上传到您在**步骤 1** 的 `CreateCluster` 请求中提供的 S3 存储桶。例如，假设您的 `create_cluster.json` 有以下内容。

   ```
   "LifeCycleConfig": { 
   
       "SourceS3URI": "s3://sagemaker-hyperpod-lifecycle/src",
       "OnCreate": "on_create.sh"
   }
   ```

   然后，您的 `"s3://sagemaker-hyperpod-lifecycle/src"` 应包含 `on_create.sh`、`lifecycle_script.py`、`provisioning_parameters.json` 和所有其他设置脚本。假设您在本地文件夹中准备了如下文件。

   ```
   └── lifecycle_files // your local folder
       ├── provisioning_parameters.json
       ├── on_create.sh
       ├── lifecycle_script.py
       └── ... // more setup scrips to be fed into lifecycle_script.py
   ```

   要上传文件，请使用 S3 命令，如下所示。

   ```
   aws s3 cp --recursive ./lifecycle_scripts s3://sagemaker-hyperpod-lifecycle/src
   ```

# Slurm 配置 HyperPod 文件中管理哪些特定的配置
<a name="sagemaker-hyperpod-lifecycle-best-practices-slurm-what-hyperpod-overrides-in-slurm-conf"></a>

当您在上创建 Slurm 集群时 HyperPod， HyperPod 代理会根据您的集群创建请求[https://slurm.schedmd.com/slurm.conf.html](https://slurm.schedmd.com/slurm.conf.html)和生命周期脚本`/opt/slurm/etc/`将和[https://slurm.schedmd.com/gres.conf.html](https://slurm.schedmd.com/gres.conf.html)文件设置为管理 Slurm HyperPod 集群。以下列表显示了 HyperPod 代理处理和覆盖的特定参数。

**重要**  
我们强烈建议您**不要**更改这些由管理的参数 HyperPod。
+ 在中 [https://slurm.schedmd.com/slurm.conf.html](https://slurm.schedmd.com/slurm.conf.html)， HyperPod 设置以下基本参数：`ClusterName``SlurmctldHost`、`PartitionName`、和`NodeName`。

  此外，要启用该[自动节点恢复和自动恢复](sagemaker-hyperpod-resiliency-slurm-auto-resume.md)功能， HyperPod 需要按以下方式设置`TaskPlugin`和`SchedulerParameters`参数。默认情况下， HyperPod 代理将这两个参数设置为所需的值。

  ```
  TaskPlugin=task/none
  SchedulerParameters=permit_job_expansion
  ```
+ 在中 [https://slurm.schedmd.com/gres.conf.html](https://slurm.schedmd.com/gres.conf.html)， HyperPod 管理 G `NodeName` PU 节点。

# Slurm 日志轮换
<a name="sagemaker-hyperpod-slurm-log-rotation"></a>

SageMaker HyperPod 为 Slurm 守护程序日志提供自动日志轮换，以帮助管理磁盘空间使用情况和维护系统性能。日志轮换对于防止日志占用过多磁盘空间和通过自动存档和删除旧日志文件来确保最佳系统运行至关重要，同时保留最新的日志信息。创建集群时，Slurm 日志轮换默认处于启用状态。

## 日志轮换的工作原理
<a name="sagemaker-hyperpod-slurm-log-rotation-how-it-works"></a>

启用后，日志轮换配置：
+ 监视所有扩展名`.log`位于控制器、登录和计算节点上`/var/log/slurm/`文件夹中的 Slurm 日志文件。
+ 当日志大小达到 50 MB 时轮换日志。
+ 在删除之前，最多保留两个轮换的日志文件。
+ 轮换后向 Slurm 守护程序（`slurmctld``slurmd`、和`slurmdbd`）发送 SIGUSR2 信号。

## 轮换的日志文件列表
<a name="sagemaker-hyperpod-slurm-log-rotation-log-files-list"></a>

Slurm 日志位于目录中。`/var/log/slurm/`所有匹配的文件都启用了日志轮换`/var/log/slurm/*.log`。当发生旋转时，旋转后的文件会有数字后缀（例如）。`slurmd.log.1`以下列表并不详尽，但显示了一些自动轮换的关键日志文件：
+ `/var/log/slurm/slurmctld.log`
+ `/var/log/slurm/slurmd.log`
+ `/var/log/slurm/slurmdb.log`
+ `/var/log/slurm/slurmrestd.log`

## 启用或禁用日志轮换
<a name="sagemaker-hyperpod-slurm-log-rotation-enable-disable"></a>

您可以使用集群生命周期`config.py`脚本中的`enable_slurm_log_rotation`参数来控制日志轮换功能，如以下示例所示：

```
class Config:
    # Set false if you want to disable log rotation of Slurm daemon logs
    enable_slurm_log_rotation = True  # Default value
```

要禁用日志轮换，请将参数设置为`False`，如以下示例所示：

```
enable_slurm_log_rotation = False
```

**注意**  
创建集群期间，生命周期脚本在所有 Slurm 节点（控制器、登录节点和计算节点）上运行。添加到集群后，它们还会在新节点上运行。创建集群后，必须手动更新日志轮换配置。日志轮换配置存储在中`/etc/logrotate.d/sagemaker-hyperpod-slurm`。我们建议启用日志轮换，以防止日志文件占用过多的磁盘空间。要禁用日志轮换，请删除`sagemaker-hyperpod-slurm`文件或通过`#`在`sagemaker-hyperpod-slurm`文件中每行的开头添加注释掉其内容。

## 默认日志轮换设置
<a name="sagemaker-hyperpod-slurm-log-rotation-default-settings"></a>

系统会为每个轮换的日志文件自动配置以下设置：


| 设置 | 值 | 说明 | 
| --- | --- | --- | 
| rotate | 2 | 要保留的轮换日志文件数 | 
| size | 50 MB | 旋转前的最大尺寸 | 
| copytruncate | 已启用 | 复制和截断原始日志文件 | 
| compress | disabled | 轮换的日志未被压缩 | 
| missingok | 已启用 | 如果缺少日志文件则不会出错 | 
| notifempty | 已启用 | 不轮换空文件 | 
| noolddir | 已启用 | 旋转后的文件保留在同一个目录中 | 

# 将 FSx 适用于 Lustre 的 Amazon 和 FSx 适用于 OpenZFS 的亚马逊安装到集群 HyperPod
<a name="sagemaker-hyperpod-lifecycle-best-practices-slurm-slurm-setup-with-fsx"></a>

要将 Amazon f FSx or Lustre 共享文件系统挂载到您的 HyperPod 集群，请进行以下设置。

1. 使用 Amazon VPC。

   1. 要使 HyperPod 集群实例在您的 VPC 内进行通信，请确保将附加[SageMaker HyperPod 使用自定义 Amazon VPC 进行设置](sagemaker-hyperpod-prerequisites.md#sagemaker-hyperpod-prerequisites-optional-vpc)到的 IAM 角色 SageMaker HyperPod。

   1. 在 `create_cluster.json` 中，包含以下 VPC 信息。

      ```
      "VpcConfig": { 
          "SecurityGroupIds": [ "string" ],
          "Subnets": [ "string" ]
      }
      ```

      有关设置 Amazon VPC 的更多提示，请参阅 [使用的先决条件 SageMaker HyperPod](sagemaker-hyperpod-prerequisites.md)。

1. 要完成使用 Ama FSx zon for Lustre 配置 Slurm，你可以使用以下方法之一。您可以通过账户中的 Amazon for FSx Lustre 控制台或运行以下 AWS CLI 命令来查找亚马逊 FSx 信息。`aws fsx describe-file-systems`

   **选项 A：API 驱动的配置（推荐）**

   在每个实例组中使用直接在 CreateCluster API 负载`InstanceStorageConfigs`中指定 Amazon FSx 配置。这种方法同时 FSx 支持 Lustre 和 OpenZFS，并且允许 FSx 进行配置。 per-instance-group FSx 

   ```
   "InstanceStorageConfigs": [
       {
           "FsxLustreConfig": {
               "DnsName": "fs-12345678a90b01cde.fsx.us-west-2.amazonaws.com",
               "MountPath": "/fsx",
               "MountName": "1abcdefg"
           }
       }
   ]
   ```

   对 FSx 于 OpenZFS，请改用`FsxOpenZfsConfig`：

   ```
   "InstanceStorageConfigs": [
       {
           "FsxOpenZfsConfig": {
               "DnsName": "fs-12345678a90b01cde.fsx.us-west-2.amazonaws.com",
               "MountPath": "/fsx-openzfs"
           }
       }
   ]
   ```

   有关更多详细信息，请参阅 [AWS CLI SageMaker HyperPod 使用入门](sagemaker-hyperpod-quickstart.md)。

   **选项 B：传统配置**

   `provisioning_parameters.json`如本[提供的基本生命周期脚本 HyperPod](sagemaker-hyperpod-lifecycle-best-practices-slurm-slurm-base-config.md)节图所示，在中指定 Amazon FSx DNS 名称和亚马逊 FSx 挂载名称。

   ```
   "fsx_dns_name": "fs-12345678a90b01cde.fsx.us-west-2.amazonaws.com",
   "fsx_mountname": "1abcdefg"
   ```

# 在上创建 Slurm 集群之前验证 JSON 配置文件 HyperPod
<a name="sagemaker-hyperpod-lifecycle-best-practices-slurm-slurm-validate-json-files"></a>

要在提交集群创建请求前验证 JSON 配置文件，请使用配置验证脚本 [https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/validate-config.py](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/validate-config.py)。该脚本解析并比较您的 HyperPod 集群配置 JSON 文件和 Slurm 配置 JSON 文件，并确定这两个文件之间以及亚马逊 EC2、Amazon VPC 和亚马逊资源之间是否存在任何资源配置错误。 FSx 例如，要验证 [提供的基本生命周期脚本 HyperPod](sagemaker-hyperpod-lifecycle-best-practices-slurm-slurm-base-config.md) 一节的 `create_cluster.json` 和 `provisioning_parameters.json` 文件，请按以下步骤运行验证脚本。

```
python3 validate-config.py --cluster-config create_cluster.json --provisioning-parameters provisioning_parameters.json
```

下面是一个成功验证的输出示例。

```
✔️  Validated instance group name worker-group-1 is correct ...

✔️  Validated subnet subnet-012345abcdef67890 ...
✔️  Validated security group sg-012345abcdef67890 ingress rules ...
✔️  Validated security group sg-012345abcdef67890 egress rules ...
✔️  Validated FSx Lustre DNS name fs-012345abcdef67890.fsx.us-east-1.amazonaws.com
✔️  Validated FSx Lustre mount name abcdefgh
✅ Cluster Validation succeeded
```

# 在 HyperPod Slurm 集群上运行生产工作负载之前验证运行时间
<a name="sagemaker-hyperpod-lifecycle-best-practices-slurm-slurm-validate-runtime"></a>

要在 Slurm 集群上运行任何生产工作负载之前检查运行时间 HyperPod，请使用运行时验证脚本。[https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/hyperpod-precheck.py](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/hyperpod-precheck.py)此脚本检查 Slurm 集群是否安装了用于运行 Docker 的所有软件包，该集群是否正确安装 FSx 了 For Lustre 文件系统和共享文件系统的用户目录，以及 Slurm 守护程序是否在所有计算节点上运行。

要在多个节点上同时运行脚本，请使用 `srun`，如以下在由 8 个节点组成的 Slurm 集群上运行脚本的命令示例所示。

```
# The following command runs on 8 nodes
srun -N 8 python3 hyperpod-precheck.py
```

**注意**  
要了解有关验证脚本的更多信息，例如该脚本提供的运行时验证功能以及解决未通过验证的问题的指南，请参阅在 *Awsome Distributed Tra GitHub * ining 存储库中[运行工作负载之前的运行时验证](https://github.com/aws-samples/awsome-distributed-training/tree/main/1.architectures/5.sagemaker-hyperpod#35-runtime-validation-before-running-workloads)。

# 在 HyperPod 群集节点上以交互方式开发生命周期脚本
<a name="sagemaker-hyperpod-lifecycle-best-practices-slurm-slurm-develop-lifecycle-scripts"></a>

本节介绍如何在不重复创建和删除 HyperPod 集群的情况下以交互方式开发生命周期脚本。

1. 使用基本生命周期脚本创建 HyperPod 集群。

1. 登录集群节点。

1. 通过编辑并在节点上反复运行脚本 (`configure_xyz.sh`) 来开发脚本。

   1. HyperPod 以 root 用户身份运行生命周期脚本，因此我们建议您在开发时以 root 用户身份运行，以确保脚本在运行时在相同的条件下进行测试 HyperPod。`configure_xyz.sh`

1. 通过添加类似以下代码的行，将脚本整合到 `lifecycle_script.py` 中。

   ```
   ExecuteBashScript("./utils/configure_xyz.sh").run()
   ```

1. 将更新的生命周期脚本上传到最初用于上传基本生命周期脚本的 S3 存储桶。

1. `lifecycle_script.py`通过创建新集 HyperPod 群来测试的集成版本。您也可以使用手动替换实例，通过创建新实例来测试更新的生命周期脚本。有关详细说明，请参阅[手动替换节点](https://docs.aws.amazon.com//sagemaker/latest/dg/sagemaker-hyperpod-resiliency-slurm-replace-faulty-instance.html#sagemaker-hyperpod-resiliency-slurm-replace-faulty-instance-replace)。请注意，只有工作节点是可更换的。

# SageMaker HyperPod 多头节点支持
<a name="sagemaker-hyperpod-multihead-slurm"></a>

你可以在单个 SageMaker HyperPod Slurm 集群中创建多个控制器（头）节点，其中一个用作主控制器节点，另一个用作备用控制器节点。主控制器节点负责控制计算（Worker）节点和处理 Slurm 操作。备份控制器节点可持续监控主控制器节点。如果主控制器节点出现故障或无响应，则其中一个备份控制器节点将自动接管，成为新的主控制器节点。

在 SageMaker HyperPod Slurm 集群中配置多个控制器节点有几个主要好处。通过提供控制器头节点，它消除了单一控制器节点出现故障的风险，支持自动失效转移至备份控制器节点以加快恢复速度，并允许您独立管理自己的会计数据库和 Slurm 配置。

## 重要概念
<a name="sagemaker-hyperpod-multihead-slurm-concepts"></a>

以下内容详细介绍了与 Slurm 集群的 SageMaker HyperPod 多控制器（头）节点支持相关的概念。

**控制器节点**

控制器节点是集群中的一个 Amazon EC2 实例，可运行用于管理和协调集群操作的关键 Slurm 服务。具体而言，它会托管 [Slurm 控制器进程守护程序（slurmctld）](https://slurm.schedmd.com/slurmctld.html)和 [Slurm 数据库进程守护程序（slurmdbd）](https://slurm.schedmd.com/slurmdbd.html)。控制器节点也称为头节点。

**主控制器节点**

主控制器节点是 Slurm 集群中当前处于活跃状态且行使控制权的控制器节点。Slurm 将此节点标识为负责管理集群的主控制器节点。主控制器节点接收并执行来自用户的命令，以控制计算节点上的资源，并分配这些资源来运行作业。

**备份控制器节点**

备份控制器节点是 Slurm 集群中处于非活跃状态的备用控制器节点。Slurm 将此节点标识为当前未管理集群的备份控制器节点。备份控制器节点在待机模式下运行 [Slurm 控制器进程守护程序（slurmctld）](https://slurm.schedmd.com/slurmctld.html)。在备份控制器节点上执行的任何控制器命令都将传播到主控制器节点来执行。其主要用途是持续监控主控制器节点，并在主控制器节点出现故障或无响应时接管其职责。

**计算节点**

计算节点集群中的一个托管 [Slurm Worker 进程守护程序（slurmd）](https://slurm.schedmd.com/slurmd.html)的 Amazon EC2 实例。计算节点的主要功能是执行由主控制器节点上运行的 [Slurm 控制器进程守护程序（slurmctld）](https://slurm.schedmd.com/slurmctld.html)分配的作业。当作业被调度时，计算节点会收到来自 [Slurm 控制器进程守护程序（slurmctld）](https://slurm.schedmd.com/slurmctld.html)的指令，在节点内部执行该作业所需的任务和计算。计算节点也称为 Worker 节点。

## 工作原理
<a name="sagemaker-hyperpod-multihead-slurm-how"></a>

下图说明了不同的 AWS 服务如何协同工作以支持 SageMaker HyperPod Slurm 集群的多控制器（头）节点架构。

![\[SageMaker HyperPod 多头节点架构图\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/hyperpod/hyperpod-multihead-architecture.png)


协同工作以支持 SageMaker HyperPod 多控制器（头）节点架构的 AWS 服务包括以下内容。


**AWS 协同工作以支持 SageMaker HyperPod 多控制器节点架构的服务**  

| 服务 | 说明 | 
| --- | --- | 
| IAM（AWS Identity and Access Management） | 定义两个 IAM 角色来控制访问权限：一个 IAM 角色用于计算节点实例组，另一个 IAM 角色用于控制器节点实例组。 | 
| Amazon RDS for MariaDB | 存储 Slurm 的会计数据，该数据包含作业记录和计量数据。 | 
| AWS Secrets Manager | 存储并管理 Amazon FSx 可以访问的 Lustre 证书。 | 
| 亚马逊 f FSx or Lustre  | 存储 Slurm 配置和运行时状态。 | 
| Amazon VPC | 提供隔离的网络环境，用于部署 HyperPod 集群及其资源。 | 
| Amazon SNS  | 当出现与主控制器（头）节点相关的状态变化（Slurm 控制器为 ON 或 OFF）时，Amazon SNS 会向管理员发送通知。 | 

集 HyperPod 群本身由控制器节点（主节点和备用节点）和计算节点组成。控制器节点运行 Slurm 控制器 (SlurmCtld) 和数据库 (SlurmDBd) 组件，它们管理和监控计算节点上的工作负载。

控制器节点访问存储在 Ama FSx zon for Lustre 文件系统中的 Slurm 配置和运行时状态。Slurm 的会计数据存储在亚马逊 RDS for MariaDB 数据库中。 AWS Secrets Manager 为控制器节点提供对数据库凭据的安全访问。

如果 Slurm 控制器节点中出现状态变化（Slurm 控制器为 `ON` 或 `OFF`），Amazon SNS 会向管理员发送通知，以便管理员采取进一步的行动。

此多控制器节点架构消除了单一控制器（头）节点的单点故障风险，支持快速且自动化的失效转移恢复，同时使您能够控制 Slurm 会计数据库与配置。

# 为 SageMaker HyperPod Slurm 集群设置多个控制器节点
<a name="sagemaker-hyperpod-multihead-slurm-setup"></a>

本主题介绍如何使用生命周期脚本在 SageMaker HyperPod Slurm 集群中配置多个控制器（头）节点。在开始之前，请查看[使用的先决条件 SageMaker HyperPod](sagemaker-hyperpod-prerequisites.md)中列出的先决条件并熟悉[使用生命周期脚本自定义 SageMaker HyperPod 集群](sagemaker-hyperpod-lifecycle-best-practices-slurm.md)中的生命周期脚本。本主题中的说明使用的是 Amazon Linux 环境中的 AWS CLI 命令。请注意，这些命令中使用的环境变量仅在当前会话中可用，除非将其显式保留。

**Topics**
+ [

# 使用 CloudFormation 堆栈配置资源
](sagemaker-hyperpod-multihead-slurm-cfn.md)
+ [

# 创建并附加 IAM 策略
](sagemaker-hyperpod-multihead-slurm-iam.md)
+ [

# 准备并上传生命周期脚本
](sagemaker-hyperpod-multihead-slurm-scripts.md)
+ [

# 创建集 SageMaker HyperPod 群
](sagemaker-hyperpod-multihead-slurm-create.md)
+ [

# 考虑重要说明
](sagemaker-hyperpod-multihead-slurm-notes.md)
+ [

# 查看环境变量参考
](sagemaker-hyperpod-multihead-slurm-variables-reference.md)

# 使用 CloudFormation 堆栈配置资源
<a name="sagemaker-hyperpod-multihead-slurm-cfn"></a>

要在 HyperPod Slurm 集群中设置多个控制器节点，请通过两个 CloudFormation 堆栈配置 AWS 资源：和。[预调配基本资源](#sagemaker-hyperpod-multihead-slurm-cfn-basic) [预调配其他资源以支持多个控制器节点](#sagemaker-hyperpod-multihead-slurm-cfn-multihead)

## 预调配基本资源
<a name="sagemaker-hyperpod-multihead-slurm-cfn-basic"></a>

按照以下步骤为您的 Amazon SageMaker HyperPod Slurm 集群配置基本资源。

1. 将 [sagemaker-hyperpod.yaml](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/sagemaker-hyperpod.yaml) 模板文件下载到您的计算机上。此 YAML 文件是一个 CloudFormation 模板，用于定义要为 Slurm 集群创建的以下资源。
   + 计算节点实例组的执行 IAM 角色
   + 用于存储生命周期脚本的 Amazon S3 存储桶
   + 公有子网和私有子网（私有子网可通过 NAT 网关访问互联网）
   + 互联网 Gateway/NAT 网关
   + 两个 Amazon EC2 安全组
   + 用于存储配置文件的 Amazon FSx 卷

1. 运行以下 CLI 命令创建名为的 CloudFormation 堆栈`sagemaker-hyperpod`。在和中 IDs 为您的集群定义可用区 (AZ) `BackupSubnetAZ`。`PrimarySubnetAZ`例如，*use1-az4*是该`us-east-1`区域中可用区的可用区 ID。有关更多信息，请参阅[可用区 IDs](https://docs.aws.amazon.com//ram/latest/userguide/working-with-az-ids.html)和[跨多个 SageMaker HyperPod 集群设置 AZs](sagemaker-hyperpod-prerequisites.md#sagemaker-hyperpod-prerequisites-multiple-availability-zones)。

   ```
   aws cloudformation deploy \
   --template-file /path_to_template/sagemaker-hyperpod.yaml \
   --stack-name sagemaker-hyperpod \
   --parameter-overrides PrimarySubnetAZ=use1-az4 BackupSubnetAZ=use1-az1 \
   --capabilities CAPABILITY_IAM
   ```

   有关更多信息，请参见[通过 AWS Command Line Interface 参考进行部署](https://docs.aws.amazon.com//cli/latest/reference/cloudformation/deploy/)。堆栈创建可能需要几分钟才能完成。堆栈创建完成后，您将在命令行界面中看到以下内容。

   ```
   Waiting for changeset to be created..
   Waiting for stack create/update to complete
   Successfully created/updated stack - sagemaker-hyperpod
   ```

1. （可选）在 [CloudFormation 控制台](https://console.aws.amazon.com/cloudformation/home)中验证堆栈。
   + 从左侧导航栏中，选择**堆栈**。
   + 在**堆栈**页面上，找到并选择 **sagemaker-hyperpod**。
   + 选择**资源**和**输出**等标签页以查看资源和输出。

1. 从堆栈（`sagemaker-hyperpod`）输出中创建环境变量。您将使用这些变量的值来[预调配其他资源以支持多个控制器节点](#sagemaker-hyperpod-multihead-slurm-cfn-multihead)。

   ```
   source .env
   PRIMARY_SUBNET=$(aws --region $REGION cloudformation describe-stacks --stack-name $SAGEMAKER_STACK_NAME --query 'Stacks[0].Outputs[?OutputKey==`PrimaryPrivateSubnet`].OutputValue' --output text)
   BACKUP_SUBNET=$(aws --region $REGION cloudformation describe-stacks --stack-name $SAGEMAKER_STACK_NAME --query 'Stacks[0].Outputs[?OutputKey==`BackupPrivateSubnet`].OutputValue' --output text)
   EMAIL=$(bash -c 'read -p "INPUT YOUR SNSSubEmailAddress HERE: " && echo $REPLY')
   DB_USER_NAME=$(bash -c 'read -p "INPUT YOUR DB_USER_NAME HERE: " && echo $REPLY')
   SECURITY_GROUP=$(aws --region $REGION cloudformation describe-stacks --stack-name $SAGEMAKER_STACK_NAME --query 'Stacks[0].Outputs[?OutputKey==`SecurityGroup`].OutputValue' --output text)
   ROOT_BUCKET_NAME=$(aws --region $REGION cloudformation describe-stacks --stack-name $SAGEMAKER_STACK_NAME --query 'Stacks[0].Outputs[?OutputKey==`AmazonS3BucketName`].OutputValue' --output text)
   SLURM_FSX_DNS_NAME=$(aws --region $REGION cloudformation describe-stacks --stack-name $SAGEMAKER_STACK_NAME --query 'Stacks[0].Outputs[?OutputKey==`FSxLustreFilesystemDNSname`].OutputValue' --output text)
   SLURM_FSX_MOUNT_NAME=$(aws --region $REGION cloudformation describe-stacks --stack-name $SAGEMAKER_STACK_NAME --query 'Stacks[0].Outputs[?OutputKey==`FSxLustreFilesystemMountname`].OutputValue' --output text)
   COMPUTE_NODE_ROLE=$(aws --region $REGION cloudformation describe-stacks --stack-name $SAGEMAKER_STACK_NAME --query 'Stacks[0].Outputs[?OutputKey==`AmazonSagemakerClusterExecutionRoleArn`].OutputValue' --output text)
   ```

   当您看到要求您输入电子邮件地址和数据库用户名的提示时，请输入如下值。

   ```
   INPUT YOUR SNSSubEmailAddress HERE: Email_address_to_receive_SNS_notifications
   INPUT YOUR DB_USER_NAME HERE: Database_user_name_you_define
   ```

   要验证变量值，请使用 `print $variable` 命令。

   ```
   print $REGION
   us-east-1
   ```

## 预调配其他资源以支持多个控制器节点
<a name="sagemaker-hyperpod-multihead-slurm-cfn-multihead"></a>

按照以下步骤为具有多个控制器节点的 Amazon SageMaker HyperPod Slurm 集群配置更多资源。

1. 将 [sagemaker-hyperpod-slurm-multi-headnode.yaml](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/sagemaker-hyperpod-slurm-multi-headnode.yaml) 模板文件下载到您的计算机上。第二个 YAML 文件是一个 CloudFormation 模板，用于定义要为 Slurm 集群中的多个控制器节点支持创建的额外资源。
   + 控制器节点实例组的执行 IAM 角色
   + Amazon RDS for MariaDB 实例
   + Amazon SNS 主题和订阅
   + AWS Secrets Manager 适用于 MariaDB 的 Amazon RDS 的凭证

1. 运行以下 CLI 命令创建名为的 CloudFormation 堆栈`sagemaker-hyperpod-mh`。第二个堆栈使用 CloudFormation 模板创建其他 AWS 资源来支持多控制器节点架构。

   ```
   aws cloudformation deploy \
   --template-file /path_to_template/slurm-multi-headnode.yaml \
   --stack-name sagemaker-hyperpod-mh \
   --parameter-overrides \
   SlurmDBSecurityGroupId=$SECURITY_GROUP \
   SlurmDBSubnetGroupId1=$PRIMARY_SUBNET \
   SlurmDBSubnetGroupId2=$BACKUP_SUBNET \
   SNSSubEmailAddress=$EMAIL \
   SlurmDBUsername=$DB_USER_NAME \
   --capabilities CAPABILITY_NAMED_IAM
   ```

   有关更多信息，请参见[通过 AWS Command Line Interface 参考进行部署](https://docs.aws.amazon.com//cli/latest/reference/cloudformation/deploy/)。堆栈创建可能需要几分钟才能完成。堆栈创建完成后，您将在命令行界面中看到以下内容。

   ```
   Waiting for changeset to be created..
   Waiting for stack create/update to complete
   Successfully created/updated stack - sagemaker-hyperpod-mh
   ```

1. （可选）在 [AWS Cloud Formation 控制台](https://console.aws.amazon.com/cloudformation/home)中验证堆栈。
   + 从左侧导航栏中，选择**堆栈**。
   + 在**堆栈**页面上，找到并选择**sagemaker-hyperpod-mh**。
   + 选择**资源**和**输出**等标签页以查看资源和输出。

1. 从堆栈（`sagemaker-hyperpod-mh`）输出中创建环境变量。您将使用这些变量的值来更新[准备并上传生命周期脚本](sagemaker-hyperpod-multihead-slurm-scripts.md)中的配置文件（`provisioning_parameters.json`）。

   ```
   source .env
   SLURM_DB_ENDPOINT_ADDRESS=$(aws --region us-east-1 cloudformation describe-stacks --stack-name $MULTI_HEAD_SLURM_STACK --query 'Stacks[0].Outputs[?OutputKey==`SlurmDBEndpointAddress`].OutputValue' --output text)
   SLURM_DB_SECRET_ARN=$(aws --region us-east-1 cloudformation describe-stacks --stack-name $MULTI_HEAD_SLURM_STACK --query 'Stacks[0].Outputs[?OutputKey==`SlurmDBSecretArn`].OutputValue' --output text)
   SLURM_EXECUTION_ROLE_ARN=$(aws --region us-east-1 cloudformation describe-stacks --stack-name $MULTI_HEAD_SLURM_STACK --query 'Stacks[0].Outputs[?OutputKey==`SlurmExecutionRoleArn`].OutputValue' --output text)
   SLURM_SNS_FAILOVER_TOPIC_ARN=$(aws --region us-east-1 cloudformation describe-stacks --stack-name $MULTI_HEAD_SLURM_STACK --query 'Stacks[0].Outputs[?OutputKey==`SlurmFailOverSNSTopicArn`].OutputValue' --output text)
   ```

# 创建并附加 IAM 策略
<a name="sagemaker-hyperpod-multihead-slurm-iam"></a>

此部分介绍如何创建 IAM 策略并将其附加到您在[预调配其他资源以支持多个控制器节点](sagemaker-hyperpod-multihead-slurm-cfn.md#sagemaker-hyperpod-multihead-slurm-cfn-multihead)中创建的执行角色。

1. 从 GitHub存储库将 [IAM 策略示例](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/1.AmazonSageMakerClustersExecutionRolePolicy.json)下载到您的计算机上。

1. 使用 [create-policy](https://docs.aws.amazon.com//cli/latest/reference/iam/create-policy.html) CLI 命令通过下载的示例创建 IAM 策略。

   ```
   aws --region us-east-1 iam create-policy \
       --policy-name AmazonSagemakerExecutionPolicy \
       --policy-document file://1.AmazonSageMakerClustersExecutionRolePolicy.json
   ```

   该命令的示例输出。

   ```
   {
       "Policy": {
           "PolicyName": "AmazonSagemakerExecutionPolicy",
           "PolicyId": "ANPAXISIWY5UYZM7WJR4W",
           "Arn": "arn:aws:iam::111122223333:policy/AmazonSagemakerExecutionPolicy",
           "Path": "/",
           "DefaultVersionId": "v1",
           "AttachmentCount": 0,
           "PermissionsBoundaryUsageCount": 0,
           "IsAttachable": true,
           "CreateDate": "2025-01-22T20:01:21+00:00",
           "UpdateDate": "2025-01-22T20:01:21+00:00"
       }
   }
   ```

1. 使用 CL [attach-role-policy](https://docs.aws.amazon.com//cli/latest/reference/iam/attach-role-policy.html)I 命令将策略附加`AmazonSagemakerExecutionPolicy`到您在中[预调配其他资源以支持多个控制器节点](sagemaker-hyperpod-multihead-slurm-cfn.md#sagemaker-hyperpod-multihead-slurm-cfn-multihead)创建的 Slurm 执行角色。

   ```
   aws --region us-east-1 iam attach-role-policy \
       --role-name AmazonSagemakerExecutionRole \
       --policy-arn arn:aws:iam::111122223333:policy/AmazonSagemakerExecutionPolicy
   ```

   此命令不会生成任何输出。

   （可选）如果您使用环境变量，以下是示例命令。
   + 获取角色名称和策略名称 

     ```
     POLICY=$(aws --region $REGION iam list-policies --query 'Policies[?PolicyName==AmazonSagemakerExecutionPolicy].Arn' --output text)
     ROLENAME=$(aws --region $REGION iam list-roles --query "Roles[?Arn=='${SLURM_EXECUTION_ROLE_ARN}'].RoleName" —output text)
     ```
   + 附加 策略

     ```
     aws  --region us-east-1 iam attach-role-policy \
          --role-name $ROLENAME --policy-arn $POLICY
     ```

有关更多信息，请参阅 [的 IAM 角色适用于 SageMaker HyperPod](sagemaker-hyperpod-prerequisites-iam.md#sagemaker-hyperpod-prerequisites-iam-role-for-hyperpod)。

# 准备并上传生命周期脚本
<a name="sagemaker-hyperpod-multihead-slurm-scripts"></a>

创建完所有必需的资源后，您需要为 SageMaker HyperPod 集群设置[生命周期脚本](https://github.com/aws-samples/awsome-distributed-training/tree/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts)。这些[生命周期脚本](https://github.com/aws-samples/awsome-distributed-training/tree/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts)提供了可用于创建[基本 HyperPod Slurm 集群的基本配置](https://github.com/aws-samples/awsome-distributed-training/tree/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config)。

## 准备生命周期脚本
<a name="sagemaker-hyperpod-multihead-slurm-prepare-scripts"></a>

按照以下步骤操作可获取生命周期脚本。

1. 将[生命周期脚本](https://github.com/aws-samples/awsome-distributed-training/tree/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts)从 GitHub 存储库下载到您的计算机。

1. 使用 [cp](https://docs.aws.amazon.com//cli/latest/reference/s3/cp.html) CLI 命令将[生命周期脚本](https://github.com/aws-samples/awsome-distributed-training/tree/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts)上传到您在[预调配基本资源](sagemaker-hyperpod-multihead-slurm-cfn.md#sagemaker-hyperpod-multihead-slurm-cfn-basic)中创建的 Amazon S3 存储桶。

   ```
   aws s3 cp --recursive LifeCycleScripts/base-config s3://${ROOT_BUCKET_NAME}/LifeCycleScripts/base-config
   ```

## 创建配置文件
<a name="sagemaker-hyperpod-multihead-slurm-update-config-file"></a>

按照以下步骤操作，创建配置文件并将其上传到用于存储生命周期脚本的同一 Amazon S3 存储桶。

1. 使用以下配置创建名为 `provisioning_parameters.json` 的配置文件。请注意，`slurm_sns_arn` 是可选项。如果未提供， HyperPod 则无法设置 Amazon SNS 通知。

   ```
   cat <<EOF > /tmp/provisioning_parameters.json
   {
     "version": "1.0.0",
     "workload_manager": "slurm",
     "controller_group": "$CONTOLLER_IG_NAME",
     "login_group": "my-login-group",
     "worker_groups": [
       {
         "instance_group_name": "$COMPUTE_IG_NAME",
         "partition_name": "dev"
       }
     ],
     "fsx_dns_name": "$SLURM_FSX_DNS_NAME",
     "fsx_mountname": "$SLURM_FSX_MOUNT_NAME",
     "slurm_configurations": {
       "slurm_database_secret_arn": "$SLURM_DB_SECRET_ARN",
       "slurm_database_endpoint": "$SLURM_DB_ENDPOINT_ADDRESS",
       "slurm_shared_directory": "/fsx",
       "slurm_database_user": "$DB_USER_NAME",
       "slurm_sns_arn": "$SLURM_SNS_FAILOVER_TOPIC_ARN"
     }
   }
   EOF
   ```

1. 将 `provisioning_parameters.json` 文件上传到用于存储生命周期脚本的同一 Amazon S3 存储桶。

   ```
   aws s3 cp /tmp/provisioning_parameters.json s3://${ROOT_BUCKET_NAME}/LifeCycleScripts/base-config/provisioning_parameters.json
   ```
**注意**  
如果您使用的是 API 驱动的配置，则不需要该`provisioning_parameters.json`文件。使用 API 驱动的配置，您可以直接在 API 负载中定义 Slurm 节点类型、分区和 FSx 挂载。 CreateCluster 有关详细信息，请参阅[ SageMaker HyperPod 使用入门 AWS CLI](smcluster-getting-started-slurm-cli.md)。

## 验证 Amazon S3 存储桶中的文件
<a name="sagemaker-hyperpod-multihead-slurm-verify-s3"></a>

上传所有生命周期脚本和 `provisioning_parameters.json` 文件后，Amazon S3 存储桶应如下所示。

![\[图片显示了在 Amazon Simple Storage Service 控制台中上传到 Amazon S3 存储桶的所有生命周期脚本。\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/hyperpod/hyperpod-lifecycle-scripts-s3.png)


有关更多信息，请参阅[从提供的基本生命周期脚本开始 HyperPod](https://docs.aws.amazon.com//sagemaker/latest/dg/sagemaker-hyperpod-lifecycle-best-practices-slurm-slurm-base-config.html)。

# 创建集 SageMaker HyperPod 群
<a name="sagemaker-hyperpod-multihead-slurm-create"></a>

设置完所有必需资源并将脚本上传到 Amazon S3 存储桶后，您可以创建集群。

1. 要创建集群，请运行[https://docs.aws.amazon.com//cli/latest/reference/sagemaker/create-cluster.html](https://docs.aws.amazon.com//cli/latest/reference/sagemaker/create-cluster.html) AWS CLI 命令。创建过程可能最多需要 15 分钟才能完成。

   ```
   aws --region $REGION sagemaker create-cluster \
       --cluster-name $HP_CLUSTER_NAME \
       --vpc-config '{
           "SecurityGroupIds":["'$SECURITY_GROUP'"],
           "Subnets":["'$PRIMARY_SUBNET'", "'$BACKUP_SUBNET'"]
       }' \
       --instance-groups '[{                  
       "InstanceGroupName": "'$CONTOLLER_IG_NAME'",
       "InstanceType": "ml.t3.medium",
       "InstanceCount": 2,
       "LifeCycleConfig": {
           "SourceS3Uri": "s3://'$BUCKET_NAME'",
           "OnCreate": "on_create.sh"
       },
       "ExecutionRole": "'$SLURM_EXECUTION_ROLE_ARN'",
       "ThreadsPerCore": 1
   },
   {
       "InstanceGroupName": "'$COMPUTE_IG_NAME'",          
       "InstanceType": "ml.c5.xlarge",
       "InstanceCount": 2,
       "LifeCycleConfig": {
           "SourceS3Uri": "s3://'$BUCKET_NAME'",
           "OnCreate": "on_create.sh"
       },
       "ExecutionRole": "'$COMPUTE_NODE_ROLE'",
       "ThreadsPerCore": 1
   }]'
   ```

   成功执行后，该命令会返回集群 ARN，如下所示。

   ```
   {
       "ClusterArn": "arn:aws:sagemaker:us-east-1:111122223333:cluster/cluster_id"
   }
   ```

1. （可选）要检查集群的状态，您可以使用 SageMaker AI 控制台（[https://console.aws.amazon.com/sagemaker/](https://console.aws.amazon.com/sagemaker/)）。从左侧导航栏中选择 “**HyperPod 集群**”，然后选择 “**集群管理**”。选择集群名称以打开集群详细信息页面。如果您的集群已成功创建，您将看到集群状态为**InService**。  
![\[该图显示了 Amazon A SageMaker I 控制台中包含多个控制器节点的 HyperPod Slurm 集群。\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/hyperpod/hyperpod-lifecycle-multihead-cluster.png)

# 考虑重要说明
<a name="sagemaker-hyperpod-multihead-slurm-notes"></a>

此部分提供了一些重要说明，可能会对您有所帮助。

1. 要迁移到多控制器 Slurm 集群，请完成以下步骤。

   1. 按照[使用 CloudFormation 堆栈配置资源](sagemaker-hyperpod-multihead-slurm-cfn.md)中的说明操作以预调配所有必需的资源。

   1. 按照[准备并上传生命周期脚本](sagemaker-hyperpod-multihead-slurm-scripts.md)中的说明操作以上传更新后的生命周期脚本。更新 `provisioning_parameters.json` 文件时，将现有的控制器组移到 `worker_groups` 部分，并在 `controller_group` 部分中添加新的控制器组名称。

   1. 运行 [update-cluster](https://docs.aws.amazon.com/cli/latest/reference/sagemaker/update-cluster.html) API 调用以创建新的控制器组，并保留原始计算实例组和控制器组。

1. 要缩减控制器节点的数量，请使用 [update-cluster](https://docs.aws.amazon.com/cli/latest/reference/sagemaker/update-cluster.html) CLI 命令。对于每个控制器实例组，可缩减至的最小控制器节点数为 1。这意味着您无法将控制器节点数缩减至 0。
**重要**  
对于 2025 年 1 月 24 日之前创建的集群，在运行 update-cluster CLI 命令之前，必须先使用 [UpdateClusterSoftware](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_UpdateClusterSoftware.html)API [更新集群](https://docs.aws.amazon.com/cli/latest/reference/sagemaker/update-cluster.html)软件。

   以下是用于缩减控制器节点数的 CLI 命令示例。

   ```
   aws sagemaker update-cluster \
       --cluster-name my_cluster \
       --instance-groups '[{                  
       "InstanceGroupName": "controller_ig_name",
       "InstanceType": "ml.t3.medium",
       "InstanceCount": 3,
       "LifeCycleConfig": {
           "SourceS3Uri": "s3://amzn-s3-demo-bucket1",
           "OnCreate": "on_create.sh"
       },
       "ExecutionRole": "slurm_execution_role_arn",
       "ThreadsPerCore": 1
   },
   {
       "InstanceGroupName": "compute-ig_name",       
       "InstanceType": "ml.c5.xlarge",
       "InstanceCount": 2,
       "LifeCycleConfig": {
           "SourceS3Uri": "s3://amzn-s3-demo-bucket1",
           "OnCreate": "on_create.sh"
       },
       "ExecutionRole": "compute_node_role_arn",
       "ThreadsPerCore": 1
   }]'
   ```

1. 要批量删除控制器节点，请使用 [batch-delete-cluster-nodes](https://docs.aws.amazon.com/cli/latest/reference/sagemaker/batch-delete-cluster-nodes.html)CLI 命令。对于每个控制器实例组，您必须至少保留一个控制器节点。如果要批量删除所有控制器节点，则 API 操作将不起作用。
**重要**  
对于 2025 年 1 月 24 日之前创建的集群，必须先使用 [UpdateClusterSoftware](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_UpdateClusterSoftware.html)API 更新集群软件，然后才能运行 [batch-delete-cluster-nodes](https://docs.aws.amazon.com/cli/latest/reference/sagemaker/batch-delete-cluster-nodes.html)CLI 命令。

   以下是用于批量删除控制器节点的 CLI 命令示例。

   ```
   aws sagemaker batch-delete-cluster-nodes --cluster-name my_cluster --node-ids instance_ids_to_delete
   ```

1. 要对集群创建问题进行故障排除，请查看 SageMaker AI 控制台中集群详细信息页面上的失败消息。您还可以使用 CloudWatch日志来解决集群创建问题。在 CloudWatch 控制台中，选择**日志组**。然后，搜索 `clusters` 以查看与集群创建相关的日志组列表。  
![\[该图显示了 CloudWatch控制台中的 Amazon SageMaker HyperPod 集群日志组。\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/hyperpod/hyperpod-lifecycle-multihead-logs.png)

# 查看环境变量参考
<a name="sagemaker-hyperpod-multihead-slurm-variables-reference"></a>

[为 SageMaker HyperPod Slurm 集群设置多个控制器节点](sagemaker-hyperpod-multihead-slurm-setup.md)教程中定义并使用以下环境变量。这些环境变量仅在当前会话中可用，除非将其显式保留。它们是使用 `$variable_name` 语法定义的。 key/value 成对的变量表示 AWS创建的资源，而没有键的变量是用户定义的。


**环境变量参考**  

| 变量 | 说明 | 
| --- | --- | 
| \$1BACKUP\$1SUBNET |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/sagemaker-hyperpod-multihead-slurm-variables-reference.html)  | 
| \$1COMPUTE\$1IG\$1NAME |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/sagemaker-hyperpod-multihead-slurm-variables-reference.html)  | 
| \$1COMPUTE\$1NODE\$1ROLE |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/sagemaker-hyperpod-multihead-slurm-variables-reference.html)  | 
| \$1CONTOLLER\$1IG\$1NAME |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/sagemaker-hyperpod-multihead-slurm-variables-reference.html)  | 
| \$1DB\$1USER\$1NAME |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/sagemaker-hyperpod-multihead-slurm-variables-reference.html)  | 
| \$1EMAIL |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/sagemaker-hyperpod-multihead-slurm-variables-reference.html)  | 
| \$1PRIMARY\$1SUBNET |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/sagemaker-hyperpod-multihead-slurm-variables-reference.html)  | 
| \$1POLICY |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/sagemaker-hyperpod-multihead-slurm-variables-reference.html)  | 
| \$1REGION |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/sagemaker-hyperpod-multihead-slurm-variables-reference.html)  | 
| \$1ROOT\$1BUCKET\$1NAME |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/sagemaker-hyperpod-multihead-slurm-variables-reference.html)  | 
| \$1SECURITY\$1GROUP |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/sagemaker-hyperpod-multihead-slurm-variables-reference.html)  | 
| \$1SLURM\$1DB\$1ENDPOINT\$1ADDRESS |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/sagemaker-hyperpod-multihead-slurm-variables-reference.html)  | 
| \$1SLURM\$1DB\$1SECRET\$1ARN |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/sagemaker-hyperpod-multihead-slurm-variables-reference.html)  | 
| \$1SLURM\$1EXECUTION\$1ROLE\$1ARN |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/sagemaker-hyperpod-multihead-slurm-variables-reference.html)  | 
| \$1SLURM\$1FSX\$1DNS\$1NAME |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/sagemaker-hyperpod-multihead-slurm-variables-reference.html)  | 
| \$1SLURM\$1FSX\$1MOUNT\$1NAME |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/sagemaker-hyperpod-multihead-slurm-variables-reference.html)  | 
| \$1SLURM\$1SNS\$1FAILOVER\$1TOPIC\$1ARN |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/sagemaker-hyperpod-multihead-slurm-variables-reference.html)  | 

# SageMaker HyperPod 集群上的作业
<a name="sagemaker-hyperpod-run-jobs-slurm"></a>

以下主题提供了在已配置的 SageMaker HyperPod 集群上访问计算节点和运行机器学习工作负载的过程和示例。根据您在集群上设置环境的方式，有多种方法可以在 HyperPod 集 HyperPod 群上运行 ML 工作负载。[Awsome Distributed Training GitHub 存储库](https://github.com/aws-samples/awsome-distributed-training/)中还提供了在 HyperPod 集群上运行 ML 工作负载的示例。以下主题将引导您了解如何登录已配置的集 HyperPod 群并开始运行示例 ML 工作负载。

**提示**  
要查找实际示例和解决方案，另请参阅[SageMaker HyperPod研讨会](https://catalog.workshops.aws/sagemaker-hyperpod)。

**Topics**
+ [

# 访问您的 SageMaker HyperPod 集群节点
](sagemaker-hyperpod-run-jobs-slurm-access-nodes.md)
+ [

# 在集群上调度 Slurm 作业 SageMaker HyperPod
](sagemaker-hyperpod-run-jobs-slurm-schedule-slurm-job.md)
+ [

# 在 Slurm 计算节点上运行 Docker 容器 HyperPod
](sagemaker-hyperpod-run-jobs-slurm-docker.md)
+ [

# 在 Slurm 开启的情况下运行分布式训练工作负载 HyperPod
](sagemaker-hyperpod-run-jobs-slurm-distributed-training-workload.md)

# 访问您的 SageMaker HyperPod 集群节点
<a name="sagemaker-hyperpod-run-jobs-slurm-access-nodes"></a>

您可以通过 AWS Systems Manager (SSM) 访问**InService**集群，方法是运行`aws ssm start-session`带有 SageMaker HyperPod集群主机名的 AWS CLI 命令，格式为。`sagemaker-cluster:[cluster-id]_[instance-group-name]-[instance-id]`您可以从[SageMaker HyperPod 控制台](sagemaker-hyperpod-operate-slurm-console-ui.md#sagemaker-hyperpod-operate-slurm-console-ui-view-details-of-clusters)检索集群 ID、实例 ID 和实例组名称，也可以通过运行和的[AWS CLI 命令](sagemaker-hyperpod-operate-slurm-cli-command.md#sagemaker-hyperpod-operate-slurm-cli-command-list-cluster-nodes)来检索集群 ID、实例 ID `describe-cluster` 和`list-cluster-nodes`实例组名称 SageMaker HyperPod。例如，如果集群 ID 是 `aa11bbbbb222`，集群节点名称是 `controller-group`，集群节点 ID 是 `i-111222333444555aa`，则 SSM `start-session` 命令应如下所示。

**注意**  
授予用户访问 HyperPod 群集节点的权限允许他们在节点上安装和操作用户管理的软件。确保遵守用户的最低权限原则。  
如果您尚未设置 AWS Systems Manager，请按照中提供的说明进行操作[为集群用户访问控制设置 AWS Systems Manager 和运行方式](sagemaker-hyperpod-prerequisites.md#sagemaker-hyperpod-prerequisites-ssm)。

```
$ aws ssm start-session \
    --target sagemaker-cluster:aa11bbbbb222_controller-group-i-111222333444555aa \
    --region us-west-2
Starting session with SessionId: s0011223344aabbccdd
root@ip-111-22-333-444:/usr/bin#
```

请注意，这最初会将您连接为根用户。运行作业前，运行以下命令切换为 `ubuntu` 用户。

```
root@ip-111-22-333-444:/usr/bin# sudo su - ubuntu
ubuntu@ip-111-22-333-444:/usr/bin#
```

有关实际使用 HyperPod 群集的高级设置，请参阅以下主题。

**Topics**
+ [

## 访问 SageMaker HyperPod 群集节点的其他提示
](#sagemaker-hyperpod-run-jobs-slurm-access-nodes-tips)
+ [

## 通过 Amazon FSx 共享空间设置多用户环境
](#sagemaker-hyperpod-run-jobs-slurm-access-nodes-multi-user-with-fxs-shared-space)
+ [

## 通过将集 HyperPod 群与 Active Directory 集成来设置多用户环境
](#sagemaker-hyperpod-run-jobs-slurm-access-nodes-multi-user-with-active-directory)

## 访问 SageMaker HyperPod 群集节点的其他提示
<a name="sagemaker-hyperpod-run-jobs-slurm-access-nodes-tips"></a>

**使用提供的`easy-ssh.sh`脚本 HyperPod 来简化连接过程**

为了将前面的过程变成单行命令，该 HyperPod 团队提供了一个[https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/easy-ssh.sh](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/easy-ssh.sh)脚本，用于检索您的集群信息，将其聚合到 SSM 命令中，然后连接到计算节点。当此脚本运行`describe-cluster`并`list-cluster-nodes`命令和解析完成 SSM 命令所需的信息时，您无需手动查找所需的 HyperPod 集群信息。以下命令示例演示了如何运行 [https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/easy-ssh.sh](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/easy-ssh.sh) 脚本。如果运行成功，您将以根用户身份连接到集群。它还会打印一个代码片段，用于通过SSM代理将 HyperPod 集群添加为远程主机来设置 SSH。通过设置 SSH，您可以将本地开发环境（例如 Visual Studio Code）与 HyperPod 集群连接起来。

```
$ chmod +x easy-ssh.sh
$ ./easy-ssh.sh -c <node-group> <cluster-name>
Cluster id: <cluster_id>
Instance id: <instance_id>
Node Group: <node-group>
Add the following to your ~/.ssh/config to easily connect:

$ cat <<EOF >> ~/.ssh/config
Host <cluster-name>
  User ubuntu
  ProxyCommand sh -c "aws ssm start-session  --target sagemaker-cluster:<cluster_id>_<node-group>-<instance_id> --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
EOF

Add your ssh keypair and then you can do:

$ ssh <cluster-name>

aws ssm start-session --target sagemaker-cluster:<cluster_id>_<node-group>-<instance_id>

Starting session with SessionId: s0011223344aabbccdd
root@ip-111-22-333-444:/usr/bin#
```

请注意，这最初会将您连接为根用户。运行作业前，运行以下命令切换为 `ubuntu` 用户。

```
root@ip-111-22-333-444:/usr/bin# sudo su - ubuntu
ubuntu@ip-111-22-333-444:/usr/bin#
```

**使用 HyperPod 计算节点作为远程主机进行设置，便于使用 SSH 进行访问**

为了进一步简化从本地计算机使用 SSH 访问计算节点的过程，该`easy-ssh.sh`脚本输出了一段将 HyperPod 集群设置为远程主机的代码片段，如上一节所示。代码片段是自动生成的，可帮助您直接添加到本地设备上的 `~/.ssh/config` 文件中。以下过程说明如何设置通过 SSM 代理使用 SSH 进行轻松访问，以便您或您的集群用户可以直接运行`ssh <cluster-name>`连接到 HyperPod 群集节点。

1. 在您的本地设备上，将带有用户名的 HyperPod 计算节点作为远程主机添加到`~/.ssh/config`文件中。以下命令展示了如何将 `easy-ssh.sh` 脚本中自动生成的代码片段附加到 `~/.ssh/config` 文件。确保从 `easy-ssh.sh` 脚本自动生成的输出中复制，该脚本包含正确的集群信息。

   ```
   $ cat <<EOF >> ~/.ssh/config
   Host <cluster-name>
     User ubuntu
     ProxyCommand sh -c "aws ssm start-session  --target sagemaker-cluster:<cluster_id>_<node-group>-<instance_id> --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
   EOF
   ```

1. 在 HyperPod 群集节点上，将本地设备上的公钥添加到 HyperPod 群集节点上的`~/.ssh/authorized_keys`文件中。

   1. 在本地计算机上打印公钥文件。

      ```
      $ cat ~/.ssh/id_rsa.pub
      ```

      这将返回您的密钥。复制该命令的输出结果。

      (可选）如果您没有公钥，请运行以下命令创建一个。

      ```
      $ ssh-keygen -t rsa -q -f "$HOME/.ssh/id_rsa" -N ""
      ```

   1. 连接到集群节点并切换到用户以添加密钥。以下命令是以 `ubuntu` 用户身份访问的示例。将 `ubuntu` 替换为要设置 SSH 简易访问的用户名。

      ```
      $ ./easy-ssh.sh -c <node-group> <cluster-name>
      $ sudo su - ubuntu
      ubuntu@ip-111-22-333-444:/usr/bin#
      ```

   1. 打开 `~/.ssh/authorized_keys` 文件，在文件末尾添加公钥。

      ```
      ubuntu@ip-111-22-333-444:/usr/bin# vim ~/.ssh/authorized_keys
      ```

完成设置后，您可以通过运行简化的 SSH 命令以用户身份连接到 HyperPod 群集节点，如下所示。

```
$ ssh <cluster-name>
ubuntu@ip-111-22-333-444:/usr/bin#
```

此外，您还可以使用主机从本地设备上的集成开发环境进行远程开发，例如 [Visual Studio Code Remote - SSH](https://code.visualstudio.com/docs/remote/ssh)。

## 通过 Amazon FSx 共享空间设置多用户环境
<a name="sagemaker-hyperpod-run-jobs-slurm-access-nodes-multi-user-with-fxs-shared-space"></a>

您可以使用 Amazon FSx 共享空间来管理 Slurm 集群中的多用户环境。 SageMaker HyperPod如果您在创建集群 FSx 时使用 Amazon 配置了 Slurm HyperPod 集群，那么这是为集群用户设置工作空间的好选择。在 Amazon FSx 共享文件系统上创建新用户并为该用户设置主目录。

**提示**  
要让用户通过用户名和专用目录访问您的集群，您还可以按照《 AWS Systems Manager 用户指南》中[为 Linux 和 macOS 托管节点启用“以另一种身份运行”支持](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-preferences-run-as.html)提供的**为 Linux 和 macOS 托管节点开启“以另一种身份运行”支持**步骤下的步骤 5 **选项 2** 中的说明进行标记，将它们与 IAM 角色或用户关联起来。另请参阅[为集群用户访问控制设置 AWS Systems Manager 和运行方式](sagemaker-hyperpod-prerequisites.md#sagemaker-hyperpod-prerequisites-ssm)。

**要在创建 Slurm 集群时设置多用户环境，请开启 SageMaker HyperPod**

 SageMaker HyperPod 服务团队提供了一个脚本[https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/add_users.sh](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/add_users.sh)作为基本生命周期脚本示例的一部分。

1. 准备一个名为 `shared_users.txt` 的文本文件，需要按照以下格式创建。第一列用于用户名，第二列用于唯一用户 IDs，第三列用于表示 Amazon FSx 共享空间中的用户目录。

   ```
   username1,uid1,/fsx/username1
   username2,uid2,/fsx/username2
   ...
   ```

1. 确保将`shared_users.txt`和[https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/add_users.sh](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/add_users.sh)文件上传到 S3 存储桶以获取 HyperPod 生命周期脚本。当集群创建、集群更新或集群软件更新正在进行时，[https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/add_users.sh](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/add_users.sh) 会读入 `shared_users.txt` 并正确设置用户目录。

**创建新用户并添加到上运行的现有 Slurm 集群 SageMaker HyperPod **

1. 在主节点上，运行以下命令保存帮助创建用户的脚本。确保以 sudo 权限运行。

   ```
   $ cat > create-user.sh << EOL
   #!/bin/bash
   
   set -x
   
   # Prompt user to get the new user name.
   read -p "Enter the new user name, i.e. 'sean': 
   " USER
   
   # create home directory as /fsx/<user>
   # Create the new user on the head node
   sudo useradd \$USER -m -d /fsx/\$USER --shell /bin/bash;
   user_id=\$(id -u \$USER)
   
   # add user to docker group
   sudo usermod -aG docker \${USER}
   
   # setup SSH Keypair
   sudo -u \$USER ssh-keygen -t rsa -q -f "/fsx/\$USER/.ssh/id_rsa" -N ""
   sudo -u \$USER cat /fsx/\$USER/.ssh/id_rsa.pub | sudo -u \$USER tee /fsx/\$USER/.ssh/authorized_keys
   
   # add user to compute nodes
   read -p "Number of compute nodes in your cluster, i.e. 8: 
   " NUM_NODES
   srun -N \$NUM_NODES sudo useradd -u \$user_id \$USER -d /fsx/\$USER --shell /bin/bash;
   
   # add them as a sudoer
   read -p "Do you want this user to be a sudoer? (y/N):
   " SUDO
   if [ "\$SUDO" = "y" ]; then
           sudo usermod -aG sudo \$USER
           sudo srun -N \$NUM_NODES sudo usermod -aG sudo \$USER
           echo -e "If you haven't already you'll need to run:\n\nsudo visudo /etc/sudoers\n\nChange the line:\n\n%sudo   ALL=(ALL:ALL) ALL\n\nTo\n\n%sudo   ALL=(ALL:ALL) NOPASSWD: ALL\n\nOn each node."
   fi
   EOL
   ```

1. 使用以下命令运行脚本 系统将提示您添加用户名和允许用户访问的计算节点数。

   ```
   $ bash create-user.sh
   ```

1. 运行以下命令对用户进行测试。

   ```
   $ sudo su - <user> && ssh $(srun hostname)
   ```

1. 将用户信息添加到 `shared_users.txt` 文件，以便在任何新计算节点或新集群上创建用户。

## 通过将集 HyperPod 群与 Active Directory 集成来设置多用户环境
<a name="sagemaker-hyperpod-run-jobs-slurm-access-nodes-multi-user-with-active-directory"></a>

在实际用例中， HyperPod 群集通常由多个用户使用：机器学习 (ML) 研究人员、软件工程师、数据科学家和集群管理员。他们编辑自己的文件，运行自己的作业，不会影响彼此的工作。要设置多用户环境，可使用 Linux 用户和组机制，通过生命周期脚本在每个实例上静态创建多个用户。不过，这种方法的缺点是，在进行添加、编辑和删除用户等更新时，需要在集群中的多个实例中复制用户和组设置，以便在所有实例中保持一致的配置。

要解决这个问题，你可以使用[轻量级目录访问协议 (LDAP) 和 LDAP](https://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol) ov [er TLS/SSL (LDAPS)](https://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol) 与目录服务（例如[微软 Active Directory 的AWS 目录服务](https://aws.amazon.com/directoryservice/)）集成。要了解有关在集群中设置 Active Directory 和多用户环境的更多信息，请参阅博客文章[将 HyperPod 集群与 Active Directory 集成 HyperPod 以实现多用户无缝登录](https://aws.amazon.com/blogs/machine-learning/integrate-hyperpod-clusters-with-active-directory-for-seamless-multi-user-login/)。

# 在集群上调度 Slurm 作业 SageMaker HyperPod
<a name="sagemaker-hyperpod-run-jobs-slurm-schedule-slurm-job"></a>

您可以使用标准的 Slurm `sbatch` 或 `srun` 命令启动训练作业。例如，要启动 8 节点训练作业，可以在各种环境中运行`srun -N 8 --exclusive train.sh` SageMaker HyperPod 支持训练，包括`conda`、`venv``docker`、和`enroot`。您可以通过在 SageMaker HyperPod 集群上运行生命周期脚本来配置 ML 环境。您还可以选择附加共享文件系统，例如 Amazon FSx，该文件系统也可以用作虚拟环境。

以下示例说明如何在具有 Amazon 共享文件系统的集群 SageMaker HyperPod 上使用完全分片数据并行化 (FSDP) 技术运行训练 Llama-2 的作业。 FSx 您还可以从 [Awsome 分布式训练 GitHub 资料库](https://github.com/aws-samples/awsome-distributed-training/)中找到更多示例。

**提示**  
所有 SageMaker HyperPod 示例都可在 [Awsome 分布式训练 GitHub 存储库的`3.test_cases`文件夹中找](https://github.com/aws-samples/awsome-distributed-training/)到。

1. 克隆 [Awsome 分布式训练 GitHub 存储库](https://github.com/aws-samples/awsome-distributed-training/)，并将训练作业示例复制到您的 Amazon FSx 文件系统。

   ```
   $ TRAINING_DIR=/fsx/users/my-user/fsdp
   $ git clone https://github.com/aws-samples/awsome-distributed-training/
   ```

1. 运行 [https://github.com/aws-samples/awsome-distributed-training/blob/main/3.test_cases/10.FSDP/0.create_conda_env.sh](https://github.com/aws-samples/awsome-distributed-training/blob/main/3.test_cases/10.FSDP/0.create_conda_env.sh) 脚本。这将在您的 Amazon FSx 文件系统上创建`conda`环境。确保集群中的所有节点都能访问文件系统。

1. 启动单节点 slurm 作业，构建虚拟 Conda 环境，如下所示。

   ```
   $ srun -N 1 /path_to/create_conda_env.sh
   ```

1. 环境构建完成后，您可以通过指向共享卷上的环境路径来启动训练作业。您可以使用相同的设置启动单节点和多节点训练作业。要启动作业，请按如下步骤创建作业启动器脚本（也称为入口点脚本）。

   ```
   #!/usr/bin/env bash
   set -ex
   
   ENV_PATH=/fsx/users/my_user/pytorch_env
   TORCHRUN=$ENV_PATH/bin/torchrun
   TRAINING_SCRIPT=/fsx/users/my_user/pt_train.py
   
   WORLD_SIZE_JOB=$SLURM_NTASKS
   RANK_NODE=$SLURM_NODEID
   PROC_PER_NODE=8
   MASTER_ADDR=(`scontrol show hostnames \$SLURM_JOB_NODELIST | head -n 1`)
   MASTER_PORT=$(expr 10000 + $(echo -n $SLURM_JOBID | tail -c 4))
   
   DIST_ARGS="--nproc_per_node=$PROC_PER_NODE \
              --nnodes=$WORLD_SIZE_JOB \
              --node_rank=$RANK_NODE \
              --master_addr=$MASTER_ADDR \
              --master_port=$MASTER_PORT \
             "
             
   $TORCHRUN $DIST_ARGS $TRAINING_SCRIPT
   ```
**提示**  
如果要使用的自动恢复功能提高训练作业抵御硬件故障的能力 SageMaker HyperPod，则需要在 entrypoint 脚本`MASTER_ADDR`中正确设置环境变量。要了解更多信息，请参阅[自动节点恢复和自动恢复](sagemaker-hyperpod-resiliency-slurm-auto-resume.md)。

   本教程假定该脚本保存为 `/fsx/users/my_user/train.sh`。

1. 将此脚本放入位于 `/fsx/users/my_user/train.sh` 的共享卷后，运行以下 `srun` 命令来调度 Slurm 作业。

   ```
   $ cd /fsx/users/my_user/
   $ srun -N 8 train.sh
   ```

# 在 Slurm 计算节点上运行 Docker 容器 HyperPod
<a name="sagemaker-hyperpod-run-jobs-slurm-docker"></a>

[要在开启 Slurm 的情况下运行 Docker 容器 SageMaker HyperPod，你需要使用 [En](https://github.com/NVIDIA/enroot) root 和 Pyxis。](https://github.com/NVIDIA/pyxis)Enroot 软件包有助于将 Docker 映像转换为 Slurm 可以理解的运行时，而 Pyxis 则可以通过 `srun` 命令 `srun --container-image=docker/image:tag` 将运行时调度为 Slurm 作业。

**提示**  
应在创建集群时安装 Docker、Enroot 和 Pyxis 软件包，作为运行 [提供的基本生命周期脚本 HyperPod](sagemaker-hyperpod-lifecycle-best-practices-slurm-slurm-base-config.md) 中指导的生命周期脚本的一部分。创建集[群时，请使用 HyperPod 服务团队提供的基本生命周期脚本](https://github.com/aws-samples/awsome-distributed-training/tree/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config)。 HyperPod 这些基础脚本默认设置为安装软件包。在 [https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/config.py](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/config.py) 脚本中，有一个 `Config` 类，用于安装软件包的布尔值类型参数设置为 `True` (`enable_docker_enroot_pyxis=True`)。[https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/lifecycle_script.py](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/lifecycle_script.py) 脚本调用并解析了这段代码，它从 [https://github.com/aws-samples/awsome-distributed-training/tree/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/utils](https://github.com/aws-samples/awsome-distributed-training/tree/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/utils) 文件夹中调用了 `install_docker.sh` 和 `install_enroot_pyxis.sh` 脚本。安装脚本是实际安装软件包的地方。此外，安装脚本还会确定它们能否检测到来自其运行实例的 NVMe 存储路径，并设置 Docker 和 Enroot 的根路径。`/opt/dlami/nvme`任何新实例的默认根卷都`/tmp`只能装入 100GB 的 EBS 卷，如果您计划运行的工作负载涉及训练，因此容量很大，则该卷将耗尽。 LLMs 如果您将实例系列（例如 P 和 G）与本地 NVMe 存储一起使用，则需要确保使用连接在的 NVMe存储`/opt/dlami/nvme`，并且安装脚本负责配置过程。

**检查根路径是否设置正确**

在 Slurm 集群的计算节点上 SageMaker HyperPod，运行以下命令以确保生命周期脚本正常运行并且每个节点的根卷设置为。`/opt/dlami/nvme/*`以下命令显示了检查 Slurm 集群 8 个计算节点的 Enroot 运行时路径和数据根路径的示例。

```
$ srun -N 8 cat /etc/enroot/enroot.conf | grep "ENROOT_RUNTIME_PATH"
ENROOT_RUNTIME_PATH        /opt/dlami/nvme/tmp/enroot/user-$(id -u)
... // The same or similar lines repeat 7 times
```

```
$ srun -N 8 cat /etc/docker/daemon.json
{
    "data-root": "/opt/dlami/nvme/docker/data-root"
}
... // The same or similar lines repeat 7 times
```

确认运行时路径已正确设置为 `/opt/dlami/nvme/*` 后，您就可以使用 Enroot 和 Pyxis 构建和运行 Docker 容器了。

**使用 Slurm 测试 Docker**

1. 在计算节点上，尝试执行以下命令检查 Docker 和 Enroot 是否已正确安装。

   ```
   $ docker --help
   $ enroot --help
   ```

1. 运行 [NVIDIA CUDA Ubuntu](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/cuda) 映像，测试 Pyxis 和 Enroot 安装是否正确。

   ```
   $ srun --container-image=nvidia/cuda:XX.Y.Z-base-ubuntuXX.YY nvidia-smi
   pyxis: importing docker image: nvidia/cuda:XX.Y.Z-base-ubuntuXX.YY
   pyxis: imported docker image: nvidia/cuda:XX.Y.Z-base-ubuntuXX.YY
   DAY MMM DD HH:MM:SS YYYY
   +-----------------------------------------------------------------------------+
   | NVIDIA-SMI 470.141.03   Driver Version: 470.141.03   CUDA Version: XX.YY    |
   |-------------------------------+----------------------+----------------------+
   | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
   | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
   |                               |                      |               MIG M. |
   |===============================+======================+======================|
   |   0  Tesla T4            Off  | 00000000:00:1E.0 Off |                    0 |
   | N/A   40C    P0    27W /  70W |      0MiB / 15109MiB |      0%      Default |
   |                               |                      |                  N/A |
   +-------------------------------+----------------------+----------------------+
   
   +-----------------------------------------------------------------------------+
   | Processes:                                                                  |
   |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
   |        ID   ID                                                   Usage      |
   |=============================================================================|
   |  No running processes found                                                 |
   +-----------------------------------------------------------------------------+
   ```

   您还可以创建一个脚本并运行 `sbatch` 命令进行测试，如下所示。

   ```
   $ cat <<EOF >> container-test.sh
   #!/bin/bash
   #SBATCH --container-image=nvidia/cuda:XX.Y.Z-base-ubuntuXX.YY
   nvidia-smi
   EOF
   
   $ sbatch container-test.sh
   pyxis: importing docker image: nvidia/cuda:XX.Y.Z-base-ubuntuXX.YY
   pyxis: imported docker image: nvidia/cuda:XX.Y.Z-base-ubuntuXX.YY
   DAY MMM DD HH:MM:SS YYYY
   +-----------------------------------------------------------------------------+
   | NVIDIA-SMI 470.141.03   Driver Version: 470.141.03   CUDA Version: XX.YY    |
   |-------------------------------+----------------------+----------------------+
   | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
   | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
   |                               |                      |               MIG M. |
   |===============================+======================+======================|
   |   0  Tesla T4            Off  | 00000000:00:1E.0 Off |                    0 |
   | N/A   40C    P0    27W /  70W |      0MiB / 15109MiB |      0%      Default |
   |                               |                      |                  N/A |
   +-------------------------------+----------------------+----------------------+
   
   +-----------------------------------------------------------------------------+
   | Processes:                                                                  |
   |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
   |        ID   ID                                                   Usage      |
   |=============================================================================|
   |  No running processes found                                                 |
   +-----------------------------------------------------------------------------+
   ```

**使用 Docker 运行 Slurm 测试作业**

使用 Docker 完成 Slurm 的设置后，你可以带上任何预先构建的 Docker 镜像，然后使用 Slurm 开启运行。 SageMaker HyperPod以下是一个示例用例，它将引导您了解如何使用 Docker 和 Slurm 运行训练作业。 SageMaker HyperPod它显示了使用 SageMaker AI 模型并行度 (SMP) 库对 Llama 2 模型进行模型并行训练的示例作业。

1. 如果您想使用由 SageMaker AI 或 DLC 分发的预构建 ECR 映像之一，请确保授予 HyperPod 集群通过提取 ECR 映像的权限。[的 IAM 角色适用于 SageMaker HyperPod](sagemaker-hyperpod-prerequisites-iam.md#sagemaker-hyperpod-prerequisites-iam-role-for-hyperpod)如果您使用自己的或开源的 Docker 映像，可以跳过这一步。将以下权限添加到 [的 IAM 角色适用于 SageMaker HyperPod](sagemaker-hyperpod-prerequisites-iam.md#sagemaker-hyperpod-prerequisites-iam-role-for-hyperpod)。在本教程中，我们使用预打包了 SMP 库的 [SMP Docker 映像](distributed-model-parallel-support-v2.md#distributed-model-parallel-supported-frameworks-v2)。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "ecr:BatchCheckLayerAvailability",
                   "ecr:BatchGetImage",
                   "ecr-public:*",
                   "ecr:GetDownloadUrlForLayer",
                   "ecr:GetAuthorizationToken",
                   "sts:*"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------

1. 在计算节点上克隆存储库，并转到提供使用 SMP 进行训练的示例脚本的文件夹。

   ```
   $ git clone https://github.com/aws-samples/awsome-distributed-training/
   $ cd awsome-distributed-training/3.test_cases/17.SM-modelparallelv2
   ```

1. 在本教程中，运行示例脚本 [https://github.com/aws-samples/awsome-distributed-training/blob/main/3.test_cases/17.SM-modelparallelv2/docker_build.sh](https://github.com/aws-samples/awsome-distributed-training/blob/main/3.test_cases/17.SM-modelparallelv2/docker_build.sh)，该脚本会提取 SMP Docker 映像、构建 Docker 容器并将其作为 Enroot 运行时运行。您可以随意修改。

   ```
   $ cat docker_build.sh
   #!/usr/bin/env bash
   
   region=us-west-2
   dlc_account_id=658645717510
   aws ecr get-login-password --region $region | docker login --username AWS --password-stdin $dlc_account_id.dkr.ecr.$region.amazonaws.com
   
   docker build -t smpv2 .
   enroot import -o smpv2.sqsh  dockerd://smpv2:latest
   ```

   ```
   $ bash docker_build.sh
   ```

1. 创建批脚本，使用 `sbatch` 启动训练作业。在本教程中，所提供的示例脚本 [https://github.com/aws-samples/awsome-distributed-training/blob/main/3.test_cases/17.SM-modelparallelv2/launch_training_enroot.sh](https://github.com/aws-samples/awsome-distributed-training/blob/main/3.test_cases/17.SM-modelparallelv2/launch_training_enroot.sh) 将在 8 个计算节点上用合成数据集启动一个 700 亿参数的 Llama 2 模型的模型并行训练作业。[https://github.com/aws-samples/awsome-distributed-training/tree/main/3.test_cases/17.SM-modelparallelv2/scripts](https://github.com/aws-samples/awsome-distributed-training/tree/main/3.test_cases/17.SM-modelparallelv2/scripts) 中提供了一组训练脚本，`launch_training_enroot.sh` 将 `train_external.py` 作为入口脚本。
**重要**  
要在上使用 Docker 容器 SageMaker HyperPod，必须将主机（在本例中为 HyperPod 计算节点）中的`/var/log`目录挂载到容器中的`/var/log`目录上。您可以为 Enroot 添加以下变量进行设置。  

   ```
   "${HYPERPOD_PATH:="/var/log/aws/clusters":"/var/log/aws/clusters"}"
   ```

   ```
   $ cat launch_training_enroot.sh
   #!/bin/bash
   
   # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   # SPDX-License-Identifier: MIT-0
   
   #SBATCH --nodes=8 # number of nodes to use, 2 p4d(e) = 16 A100 GPUs
   #SBATCH --job-name=smpv2_llama # name of your job
   #SBATCH --exclusive # job has exclusive use of the resource, no sharing
   #SBATCH --wait-all-nodes=1
   
   set -ex;
   
   ###########################
   ###### User Variables #####
   ###########################
   
   #########################
   model_type=llama_v2
   model_size=70b
   
   # Toggle this to use synthetic data
   use_synthetic_data=1
   
   
   # To run training on your own data  set Training/Test Data path  -> Change this to the tokenized dataset path in Fsx. Acceptable formats are huggingface (arrow) and Jsonlines.
   # Also change the use_synthetic_data to 0
   
   export TRAINING_DIR=/fsx/path_to_data
   export TEST_DIR=/fsx/path_to_data
   export CHECKPOINT_DIR=$(pwd)/checkpoints
   
   # Variables for Enroot
   : "${IMAGE:=$(pwd)/smpv2.sqsh}"
   : "${HYPERPOD_PATH:="/var/log/aws/clusters":"/var/log/aws/clusters"}" # This is needed for validating its hyperpod cluster
   : "${TRAIN_DATA_PATH:=$TRAINING_DIR:$TRAINING_DIR}"
   : "${TEST_DATA_PATH:=$TEST_DIR:$TEST_DIR}"
   : "${CHECKPOINT_PATH:=$CHECKPOINT_DIR:$CHECKPOINT_DIR}"   
   
   
   ###########################
   ## Environment Variables ##
   ###########################
   
   #export NCCL_SOCKET_IFNAME=en
   export NCCL_ASYNC_ERROR_HANDLING=1
   
   export NCCL_PROTO="simple"
   export NCCL_SOCKET_IFNAME="^lo,docker"
   export RDMAV_FORK_SAFE=1
   export FI_EFA_USE_DEVICE_RDMA=1
   export NCCL_DEBUG_SUBSYS=off
   export NCCL_DEBUG="INFO"
   export SM_NUM_GPUS=8
   export GPU_NUM_DEVICES=8
   export FI_EFA_SET_CUDA_SYNC_MEMOPS=0
   
   # async runtime error ...
   export CUDA_DEVICE_MAX_CONNECTIONS=1
   
   
   #########################
   ## Command and Options ##
   #########################
   
   if [ "$model_size" == "7b" ]; then
       HIDDEN_WIDTH=4096
       NUM_LAYERS=32
       NUM_HEADS=32
       LLAMA_INTERMEDIATE_SIZE=11008
       DEFAULT_SHARD_DEGREE=8
   # More Llama model size options
   elif [ "$model_size" == "70b" ]; then
       HIDDEN_WIDTH=8192
       NUM_LAYERS=80
       NUM_HEADS=64
       LLAMA_INTERMEDIATE_SIZE=28672
       # Reduce for better perf on p4de
       DEFAULT_SHARD_DEGREE=64
   fi
   
   
   if [ -z "$shard_degree" ]; then
       SHARD_DEGREE=$DEFAULT_SHARD_DEGREE
   else
       SHARD_DEGREE=$shard_degree
   fi
   
   if [ -z "$LLAMA_INTERMEDIATE_SIZE" ]; then
       LLAMA_ARGS=""
   else
       LLAMA_ARGS="--llama_intermediate_size $LLAMA_INTERMEDIATE_SIZE "
   fi
   
   
   if [ $use_synthetic_data == 1 ]; then
       echo "using synthetic data"
       declare -a ARGS=(
       --container-image $IMAGE
       --container-mounts $HYPERPOD_PATH,$CHECKPOINT_PATH
       )
   else
       echo "using real data...."
       declare -a ARGS=(
       --container-image $IMAGE
       --container-mounts $HYPERPOD_PATH,$TRAIN_DATA_PATH,$TEST_DATA_PATH,$CHECKPOINT_PATH
       )
   fi
   
   
   declare -a TORCHRUN_ARGS=(
       # change this to match the number of gpus per node:
       --nproc_per_node=8 \
       --nnodes=$SLURM_JOB_NUM_NODES \
       --rdzv_id=$SLURM_JOB_ID \
       --rdzv_backend=c10d \
       --rdzv_endpoint=$(hostname) \
   )
   
   srun -l "${ARGS[@]}" torchrun "${TORCHRUN_ARGS[@]}" /path_to/train_external.py \
               --train_batch_size 4 \
               --max_steps 100 \
               --hidden_width $HIDDEN_WIDTH \
               --num_layers $NUM_LAYERS \
               --num_heads $NUM_HEADS \
               ${LLAMA_ARGS} \
               --shard_degree $SHARD_DEGREE \
               --model_type $model_type \
               --profile_nsys 1 \
               --use_smp_implementation 1 \
               --max_context_width 4096 \
               --tensor_parallel_degree 1 \
               --use_synthetic_data $use_synthetic_data \
               --training_dir $TRAINING_DIR \
               --test_dir $TEST_DIR \
               --dataset_type hf \
               --checkpoint_dir $CHECKPOINT_DIR \
               --checkpoint_freq 100 \
   
   $ sbatch launch_training_enroot.sh
   ```

*要查找可下载的代码示例，请参阅 Aw [some 分布式训练存储库中使用 SageMaker Awsome 分布式训练库中的 Docker 和 Enroot with Slurm 运行模型并行训练作业](https://github.com/aws-samples/awsome-distributed-training/tree/main/3.test_cases/17.SM-modelparallelv2#option-2----run-training-using-docker-and-enroot)。 GitHub *有关在 Slurm 集群开启的情况下进行分布式训练的更多信息 SageMaker HyperPod，请继续阅读下一个主题。[在 Slurm 开启的情况下运行分布式训练工作负载 HyperPod](sagemaker-hyperpod-run-jobs-slurm-distributed-training-workload.md)

# 在 Slurm 开启的情况下运行分布式训练工作负载 HyperPod
<a name="sagemaker-hyperpod-run-jobs-slurm-distributed-training-workload"></a>

SageMaker HyperPod 专门用于训练大型语言模型 (LLMs) 和基础模型 (FMs) 的工作负载。这些工作负载通常需要使用多种并行技术，并对 ML 基础设施和资源进行优化操作。使用 SageMaker HyperPod，您可以使用以下 SageMaker AI 分布式训练框架：
+ [SageMaker AI 分布式数据并行度 (SMDDP) 库](data-parallel.md)，可提供经过优化的集体通信操作。 AWS
+ 实现各种[模型并行技术的 SageMaker AI 模型并行度 (SMP) 库](model-parallel-v2.md)。

**Topics**
+ [

## 在 a 上使用 SMDDP SageMaker HyperPod
](#sagemaker-hyperpod-run-jobs-slurm-distributed-training-workload-smddp)
+ [

## 在集群上使用 SMP SageMaker HyperPod
](#sagemaker-hyperpod-run-jobs-slurm-distributed-training-workload-smp)

## 在 a 上使用 SMDDP SageMaker HyperPod
<a name="sagemaker-hyperpod-run-jobs-slurm-distributed-training-workload-smddp"></a>

[SMDDP 库](data-parallel.md)是一个集体通信库，可提高分布式数据并行训练的计算性能。SMDDP 库可与以下开源分布式训练框架配合使用：
+ [PyTorch并行分布式数据 (DDP)](https://pytorch.org/docs/stable/notes/ddp.html)
+ [PyTorch 完全分片数据并行度 (FSDP)](https://pytorch.org/docs/stable/fsdp.html)
+ [DeepSpeed](https://github.com/microsoft/DeepSpeed)
+ [威震天-DeepSpeed](https://github.com/microsoft/Megatron-DeepSpeed)

SMDDP 库通过提供以下内容来解决关键集体通信操作的通信开销。 SageMaker HyperPod
+ 该库`AllGather`针对以下内容进行了优化 AWS。 `AllGather`是分片数据并行训练中使用的一项关键操作，分片数据并行训练是流行库提供的一种节省内存的数据并行技术。其中包括 SageMaker 人工智能模型并行度 (SMP) 库、 DeepSpeed 零冗余优化器 (ZerO) 和 PyTorch 完全分片数据并行度 (FSDP)。
+ 该库通过充分利用 AWS 网络基础设施和 SageMaker AI ML 实例拓扑来优化 node-to-node通信。

**运行样本数据并行训练作业**

探索以下使用 SMDDP 库实施数据并行技术的分布式训练样本。
+ [https://github.com/aws-samples/awsome-distributed-training/tree/main/3.test_cases/12.SM-dataparallel-FSDP](https://github.com/aws-samples/awsome-distributed-training/tree/main/3.test_cases/12.SM-dataparallel-FSDP)
+ [https://github.com/aws-samples/awsome-distributed-training/tree/main/3.test_cases/13.SM-dataparallel-deepspeed](https://github.com/aws-samples/awsome-distributed-training/tree/main/3.test_cases/13.SM-dataparallel-deepspeed)

**要设置在上使用 SMDDP 库的环境 SageMaker HyperPod**

以下是在上使用 SMDDP 库的培训环境要求。 SageMaker HyperPod
+ PyTorch v2.0.1 及更高版本
+ CUDA v11.8 及更高版本
+ `libstdc++` 运行时版本大于 3
+ Python v3.10.x 及更高版本
+ `ml.p4d.24xlarge` 和 `ml.p4de.24xlarge`，它们是 SMDDP 库支持的实例类型
+ 在训练主机上启用 `imdsv2`

根据运行分布式训练作业的方式，有两种安装 SMDDP 库的选项：
+ 使用 SMDDP 二进制文件直接安装。
+ 使用 SMDDP 库中预装的 SageMaker AI Deep Learning Containers (DLCs)。

预装了 SMDDP 库或 SMDDP 二进制文件的 Docker 镜像在 SMDDP 库文档的[支持框架](https://docs.aws.amazon.com/sagemaker/latest/dg/distributed-data-parallel-support.html#distributed-data-parallel-supported-frameworks)中列出。 URLs 

**在 DLAMI 上安装 SMDDP 库 SageMaker HyperPod**
+ `pip install --no-cache-dir https://smdataparallel.s3.amazonaws.com/binary/pytorch/<pytorch-version>/cuXYZ/YYYY-MM-DD/smdistributed_dataparallel-X.Y.Z-cp310-cp310-linux_x86_64.whl`
**注意**  
如果您在 Conda 环境中工作，请确保 PyTorch使用`conda install`代替进行安装。`pip`  

  ```
  conda install pytorch==X.Y.Z  torchvision==X.Y.Z torchaudio==X.Y.Z pytorch-cuda=X.Y.Z -c pytorch -c nvidia
  ```

**在 Docker 容器上使用 SMDDP 库**
+ SMDDP 库已预装在 AI Deep Learning Cont SageMaker ainers () 上。DLCs要查找 SMDDP 库 DLCs 的 SageMaker PyTorch AI 框架列表，请参阅 SMDDP 库文档中的[支持的框架](https://docs.aws.amazon.com/sagemaker/latest/dg/distributed-data-parallel-support.html#distributed-data-parallel-supported-frameworks)。您也可以自带已安装所需依赖关系的 Docker 容器来使用 SMDDP 库。要了解有关设置自定义 Docker 容器以使用 SMDDP 库的更多信息，另请参阅 [使用 SageMaker AI 分布式数据并行库创建自己的 Docker 容器](data-parallel-bring-your-own-container.md)。
**重要**  
要在 Docker 容器中使用 SMDDP 库，请将主机中的 `/var/log` 目录挂载到容器中的 `/var/log`。可以在运行容器时添加以下选项来实现。  

  ```
  docker run <OTHER_OPTIONS> -v /var/log:/var/log ...
  ```

要了解如何使用 SMDDP 运行数据并行训练作业，请参阅 [使用 SageMaker AI 分布式数据并行库进行分布式训练](data-parallel-modify-sdp.md)。

## 在集群上使用 SMP SageMaker HyperPod
<a name="sagemaker-hyperpod-run-jobs-slurm-distributed-training-workload-smp"></a>

A [SageMaker I 模型并行度 (SMP) 库](model-parallel-v2.md)提供了各种[state-of-the-art模型并行技术](model-parallel-core-features-v2.md)，包括：
+ 完全分片数据并行
+ 专家并行
+ 使用 FP16/BF16 和 FP8 数据类型进行混合精度训练
+ 张量并行

SMP 库还与 FS PyTorch DP、NVIDIA 威震天和 NVIDIA Transformer Engine 等开源框架兼容。

**运行模型并行训练工作负载样本**

 SageMaker AI 服务团队提供样本训练作业，使用位于 SMP 库实现模型并行性。[https://github.com/aws-samples/awsome-distributed-training/tree/main/3.test_cases/17.SM-modelparallelv2](https://github.com/aws-samples/awsome-distributed-training/tree/main/3.test_cases/17.SM-modelparallelv2)

# SageMaker HyperPod 集群资源监控
<a name="sagemaker-hyperpod-cluster-observability-slurm"></a>

[要实现 SageMaker HyperPod 集群资源和软件组件的全面可观察性，请将集群与[适用于 Prometheus 的亚马逊托管服务和 Amazon M](https://docs.aws.amazon.com/prometheus/latest/userguide/what-is-Amazon-Managed-Service-Prometheus.html) anaged Grafana 集成。](https://docs.aws.amazon.com/grafana/latest/userguide/what-is-Amazon-Managed-Service-Grafana.html)通过与 Amazon Prometheus 托管服务的集成，可以导出与 HyperPod 您的集群资源相关的指标，从而深入了解其性能、利用率和运行状况。与 Amazon Managed Grafana 集成后，可以通过各种 Grafana 控制面板实现这些指标的可视化，为监控和分析集群行为提供直观的界面。通过利用这些服务，您可以获得 HyperPod 集群的集中统一视图，从而便于对分布式训练工作负载进行主动监控、故障排除和优化。

**提示**  
要查找实际示例和解决方案，另请参阅[SageMaker HyperPod研讨会](https://catalog.workshops.aws/sagemaker-hyperpod)。

![\[使用适用于 Prometheus SageMaker HyperPod 的亚马逊托管服务和亚马逊托管 Grafana 进行配置的概述。\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/hyperpod-observability-architecture.png)


图：此架构图显示了使用适用于 Prometheus SageMaker HyperPod 的亚马逊托管服务和亚马逊托管 Grafana 进行配置的概述。

继续阅读以下主题以设置 SageMaker HyperPod 集群可观测性。

**Topics**
+ [

# SageMaker HyperPod 集群可观测性的先决条件
](sagemaker-hyperpod-cluster-observability-slurm-prerequisites.md)
+ [

# 在 HyperPod 集群上安装指标导出器包
](sagemaker-hyperpod-cluster-observability-slurm-install-exporters.md)
+ [

# 验证集群头节点上的 Prometheus 设置 HyperPod
](sagemaker-hyperpod-cluster-observability-slurm-validate-prometheus-setup.md)
+ [

# 设置 Amazon Managed Grafana 工作区
](sagemaker-hyperpod-cluster-observability-slurm-managed-grafana-ws.md)
+ [

# 导出的指标参考
](sagemaker-hyperpod-cluster-observability-slurm-exported-metrics-reference.md)
+ [

# Amazon SageMaker HyperPod Slurm 指标
](smcluster-slurm-metrics.md)

# SageMaker HyperPod 集群可观测性的先决条件
<a name="sagemaker-hyperpod-cluster-observability-slurm-prerequisites"></a>

在执行 [在 HyperPod 集群上安装指标导出器包](sagemaker-hyperpod-cluster-observability-slurm-install-exporters.md) 步骤之前，请确保满足以下先决条件。

## 启用 IAM Identity Center
<a name="sagemaker-hyperpod-cluster-observability-slurm-prerequisites-iam-id-center"></a>

要为您的 SageMaker HyperPod 集群启用可观察性，您必须先启用 IAM 身份中心。这是部署堆栈的先决条件，该 CloudFormation 堆栈用于设置 Amazon Managed Grafana 工作空间和 Prometheus 的亚马逊托管服务。这两项服务还需要 IAM 身份中心进行身份验证和授权，以确保安全的用户访问和监控基础设施的管理。

有关启用 IAM 身份中心的详细指导，请参阅*《AWS IAM 身份中心用户指南》*中的[启用 IAM 身份中心](https://docs.aws.amazon.com/singlesignon/latest/userguide/get-set-up-for-idc.html)部分。

成功启用 IAM Identity Center 后，请设置一个用户账户，在以下配置过程中作为管理用户使用。

## 创建和部署 CloudFormation 堆栈以实现 SageMaker HyperPod 可观察性
<a name="sagemaker-hyperpod-cluster-observability-slurm-prerequisites-cloudformation-stack"></a>

使用适用于 Prometheus 的亚马逊托管服务和 Amazon Managed Grafana 创建和部署 SageMaker HyperPod 可观察性 CloudFormation 堆栈，以便实时监控 HyperPod 集群指标。要部署堆栈，请注意还需事先启用 [IAM Identity Center](https://console.aws.amazon.com/singlesignon)。

使用示例 CloudFormation 脚本[https://github.com/aws-samples/awsome-distributed-training/blob/main/4.validation_and_observability/4.prometheus-grafana/cluster-observability.yaml](https://github.com/aws-samples/awsome-distributed-training/blob/main/4.validation_and_observability/4.prometheus-grafana/cluster-observability.yaml)帮助您设置创建集 HyperPod 群可观察性堆栈所需的 Amazon VPC 子网、Amaz FSx on for Lustre 文件系统、Amazon S3 存储桶和 IAM 角色。

# 在 HyperPod 集群上安装指标导出器包
<a name="sagemaker-hyperpod-cluster-observability-slurm-install-exporters"></a>

在[基本配置中，该 SageMaker HyperPod 团队提供的生命周期脚本](sagemaker-hyperpod-lifecycle-best-practices-slurm-slurm-base-config.md)还包括安装各种指标导出器包。要激活安装步骤，只需在 [https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/config.py](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/config.py) 文件中设置参数 `enable_observability=True`。生命周期脚本旨在使用以下开源指标导出程序包启动集群。


|  |  |  | 
| --- |--- |--- |
| 名称 | 脚本部署目标节点 | 导出程序描述 | 
| [Prometheus 的 Slurm 导出程序](https://github.com/vpenso/prometheus-slurm-exporter) | 主节点（控制器） |  导出 Slurm 会计指标。  | 
|  [Elastic Fabric Adapter（EFA）节点导出程序](https://github.com/aws-samples/awsome-distributed-training/tree/main/4.validation_and_observability/3.efa-node-exporter)  |  计算节点  |  从集群节点和 EFA 导出指标。该软件包是 [Prometheus 节点导出程序](https://github.com/prometheus/node_exporter)的分叉。  | 
|  [NVIDIA 数据中心 GPU 管理（DCGM）导出程序](https://github.com/NVIDIA/dcgm-exporter)  | 计算节点 |  导出有关 NVIDIA 运行状况和性能的 NVIDIA GPUs DCGM 指标。  | 

通过 [https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/config.py](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/config.py) 文件中的 `enable_observability=True`，以下安装步骤将在 [https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/lifecycle_script.py](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/lifecycle_script.py) 脚本中激活。

```
# Install metric exporting software and Prometheus for observability
if Config.enable_observability:
    if node_type == SlurmNodeType.COMPUTE_NODE:
        ExecuteBashScript("./utils/install_docker.sh").run()
        ExecuteBashScript("./utils/install_dcgm_exporter.sh").run()
        ExecuteBashScript("./utils/install_efa_node_exporter.sh").run()

    if node_type == SlurmNodeType.HEAD_NODE:
        wait_for_scontrol()
        ExecuteBashScript("./utils/install_docker.sh").run()
        ExecuteBashScript("./utils/install_slurm_exporter.sh").run()
        ExecuteBashScript("./utils/install_prometheus.sh").run()
```

在计算节点上，脚本会安装 NVIDIA 数据中心 GPU 管理 (DCGM) 导出程序和 Elastic Fabric Adapter（EFA）节点导出程序。DCGM 导出器是 Prometheus 的导出器，它从 GPUs NVIDIA 收集指标，从而可以监控 GPU 的使用情况、性能和运行状况。另一方面，EFA 节点导出程序收集与 EFA 网络接口相关的指标，这对高性能计算集群的低延迟和高带宽通信至关重要。

在主节点上，脚本会安装 Prometheus 的 Slurm 导出程序和 [Prometheus 开放源代码软件](https://prometheus.io/docs/introduction/overview/)。Slurm 导出程序可为 Prometheus 提供与 Slurm 作业、分区和节点状态相关的指标。

请注意，生命周期脚本旨在将所有出口程序包安装为 docker 容器，因此主节点和计算节点上也应安装 Docker 软件包。这些组件的脚本可以方便地在 *Awsome Distributed Training GitHub 存储库*的[https://github.com/aws-samples/awsome-distributed-training/tree/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/utils](https://github.com/aws-samples/awsome-distributed-training/tree/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/utils)文件夹中提供。

成功设置安装了导出器包的 HyperPod 集群后，请继续阅读下一个主题，完成针对 Prometheus 和 Amazon Managed Grafana 的亚马逊托管服务的设置。

# 验证集群头节点上的 Prometheus 设置 HyperPod
<a name="sagemaker-hyperpod-cluster-observability-slurm-validate-prometheus-setup"></a>

成功设置安装了导出器包的 HyperPod 集群后，请检查集群的主节点上是否正确设置了 Prometheus。 HyperPod 

1. 连接到集群的主节点。有关访问节点的说明，请参见 [访问您的 SageMaker HyperPod 集群节点](sagemaker-hyperpod-run-jobs-slurm-access-nodes.md)。

1. 运行以下命令验证生命周期脚本 `install_prometheus.sh` 创建的 Prometheus 配置和服务文件是否在控制器节点上运行。输出结果应显示活动状态为 **active (running)**。

   ```
   $ sudo systemctl status prometheus
   • prometheus service - Prometheus Exporter
   Loaded: loaded (/etc/systemd/system/prometheus.service; enabled; preset:disabled)
   Active: active (running) since DAY YYYY-MM-DD HH:MM:SS UTC; Ss ago
   Main PID: 12345 (prometheus)
   Tasks: 7 (limit: 9281)
   Memory: 35M
   CPU: 234ms
   CGroup: /system.slice/prometheus.service
           -12345 /usr/bin/prometheus--config.file=/etc/prometheus/prometheus.yml
   ```

1. 按如下步骤验证 Prometheus 配置文件。输出结果必须与下面类似，三个出口程序配置了正确的计算节点 IP 地址。

   ```
   $ cat /etc/prometheus/prometheus.yml
   global:
     scrape_interval: 15s
     evaluation_interval: 15s
     scrape_timeout: 15s
   
   scrape_configs:
     - job_name: 'slurm_exporter'
       static_configs:
         - targets:
             - 'localhost:8080'
     - job_name: 'dcgm_exporter'
       static_configs:
         - targets:
             - '<ComputeNodeIP>:9400'
             - '<ComputeNodeIP>:9400'
     - job_name: 'efa_node_exporter'
       static_configs:
         - targets:
             - '<ComputeNodeIP>:9100'
             - '<ComputeNodeIP>:9100'
   
   remote_write:
     - url: <AMPReoteWriteURL>
       queue_config:
         max_samples_per_send: 1000
         max_shards: 200
         capacity: 2500
       sigv4:
         region: <Region>
   ```

1. 要测试 Prometheus 是否正确导出 Slurm、DCGM 和 EFA 指标，请在主节点的 `:9090` 端口为 Prometheus 运行以下 `curl` 命令。

   ```
   $ curl -s http://localhost:9090/metrics | grep -E 'slurm|dcgm|efa'
   ```

   通过控制器节点的 Prometheus 远程写入配置将指标导出到 Amazon Managed Service for Prometheus Workspace 后，您就可以进入下一个主题，设置 Amazon Managed Grafana 面板来显示指标。

# 设置 Amazon Managed Grafana 工作区
<a name="sagemaker-hyperpod-cluster-observability-slurm-managed-grafana-ws"></a>

使用 Amazon Managed Service for Prometheus 作为数据来源，创建新的 Amazon Managed Grafana 作业区或更新现有的 Amazon Managed Grafana 作业区。

**Topics**
+ [

## 创建 Grafana 作业区并将 Amazon Managed Service for Prometheus 设置为数据来源
](#sagemaker-hyperpod-cluster-observability-slurm-managed-grafana-ws-create)
+ [

## 打开 Grafana 作业区并完成数据来源设置
](#sagemaker-hyperpod-cluster-observability-slurm-managed-grafana-ws-connect-data-source)
+ [

## 导入开源 Grafana 控制面板
](#sagemaker-hyperpod-cluster-observability-slurm-managed-grafana-ws-import-dashboards)

## 创建 Grafana 作业区并将 Amazon Managed Service for Prometheus 设置为数据来源
<a name="sagemaker-hyperpod-cluster-observability-slurm-managed-grafana-ws-create"></a>

要可视化 Amazon Managed Service for Prometheus 的指标，请创建 Amazon Managed Grafana 作业区并将其设置为使用 Amazon Managed Service for Prometheus 作为数据来源。

1. 要创建 Grafana 作业区，请按照 [Amazon Managed Service for Prometheus User Guide](https://docs.aws.amazon.com/grafana/latest/userguide/AMG-create-workspace.html#creating-workspace) 中的*创建空间*进行操作。

   1. 在步骤 13 中，选择 Amazon Managed Service for Prometheus 作为数据来源。

   1. 在步骤 17 中，您可以在 IAM Identity Center 中添加管理员用户和其他用户。

要了解更多信息，请参阅以下资源。
+ 在[《Amazon Managed Service for Prometheus 用户指南》](https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-amg.html)中*设置 Amazon Managed Grafana，以便与 Amazon Managed Service for Prometheus 配合使用*。
+ [https://docs.aws.amazon.com/grafana/latest/userguide/AMP-adding-AWS-config.html](https://docs.aws.amazon.com/grafana/latest/userguide/AMP-adding-AWS-config.html)

## 打开 Grafana 作业区并完成数据来源设置
<a name="sagemaker-hyperpod-cluster-observability-slurm-managed-grafana-ws-connect-data-source"></a>

成功创建或更新 Amazon Managed Grafana 作业区后，选择作业区 URL 以打开作业区。系统会提示您输入在 IAM Identity Center 中设置的用户名和密码。您应该使用管理员用户登录，以完成作业区的设置。

1. 在作业区**主页**页面，选择**应用程序**、**AWS 数据来源**和**数据来源**。

1. 在**数据来源**页面，选择**数据来源**选项卡。

1. 在**服务**中，选择 Amazon Managed Service for Prometheus。

1. 在**浏览和配置数据源**部分，选择您为 Prometheus 工作空间配置亚马逊托管服务的 AWS 区域。

1. 从所选区域的数据来源列表中，选择 Amazon Managed Service for Prometheus 的数据来源。请务必检查您为可观察性堆栈设置的适用于 Prometheus 的亚马逊托管服务工作空间的资源 ID 和资源别名。 HyperPod 

## 导入开源 Grafana 控制面板
<a name="sagemaker-hyperpod-cluster-observability-slurm-managed-grafana-ws-import-dashboards"></a>

成功设置 Amazon Managed Grafana 作业区并将 Amazon Managed Service for Prometheus 作为数据来源后，您就可以开始向 Prometheus 收集指标，然后就可以看到显示图表、信息等的各种控制面板。Grafana 开源软件提供各种控制面板，您可以将它们导入 Amazon Managed Grafana。

**将开源 Grafana 控制面板导入 Amazon Managed Grafana**

1. 在 Amazon Managed Grafana 作业区的**主页**页面中，选择**控制面板**。

1. 选择带有用户界面文本**新建**的下拉菜单按钮，然后选择**导入**。

1. 将 URL 粘贴到 [Slurm 控制面板](https://grafana.com/grafana/dashboards/4323-slurm-dashboard/)。

   ```
   https://grafana.com/grafana/dashboards/4323-slurm-dashboard/
   ```

1. 选择**加载**。

1. 重复前面的步骤导入以下控制面板。

   1. [Node Exporter Full Dashboard](https://grafana.com/grafana/dashboards/1860-node-exporter-full/)

      ```
      https://grafana.com/grafana/dashboards/1860-node-exporter-full/
      ```

   1. [NVIDIA DCGM 导出器控制面板](https://grafana.com/grafana/dashboards/12239-nvidia-dcgm-exporter-dashboard/)

      ```
      https://grafana.com/grafana/dashboards/12239-nvidia-dcgm-exporter-dashboard/
      ```

   1. [EFA 指标控制面板](https://grafana.com/grafana/dashboards/20579-efa-metrics-dev/)

      ```
      https://grafana.com/grafana/dashboards/20579-efa-metrics-dev/
      ```

   1. [FSx 适用于 Lustre 指标控制面板](https://grafana.com/grafana/dashboards/20906-fsx-lustre/)

      ```
      https://grafana.com/grafana/dashboards/20906-fsx-lustre/
      ```

# 导出的指标参考
<a name="sagemaker-hyperpod-cluster-observability-slurm-exported-metrics-reference"></a>

以下各节列出了成功配置堆栈 SageMaker HyperPod 以实现可观察性后从亚马逊托管服务 Prometheus 导出的指标的完整列表。 CloudFormation SageMaker HyperPod 您可以在 Amazon Managed Grafana 面板中开始监控这些可视化指标。

## Slurm 导出程序控制面板
<a name="sagemaker-hyperpod-cluster-observability-slurm-exported-metrics-reference-slurm-exporter"></a>

提供 Slurm 集群的可视化信息。 SageMaker HyperPod

**指标类型**
+ **集群概览：**显示节点、作业总数及其状态。
+ **作业指标：**可视化一段时间内的作业数量和状态。
+ **节点指标：**显示节点状态、分配和可用资源。
+ **分区指标：**监控特定分区的指标，如 CPU、内存和 GPU 利用率。
+ **作业效率：**根据使用的资源计算作业效率。

**指标列表**


| 指标名称 | 说明 | 
| --- | --- | 
| slurm\$1job\$1count | Slurm 集群中的作业总数 | 
| slurm\$1job\$1state\$1count | 处于各种状态（如运行中、待处理、已完成）的作业数 | 
| slurm\$1node\$1count  | Slurm 集群的节点总数 | 
| slurm\$1node\$1state\$1count  | 处于各种状态（如空闲、分配、混合）的节点数 | 
| slurm\$1partition\$1node\$1count  | 每个分区的节点数 | 
| slurm\$1partition\$1job\$1count  | 每个分区的作业计数 | 
| slurm\$1partition\$1alloc\$1cpus  | 每个分区 CPUs 中分配的总数 | 
| slurm\$1partition\$1free\$1cpus  | 每个分区 CPUs 中可用的总数 | 
| slurm\$1partition\$1alloc\$1memory  | 每个分区分配的内存总量 | 
| slurm\$1partition\$1free\$1memory  | 每个分区的可用内存总量 | 
| slurm\$1partition\$1alloc\$1gpus  | 每个分区 GPUs 中分配的总数 | 
| slurm\$1partition\$1free\$1gpus  | 每个分区 GPUs 中的可用总数 | 

## 节点导出程序控制面板
<a name="sagemaker-hyperpod-cluster-observability-slurm-exported-metrics-reference-node-exporter"></a>

提供 [Prometheus](https://github.com/prometheus/node_exporter) 节点导出器从集群节点收集的系统指标的可视化信息。 HyperPod 

**指标类型**
+ **系统概述：**显示 CPU 负载平均值和内存使用情况。
+ **内存指标：**可视化内存使用情况，包括总内存、可用内存和交换空间。
+ **磁盘使用情况：**监控磁盘空间利用率和可用性。
+ **网络流量：**显示一段时间内接收和传输的网络字节数。
+ **文件系统指标：**分析文件系统的使用情况和可用性。
+ **磁盘 I/O 指标：**可视化磁盘读取和写入活动。

**指标列表**

有关导出的指标的完整列表，请参阅[节点导出器](https://github.com/prometheus/node_exporter?tab=readme-ov-file#enabled-by-default)和 [procfs](https://github.com/prometheus/procfs?tab=readme-ov-file) GitHub 存储库。下表列出了部分指标，可帮助用户深入了解 CPU 负载、内存使用、磁盘空间和网络活动等系统资源利用情况。


| 指标名称 | 说明 | 
| --- | --- | 
|  node\$1load1  | 1 分钟平均负荷 | 
|  node\$1load5  | 5 分钟平均负荷 | 
|  node\$1load15  | 15 分钟平均负荷 | 
|  node\$1memory\$1MemTotal  | 系统内存总量 | 
|  node\$1memory\$1MemFree  | 释放系统内存 | 
|  node\$1memory\$1MemAvailable  | 可分配给进程的可用内存 | 
|  node\$1memory\$1Buffers  | 内核用于缓冲的内存 | 
|  node\$1memory\$1Cached  | 内核用于缓存文件系统数据的内存 | 
|  node\$1memory\$1SwapTotal  | 可用交换空间总数 | 
|  node\$1memory\$1SwapFree  | 自由交换空间 | 
|  node\$1memory\$1SwapCached  | 曾被换出的内存被换回，但仍处于交换状态 | 
|  node\$1filesystem\$1avail\$1bytes  | 可用磁盘空间（单位：字节） | 
|  node\$1filesystem\$1size\$1bytes  | 磁盘空间总量（单位：字节） | 
|  node\$1filesystem\$1free\$1bytes  | 可用磁盘空间（单位：字节） | 
|  node\$1network\$1receive\$1bytes  | 收到的网络字节数 | 
|  node\$1network\$1transmit\$1bytes  | 传输的网络字节数 | 
|  node\$1disk\$1read\$1bytes  | 读取的磁盘字节数 | 
|  node\$1disk\$1written\$1bytes  | 写入的磁盘字节数 | 

## NVIDIA DCGM 导出器控制面板
<a name="sagemaker-hyperpod-cluster-observability-slurm-exported-metrics-reference-nvidia-dcgm-exporter"></a>

提供由 [NVIDIA DCGM 导出程序](https://github.com/NVIDIA/dcgm-exporter)收集的 NVIDIA GPU 指标的可视化信息。

**指标类型**
+ **GPU 概览：**显示 GPU 利用率、温度、功耗和内存使用情况。
+ **温度指标：**可视化 GPU 随时间变化的温度。
+ **电源使用：**监控 GPU 功耗和用电趋势。
+ **内存使用情况：**分析 GPU 内存使用情况，包括已用内存、可用内存和总内存。
+ **风扇速度：**显示 GPU 风扇速度和变化。
+ **ECC 错误：**跟踪 GPU 内存 ECC 错误和待处理错误。

**指标列表**

下表列出的指标可帮助用户深入了解 NVIDIA GPU 的运行状况和性能，包括时钟频率、温度、用电量、内存利用率、风扇速度和错误指标。


| 指标名称 | 说明 | 
| --- | --- | 
|  DCGM\$1FI\$1DEV\$1SM\$1CLOCK  | SM 时钟频率 (in MHz) | 
|  DCGM\$1FI\$1DEV\$1MEM\$1CLOCK  | 内存时钟频率 (in MHz) | 
|  DCGM\$1FI\$1DEV\$1MEMORY\$1TEMP  | 内存温度（单位：摄氏度） | 
|  DCGM\$1FI\$1DEV\$1GPU\$1TEMP  | GPU 温度（单位：摄氏度） | 
|  DCGM\$1FI\$1DEV\$1POWER\$1USAGE  | 耗电量（单位：瓦） | 
|  DCGM\$1FI\$1DEV\$1TOTAL\$1ENERGY\$1CONSUMPTION  | 启动以来的总能耗（单位：兆焦耳） | 
|  DCGM\$1FI\$1DEV\$1PCIE\$1REPLAY\$1COUNTER  |  PCIe 重试总次数 | 
|  DCGM\$1FI\$1DEV\$1MEM\$1COPY\$1UTIL  | 内存利用率（单位：%） | 
|  DCGM\$1FI\$1DEV\$1ENC\$1UTIL  | 编码器利用率（单位：%） | 
|  DCGM\$1FI\$1DEV\$1DEC\$1UTIL  | 解码器利用率（单位：%） | 
|  DCGM\$1FI\$1DEV\$1XID\$1ERRORS  | 最后遇到的 XID 错误值 | 
|  DCGM\$1FI\$1DEV\$1FB\$1FREE  | 帧缓冲区可用内存（单位：MB） | 
|  DCGM\$1FI\$1DEV\$1FB\$1USED  | 使用的帧缓冲区内存（单位：MB） | 
|  DCGM\$1FI\$1DEV\$1NVLINK\$1BANDWIDTH\$1TOTAL  | 所有通道的 NVLink 带宽计数器总数 | 
|  DCGM\$1FI\$1DEV\$1VGPU\$1LICENSE\$1STATUS  | vGPU 许可证状态 | 
|  DCGM\$1FI\$1DEV\$1UNCORRECTABLE\$1REMAPPED\$1ROWS  | 无法纠正错误的重新映射行数 | 
|  DCGM\$1FI\$1DEV\$1CORRECTABLE\$1REMAPPED\$1ROWS  | 可纠正错误的重新映射行数 | 
|  DCGM\$1FI\$1DEV\$1ROW\$1REMAP\$1FAILURE  | 行的重新映射是否失败 | 

## EFA 指标控制面板
<a name="sagemaker-hyperpod-cluster-observability-slurm-exported-metrics-reference-efa-exporter"></a>

提供由 [EFA 节点导出程序](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa.html)收集的 P 实例上配备的 [Amazon Elastic Fabric Adapter（EFA）](https://github.com/aws-samples/awsome-distributed-training/blob/main/4.validation_and_observability/3.efa-node-exporter/README.md)指标的可视化信息。

**指标类型**
+ **EFA 错误指标：**可视化分配错误、命令错误和内存映射错误等错误。
+ **EFA 网络流量：**监控接收和传输的字节、数据包和作业请求。
+ **EFA RDMA 性能：**分析 RDMA 读写操作，包括传输字节数和错误率。
+ **EFA 端口寿命：**显示 EFA 端口随时间变化的寿命。
+ **EFA 保持连接数据包：**跟踪收到的保持连接数据包的数量。

**指标列表**

下表列出了可深入了解 EFA 运行各个方面的指标，包括错误、已完成命令、网络流量和资源利用率。


| 指标名称 | 说明 | 
| --- | --- | 
|  node\$1amazonefa\$1info  | 来自/sys/class/infiniband/的非数字数据，值始终为 1。 | 
|  node\$1amazonefa\$1lifespan  | 端口寿命 | 
|  node\$1amazonefa\$1rdma\$1read\$1bytes  | RDMA 读取的字节数 | 
|  node\$1amazonefa\$1rdma\$1read\$1resp\$1bytes  | RDMA 读取响应字节数 | 
|  node\$1amazonefa\$1rdma\$1read\$1wr\$1err  | RDMA 读写错误次数 | 
|  node\$1amazonefa\$1rdma\$1read\$1wrs  | RDMA 的读取次数 | 
|  node\$1amazonefa\$1rdma\$1write\$1bytes  | RDMA 写入的字节数 | 
|  node\$1amazonefa\$1rdma\$1write\$1recv\$1bytes  | RDMA 写入和接收的字节数 | 
|  node\$1amazonefa\$1rdma\$1write\$1wr\$1err  | 写入的错误 RDMA 字节数 | 
|  node\$1amazonefa\$1rdma\$1write\$1wrs  | 写入的 wrs RDMA 字节数 | 
|  node\$1amazonefa\$1recv\$1bytes  | 接收的字节数 | 
|  node\$1amazonefa\$1recv\$1wrs  | 接收的 wrs 字节数 | 
|  node\$1amazonefa\$1rx\$1bytes  | 接收的字节数 | 
|  node\$1amazonefa\$1rx\$1drops  | 丢弃的数据包数量 | 
|  node\$1amazonefa\$1rx\$1pkts  | 接收的数据包数量 | 
|  node\$1amazonefa\$1send\$1bytes  | 发送的字节数 | 
|  node\$1amazonefa\$1send\$1wrs  | 发送的 wrs 数量 | 
|  node\$1amazonefa\$1tx\$1bytes  | 传输的字节数 | 
|  node\$1amazonefa\$1tx\$1pkts  | 传输的数据包数量 | 

## FSx 适用于 Lustre 指标控制面板
<a name="sagemaker-hyperpod-cluster-observability-slurm-exported-metrics-reference-fsx-exporter"></a>

[提供亚马逊收集的 [Amazon FSx for Lustre 文件系统指标](https://docs.aws.amazon.com/fsx/latest/LustreGuide/monitoring-cloudwatch.html)的可视化信息。 CloudWatch](https://docs.aws.amazon.com/fsx/latest/LustreGuide/monitoring-cloudwatch.html)

**注意**  
Grafana FSx for Lustre 控制面板使用 CloudWatch 亚马逊作为其数据源，这与您配置为使用适用于 Prometheus 的亚马逊托管服务的其他控制面板不同。为确保准确监控和可视化与 for Lustre 文件系统相关的指标，请将 for Lustre 控制面板配置 FSx 为使用 Amazon CloudWatch 作为数据源，指定与 for Lustre 文件系统的部署 AWS 区域 位置相同。 FSx FSx 

**指标类型**
+ **DataReadBytes：**文件系统读取操作的字节数。
+ **DataWriteBytes：**文件系统写入操作的字节数。
+ **DataReadOperations：**读取操作的数量。
+ **DataWriteOperations：**写入操作的数量。
+ **MetadataOperations：**元数据操作的数量。
+ **FreeDataStorageCapacity：**可用存储容量。

# Amazon SageMaker HyperPod Slurm 指标
<a name="smcluster-slurm-metrics"></a>

Amazon SageMaker HyperPod 提供了一组亚马逊 CloudWatch 指标，您可以使用这些指标来监控 HyperPod 集群的运行状况和性能。这些指标是从集 HyperPod 群上运行的 Slurm 工作负载管理器收集的，可在命名空间中`/aws/sagemaker/Clusters` CloudWatch 使用。

## 集群级别指标
<a name="smcluster-slurm-metrics-cluster"></a>

以下集群级别的指标可用于。 HyperPod这些指标使用`ClusterId`维度来标识特定的 HyperPod 集群。


| CloudWatch 指标名称 | 注意 | Amazon EKS Container Insights 指标名称 | 
| --- | --- | --- | 
| cluster\$1node\$1count | 集群中的节点总数 | cluster\$1node\$1count | 
| cluster\$1idle\$1node\$1count | 集群中的空闲节点数 | 不适用 | 
| cluster\$1failed\$1node\$1count | 集群中的故障节点数 | cluster\$1failed\$1node\$1count | 
| cluster\$1cpu\$1count | 集群中的 CPU 内核总数 | node\$1cpu\$1limit | 
| cluster\$1idle\$1cpu\$1count | 集群中的空闲 CPU 内核数 | 不适用 | 
| cluster\$1gpu\$1count | 集群 GPUs 中的总数 | node\$1gpu\$1limit | 
| cluster\$1idle\$1gpu\$1count | 集群 GPUs 中的空闲人数 | 不适用 | 
| cluster\$1running\$1task\$1count | 集群中正在运行的 Slurm 作业数 | 不适用 | 
| cluster\$1pending\$1task\$1count | 集群中的待处理 Slurm 作业数 | 不适用 | 
| cluster\$1preempted\$1task\$1count | 集群中的已抢占 Slurm 作业数 | 不适用 | 
| cluster\$1avg\$1task\$1wait\$1time | 集群中的 Slurm 作业的平均等待时间 | 不适用 | 
| cluster\$1max\$1task\$1wait\$1time | 集群中的 Slurm 作业的最长等待时间 | 不适用 | 

## 实例级别指标
<a name="smcluster-slurm-metrics-instance"></a>

以下实例级别指标可用于。 HyperPod这些指标还使用`ClusterId`维度来标识特定的 HyperPod 集群。


| CloudWatch 指标名称 | 注意 | Amazon EKS Container Insights 指标名称 | 
| --- | --- | --- | 
| node\$1gpu\$1utilization | 所有实例的平均 GPU 利用率 | node\$1gpu\$1utilization | 
| node\$1gpu\$1memory\$1utilization | 所有实例的平均 GPU 内存利用率 | node\$1gpu\$1memory\$1utilization | 
| node\$1cpu\$1utilization | 所有实例的平均 CPU 利用率 | node\$1cpu\$1utilization | 
| node\$1memory\$1utilization | 所有实例的平均内存利用率 | node\$1memory\$1utilization | 

# SageMaker HyperPod 集群弹性
<a name="sagemaker-hyperpod-resiliency-slurm"></a>

SageMaker HyperPod 通过 Slurm 编排提供以下集群弹性功能。

**Topics**
+ [

# Health 监控代理
](sagemaker-hyperpod-resiliency-slurm-cluster-health-check.md)
+ [

# 自动节点恢复和自动恢复
](sagemaker-hyperpod-resiliency-slurm-auto-resume.md)
+ [

# 使用 Slurm 手动替换或重启节点
](sagemaker-hyperpod-resiliency-slurm-replace-faulty-instance.md)

# Health 监控代理
<a name="sagemaker-hyperpod-resiliency-slurm-cluster-health-check"></a>

本节介绍了一组运行状况检查， SageMaker HyperPod 用于定期监控集群实例的运行状况，以防加速器（GPU 和 Trainium 内核）和网络 (EFA) 等设备出现问题。 SageMaker HyperPod 运行状况监控代理 (HMA) 持续监控每个基于 GPU 或 Trainium 的实例的运行状况。当检测到任何实例或 GPU 故障时，座席会将实例标记为运行状况不佳。

SageMaker HyperPod HMA 对 EKS 和 Slurm 协调器执行相同的运行状况检查。有关 HMA 的更多信息，请参阅[Health 监控系统](sagemaker-hyperpod-eks-resiliency-health-monitoring-agent.md)。

# 自动节点恢复和自动恢复
<a name="sagemaker-hyperpod-resiliency-slurm-auto-resume"></a>

**注意**  
截至2025年9月11日，Slurm编排现在支持健康监测代理。 HyperPod 要使用此功能，请运行[UpdateClusterSoftware](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_UpdateClusterSoftware.html)并更新到最新版本的 AMI。

本节讨论 Amazon SageMaker HyperPod 的两个互补弹性功能：无需人工干预即可替换故障基础设施的自动节点恢复，以及硬件故障后从最后一个检查点重新启动训练作业的自动恢复功能。

## 自动节点恢复的工作原理
<a name="sagemaker-hyperpod-resiliency-slurm-auto-resume-how"></a>

在集群创建或更新期间，集群管理员用户可在集群级别的 `Automatic`（推荐）和 `None` 之间选择节点（实例）恢复选项。如果设置为`Automatic`，则 SageMaker HyperPod 自动重启或更换故障节点。

**重要**  
我们建议设置 `Automatic` 选项。默认情况下，群集设置为自动节点恢复。

当从运行状况监控座席、基本运行状况检查和深度运行状况检查中发现问题时，自动运行节点恢复。如果设置为 `None`，运行状况监控座席将在检测到故障时对实例进行标记，但不会在受影响的节点上自动启动任何修复或恢复操作。我们不建议使用此选项。

## 使用 Amazon SageMaker HyperPod 自动恢复功能运行训练作业
<a name="sagemaker-hyperpod-resiliency-slurm-auto-resume-job"></a>

本节介绍如何使用 SageMaker HyperPod 自动恢复功能运行训练作业，该功能提供了零接触弹性基础架构，可在硬件出现故障时自动从上次保存的检查点恢复训练作业。

借助自动恢复功能，如果作业由于硬件故障或训练间隔期间的任何暂时问题而失败，则 SageMaker HyperPod 自动恢复将启动节点替换工作流程，并在更换故障节点后重新启动作业。使用自动恢复时，每当作业失败时，都会运行以下硬件检查：


| 类别 | 实用程序名称 | 实例类型兼容性 | 说明 | 
| --- | --- | --- | --- | 
| Accelerator | NVIDIA SMI | GPU | [nvidia-smi](https://developer.nvidia.com/nvidia-system-management-interface) 实用程序是一个众所周知的用于管理和监控的 CLI。 GPUs内置运行状况检查程序会解析 nvidia-smi 的输出，以确定实例的运行状况。 | 
| Accelerator | Neuron sysfs | Trainium | 对于 Trainium-powered 实例，Neuron 设备的运行状况由 Neuron 驱动程序直接从 [Neuron sysfs](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/tools/neuron-sys-tools/neuron-sysfs-user-guide.html) 中读取计数器来确定。 | 
| Network | EFA | GPU 和 Trainium | 为帮助诊断弹性 Fabric 适配器 (EFA) 设备，EFA 运行状况检查程序会使用实例中所有可用的 EFA 卡运行一系列连接性测试。 | 

**注意**  
当[通用资源（GRES）](https://slurm.schedmd.com/gres.html)连接到 Slurm 节点时，Slurm 通常不允许更改节点分配，如更换节点，因此无法恢复失败的作业。除非明确禁止，否则 HyperPod自动恢复功能会自动将任何与启用 GRES 的节点关联的错误作业重新排队。这个过程包括停止作业，将其放回作业队列，然后从头开始重新启动作业。

**在 Slur SageMaker HyperPod m 中使用自动恢复功能**

当你在 Slurm 中使用 SageMaker HyperPod 自动恢复时，你应该在通过使用或获得的独占分配中运行作业。`salloc` `sbatch`无论如何，您都需要修改入口点脚本，以确保在恢复任务时，所有设置步骤都在一条 `srun` 命令中运行。通过入口点脚本，必须将被替换节点上的环境设置为与作业步骤停止前的运行环境一致。以下过程说明如何准备入口点脚本以保持环境一致并将其作为单个`srun`命令运行。

**提示**  
如果您使用 `sbatch`，则可以创建一个单独的脚本来设置环境，并使用单一的 `srun` 命令，从而使批处理脚本保持简洁。

1. 使用以下代码示例创建脚本，并将其保存为 `train_auto_resume.sh`。该脚本会部署训练环境设置，前提是之前没有对被替换节点进行手动配置。这样就能确保环境与节点无关，这样当节点被替换时，就能在节点上配置相同的环境，然后再恢复作业。
**注意**  
下面的代码示例显示了如何发现与作业相关的 Slurm 节点列表。请勿使用 Slurm 提供的`$SLURM_JOB_NODELIST`环境变量，因为在 SageMaker HyperPod 自动恢复作业后，其值可能会过时。下面的代码示例展示了如何定义一个新的 `NODE_LIST` 变量来替代 `SLURM_JOB_NODELIST`，然后根据 `MASTER_NODE` 变量设置 `MASTER_ADDR` 和 `NODE_LIST` 变量。

   ```
   #!/bin/bash
   
   # Filename: train_auto_resume.sh
   # Sample containerized script to launch a training job with a single srun which can be auto-resumed.
   
   # Place your training environment setup here. 
   # Example: Install conda, docker, activate virtual env, etc.
   
   # Get the list of nodes for a given job
   NODE_LIST=$(scontrol show jobid=$SLURM_JOBID | \ # Show details of the SLURM job
               awk -F= '/NodeList=/{print $2}' | \  # Extract NodeList field
               grep -v Exc)                         # Exclude nodes marked as excluded
   
   # Determine the master node from the node list
   MASTER_NODE=$(scontrol show hostname $NODE_LIST | \ # Convert node list to hostnames
                 head -n 1)                            # Select the first hostname as master node
   
   # Get the master node address
   MASTER_ADDR=$(scontrol show node=$MASTER_NODE | \ # Show node information
                 awk -F= '/NodeAddr=/{print $2}' | \ # Extract NodeAddr
                 awk '{print $1}')                   # Print the first part of NodeAddr
   
   
   # Torchrun command to launch the training job
   torchrun_cmd="torchrun --nnodes=$SLURM_NNODES \
                          --nproc_per_node=1 \
                          --node_rank=$SLURM_NODE \
                          --master-addr=$MASTER_ADDR \
                          --master_port=1234 \
                          <your_training_script.py>"
   
   # Execute the torchrun command in the 'pytorch' Conda environment, 
   # streaming output live
   /opt/conda/bin/conda run --live-stream -n pytorch $torchrun_cmd
   ```
**提示**  
您可以使用前面的脚本添加更多命令，以便为作业安装其他依赖关系。不过，我们建议您将依赖关系安装脚本保留在创建集群时使用的[生命周期脚本集](sagemaker-hyperpod-lifecycle-best-practices-slurm-slurm-base-config.md)中。如果您使用托管在共享目录下的虚拟环境，也可以使用此脚本激活虚拟环境。

1. 在启用 SageMaker HyperPod 自动恢复的情况下启动作业，方法是添加标志，`--auto-resume=1`以指示在出现硬件故障时应自动重试该`srun`命令。
**注意**  
如果您使用 `sbatch` 或 `salloc` 设置了资源分配，则可以在分配中运行多个 `srun` 命令。如果出现故障， SageMaker HyperPod自动恢复功能仅在带有标志`--auto-resume=1`的`srun`命令的当前[作业步骤](https://slurm.schedmd.com/job_launch.html#step_allocation)中运行。换句话说，在 `srun` 命令中激活自动恢复功能并不适用于在资源分配会话中启动的其他 `srun` 命令。

   以下是启用 `auto-resume` 后的 `srun` 命令示例。

   **使用 sbatch**

   由于设置环境的大部分逻辑已经在 `train_auto_resume.sh` 中，因此批脚本应该很简单，与下面的代码示例类似。假设以下批脚本保存为 `batch.sh`。

   ```
   #!/bin/bash
   #SBATCH --nodes 2
   #SBATCH --exclusive
   srun --auto-resume=1 train_auto_resume.sh
   ```

   使用以下命令运行前面的批脚本。

   ```
   sbatch batch.sh
   ```

   **使用 salloc**

   首先获取独占分配，然后使用 `--auto-resume` 标志和入口点脚本运行 `srun` 命令。

   ```
   salloc -N 2 --exclusive
   srun --auto-resume=1 train_auto_resume.sh
   ```

## 自动节点恢复和自动恢复是如何协同工作的
<a name="sagemaker-hyperpod-resiliency-slurm-auto-resume-node-recovery"></a>

当自动节点恢复和自动恢复系统都处于活动状态时，它们会遵循协调的方法来处理故障。如果 HMA 检测到硬件故障，则无论作业级别的状态如何，该节点都会被标记为已耗尽。启用节点自动恢复后，一旦节点中运行的所有作业退出，就会自动替换节点。在这种情况下，对于启用了自动恢复的作业，如果步骤中的退出状态为非零，则自动恢复将启动（替换节点后作业就会恢复）。未启用自动恢复功能的作业将直接退出，需要管理员或用户手动重新提交。

**注意**  
如果使用自动恢复，则在检测到硬件故障时将始终替换节点（不重新启动）。

# 使用 Slurm 手动替换或重启节点
<a name="sagemaker-hyperpod-resiliency-slurm-replace-faulty-instance"></a>

本节讨论何时应手动重启或更换节点，并说明如何同时执行这两项操作。

## 何时手动重启或更换节点
<a name="sagemaker-hyperpod-resiliency-slurm-replace-faulty-instance-when"></a>

 HyperPod 自动恢复功能会监控 Slurm 节点的状态是否变为或。`fail` `down`运行 `sinfo` 可检查 Slurm 节点的状态。

如果节点仍然停滞或无响应，并且自动恢复过程无法将其恢复，则可以手动启动恢复。在重启和更换节点之间做出选择取决于问题的性质。遇到临时问题或与软件相关的问题（例如系统挂起、内存泄漏、GPU 驱动程序问题、内核更新或进程挂起）时，可以考虑重新启动。但是，如果您遇到持续存在的问题或与硬件相关的问题，例如故障 GPUs、内存或网络故障、反复出现的运行状况检查失败，或者节点在多次重启尝试后仍然没有响应，则更换节点是更合适的解决方案。

## 手动重启或替换节点的方法
<a name="sagemaker-hyperpod-resiliency-slurm-replace-faulty-instance-ways"></a>

SageMaker HyperPod 提供了两种手动恢复节点的方法。首选方法是使用 R SageMaker HyperPod eboot and Replace APIs，它提供了更快、更透明的恢复流程，适用于所有协调器。或者，你可以使用传统的 Slurm 命令`scontrol update`，比如，尽管这种传统方法需要直接访问 Slurm 的控制器节点。这两种方法都激活相同的 SageMaker HyperPod 恢复过程。

## 使用重启 API 手动重启节点
<a name="sagemaker-hyperpod-resiliency-slurm-replace-faulty-instance-reboot-api"></a>

 您可以使用手动重启 SageMaker HyperPod 集群中出现故障的节点。**BatchRebootClusterNodes**

 以下是使用以下方法在两个集群实例上运行重启操作的示例 AWS Command Line Interface：

```
 aws sagemaker batch-reboot-cluster-nodes \
                --cluster-name arn:aws:sagemaker:ap-northeast-1:123456789:cluster/test-cluster \
                --node-ids i-0123456789abcdef0 i-0fedcba9876543210
```

## 使用替换 API 手动替换节点
<a name="sagemaker-hyperpod-resiliency-slurm-replace-faulty-instance-replace-api"></a>

 您可以使用手动替换 SageMaker HyperPod 集群中出现故障的节点。**BatchReplaceClusterNodes**

 以下是使用以下方法对集群的两个实例运行替换操作的示例 AWS Command Line Interface：

```
 aws sagemaker batch-replace-cluster-nodes \
                --cluster-name arn:aws:sagemaker:ap-northeast-1:123456789:cluster/test-cluster \
                --node-ids i-0123456789abcdef0 i-0fedcba9876543210
```

## 使用 Slurm 手动重启节点
<a name="sagemaker-hyperpod-resiliency-slurm-replace-faulty-instance-reboot"></a>

你也可以使用 scontrol Slurm 命令来触发节点恢复。这些命令直接与 Slurm 控制平面交互并调用相同的底层 SageMaker HyperPod 恢复机制。

在以下命令中，<ip-ipv4>替换为要重启的故障实例的 Slurm 节点名称（主机名）。

```
scontrol update node=<ip-ipv4> state=fail reason="Action:Reboot"
```

这会将该节点标记为失败，原因是指定的。 SageMaker HyperPod 检测到这一点并重启实例。避免在操作期间更改节点状态或重新启动 Slurm 控制器。

## 使用 Slurm 手动替换节点
<a name="sagemaker-hyperpod-resiliency-slurm-replace-faulty-instance-replace"></a>

您可以按如下方式使用 scontrol 更新命令来替换节点。

在以下命令中，`<ip-ipv4>`替换为要替换的故障实例的 Slurm 节点名称（主机名）。

```
scontrol update node=<ip-ipv4> state=fail reason="Action:Replace"
```

运行此命令后，节点将进入`fail`状态，等待当前正在运行的作业完成，替换为运行正常的实例，然后使用相同的主机名进行恢复。这一过程所需的时间取决于可用性区域中的可用实例以及运行生命周期脚本所需的时间。在更新和替换过程中，避免再次手动更改节点状态或重启 Slurm 控制器；否则会导致替换失败。如果节点长时间无法恢复或转为 `idle` 状态，请联系 [AWS 支持](https://console.aws.amazon.com/support/)。

## 手动强制更改节点
<a name="sagemaker-hyperpod-resiliency-slurm-replace-faulty-instance-force"></a>

如果故障节点持续停留在 `fail` 状态，最后的办法就是手动强制将节点状态更改为 `down`。这需要管理员权限（sudo 权限）。

**警告**  
在运行以下命令之前请谨慎操作，因为它会强制终止所有作业，您可能会丢失所有未保存的工作。

```
scontrol update node=<ip-ipv4> state=down reason="Action:Replace"
```

# 使用 Slurm 持续配置以增强集群操作
<a name="sagemaker-hyperpod-scaling-slurm"></a>

使用 Slurm 编排创建的 Amazon SageMaker HyperPod 集群现在支持持续配置，该功能可在运行大规模工作负载时提高灵活性和效率。 AI/ML 持续预调配功能可让您快速启动训练、无缝扩展、在不中断操作的情况下执行维护，并对集群操作拥有精细可见性。

**注意**  
对于使用 Slurm 编排创建的新 HyperPod 集群，可将持续配置作为可选配置提供。目前无法将使用先前扩展模型的现有集群迁移到持续配置。

## 工作原理
<a name="sagemaker-hyperpod-scaling-slurm-how"></a>

持续配置系统引入了理想状态架构，取代了传统的 all-or-nothing扩展模型。在之前的模型中，如果无法完全配置任何实例组，则整个集群的创建或更新操作将失败并回滚。通过持续配置，系统会接受部分容量，并继续异步配置剩余的实例。

持续预调配系统：
+ **接受请求**：记录每个实例组的目标实例数。
+ **启动配置**：开始并行启动所有实例组的实例。
+ **首先配置优先级节点**：成功配置至少一个控制器节点（如果指定了登录实例组，则还包括一个登录节点）`InService`后，集群将过渡到。
+ **跟踪进度**：监控每次实例启动尝试并记录状态。
+ **处理失败**：自动异步重试工作节点失败的启动。

默认情况下，持续预调配功能处于禁用状态。要使用此功能，请在`NodeProvisioningMode``CreateCluster`请求`Continuous`中设置为。

启用持续预调配功能后，您可以同时启动多个扩展操作，无需等待之前的操作完成。这使您能够同时扩展同一个集群中不同的实例组，并向同一个实例组提交多个扩展请求。

## 基于优先级的配置
<a name="sagemaker-hyperpod-scaling-slurm-priority"></a>

Slurm 集群需要控制器节点才能运行，然后工作节点才能注册和接受作业。持续资源调配通过基于优先级的资源调配自动处理此问题：

1. 首先配置控制器实例组。

1. 一旦一个控制器节点运行正常，登录节点和工作节点就会开始并行配置。

1. `InService`当一个控制器节点启动而一个登录节点已启动时（如果指定了登录实例组），则集群将过渡到。如果未指定登录实例组，则集群将在配置控制器节点后立即转换为。`InService`

1. 由于容量限制而无法立即配置的工作节点会进入异步重试循环，并在可用时自动添加到 Slurm 集群。

## 控制器故障处理
<a name="sagemaker-hyperpod-scaling-slurm-controller-failure"></a>

在创建集群期间，如果控制器节点无法配置，则行为取决于错误是可重试还是不可重试。

**可重试的错误**（例如，不健康的实例或暂时性故障）：
+ HyperPod 持续替换实例并重试配置，直到控制器启动为止。
+ 已经配置的工作节点和登录节点仍然可用，但是`InService`直到控制器运行状况良好，集群才会过渡到。

**不可重试的错误**（例如，控制器实例类型没有可用容量或生命周期脚本失败）：
+ 该群集被标记为`Failed`。
+ 您将收到失败原因的通知，并且必须采取纠正措施，例如选择不同的实例类型、修复生命周期脚本或在其他可用区重试。

## 先决条件
<a name="sagemaker-hyperpod-scaling-slurm-prerequisites"></a>

持续配置要求通过每个实例组字段中的 API 负载提供 Slurm 配置参数（节点类型、分区名称）。`SlurmConfig`依赖于 Amazon S3 中旧`provisioning_parameters.json`文件的集群与持续配置不兼容。

**注意**  
Slurm 集群的持续配置目前不支持以下功能：迁移现有集群、通过基于 API 的 Slurm 拓扑进行多头节点配置，以及。`SlurmConfigStrategy`持续资源调配仅在合并模式下运行，便于`slurm.conf`管理。

## 使用计量
<a name="sagemaker-hyperpod-scaling-slurm-metering"></a>

HyperPod 具有持续预配功能的集群使用实例级计量来提供反映实际资源使用情况的准确账单。这种计量方法不同于传统的集群级别计费，它会对每个实例进行独立跟踪。

**实例级别计费**

利用持续预调配功能，计费将在单个实例级别开始和停止，而不是等待集群级别的状态变化。此方法具有以下优势：
+ **精准的计费准确性**：生命周期脚本开始执行时，开始计费。如果生命周期脚本失败，则将重试实例配置，并向您收取生命周期脚本运行时间的费用。
+ **独立计量**：每个实例的账单生命周期均单独管理，防止出现级联计费错误。
+ **实时账单更新**：计费从实例开始执行其生命周期配置脚本时开始，在实例进入终止状态时停止。

**计费生命周期**

 HyperPod 集群中的每个实例都遵循以下账单生命周期：
+ **计费开始**：当实例成功启动并开始执行其生命周期配置脚本时。
+ **继续计费**：在实例的整个运行生命周期内。
+ **计费停止**：当实例进入终止状态时，无论终止原因如何。

**注意**  
对于启动失败的实例，不会开始计费。如果因容量不足或其他问题导致实例启动失败，您无需为失败的尝试付费。计费在实例级别计算，费用将汇总并显示在集群的 Amazon 资源名称（ARN）下。

## 创建一个已启用持续预调配的集群
<a name="sagemaker-hyperpod-scaling-slurm-create"></a>

**注意**  
准备生命周期配置脚本并将其上传到您的执行角色可以访问的 Amazon S3 存储桶。有关更多信息，请参阅 [SageMaker HyperPod Slurm 集群操作](sagemaker-hyperpod-operate-slurm.md)。

准备一个 JSON 格式的 `CreateCluster` API 请求文件。设置`NodeProvisioningMode`为`Continuous`并在每个实例组的字段中提供 Slurm 拓扑信息。`SlurmConfig`

```
// create_cluster.json
{
    "ClusterName": "my-training-cluster",
    "NodeProvisioningMode": "Continuous",
    "Orchestrator": {
        "Slurm": {}
    },
    "InstanceGroups": [
        {
            "InstanceGroupName": "controller-group",
            "InstanceType": "ml.m5.xlarge",
            "InstanceCount": 1,
            "LifeCycleConfig": {
                "SourceS3Uri": "s3://amzn-s3-demo-bucket/lifecycle-scripts/src/",
                "OnCreate": "on_create.sh"
            },
            "ExecutionRole": "arn:aws:iam::111122223333:role/iam-role-for-cluster",
            "SlurmConfig": {
                "NodeType": "Controller"
            }
        },
        {
            "InstanceGroupName": "login-group",
            "InstanceType": "ml.m5.xlarge",
            "InstanceCount": 1,
            "LifeCycleConfig": {
                "SourceS3Uri": "s3://amzn-s3-demo-bucket/lifecycle-scripts/src/",
                "OnCreate": "on_create.sh"
            },
            "ExecutionRole": "arn:aws:iam::111122223333:role/iam-role-for-cluster",
            "SlurmConfig": {
                "NodeType": "Login"
            }
        },
        {
            "InstanceGroupName": "worker-gpu-a",
            "InstanceType": "ml.p5.48xlarge",
            "InstanceCount": 16,
            "LifeCycleConfig": {
                "SourceS3Uri": "s3://amzn-s3-demo-bucket/lifecycle-scripts/src/",
                "OnCreate": "on_create.sh"
            },
            "ExecutionRole": "arn:aws:iam::111122223333:role/iam-role-for-cluster",
            "SlurmConfig": {
                "NodeType": "Compute",
                "PartitionNames": ["gpu-training"]
            }
        }
    ],
    "VpcConfig": {
        "SecurityGroupIds": ["sg-12345678"],
        "Subnets": ["subnet-12345678"]
    }
}
```

运行`create-cluster`命令提交请求。

```
aws sagemaker create-cluster \
    --cli-input-json file://complete/path/to/create_cluster.json
```

这将返回新集群的 ARN。

```
{
    "ClusterArn": "arn:aws:sagemaker:us-west-2:111122223333:cluster/abcde12345"
}
```

## Slurm 配置管理
<a name="sagemaker-hyperpod-scaling-slurm-config"></a>

持续资源调配仅在合并模式下运行，用于`slurm.conf`分区管理。在合并模式下 HyperPod，将其分区配置更改添加到您所修改的内容之上。`slurm.conf` HyperPod 仅更新与分区相关的部分`slurm.conf`（例如分区名称和节点名称条目）；其他 Slurm 配置参数不会被修改。这意味着：
+ 您对的手动编辑`slurm.conf`将被保留。
+ 无法自动检测偏差，也无法解决您的修改与 HyperPod预期状态之间的冲突。

持续配置不支持`SlurmConfigStrategy`参数 (`Managed``Merge`,,`Overwrite`)。传递任何`SlurmConfigStrategy`值都会导致 API 错误。

# SageMaker HyperPod 集群管理
<a name="sagemaker-hyperpod-cluster-management-slurm"></a>

以下主题讨论了日志记录和管理 SageMaker HyperPod 集群。

## 记录 SageMaker HyperPod 事件
<a name="sagemaker-hyperpod-cluster-management-slurm-logging-hyperpod-events"></a>

来自的所有事件和日志 SageMaker HyperPod 都以日志组名称保存到 Amazon CloudWatch `/aws/sagemaker/Clusters/[ClusterName]/[ClusterID]`。每次调用 `CreateCluster` API 都会创建一个新的日志组。以下列表包含每个日志组收集的所有可用日志流。


|  |  | 
| --- |--- |
| 日志组名称 | 日志流名称 | 
| /aws/sagemaker/Clusters/[ClusterName]/[ClusterID] | LifecycleConfig/[instance-group-name]/[instance-id] | 

## SageMaker HyperPod 在实例级别进行日志记录
<a name="sagemaker-hyperpod-cluster-management-slurm-logging-at-instance-level"></a>

您可以访问在集群实例配置 CloudWatch 期间发布到的 LifecycleScript 日志。创建的集群中的每个实例都会生成单独的日志流，以 `LifecycleConfig/[instance-group-name]/[instance-id]` 格式区分。

写入的所有日志都将`/var/log/provision/provisioning.log`上传到前面的 CloudWatch 流中。 LifecycleScripts 在[https://github.com/aws-samples/awsome-distributed-training/tree/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config](https://github.com/aws-samples/awsome-distributed-training/tree/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config)将他们`stdout`和重定向`stderr`到此位置时示例。如果您使用的是自定义脚本，请将日志写入可用的`/var/log/provision/provisioning.log`位置 CloudWatch。

**生命周期脚本日志标记**

CloudWatch 生命周期脚本的日志包含特定的标记，可帮助您跟踪执行进度并识别问题：


|  |  | 
| --- |--- |
| Marker | 描述 | 
| START | Indicates the beginning of lifecycle script logs for the instance | 
| [SageMaker] Lifecycle scripts were provided, with S3 uri: [s3://bucket-name/] and entrypoint script: [script-name.sh] | Indicates the S3 location and entrypoint script that will be used | 
| [SageMaker] Downloading lifecycle scripts | Indicates scripts are being downloaded from the specified S3 location | 
| [SageMaker] Lifecycle scripts have been downloaded | Indicates scripts have been successfully downloaded from S3 | 
| [SageMaker] The lifecycle scripts succeeded | Indicates successful completion of all lifecycle scripts | 
| [SageMaker] The lifecycle scripts failed | Indicates failed execution of lifecycle scripts | 

这些标记可帮助您快速确定问题在生命周期脚本执行过程中的哪个位置出现。排除故障时，请查看日志条目以确定进程在何处停止或失败。

**生命周期脚本失败消息**

如果生命周期脚本存在但在执行过程中失败，您将收到一条包含 CloudWatch 日志组名称和日志流名称的错误消息。如果多个实例出现生命周期脚本故障，则错误消息将仅显示一个失败的实例，但日志组应包含所有实例的流。

您可以通过运行 [DescribeCluster](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DescribeCluster.html)API 或在 SageMaker 控制台中查看集群详细信息页面来查看错误消息。控制台中提供了 “**查看生命周期脚本日志**” 按钮，可直接导航到 CloudWatch 日志流。错误消息采用以下格式：

```
Instance [instance-id] failed to provision with the following error: "Lifecycle scripts did not run successfully. To view lifecycle script logs,
visit log group ‘/aws/sagemaker/Clusters/[cluster-name]/[cluster-id]' and log stream ‘LifecycleConfig/[instance-group-name]/[instance-id]’.
If you cannot find corresponding lifecycle script logs in CloudWatch, please make sure you follow one of the options here:
https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-hyperpod-faq-slurm.html#hyperpod-faqs-q1.” Note that multiple instances may be impacted.
```

## 标注资源
<a name="sagemaker-hyperpod-cluster-management-slurm-tagging"></a>

AWS 标签系统可帮助管理、识别、组织、搜索和筛选资源。 SageMaker HyperPod 支持标记，因此您可以将群集作为 AWS 资源进行管理。在创建集群或编辑现有集群期间，您可以为集群添加或编辑标签。要了解有关标记的更多一般信息，请参阅[标记 AWS 资源](https://docs.aws.amazon.com/tag-editor/latest/userguide/tagging.html)。

### 使用 SageMaker HyperPod 控制台 UI
<a name="sagemaker-hyperpod-cluster-management-slurm-tagging-in-console"></a>

在[创建新集群](sagemaker-hyperpod-operate-slurm-console-ui.md#sagemaker-hyperpod-operate-slurm-console-ui-create-cluster)和[编辑集群](sagemaker-hyperpod-operate-slurm-console-ui.md#sagemaker-hyperpod-operate-slurm-console-ui-edit-clusters)时，您可以添加、删除或编辑标签。

### 使用 SageMaker HyperPod APIs
<a name="sagemaker-hyperpod-cluster-management-slurm-tagging-in-api-request"></a>

当您以 JSON 格式编写[CreateCluster](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateCluster.html)或 [UpdateCluster](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_UpdateCluster.html)API 请求文件时，请编辑该`Tags`部分。

### 使用适用于 AI 的 AWS CLI SageMaker 标记命令
<a name="sagemaker-hyperpod-cluster-management-slurm-tagging-using-cli"></a>

**要标记一个集群**

按如下方式使用 [https://docs.aws.amazon.com/cli/latest/reference/sagemaker/add-tags.html](https://docs.aws.amazon.com/cli/latest/reference/sagemaker/add-tags.html)。

```
aws sagemaker add-tags --resource-arn cluster_ARN --tags Key=string,Value=string
```

**要取消标记一个集群**

按如下方式使用 [https://docs.aws.amazon.com/cli/latest/reference/sagemaker/delete-tags.html](https://docs.aws.amazon.com/cli/latest/reference/sagemaker/delete-tags.html)。

```
aws sagemaker delete-tags --resource-arn cluster_ARN --tag-keys "tag_key"
```

**列出资源的标签**

按如下方式使用 [https://docs.aws.amazon.com/cli/latest/reference/sagemaker/list-tags.html](https://docs.aws.amazon.com/cli/latest/reference/sagemaker/list-tags.html)。

```
aws sagemaker list-tags --resource-arn cluster_ARN
```

# SageMaker HyperPod FAQs
<a name="sagemaker-hyperpod-faq-slurm"></a>

使用以下常见问题来解决使用问题 SageMaker HyperPod。

**Topics**
+ [

## 为什么我在 Amazon 中找不到我的 SageMaker HyperPod 集群的日志组 CloudWatch？
](#hyperpod-faqs-q1)
+ [

## 在 Slurm 配置文件（例如`slurm.conf`和）中 HyperPod 管理哪些特定的配置？`gres.conf`
](#hyperpod-faqs-q2)
+ [

## 如何在 Slurm 节点上运行 Docker？ HyperPod
](#hyperpod-faqs-q3)
+ [

## 当我在平台上使用 NVIDIA 集体通信库 (NCCL) 和 Slurm 时，为什么我的并行训练任务会失败？ SageMaker HyperPod
](#hyperpod-faqs-q4)
+ [

## 如何使用本地 NVMe 存储的 P 实例来启动带有 Slurm 的 Docker 或 Enroot 容器？
](#hyperpod-faqs-q5)
+ [

## 如何设置 EFA 安全组？
](#hyperpod-faqs-q6)
+ [

## 如何监控我的 HyperPod 群集节点？ 是否有从中导出的 CloudWatch 指标 HyperPod？
](#hyperpod-faqs-q7)
+ [

## 我能否向 HyperPod 群集节点添加额外的存储空间？ 集群实例的本地实例存储空间有限。
](#hyperpod-faqs-q8)
+ [

## 为什么我的计算节点在重启后显示为“DOWN”或“DRAINED”？
](#hyperpod-faqs-q9)
+ [

## 为什么我的节点总是因内存不足（OOM）问题而被置为不可用状态？
](#hyperpod-faqs-q10)
+ [

## 如何确保在作业完成后正确清理资源？
](#hyperpod-faqs-q11)

## 为什么我在 Amazon 中找不到我的 SageMaker HyperPod 集群的日志组 CloudWatch？
<a name="hyperpod-faqs-q1"></a>

默认情况下，代理日志和实例启动日志会发送到 HyperPod 平台账户的 CloudWatch。如果是用户生命周期脚本，则生命周期配置日志会发送到您的账户 CloudWatch。

如果您使用 HyperPod 服务团队提供的[生命周期脚本示例](sagemaker-hyperpod-lifecycle-best-practices-slurm-slurm-base-config.md)，则可以找到写入的生命周期配置日志`/var/log/provision/provisioning.log`，并且不会遇到此问题。

但是，如果您使用自定义路径从生命周期配置中收集日志，但找不到账户中显示的日志组 CloudWatch，则可能是由于生命周期脚本中指定的日志文件路径与在 HyperPod 集群实例上运行的 CloudWatch 代理所查找的内容不匹配。在这种情况下，这意味着您需要正确设置生命周期脚本以向 CloudWatch 代理发送日志，并相应地设置 CloudWatch 代理配置。要解决问题，请选择以下选项之一。
+ **选项 1：**更新生命周期脚本，将日志写入 `/var/log/provision/provisioning.log`。
+ **选项 2：**更新 CloudWatch 代理以查找用于日志生命周期配置的自定义路径。

  1. 每个 HyperPod 集群实例都包含一个 JSON 格式的 CloudWatch 代理配置文件，位于`/opt/aws/amazon-cloudwatch-agent/sagemaker_cwagent_config.json`。在配置文件中找到字段名 `logs.logs_collected.files.collect_list.file_path`。默认设置为 HyperPod，键值对应`"file_path": "/var/log/provision/provisioning.log"`如中所述。[SageMaker HyperPod 在实例级别进行日志记录](sagemaker-hyperpod-cluster-management-slurm.md#sagemaker-hyperpod-cluster-management-slurm-logging-at-instance-level)以下代码片段显示了 HyperPod 默认配置下 JSON 文件的外观。

     ```
     "logs": {
         "logs_collected": {
             "files": {
                 "collect_list": [
                     {
                         "file_path": "/var/log/provision/provisioning.log",
                         "log_group_name": "/aws/sagemaker/Clusters/[ClusterName]/[ClusterID]",
                         "log_stream_name": "LifecycleConfig/[InstanceGroupName]/{instance_id}",
                         "retention_in_days": -1
                     }
                 ]
             }
         },
         "force_flush_interval": 3
     }
     ```

  1. 用生命周期脚本中使用的自定义路径替换 `"file_path"` 字段名的值。例如，如果您已将生命周期脚本设置为写入 `/var/log/custom-provision/custom-provisioning.log`，请按如下方式更新该值以与之匹配。

     ```
     "file_path": "/var/log/custom-provision/custom-provisioning.log"
     ```

  1. 使用配置文件重新启动 CloudWatch 代理以完成自定义路径的应用。例如，以下 CloudWatch 命令显示如何使用步骤 1 中的 CloudWatch CloudWatch 代理配置文件重新启动代理。有关更多信息，另请参阅对[ CloudWatch 代理进行故障排除](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/troubleshooting-CloudWatch-Agent.html)。

     ```
     sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
         -a fetch-config -m ec2 -s -c \
         file:/opt/aws/amazon-cloudwatch-agent/sagemaker_cwagent_config.json
     ```

## 在 Slurm 配置文件（例如`slurm.conf`和）中 HyperPod 管理哪些特定的配置？`gres.conf`
<a name="hyperpod-faqs-q2"></a>

当您在上创建 Slurm 集群时 HyperPod， HyperPod 代理会根据您的集群创建请求[https://slurm.schedmd.com/slurm.conf.html](https://slurm.schedmd.com/slurm.conf.html)和生命周期脚本`/opt/slurm/etc/`将和[https://slurm.schedmd.com/gres.conf.html](https://slurm.schedmd.com/gres.conf.html)文件设置为管理 Slurm HyperPod 集群。以下列表显示了 HyperPod 代理处理和覆盖的特定参数。

**重要**  
我们强烈建议您不要更改由管理的这些参数 HyperPod。
+ 在中 [https://slurm.schedmd.com/slurm.conf.html](https://slurm.schedmd.com/slurm.conf.html)， HyperPod 设置以下基本参数：`ClusterName``SlurmctldHost`、`PartitionName`、和`NodeName`。

  此外，要启用该[自动节点恢复和自动恢复](sagemaker-hyperpod-resiliency-slurm-auto-resume.md)功能， HyperPod 需要按以下方式设置`TaskPlugin`和`SchedulerParameters`参数。默认情况下， HyperPod 代理将这两个参数设置为所需的值。

  ```
  TaskPlugin=task/none
  SchedulerParameters=permit_job_expansion
  ```
+ 在中 [https://slurm.schedmd.com/gres.conf.html](https://slurm.schedmd.com/gres.conf.html)， HyperPod 管理 G `NodeName` PU 节点。

## 如何在 Slurm 节点上运行 Docker？ HyperPod
<a name="hyperpod-faqs-q3"></a>

为了帮助您在运行的 Slurm 节点上运行 Docker HyperPod， HyperPod 服务团队提供了安装脚本，您可以将这些脚本包含在集群创建的生命周期配置中。要了解更多信息，请参阅 [提供的基本生命周期脚本 HyperPod](sagemaker-hyperpod-lifecycle-best-practices-slurm-slurm-base-config.md) 和 [在 Slurm 计算节点上运行 Docker 容器 HyperPod](sagemaker-hyperpod-run-jobs-slurm-docker.md)。

## 当我在平台上使用 NVIDIA 集体通信库 (NCCL) 和 Slurm 时，为什么我的并行训练任务会失败？ SageMaker HyperPod
<a name="hyperpod-faqs-q4"></a>

默认情况下，Linux 操作系统会设置 `#RemoveIPC=yes` 标志。使用 NCCL 的 Slurm 和 mpirun 作业在非根用户会话下生成进程间通信（IPC）资源。这些用户会话可能会在作业进程中退出。

 当您使用 Slurm 或 mpirun 运行作业时，如果 `systemd` 检测到用户未登录，它将清理 IPC 资源。Slurm 和 mpirun 作业可在用户未登录的情况下运行，但要求您在 systemd 级别禁用清理，转而在 Slurm 级别设置清理。有关更多信息，请参阅 [NCCL 文档中的 Systemd](https://docs.nvidia.com/deeplearning/nccl/user-guide/docs/troubleshooting.html#systemd)。

要在 systemd 级别禁用清理，请完成以下步骤。

1. 如果您正在运行使用 Slurm 和 NCCL 的训练作业，请在文件 `/etc/systemd/logind.conf` 中设置标志 `#RemoveIPC=no`。

1.  默认情况下，Slurm 不会清理共享资源。我们建议您设置 Slurm epilog 脚本来清理共享资源。当您拥有大量共享资源，并且希望在训练作业完成后清理这些资源时，此清理操作很有用。以下为示例脚本。

   ```
   #!/bin/bash
   : <<'SUMMARY'
   Script: epilog.sh
   
   Use this script with caution, as it can potentially delete unnecessary resources and cause issues if you don't use it correctly.
   
   Note: You must save this script in a shared in a shared location that is accessible to all nodes in the cluster, such as /fsx volume.
   Workers must be able to access the script to run the script after jobs.
   
   SUMMARY
   
   # Define the log directory and create it if it doesn't exist
   LOG_DIR="/<PLACEHOLDER>/epilogue" #NOTE: Update PLACEHOLDER to be a shared value path, such as /fsx/epilogue.
   mkdir -p "$LOG_DIR"
   
   # Name the log file using the Slurm job name and job ID
   log_file="$LOG_DIR/epilogue-${SLURM_JOB_NAME}_${SLURM_JOB_ID}.log"
   
   logging() {
       echo "[$(date)] $1" | tee -a "$log_file"
   }
   
   # Slurm epilogue script to clean up IPC resources
   logging "Starting IPC cleanup for Job $SLURM_JOB_ID"
   
   # Clean up shared memory segments by username
   for seg in $(ipcs -m | awk -v owner="$SLURM_JOB_USER" '$3 == owner {print $2}'); do
       if ipcrm -m "$seg"; then
           logging "Removed shared memory segment $seg"
       else
           logging "Failed to remove shared memory segment $seg"
       fi
   done
   
   # Clean up semaphores by username
   for sem in $(ipcs -s | awk -v user="$SLURM_JOB_USER" '$3 == user {print $2}'); do
       if ipcrm -s "$sem"; then
           logging "Removed semaphore $sem"
       else
           logging "Failed to remove semaphore $sem"
       fi
   done
   
   # Clean up NCCL IPC
   NCCL_IPC_PATH="/dev/shm/nccl-*"
   for file in $NCCL_IPC_PATH; do
       if [ -e "$file" ]; then
           if rm "$file"; then
               logging "Removed NCCL IPC file $file"
           else
               logging "Failed to remove NCCL IPC file $file"
           fi
       fi
   done
   logging "IPC cleanup completed for Job $SLURM_JOB_ID"
   exit 0
   ```

   有关 Epilog 参数的更多信息，请参阅 [Slurm 文档](https://slurm.schedmd.com/slurm.conf.html#OPT_Epilog)。

1. 在控制器节点的 `slurm.conf` 文件中，添加一行以指向所创建的 epilog 脚本。

   ```
   Epilog="/path/to/epilog.sh"  #For example: /fsx/epilogue/epilog.sh
   ```

1. 运行以下命令以更改脚本的权限并使其可执行。

   ```
   chown slurm:slurm /path/to/epilog.sh
   chmod +x  /path/to/epilog.sh
   ```

1. 要应用所有更改，请运行 `scontrol reconfigure`。

## 如何使用本地 NVMe 存储的 P 实例来启动带有 Slurm 的 Docker 或 Enroot 容器？
<a name="hyperpod-faqs-q5"></a>

由于头节点的默认根卷通常受到 100GB EBS 卷的限制，因此您需要设置 Docker 和 Enroot 才能使用本地实例存储。 NVMe 要了解如何设置 NVMe 存储并使用它来启动 Docker 容器，请参阅[在 Slurm 计算节点上运行 Docker 容器 HyperPod](sagemaker-hyperpod-run-jobs-slurm-docker.md)。

## 如何设置 EFA 安全组？
<a name="hyperpod-faqs-q6"></a>

如果要创建具有启用 EFA 的实例的 HyperPod 集群，请确保设置安全组以允许所有进出安全组本身的入站和出站流量。要了解更多信息，请参阅[《Amazon EC2 用户指南》](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa-start.html#efa-start-security)中的*步骤 1：准备启用 EFA 的安全组*。

## 如何监控我的 HyperPod 群集节点？ 是否有从中导出的 CloudWatch 指标 HyperPod？
<a name="hyperpod-faqs-q7"></a>

为了获得对集群资源利用率的可观察性，我们建议您将 HyperPod 集群与 Amazon Managed Grafana 和适用于 Promethe HyperPod us 的亚马逊托管服务集成。借助各种开源 Grafana 仪表板和导出器包，您可以导出和可视化与集群资源相关的 HyperPod 指标。要详细了解如何 SageMaker HyperPod 使用亚马逊托管 Grafana 和适用于 Prometheus 的亚马逊托管服务进行设置，请参阅。[SageMaker HyperPod 集群资源监控](sagemaker-hyperpod-cluster-observability-slurm.md)请注意， SageMaker HyperPod 目前不支持向 Amaz CloudWatch on 导出系统指标。

## 我能否向 HyperPod 群集节点添加额外的存储空间？ 集群实例的本地实例存储空间有限。
<a name="hyperpod-faqs-q8"></a>

如果默认实例存储不足以满足工作负载的需要，可以为每个实例配置额外的存储。从 [2024 年 6 月 20 日发布开始，](sagemaker-hyperpod-release-notes.md#sagemaker-hyperpod-release-notes-20240620)您可以向集群中的每个实例再添加一个 Amazon Elastic Block Store (EBS) 卷。 SageMaker HyperPod 请注意，此功能不能应用于 2024 年 6 月 20 日之前创建的现有 SageMaker HyperPod集群实例组。您可以通过修补在 2024 年 6 月 20 日之前创建的现有 SageMaker HyperPod 集群并向其中添加新的实例组来利用此功能。此功能对于 2024 年 6 月 20 日之后创建的任何 SageMaker HyperPod 集群完全有效。

## 为什么我的计算节点在重启后显示为“DOWN”或“DRAINED”？
<a name="hyperpod-faqs-q9"></a>

当使用 `sudo reboot` 而不是 Slurm 的控制接口来重启节点时，通常会发生此情况。要正确重启节点，请使用 Slurm 命令 `scontrol reboot nextstate=resume <list_of_nodes>`。这可确保 Slurm 保持对节点状态的适当控制，并在重启后恢复正常运行。

对于 GPU 实例（如 NVIDIA P5），如果节点无法在 Slurm 的默认时间限制（60 秒）内完成启动过程，也会发生这种情况。要解决此问题，请将 `slurm.conf` 中的 `TimeToResume` 参数的值增至 300 秒。这将为 GPU 实例提供足够的时间来启动和初始化驱动程序。

## 为什么我的节点总是因内存不足（OOM）问题而被置为不可用状态？
<a name="hyperpod-faqs-q10"></a>

当作业超过节点的内存容量时，就会发生 OOM 问题。为防止此类情况发生，请实施 `cgroups` 以对每个作业强制执行内存限制。这可防止单个作业影响整个节点，并提升隔离性与稳定性。

`slurm.conf` 中的设置示例：

```
TaskPlugin=task/cgroup
```

`cgroup.conf` 中的设置示例：

```
CgroupAutomount=yes
ConstrainCores=yes
CgroupPlugin=autodetect
ConstrainDevices=yes
ConstrainRAMSpace=yes
ConstrainSwapSpace=yes
SignalChildrenProcesses=yes
MaxRAMPercent=99
MaxSwapPercent=80
MinRAMSpace=100
```

有关更多信息，请参阅 [Slurm 中的控制组](https://slurm.schedmd.com/cgroups.html)、[Slurm 计算节点的基于 Cgroup 和 PAM 的登录控制](https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/LifecycleScripts/base-config/utils/pam_adopt_cgroup_wheel.sh#L197)以及[为 Slurm 配置 Cgroup](https://catalog.workshops.aws/sagemaker-hyperpod/en-US/07-tips-and-tricks/16-enable-cgroups)。

## 如何确保在作业完成后正确清理资源？
<a name="hyperpod-faqs-q11"></a>

实施 epilogue 脚本，以便在作业完成后自动清理资源。当作业意外崩溃、包含阻碍正常清理的错误或共享内存缓冲区（包括进程和 GPU 驱动程序之间共享的缓冲区）保留已分配状态时，可能无法正常清理资源。

Epilogue 脚本可以执行清除 GPU 内存、删除临时文件和卸载文件系统等任务。当资源未被专门分配给单个作业时，这些脚本会受到一些限制。有关详细说明和示例脚本，请参阅问题[当我在平台上使用 NVIDIA 集体通信库 (NCCL) 和 Slurm 时，为什么我的并行训练任务会失败？ SageMaker HyperPod](#hyperpod-faqs-q4)的第二个要点。有关更多信息，请参阅[启用 Slurm epilog 脚本](https://catalog.workshops.aws/sagemaker-hyperpod/en-US/07-tips-and-tricks/18-slurm-epilogue)。