

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

# AWS PCS 中的容量预留
<a name="working-with_capacity-reservations"></a>

 您可以使用按需 EC2 容量预留或 Amazon Capacity Blocks for ML 在特定可用区域中预留特定时间段的 Amazon EC2 容量，以确保在需要时有必要的计算容量可用。

 **按需容量预留 (ODCRs)** 允许您在特定可用区内为 Amazon EC2 实例预留任意持续时间的计算容量。您可以随时创建和取消预订，无需长期承诺或预付款。 ODCRs 当您需要灵活的容量预留时，这是理想的选择，可以根据需求的变化进行修改。有关更多信息，请参阅 *Amazon 弹性计算云用户指南*中的[按需容量预留](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-capacity-reservations.html)。

 **Amazon EC2 Capacity Blocks for ML** 允许您最多提前 8 周预留基于 GPU 的加速计算实例以备将来使用。您可以预留 1-64 个实例的区块，持续时间从 1 天到 6 个月不等。Capacity Blocks 非常适合需要在特定时间保证访问 GPU 容量的机器学习工作负载。有关更多信息，请参阅 *Amazon 弹性计算云用户指南*中的[机器学习容量块](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-capacity-blocks.html)。

**Topics**
+ [ODCRs 与 AWS PCS 一起使用](capacity-reservations-odcr.md)
+ [将 Amazon EC2 容量块用于带有 AWS PCS 的机器学习](capacity-blocks.md)

# ODCRs 与 AWS PCS 一起使用
<a name="capacity-reservations-odcr"></a>

 您可以选择 AWS PCS 如何使用您的预留实例。如果您创建了**开放**的 ODCR，则您的账户中 AWS PCS 或其他进程启动的任何匹配实例都将计入预留中。对于**定**向 ODCR，只有使用特定预留 ID 启动的实例才会计入预留。对于时间敏感型工作负载，定向 ODCRs 更为常见。

 您可以将 AWS PCS 计算节点组配置为使用目标 ODCR，方法是将其添加到启动模板中。以下是执行此操作的步骤：

1.  使用 [Amazon EC2 创建容量预留用户指南创建有针对性的按需容量预留](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/capacity-reservations-create.html) (ODCR)。

1.  将 ODCR 与启动模板关联。有两种方法可以做到这一点：

   1.  **直接关联 ODCR：**直接在启动模板中引用 ODCR ID。这种方法提供了严格的容量控制并且不支持实例回填（如果计算节点组请求的实例数超过 ODCR 中的可用实例，则不会启动其他实例）。

   1.  **容量预留组关联：**将 ODCR 添加到容量预留组并在启动模板中引用该组。此方法支持实例回填，允许 AWS PCS 在超过预留容量时启动其他按需实例。

1.  创建或更新 AWS PCS 计算节点组以使用启动模板。有关更多信息，请参阅 [AWS PCS 计算节点组用户指南](https://docs.aws.amazon.com/pcs/latest/userguide/working-with_cng.html)。

   1. 将计算节点组`purchaseOption`的设置为`ONDEMAND`。

## 示例：预留并使用带有目标 ODCR 的 hpc6a.48xlarge 实例
<a name="capacity-reservations-odcr-example"></a>

 此示例命令为 32 个 hpc6a.48xlarge 实例创建目标 ODCR。要在置放群组中启动预留实例，请`--placement-group-arn`向命令中添加。您可以使用`--end-date`和定义停止日期`--end-date-type`，否则预留将一直持续到手动终止。

```
aws ec2 create-capacity-reservation \
    --instance-type hpc6a.48xlarge \
    --instance-platform Linux/UNIX \
    --availability-zone us-east-2a \
    --instance-count 32 \
    --instance-match-criteria targeted
```

 此命令的结果将是新 ODCR 的 ARN。ODCR ID 可以从 `"arn:aws:ec2:us-east-2:123456789012:capacity-reservation/ODCR-ID"` ARN 中检索，也可以使用 A [mazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeCapacityReservations.html) 检索。 DescribeCapacityReservations

 **直接 ODCR 关联：**将 ODCR ID 添加到启动模板中。以下是引用 ODCR ID 的启动模板示例。

```
{
  "CapacityReservationSpecification": {
    "CapacityReservationTarget": {
      "CapacityReservationId": "cr-1234567890abcdef1"
    }
  }
}
```

 **容量预留组关联：**创建容量预留组并将该组添加到启动模板中。以下命令创建名为的容量预留组`EXAMPLE-CR-GROUP`。

```
aws resource-groups create-group \
    --name EXAMPLE-CR-GROUP \
    --configuration \
        '{"Type": "AWS::EC2::CapacityReservationPool"}' \
        '{"Type": "AWS::ResourceGroups::Generic", "Parameters": [{"Name": "allowed-resource-types", "Values": ["AWS::EC2::CapacityReservation"]}]}'
```

 以下命令将 ODCR 添加到容量预留组。

```
aws resource-groups group-resources --group EXAMPLE-CR-GROUP \
    --resource-arns arn:aws:ec2:us-east-2:123456789012:capacity-reservation/cr-1234567890abcdef1
```

 创建 ODCR 并将其添加到容量预留组后，现在可以通过将其添加到启动模板来将其连接到 AWS PCS 计算节点组。以下是引用容量预留组的启动模板示例。

```
{
  "CapacityReservationSpecification": {
    "CapacityReservationResourceGroupArn": "arn:aws:resource-groups:us-east-2:123456789012:group/EXAMPLE-CR-GROUP"
  }
}
```

 最后，创建或更新 AWS PCS 计算节点组以使用 hpc6a.48xlarge 实例，并使用引用 ODCR 的启动模板。对于静态节点组，将最小和最大实例数设置为预留的大小 (32)。对于动态节点组，请将最小实例数设置为 0，将最大实例设置为所需的实例大小。

 此示例是为一个计算节点组配置的单个 ODCR 的简单实现。但是， AWS PCS 支持许多其他设计。例如，您可以将一个大型 ODCR 或容量预留组细分为多个计算节点组。或者 ODCRs ，您可以使用其他 AWS 账户创建并与您共享的账户。

 有关更多信息，请参阅 *Amazon 弹性计算云用户指南*中的[机器学习按需容量预留和容量块](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/capacity-reservation-overview.html)。

# 将 Amazon EC2 容量块用于带有 AWS PCS 的机器学习
<a name="capacity-blocks"></a>

适用于 ML 的 Amazon EC2 容量块是一种 Amazon EC2 购买选项，允许您提前付费在特定日期和时间范围内预留基于 GPU 的加速计算实例，以支持短期工作负载。在容量块内运行的实例会自动放置在 Amazon EC2 中 UltraClusters，以实现低延迟、PB 级的无阻塞联网。有关更多信息，请参阅 *Amazon 弹性计算云用户指南*中的[机器学习容量块](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-capacity-blocks.html)。

您可以使用启动模板让 AWS PCS 在为计算节点组启动实例时使用容量块。

**注意**  
AWS 自 Slurm 版本 24.05 以来，PCS 引入了对容量块的支持。

## 限制
<a name="capacity-blocks-limitations"></a>
+ AWS PCS 仅支持 p5en、p5e、P5 和 P4d 实例系列的容量块。
+ 一次只能将一个计算节点组与 1 个容量块相关联。
+ 您无法将计算节点组与组合了多个容量块的容量预留组相关联。
+ 容量块必须处于`scheduled`或`active`状态才能与 AWS PCS 配合使用。您不能在其他州使用容量块，例如`payment-failed`。有关更多信息，请参阅 *Amazon 弹性计算云用户指南*中的[查看容量块](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/capacity-blocks-view.html)。

## 容量块到期
<a name="capacity-blocks-expiration"></a>

容量区块仅限于特定的日期和时间范围。当容量块过期时：
+ 与该容量块关联的计算节点组继续存在并保持与相同队列的关联。
+ 根据您的 Slurm 设置，计算节点组中的所有实例都将终止，活动作业可能会失败。
+ AWS PCS 无法在计算节点组中启动新实例。
+ 在将另一个计算节点组附加到队列或您更新计算节点组以使用指定新容量块的新启动模板之前，所有已排队或新提交的作业都将保持待处理状态。

# 将 AWS PCS 计算节点组配置为使用容量块
<a name="capacity-blocks-configure-cng"></a>

**将容量块与计算节点组关联**

1. 为 AWS PCS 创建一个 Amazon EC2 启动模板，指定您的容量区块。有关为 AWS PCS 创建启动模板的更多信息，请参阅[在 AWS PCS 上使用亚马逊 EC2 启动模板](working-with_launch-templates.md)。

   您的启动模板必须包括：
   + `MarketType`的值`InstanceMarketOptions`必须设置为`capacity-block`。
   + `CapacityReservationSpecification`具有有效值的 A `CapacityReservationId`
   + 与您购买的容量块的实例类型相匹配的有效`InstanceType`值。

1. 创建使用启动模板的计算节点组。有关更多信息，请参阅 [在 AWS PCS 中创建计算节点组](working-with_cng_create.md)。您也可以更新现有的计算节点组以使用启动模板。有关更多信息，请参阅 [更新 AWS PCS 计算节点组](working-with_cng_update.md)。

   创建或更新计算节点组时：
   + 您用于创建或更新计算节点组的 IAM 身份必须具有以下权限：

     ```
     ec2:DescribeCapacityReservations
     ```

     有关更多信息，请参阅 [AWS PCS 的最低权限](security-min-permissions.md)。
   + 容量块必须处于`scheduled`或`active`状态。
   + 将计算节点组`purchaseOption`的设置为`CAPACITY_BLOCK`。
   + 计算节点组`maxInstanceCount`的不能超过容量块的大小。
   + 计算节点组的可用区必须与计算节点组的 1 个子网可用区相匹配。

**重要**  
更新计算节点组时，您无法更改其实例类型。您只能使用与计算节点组具有相同实例类型的容量块。如果要将容量块与不同的实例类型一起使用，则必须创建一个新的计算节点组。

# 有关在 AWS PCS 中使用容量块的常见问题
<a name="capacity-blocks-faq"></a>

**我刚刚支付了容量块的费用，并立即尝试将其与 AWS PCS 一起使用，但计算节点组创建失败了。发生了什么？**  
您的容量块可能未处于`scheduled`或`active`状态。在容量块为`scheduled`或之后再试一次`active`。

**我在 AWS PCS 中使用的是容量块，我在扩展到期之前就购买了扩展。如何继续在 AWS PCS 中使用它？**  
您无需执行任何操作即可继续使用 AWS PCS 中的容量块。延期付款成功后，容量区块的结束日期会更新。只要您的容量块未过期，计算节点组就会继续运行。如果您的延期付款失败，则您的容量块将保留`active`，计算节点组将一直运行，直到容量块在其原始结束日期到期。

**如果我的容量块过期，我的排队和正在运行的作业会怎样？**  
在将另一个计算节点组附加到队列或使用新的容量块更新计算节点组之前，在容量块到期之前未启动的排队作业仍处于待处理状态。您仍然可以向队列提交作业。你的 Slurm 设置会影响活跃的作业。默认情况下，活动作业会自动重新排队，但可能会出现错误或失败。

**我的容量限制已过期。我应该做点什么吗？**  
你不必做任何事情。您可以在 Amazon EC2 控制台上查看 EC2 容量预留的状态。当容量块过期时，与该容量块关联的计算节点组将继续存在并处理相同的队列。计算节点组没有任何用于运行作业的实例。您可以删除计算节点组或将其与队列取消关联，以防止用户提交无法运行的作业。

**我想在我的 AWS PCS 计算节点组中使用新的容量块。我应该怎么办？**  
我们建议您创建一个新的计算节点组以使用新的容量块。有关更多信息，请参阅 [将 AWS PCS 计算节点组配置为使用容量块](capacity-blocks-configure-cng.md)。

**如何在集群和服务之间共享 1 个容量块？**  
您可以将容量块拆分到多个集群和服务中。例如，要将容量块拆分为 64 个`p5.48xlarge`实例，其中 20 个节点在 PCS-Cluster-1 上，16 个节点在 PCS-Cluster-2 上，其余节点用于其他服务，请将 PCS-Cluster-1 的和设置为 20，PCS-Cluster-2 的`minInstanceCount`和`maxInstanceCount`设置为 16。

**我能否将 1 个以上的容量块或组合容量与 1 个计算节点组一起使用？**  
不是。 只有 1 个容量块可以与单个计算节点组相关联。 AWS PCS 不支持将多个容量块组合在一起的容量预留组。

**我怎么知道我的容量块何时开始或过期？**  
与 AWS PCS 无关，Amazon EC2 会在容量块预留开始 EventBridge 时发送一个`Capacity Block Reservation Delivered``Capacity Block Reservation Expiration Warning`事件，在容量块预留到期前 40 分钟发送一个事件。有关更多信息，请参阅 *Amazon 弹性计算云用户指南 EventBridge*中的[使用监控容量块](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/capacity-blocks-monitor.html)。

**Slurm 如何跟踪我的容量区块的状态？**  
你可以跑`sinfo`去了解 AWS PCS 是如何使用容量块的。在以下示例输出中，队列与从`active`容量块运行 4 个实例的计算节点组相关联。节点处于 `idle` Slurm 状态（可供使用但尚未分配给任何作业）。  

```
$ sinfo  
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST  
fanout up infinite 4 idle node-fanout-[1-4]
```
如果节点处于`maint`状态，则可以运行`scontrol show res`查看有关控制此状态的 Slurm 预留的详细信息。在以下示例输出中，Capacity Block `scheduled` 的开始日期为 future。  

```
$ scontrol show res                                                                                                  
ReservationName=node-fanout-scheduled StartTime=2025-10-14T13:09:17 EndTime=2025-10-14T13:11:17 Duration=00:02:00    
   Nodes=node-fanout-[1-4] NodeCnt=4 CoreCnt=16 Features=(null) PartitionName=(null) Flags=MAINT,SPEC_NODES          
   TRES=cpu=16                                                                                                       
   Users=root Groups=(null) Accounts=(null) Licenses=(null) State=ACTIVE BurstBuffer=(null)                          
   MaxStartDelay=(null)                                                                                              
   Comment=node-fanout Scheduled
```

**如何判断我在启动容量时遇到的错误是否是因为我的容量块已共享？**  
在 Amazon EC2 控制台中查看**容量预留**，以了解容量块中有多少实例处于活动预置状态。检查每个实例的标签，找出使用它的服务或集群。例如，所有 PCS 实例都有 AWS AWS PCS 标签`aws:pcs:cluster-id = pcs_l0mizqyk5o | aws:pcs:compute-node-group-id = pcs_ic7onkmfqk`，例如用于指示该实例属于哪些集群和计算节点组。然后，您可以检查容量块是否已达到最大容量。  
您可以`scontrol show nodes`用来检查 AWS PCS 集群中的容量块节点是否正在触发`ReservationCapacityExceeded`：  

```
[root@ip-172-16-10-54 ~]# scontrol show nodes test-node-8-gamma-cb-2  
NodeName=test-8-gamma-cb-2 CoresPerSocket=1  
   CPUAlloc=0 CPUEfctv=8 CPUTot=8 CPULoad=0.00  
   AvailableFeatures=test-8-gamma-cb,gpu  
   ActiveFeatures=test-8-gamma-cb,gpu  
   Gres=gpu:H100:1  
   NodeAddr=test-8-gamma-cb-2 NodeHostName=test-8-gamma-cb-2  
   RealMemory=249036 AllocMem=0 FreeMem=N/A Sockets=8 Boards=1  
   State=IDLE+CLOUD+POWERING_DOWN ThreadsPerCore=1 TmpDisk=0 Weight=1 Owner=N/A MCS_label=N/A  
   Partitions=my-q  
   BootTime=None SlurmdStartTime=None  
   LastBusyTime=Unknown ResumeAfterTime=None  
   CfgTRES=cpu=8,mem=249036M,billing=8  
   AllocTRES=  
   CurrentWatts=0 AveWatts=0  
   Reason=Failed to launch backing instance (Error Code: ReservationCapacityExceeded) [root@2025-08-28T15:15:33]
```

**当多个计算节点组连接到同一个队列时，如何强制作业在 Capacity Block 支持的实例上运行？**  
你可以使用 Slurm 的功能和约束将任务锁定到一组特定的节点。我们建议您不要为每个计算节点组设置 Slurm 权重，因为这仅适用于未处于该`maint`状态的节点。