

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

# 使用 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 閘道存取網際網路)
   + 網際網路閘道/NAT 閘道
   + 兩個 Amazon EC2 安全群組
   + 要存放組態檔案的 Amazon FSx 磁碟區

1. 執行下列 CLI 命令來建立名為 的 CloudFormation 堆疊`sagemaker-hyperpod`。在 `PrimarySubnetAZ` 和 `BackupSubnetAZ` 中定義叢集的可用區域 (AZ) ID。例如，{{use1-az4}} 是 `us-east-1` 區域中可用區域的 AZ ID。如需詳細資訊，請參閱[可用區域 ID](https://docs.aws.amazon.com//ram/latest/userguide/working-with-az-ids.html) 和 [跨多個 AZ 設定 SageMaker HyperPod 叢集](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 Amazon RDS for MariaDB 的 憑證

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