

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

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

要在 HyperPod Slurm 集群中设置多个控制器节点，请通过两个 Amazon CloudFormation 堆栈配置 Amazon 资源：和。[预调配基本资源](#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 文件是一个 Amazon CloudFormation 模板，用于定义要为您的 Slurm 集群创建的以下资源。
   + 计算节点实例组的执行 IAM 角色
   + 用于存储生命周期脚本的 Amazon S3 存储桶
   + 公有子网和私有子网（私有子网可通过 NAT 网关访问互联网）
   + 互联网 Gateway/NAT 网关
   + 两个 Amazon EC2 安全组
   + 用于存储配置文件的 Amazon FSx 卷

1. 运行以下 CLI 命令创建名为的 Amazon CloudFormation 堆栈`sagemaker-hyperpod`。在和中 IDs 为您的集群定义可用区 (AZ) `BackupSubnetAZ`。`PrimarySubnetAZ`例如，{{use1-az4}}是该`us-east-1`区域中可用区的可用区 ID。有关更多信息，请参阅[可用区 IDs](https://docs.amazonaws.cn//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}}
   ```

   有关更多信息，请参阅[通过 Amazon Command Line Interface 参考进行部署](https://docs.amazonaws.cn//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. （可选）在 [Amazon CloudFormation 控制台](https://console.amazonaws.cn/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 文件是一个 Amazon CloudFormation 模板，用于定义要为 Slurm 集群中的多个控制器节点支持创建的额外资源。
   + 控制器节点实例组的执行 IAM 角色
   + Amazon RDS for MariaDB 实例
   + Amazon SNS 主题和订阅
   + Amazon Secrets Manager 适用于 MariaDB 的亚马逊 RDS 凭证

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

   ```
   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}}
   ```

   有关更多信息，请参阅[通过 Amazon Command Line Interface 参考进行部署](https://docs.amazonaws.cn//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. （可选）在 [Amazon Cloud Formation 控制台](https://console.amazonaws.cn/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)
   ```