

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

# 使用自定义进行集群管理 AMIs
<a name="hyperpod-custom-ami-cluster-management"></a>

构建自定义 AMI 后，您可以使用它来创建或更新 Amazon SageMaker HyperPod 集群。也可以纵向扩展或添加使用新 AMI 的实例组。

## 集群操作所需的权限
<a name="hyperpod-custom-ami-permissions"></a>

向操作和配置 SageMaker HyperPod 集群的集群管理员用户添加以下权限。以下策略示例包括集群管理员运行 SageMaker HyperPod核心 APIs 并使用自定义 AMI 管理 SageMaker HyperPod 集群的最低权限集。

请注意，AMI 和 AMI EBS 快照共享权限通过 `ModifyImageAttribute` 和 `ModifySnapshotAttribute` API 权限包含在以下策略中。要缩小共享权限的范围，可执行以下步骤：
+ 添加标签以控制对 AMI 和 AMI 快照的 AMI 共享权限。例如，您可以为 AMI 添加标签，将 `AllowSharing` 设置为 `true`。
+ 在策略中添加上下文密钥，仅允许使用特定标签进行 AMIs标记的 AMI 共享。

以下策略是限定范围的策略，以确保只允许 AMIs标`true`有 `AllowSharing` as。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iam::111122223333:role/your-execution-role-name"
        },
        {
            "Effect": "Allow",
            "Action": [
                "sagemaker:CreateCluster",
                "sagemaker:DeleteCluster",
                "sagemaker:DescribeCluster",
                "sagemaker:DescribeClusterNode",
                "sagemaker:ListClusterNodes",
                "sagemaker:ListClusters",
                "sagemaker:UpdateCluster",
                "sagemaker:UpdateClusterSoftware",
                "sagemaker:BatchDeleteClusterNodes",
                "eks:DescribeCluster",
                "eks:CreateAccessEntry",
                "eks:DescribeAccessEntry",
                "eks:DeleteAccessEntry",
                "eks:AssociateAccessPolicy",
                "iam:CreateServiceLinkedRole",
                "ec2:DescribeImages",
                "ec2:DescribeSnapshots"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:ModifyImageAttribute",
                "ec2:ModifySnapshotAttribute"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "ec2:ResourceTag/AllowSharing": "true"
                }
            }
        }
    ]
}
```

------

**重要**  
如果您计划使用已加密的自定义 AMI，请确保 KMS 密钥符合 [客户托管的 AWS KMS key 加密 SageMaker HyperPod](smcluster-cmk.md)中描述的权限要求。此外，请确保自定义 AMI 的 KMS 密钥也用于加密集群的 Amazon EBS 根卷。

## 创建集群
<a name="hyperpod-custom-ami-api-create"></a>

您可以在 `ImageId` 字段中指定用于 `CreateCluster` 操作的自定义 AMI。

以下示例说明如何使用自定义 AMI 创建集群，无论是否使用用于加密集群卷的 AWS KMS 客户托管密钥。

------
#### [ Standard example ]

以下示例说明如何使用自定义 AMI 创建集群。

```
aws sagemaker create-cluster \
   --cluster-name <exampleClusterName> \
   --orchestrator 'Eks={ClusterArn='<eks_cluster_arn>'}' \
   --node-provisioning-mode Continuous \
   --instance-groups '{
   "InstanceGroupName": "<exampleGroupName>",
   "InstanceType": "ml.c5.2xlarge",
   "InstanceCount": 2,
   "LifeCycleConfig": {
      "SourceS3Uri": "<s3://amzn-s3-demo-bucket>",
      "OnCreate": "on_create_noop.sh"
   },
   "ImageId": "<your_custom_ami>",
   "ExecutionRole": "<arn:aws:iam::444455556666:role/Admin>",
   "ThreadsPerCore": 1,
   "InstanceStorageConfigs": [
   
        {
            "EbsVolumeConfig": {
                "VolumeSizeInGB": 200
            }
        }
   ]
}' --vpc-config '{
   "SecurityGroupIds": ["<security_group>"],
   "Subnets": ["<subnet>"]
}'
```

------
#### [ Customer managed key example ]

以下示例说明如何使用自定义 AMI 创建集群，同时指定您自己的 AWS KMS 客户托管密钥来加密集群的 Amazon EBS 卷。可以为根卷和实例存储卷指定不同的客户托管密钥。如果您在`InstanceStorageConfigs`现场不使用客户托管的密钥，则使用 AWS 自有的 KMS 密钥对卷进行加密。如果您对根卷和二级实例存储卷使用不同的密钥，请对两个密钥设置所需的 KMS 密钥策略。

```
aws sagemaker create-cluster \
   --cluster-name <exampleClusterName> \
   --orchestrator 'Eks={ClusterArn='<eks_cluster_arn>'}' \
   --node-provisioning-mode Continuous \
   --instance-groups '{
   "InstanceGroupName": "<exampleGroupName>",
   "InstanceType": "ml.c5.2xlarge",
   "InstanceCount": 2,
   "LifeCycleConfig": {
      "SourceS3Uri": "<s3://amzn-s3-demo-bucket>",
      "OnCreate": "on_create_noop.sh"
   },
   "ImageId": "<your_custom_ami>",
   "ExecutionRole": "<arn:aws:iam:us-east-1:444455556666:role/Admin>",
   "ThreadsPerCore": 1,
   "InstanceStorageConfigs": [
             # Root volume configuration
            {
                "EbsVolumeConfig": {
                    "RootVolume": True,
                    "VolumeKmsKeyId": "arn:aws:kms:us-east-1:111122223333:key/key-id"
                }
            },
            # Instance storage volume configuration
            {
                "EbsVolumeConfig": {
                    "VolumeSizeInGB": 100,
                    "VolumeKmsKeyId": "arn:aws:kms:us-east-1:111122223333:key/key-id"
                }
            }
   ]
}' --vpc-config '{
   "SecurityGroupIds": ["<security_group>"],
   "Subnets": ["<subnet>"]
}'
```

------

## 更新集群软件
<a name="hyperpod-custom-ami-api-update"></a>

如果要使用自定义 AMI 更新集群上的现有实例组，可以使用 `UpdateClusterSoftware` 操作并在 `ImageId` 字段中指定您的自定义 AMI。请注意，除非您在请求中指定特定实例组的名称，否则新映像将应用于集群中的所有实例组。

以下示例说明如何使用自定义 AMI 更新集群的平台软件：

```
aws sagemaker update-cluster-software \
   --cluster-name <exampleClusterName> \
   --instance-groups <instanceGroupToUpdate> \
   --image-id <customAmiId>
```

## 纵向扩展实例组
<a name="hyperpod-custom-ami-scale-up"></a>

以下示例展示了如何使用自定义 AMI 扩展集群的实例组，无论是否使用 AWS KMS 客户托管密钥进行加密。

------
#### [ Standard example ]

以下示例说明如何使用自定义 AMI 纵向扩展实例组。

```
aws sagemaker update-cluster \
    --cluster-name <exampleClusterName> --instance-groups '[{                  
    "InstanceGroupName": "<exampleGroupName>",
   "InstanceType": "ml.c5.2xlarge",
   "InstanceCount": 2,
   "LifeCycleConfig": {
      "SourceS3Uri": "<s3://amzn-s3-demo-bucket>",
      "OnCreate": "on_create_noop.sh"
   },
   "ExecutionRole": "<arn:aws:iam::444455556666:role/Admin>",
   "ThreadsPerCore": 1,
   "ImageId": "<your_custom_ami>"
}]'
```

------
#### [ Customer managed key example ]

以下示例说明如何使用自定义 AMI 更新和扩展集群，同时指定您自己的 AWS KMS 客户托管密钥来加密集群的 Amazon EBS 卷。可以为根卷和实例存储卷指定不同的客户托管密钥。如果您在`InstanceStorageConfigs`现场不使用客户托管的密钥，则使用 AWS 自有的 KMS 密钥对卷进行加密。如果您对根卷和二级实例存储卷使用不同的密钥，请对两个密钥设置所需的 KMS 密钥策略。

```
aws sagemaker update-cluster \
    --cluster-name <exampleClusterName> --instance-groups '[{                  
    "InstanceGroupName": "<exampleGroupName>",
   "InstanceType": "ml.c5.2xlarge",
   "InstanceCount": 2,
   "LifeCycleConfig": {
      "SourceS3Uri": "<s3://amzn-s3-demo-bucket>",
      "OnCreate": "on_create_noop.sh"
   },
   "ExecutionRole": "<arn:aws:iam::444455556666:role/Admin>",
   "ThreadsPerCore": 1,
   "ImageId": "<your_custom_ami>",
   "InstanceStorageConfigs": [
             # Root volume configuration
            {
                "EbsVolumeConfig": {
                    "RootVolume": True,
                    "VolumeKmsKeyId": "arn:aws:kms:us-east-1:111122223333:key/key-id"
                }
            },
            # Instance storage volume configuration
            {
                "EbsVolumeConfig": {
                    "VolumeSizeInGB": 100,
                    "VolumeKmsKeyId": "arn:aws:kms:us-east-1:111122223333:key/key-id"
                }
            }
   ]
}]'
```

------

## 添加实例组
<a name="hyperpod-custom-ami-add-instance-group"></a>

以下示例说明如何使用自定义 AMI 向集群添加实例组：

```
aws sagemaker update-cluster \
   --cluster-name "<exampleClusterName>" \
   --instance-groups '{
   "InstanceGroupName": "<exampleGroupName>",
   "InstanceType": "ml.c5.2xlarge",
   "InstanceCount": 2,
   "LifeCycleConfig": {
      "SourceS3Uri": "<s3://amzn-s3-demo-bucket>",
      "OnCreate": "on_create_noop.sh"
   },
   "ExecutionRole": "<arn:aws:iam::444455556666:role/Admin>",
   "ThreadsPerCore": 1,
   "ImageId": "<your_custom_ami>"
}' '{
   "InstanceGroupName": "<exampleGroupName2>",
   "InstanceType": "ml.c5.2xlarge",
   "InstanceCount": 1,
   "LifeCycleConfig": {
      "SourceS3Uri": "<s3://amzn-s3-demo-bucket>",
      "OnCreate": "on_create_noop.sh"
   },
   "ExecutionRole": "<arn:aws:iam::444455556666:role/Admin>",
   "ThreadsPerCore": 1,
   "ImageId": "<your_custom_ami>"
}'
```