

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

# Amazon EKS 上用于增强集群操作的持续预调配功能
<a name="sagemaker-hyperpod-scaling-eks"></a>

使用 Amazon EKS 编排创建的 Amazon SageMaker HyperPod 集群现在支持持续配置，这是一项新功能，可提高运行大规模 AI/ML 工作负载的灵活性和效率。持续预调配功能可让您快速启动训练、无缝扩展、在不中断操作的情况下执行维护，并对集群操作拥有精细可见性。

**注意**  
对于使用 EKS 编排创建的 HyperPod 集群，可将持续配置作为可选配置提供。通过 Slurm 编排创建的集群会使用不同的扩展模型。

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

持续预调配系统引入了一种期望状态架构，取代了传统的基于请求的模型。这种新架构支持在不同资源级别实现并行、非阻塞操作，同时保持系统稳定性与性能。持续预调配系统：
+ **接受请求**：记录每个实例组的目标实例数
+ **启动预调配**：开始启动实例以达到目标数量

  **跟踪进度**：监控每次实例启动尝试并记录状态
+ **处理失败**：自动重试失败的启动

默认情况下，持续预调配功能处于禁用状态。要使用此功能，必须将 `--node-provisioning-mode` 设置为 `Continuous`。

启用持续预调配功能后，您可以同时启动多个扩展操作，无需等待之前的操作完成。这使您能够同时扩展同一个集群中不同的实例组，并向同一个实例组提交多个扩展请求。

持续配置还允许您访问[DescribeClusterEvent](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DescribeClusterEvent.html)和[ListClusterEvent](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_ListClusterEvents.html)查看详细的事件监控和操作可见性。

## 使用计量
<a name="sagemaker-hyperpod-scaling-eks-metering"></a>

HyperPod 具有持续预配功能的集群使用实例级计量来提供反映实际资源使用情况的准确账单。这种计量方法不同于传统的集群级别计费，它会对每个实例进行独立跟踪。

**实例级别计费**

利用持续预调配功能，计费将在单个实例级别开始和停止，而不是等待集群级别的状态变化。此方法具有以下优势：
+ **精准的计费准确性**：生命周期脚本开始执行时，开始计费。如果生命周期脚本失败，则将重试实例预调配，并按生命周期脚本运行时的持续时间向您收取费用。
+ **独立计量**：每个实例的计费生命周期均单独管理，从而防止级联计费错误
+ **实时计费更新**：实例开始执行其生命周期脚本时，开始计费；实例进入终止状态时，停止计费

**计费生命周期**

 HyperPod 集群中的每个实例都遵循以下账单生命周期：
+ **计费开始**：当实例成功启动并开始执行其生命周期配置脚本时
+ **计费继续**：在实例的整个运行生命周期内
+ **计费停止**：当实例进入终止状态时（无论终止原因如何）

**注意**  
对于启动失败的实例，不会开始计费。如果因容量不足或其他问题导致实例启动失败，您无需为失败的尝试付费。计费在实例级别计算，费用将汇总并显示在集群的 Amazon 资源名称（ARN）下。

## 创建一个已启用持续预调配的集群
<a name="sagemaker-hyperpod-scaling-eks-create"></a>

**注意**  
您必须拥有一个已配置 VPC 联网且已安装所需的 Helm 图表的现有 Amazon EKS 集群。此外，需准备一个生命周期配置脚本并将其上传到执行角色可访问的 Amazon S3 存储桶。有关更多信息，请参阅 [管理由 Amazon EKS 编排的 SageMaker HyperPod 集群](sagemaker-hyperpod-eks-operate.md)。

以下 AWS CLI 操作创建了一个具有一个实例组并启用了持续配置的 HyperPod 集群。

```
aws sagemaker create-cluster \ 
--cluster-name $HP_CLUSTER_NAME \
--orchestrator 'Eks={ClusterArn='$EKS_CLUSTER_ARN'}' \
--vpc-config '{
   "SecurityGroupIds": ["'$SECURITY_GROUP'"],
   "Subnets": ["'$SUBNET'"]
}' \
--instance-groups '{
   "InstanceGroupName": "ig-1",
   "InstanceType": "ml.c5.2xlarge",
   "InstanceCount": 2,
   "LifeCycleConfig": {
      "SourceS3Uri": "s3://'$BUCKET_NAME'",
      "OnCreate": "on_create_noop.sh"
   },
   "ExecutionRole": "'$EXECUTION_ROLE'",
   "ThreadsPerCore": 1,
   "TrainingPlanArn": ""
}' \
--node-provisioning-mode Continuous


// Expected Output:
{
    "ClusterArn": "arn:aws:sagemaker:us-west-2:<account-id>:cluster/<cluster-id>"
}
```

创建集群后，您可以使用[ListClusterNodes](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_ListClusterNodes.html)或[DescribeClusterNode](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DescribeClusterNode.html)来查找有关集群中节点的更多信息。

调用这些操作将返回一个具有以下值之一的[ClusterInstanceStatusDetails](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_ClusterInstanceStatusDetails.html)对象：
+  **Running**：节点运行状况良好，并且已在集群编排工具（EKS）中注册。
+  **Failure**：节点预调配失败，但系统将自动使用新的 EC2 实例重试预调配。
+  **Pending**：正在预调配或重启节点。
+  **ShuttingDown**：节点终止正在进行中。如果终止过程遇到问题，节点将转为 Failure 状态；否则，将成功从集群中移除节点。
+  **SystemUpdating**：该节点正在进行 AMI 修补，可以手动触发，也可以作为修补 cronjob 的一部分触发。
+  **DeepHealthCheckInProgress**: 正在进行[深度运行状况检查 (DHCs)](sagemaker-hyperpod-eks-resiliency-deep-health-checks.md)。此过程所需时间从几分钟到几小时不等，具体取决于测试的性质。运行状况不佳的节点会被替换，运行状况良好的节点会切换至 Running 状态。
+  **NotFound**：用于[BatchAddClusterNodes](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_BatchAddClusterNodes.html)响应，表示在等性重播期间节点已被删除。

## 最低容量要求 (MinCount)
<a name="sagemaker-hyperpod-scaling-eks-mincount"></a>

该 MinCount 功能允许您指定在实例组转换为`InService`状态之前必须成功配置的最小实例数量。此功能可以更好地控制扩展操作，并有助于防止出现部分预配置的实例组无法有效用于训练工作负载的情况。

**重要**  
MinCount 并不能永久保证最低容量。它只能确保当实例组首次变为时，可用的实例数量达到指定的最小数量`InService`。在正常操作期间，例如不健康的实例更换或维护活动， MinCount 可能会出现短暂的下滑。

### 如何 MinCount 运作
<a name="sagemaker-hyperpod-scaling-eks-mincount-how"></a>

当您创建或更新 MinCount 启用状态的实例组时，会发生以下行为：
+ **新实例组**：实例组将保持`Creating`状态，直到至少成功配置 MinCount 实例并准备就绪。达到此阈值后，实例组将转换为`InService`。
+ **现有实例组**：更新 MinCount 现有实例组时，状态将更改为，`Updating`直到满足新 MinCount 要求为止。
+ **持续扩展**：如果大 TargetCount 于 MinCount，则持续扩展系统将继续尝试启动其他实例，直到达到 TargetCount 该值。
+ **超时和回滚**：如果在 3 小时内 MinCount 无法满足，系统会自动将实例组回滚到其上次已知的良好状态。有关回滚行为的更多信息，请参阅[自动回滚](#sagemaker-hyperpod-scaling-eks-mincount-rollback)行为。

### MinCount 操作期间的实例组状态
<a name="sagemaker-hyperpod-scaling-eks-mincount-status"></a>

 MinCount 已配置的实例组表现出以下状态行为：

Creating  
对于新的实例组 CurrentCount < MinCount. 在满足最低容量要求之前，实例组将保持此状态。

Updating  
对于现有实例组 MinCount ，当修改时和 CurrentCount < MinCount. 在满足新的最低容量要求之前，实例组将保持此状态。

InService  
当 MinCount ≤ CurrentCount ≤ 时 TargetCount。实例组已准备就绪，所有变更操作均已解锁。

在`Creating`或`Updating`状态期间，以下限制适用：
+ 诸如`BatchAddClusterNodes`、`BatchDeleteClusterNodes`或之类的变异操作`UpdateClusterSoftware`被阻止
+ 您仍然可以修改 MinCount 和 TargetCount 值以更正配置错误
+ 始终允许删除集群和实例组

### 自动回滚行为
<a name="sagemaker-hyperpod-scaling-eks-mincount-rollback"></a>

如果某个实例组无法 MinCount 在 3 小时内到达其状态，则系统会自动启动回滚以防止无限期等待：
+ **新实例组**： MinCount 和重置 TargetCount 为 (0, 0)
+ **现有实例组**： MinCount TargetCount 和从上次`InService`状态恢复到其值
+ **选择要终止的实例：如果需要在回滚期间终止实例，则系统会先选择运行状况不佳的实例，然后选择最近配置**的实例。
+ **状态转**换：实例组在启动回滚后立即转换为`InService`状态，允许持续扩展系统根据回滚设置管理容量

每次更新时，3 小时的超时 MinCount 都会重置。例如，如果您 MinCount 多次更新，则超时时间将从最近一次更新重新开始。

### MinCount 事件
<a name="sagemaker-hyperpod-scaling-eks-mincount-events"></a>

系统会发出特定事件来帮助您跟踪 MinCount 操作：
+ **已达到最低容量**：当实例组成功到达其容量 MinCount 并过渡到时发出 `InService`
+ **已启动回滚**：在 3 小时超时到期且自动回滚开始时发出

您可以使用监控这些事件[ListClusterEvents](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_ListClusterEvents.html)来跟踪 MinCount 操作进度。

### API 使用
<a name="sagemaker-hyperpod-scaling-eks-mincount-api"></a>

MinCount 使用实例组配置中的`MinInstanceCount`参数指定：

```
aws sagemaker create-cluster \
--cluster-name $HP_CLUSTER_NAME \
--orchestrator 'Eks={ClusterArn='$EKS_CLUSTER_ARN'}' \
--vpc-config '{
   "SecurityGroupIds": ["'$SECURITY_GROUP'"],
   "Subnets": ["'$SUBNET'"]
}' \
--instance-groups '{
   "InstanceGroupName": "worker-group",
   "InstanceType": "ml.p4d.24xlarge",
   "InstanceCount": 64,
   "MinInstanceCount": 50,
   "LifeCycleConfig": {
      "SourceS3Uri": "s3://'$BUCKET_NAME'",
      "OnCreate": "on_create.sh"
   },
   "ExecutionRole": "'$EXECUTION_ROLE'"
}' \
--node-provisioning-mode Continuous
```

 MinCount 使用时的关键注意事项：
+ `MinInstanceCount`必须介于[CreateCluster](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateCluster.html)或[UpdateCluster](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_UpdateCluster.html)请求中指定的实例组的 0 和`InstanceCount`（含）值之间
+ 设置`MinInstanceCount`为 0（默认）可保留标准的连续缩放行为
+ 设置为`MinInstanceCount`等于`InstanceCount`提供 all-or-nothing缩放行为
+ MinCount 仅适用于设置为的`NodeProvisioningMode`集群 `Continuous`