

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

# SageMaker HyperPod 叢集的自訂 Amazon Machine Image (AMI)
<a name="hyperpod-custom-ami-support"></a>

使用 Amazon SageMaker HyperPod 提供並公開的基本 Amazon Machine Image (AMI)，您可以建置自訂 AMI。使用自訂 AMI，您可以透過預先設定的軟體堆疊、驅動程式自訂、專屬相依性和安全代理程式，為 AI 工作負載建立特殊化環境。此功能讓您不需要使用生命週期組態指令碼進行複雜的啟動後引導。

使用自訂 AMI，您可以標準化不同階段的環境、加速啟動時間，並完全控制執行時期環境，同時利用 SageMaker HyperPod 的基礎設施功能和擴展優勢。這可協助您維持對 AI 基礎設施的控制，同時仍受益於 SageMaker HyperPod 的最佳化基本執行時期。

您可以新增安全代理程式、合規工具和特殊化程式庫，同時保留所有分散式訓練優勢，以建置在 SageMaker HyperPod 效能調校的基礎映像之上。此功能消除了先前需要在基礎設施最佳化與組織安全策略之間進行選擇。

自訂 AMI 體驗與已建立的企業安全工作流程無縫整合。安全團隊會使用 SageMaker HyperPod 的公有 AMIs 做為基礎來建置強化的影像，而 AI 平台團隊可以在透過 SageMaker HyperPod API 建立或更新叢集時指定這些自訂 AMI。API 會驗證映像相容性、處理必要的許可，並維護回溯相容性，以便現有工作流程繼續運作。具有嚴格安全通訊協定的組織可以透過生命週期指令碼，消除在執行時期安裝安全代理程式時容易出錯的替代方案。透過與企業安全實務保持一致，而不是強制組織使其通訊協定適應 SageMaker HyperPod 的限制，自訂 AMI 移除了對執行關鍵 AI 工作負載的有安全意識組織採用的常見障礙。

如需公有 AMI 更新的版本備註，請參閱[公有 AMI 版本](sagemaker-hyperpod-release-public-ami.md)。若要了解如何開始建置自訂 AMI 並在 HyperPod 叢集中使用它，請參閱下列主題。

**Topics**
+ [建置自訂 AMI](hyperpod-custom-ami-how-to.md)
+ [使用自訂 AMI 進行叢集管理](hyperpod-custom-ami-cluster-management.md)

# 建置自訂 AMI
<a name="hyperpod-custom-ami-how-to"></a>

下頁說明如何使用 Amazon SageMaker HyperPod 基礎 AMI 建置自訂 Amazon Machine Image (AMI)。首先選取基礎 AMI，然後使用任何用於建立新映像的常見方法來建立自訂的 AMI，例如 AWS CLI。

## 選取 SageMaker HyperPod 基礎 AMI
<a name="hyperpod-custom-ami-select-base"></a>

您可以透過下列其中一種方法選取 SageMaker HyperPod 基礎 AMI。

### AWS 主控台選擇
<a name="hyperpod-custom-ami-console-selection"></a>

您可以透過 AWS 主控台或使用 `DescribeImages` API 呼叫來選取公有 SageMaker HyperPod AMIs。SageMaker HyperPod AMIs是公有且可見於每個 AWS 帳戶。您可以套用篩選條件來搜尋 Amazon 擁有的公有 AMI，以在 Amazon EC2 AMI 目錄中找到它們。

若要在主控台中尋找 SageMaker HyperPod AMI：

1. 登入 Amazon SNS 主控台。

1. 在左側導覽窗格中選擇 **AMI**。

1. 針對**映像類型**下拉式清單，選取**公有映像**。

1. 在搜尋列篩選條件中，將**擁有者別名**篩選條件設定為 **amazon**。

1. 搜尋字首為 **HyperPod EKS** 的 AMI，然後選取適合您使用案例的 AMI (最好是最新的)。例如，您可以在 Kubernetes 1.31 與 Kubernetes 1.30 之間選擇 AMI。

### 透過 擷取最新的公有 AMI ID AWS CLI
<a name="hyperpod-custom-ami-cli-fetch"></a>

如果您想要一律使用最新版本的公有 AMI，則使用公有 SageMaker HyperPod SSM 參數會更有效率，因為該參數包含 SageMaker HyperPod 發行的最新 AMI ID 值。

下列範例展示如何使用 AWS CLI擷取最新的 AMI ID：

```
aws ssm get-parameter \
  --name "/aws/service/sagemaker-hyperpod/ami/x86_64/eks-1.31-amazon-linux-2/latest/ami-id" \
  --region us-east-1 \
  --query "Parameter.Value" \
  --output text
```

**注意**  
視需要將參數名稱取代為對應的 Kubernetes 版本。例如，如果您想要使用 Kubernetes 1.30，請使用下列參數：`/aws/service/hyperpod/ami/x86_64/eks-1.30-amazon-linux-2/latest/ami-id`。

## 建置您的自訂 AMI
<a name="hyperpod-custom-ami-build"></a>

在您選取了 SageMaker HyperPod 公有 AMI 之後，請使用其做為基礎 AMI，搭配下列其中一種方法建置您自己的自訂 AMI。請注意，這不是用於建置 AMI 的詳盡清單。您可以使用任何您選擇用於建置 AMI 的方法。SageMaker HyperPod 沒有任何特定建議。
+ **AWS 管理主控台**：您可以使用 SageMaker HyperPod AMI 啟動 Amazon EC2 執行個體，進行所需的自訂，然後從該執行個體建立 AMI。
+ **AWS CLI**：執行自訂後，您也可以使用 `aws ec2 create-image` 命令，從現有的 Amazon EC2 執行個體建立 AMI。
+ **HashiCorp Packer**：Packer 是來自 HashiCorp 的開放原始碼工具，可讓您從單一來源組態為多個平台建立相同的機器映像。它支援為 AMIs AWS，以及為其他雲端供應商和虛擬化平台建立映像。
+ **Image Builder**：EC2 Image Builder 是一項全受管 AWS 服務，可讓您更輕鬆地自動建立、維護、驗證、共用和部署 Linux 或 Windows Server 映像。如需詳細資訊，請參閱 [EC2 Image Builder 使用者指南](https://docs.aws.amazon.com/imagebuilder/latest/userguide/what-is-image-builder.html)。

### 使用客戶受管 AWS KMS 加密建置自訂 AMI
<a name="hyperpod-custom-ami-build-kms"></a>

下列各節說明如何使用客戶受管 AWS KMS 金鑰建置自訂 AMI，以加密 HyperPod 叢集磁碟區。如需 HyperPod 中客戶自管金鑰以及授予必要 IAM 和 KMS 金鑰政策許可的詳細資訊，請參閱[SageMaker HyperPod 的客戶受管 AWS KMS key 加密](smcluster-cmk.md)。如果您打算使用透過客戶自管金鑰加密的自訂 AMI，請確保您也透過相同的金鑰來加密 HyperPod 叢集的 Amazon EBS 根磁碟區。

#### AWS CLI 範例：使用 EC2 Image Builder 和 HyperPod 基礎映像建立新的 AMI
<a name="hyperpod-custom-ami-cli-example"></a>

下列範例展示如何使用 Image Builder 搭配 AWS KMS 加密來建立 AMI：

```
aws imagebuilder create-image-recipe \
    name "hyperpod-custom-recipe" \
    version "1.0.0" \
    parent-image "<hyperpod-base-image-id>" \
    block-device-mappings DeviceName="/dev/xvda",Ebs={VolumeSize=100,VolumeType=gp3,Encrypted=true,KmsKeyId=arn:aws:kms:us-east-1:111122223333:key/key-id,DeleteOnTermination=true}
```

#### Amazon EC2 主控台：從 Amazon EC2 建立新的 AMI
<a name="hyperpod-custom-ami-console-example"></a>

若要使用 Amazon EC2 主控台，從 Amazon EC2 執行個體中建立 AMI：

1. 在自訂的 Amazon EC2 執行個體上按一下滑鼠右鍵，然後選擇**建立映像**。

1. 在**加密**區段中，選取**加密快照**。

1. 從下拉式清單中選取您的 KMS 金鑰。例如：`arn:aws:kms:us-east-2:111122223333:key/<your-kms-key-id>` 或使用金鑰別名：`alias/<your-hyperpod-key>`。

#### AWS CLI 範例：從 Amazon EC2 執行個體建立新的 AMI
<a name="hyperpod-custom-ami-cli-create-image"></a>

使用 `aws ec2 create-image` 命令搭配 AWS KMS 加密：

```
aws ec2 create-image \
    instance-id "<instance-id>" \
    name "MyCustomHyperPodAMI" \
    description "Custom HyperPod AMI" \
    block-device-mappings '[
        {
            "DeviceName": "/dev/xvda",
            "Ebs": {
                "Encrypted": true,
                "KmsKeyId": "arn:aws:kms:us-east-1:111122223333:key/key-id",
                "VolumeType": "gp2" 
            }
        }
    ]'
```

# 使用自訂 AMI 進行叢集管理
<a name="hyperpod-custom-ami-cluster-management"></a>

在建置了自訂 AMI 之後，您可以將其用於建立或更新 Amazon SageMaker HyperPod 叢集。您也可以擴增或新增使用新 AMI 的執行個體群組。

## 叢集操作所需的許可
<a name="hyperpod-custom-ami-permissions"></a>

將下列許可新增至操作和設定 SageMaker HyperPod 叢集的叢集管理員使用者。下列政策範例包含叢集管理員執行 SageMaker HyperPod 核心 API，以及使用自訂 AMI 管理 SageMaker HyperPod 叢集的最低許可集。

請注意，AMI 和 AMI EBS 快照共用許可會透過 `ModifyImageAttribute` 和 `ModifySnapshotAttribute` API 許可包含為下列政策的一部分。若要縮減共用許可，您可以採取下列步驟：
+ 將控制 AMI 共用許可的標籤新增至 AMI 和 AMI 快照。例如，您可以將具有 `AllowSharing` 的 AMI 標記為 `true`。
+ 在政策中新增內容金鑰，只允許使用特定標籤標記的 AMI 共用 AMI。

下列政策是縮減的政策，以確保只允許使用 `AllowSharing` 標記為 `true` 的 AMI。

------
#### [ 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 金鑰符合[SageMaker HyperPod 的客戶受管 AWS KMS key 加密](smcluster-cmk.md)中所述的許可。此外，請確定自訂 AMI 的 KMS 金鑰也用來加密叢集的 Amazon EBS 根磁碟區。

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

您可以在 `CreateCluster` 操作的 `ImageId` 欄位中指定自訂 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>"
}'
```