EC2 Capacity Reservation Topology API:启动实例前掌握 GPU 容量的网络拓扑¶
Lab 信息
- 难度: ⭐⭐ 中级
- 预估时间: 20 分钟
- 预估费用: < $0.15(Capacity Reservation 按分钟计费,测试后立即取消)
- Region: us-east-1
- 最后验证: 2026-03-27
背景¶
大规模 AI 训练和 HPC 工作负载中,成百上千的 GPU/Trainium 实例需要高效通信。这些实例在数据中心网络中的物理位置直接影响训练吞吐量——同一网络交换机下的实例通信延迟最低。
之前,AWS 提供了 DescribeInstanceTopology API,让你了解已运行实例的网络拓扑。但问题是:你必须先启动实例才能看到拓扑,这在容量规划阶段为时已晚。
新功能 DescribeCapacityReservationTopology API 解决了这个"先有鸡还是先有蛋"的问题——创建 Capacity Reservation 后、启动实例前,就能看到预留容量在网络层级中的相对位置。
前置条件¶
- AWS 账号,IAM 用户/角色需要
ec2:DescribeCapacityReservationTopology和ec2:CreateCapacityReservation权限 - AWS CLI v2 已配置
- 账号有支持实例类型(g6e/p4d/trn1 等)的 On-Demand 配额
核心概念¶
AWS 网络拓扑模型¶
AWS 数据中心网络分为 3-4 层(Layer),每个实例或 Capacity Reservation 映射到一组 NetworkNodes:
Layer i (顶层) NN-1 ─────────────┐
│ │
Layer ii (中层) NN-2 NN-3
╱ ╲ │
Layer iii (底层) NN-4 NN-5 NN-6
│ │ │ │
实例1 实例2 实例3 实例4
规则:共享的底层 NetworkNode 越多 → 物理距离越近 → 通信延迟越低。
两个 API 的关系¶
| 维度 | DescribeInstanceTopology | DescribeCapacityReservationTopology |
|---|---|---|
| 查询对象 | 运行中的实例 | pending/active 的 Capacity Reservation |
| 使用时机 | 实例启动后,做作业调度 | 实例启动前,做容量规划 |
| NetworkNodes 数量 | 3-4 个 | 1-3 个(取决于 CR 类型) |
| 定价 | 免费 | 免费 |
典型工作流:
- 创建多个 Capacity Reservation → 调用 CR Topology API 了解预留容量的位置关系
- 根据拓扑决定哪些 CR 的容量适合运行紧耦合的训练任务
- 启动实例 → 调用 Instance Topology API 获取更细粒度的拓扑信息
- 基于实例拓扑做精确的作业调度和 rank 分配
支持的实例类型¶
API 仅支持 AI/ML/HPC 实例类型:
- GPU 实例: g6e.*, g7e.*, p3dn.24xlarge, p4d.24xlarge, p4de.24xlarge, p5.48xlarge, p5e.48xlarge, p5en.48xlarge, p6e-gb200.36xlarge, p6-b200.48xlarge, p6-b300.48xlarge
- Trainium 实例: trn1.2xlarge, trn1.32xlarge, trn1n.32xlarge, trn2.48xlarge, trn2u.48xlarge
- HPC 实例: hpc6a.48xlarge, hpc6id.32xlarge, hpc7g.*, hpc7a.*, hpc8a.96xlarge
动手实践¶
Step 1: 验证权限(DryRun)¶
预期输出:DryRunOperation 错误表示权限正常。
Step 2: 创建 Capacity Reservation¶
创建 3 个 CR 用于对比拓扑——2 个在同一 AZ,1 个在不同 AZ:
# CR-1: us-east-1a
aws ec2 create-capacity-reservation \
--instance-type g6e.xlarge \
--instance-platform Linux/UNIX \
--availability-zone us-east-1a \
--instance-count 1 \
--end-date-type unlimited \
--instance-match-criteria open \
--region us-east-1
# 记录输出中的 CapacityReservationId,例如 cr-aaa
# CR-2: us-east-1a(同 AZ)
aws ec2 create-capacity-reservation \
--instance-type g6e.xlarge \
--instance-platform Linux/UNIX \
--availability-zone us-east-1a \
--instance-count 1 \
--end-date-type unlimited \
--instance-match-criteria open \
--region us-east-1
# 记录 cr-bbb
# CR-3: us-east-1b(不同 AZ)
aws ec2 create-capacity-reservation \
--instance-type g6e.xlarge \
--instance-platform Linux/UNIX \
--availability-zone us-east-1b \
--instance-count 1 \
--end-date-type unlimited \
--instance-match-criteria open \
--region us-east-1
# 记录 cr-ccc
费用提示
Capacity Reservation 创建即开始计费(按 On-Demand 费率),即使没有启动实例。g6e.xlarge 约 $0.84/小时。测试完成后请立即取消。
Step 3: 查询 Capacity Reservation 拓扑¶
# 查询所有 CR 的拓扑
aws ec2 describe-capacity-reservation-topology \
--capacity-reservation-ids cr-aaa cr-bbb cr-ccc \
--region us-east-1
Step 4: 在 Cluster Placement Group 中创建 CR(进阶)¶
Cluster Placement Group 能获得更精细的拓扑信息:
# 创建 Cluster Placement Group
aws ec2 create-placement-group \
--group-name topology-test-cpg \
--strategy cluster \
--region us-east-1
# 在 CPG 中创建 CR
aws ec2 create-capacity-reservation \
--instance-type g6e.xlarge \
--instance-platform Linux/UNIX \
--availability-zone us-east-1a \
--instance-count 1 \
--end-date-type unlimited \
--instance-match-criteria open \
--placement-group-arn arn:aws:ec2:us-east-1:<ACCOUNT_ID>:placement-group/topology-test-cpg \
--region us-east-1
# 记录 cr-ddd
# 对比普通 CR 和 CPG CR 的拓扑
aws ec2 describe-capacity-reservation-topology \
--capacity-reservation-ids cr-aaa cr-ddd \
--region us-east-1
Step 5: 按条件过滤查询¶
# 按实例类型过滤
aws ec2 describe-capacity-reservation-topology \
--filters Name=instance-type,Values=g6e.xlarge \
--region us-east-1
# 按 AZ 过滤
aws ec2 describe-capacity-reservation-topology \
--filters Name=availability-zone,Values=us-east-1a \
--region us-east-1
测试结果¶
拓扑对比数据¶
| CR 类型 | AZ | NetworkNodes | 节点数 | 说明 |
|---|---|---|---|---|
| 普通 CR | us-east-1a | nn-a42db... |
1 | 仅上层节点 |
| 普通 CR(同 AZ) | us-east-1a | nn-a42db... |
1 | 共享同一上层节点 ✅ |
| 普通 CR(不同 AZ) | us-east-1b | nn-7fa84... |
1 | 完全不同的节点 |
| CPG 中的 CR | us-east-1a | nn-a42db..., nn-77092... |
2 | 多一层拓扑粒度 |
关键发现¶
1. 同 AZ 内的 CR 共享上层 NetworkNode
两个 us-east-1a 的普通 CR 返回相同的 nn-a42db10b9625f87f8,说明它们在网络层级中位于同一上层节点下——这意味着这两个 CR 中启动的实例将有较好的网络接近性。
2. Cluster Placement Group 提供更精细的拓扑
这是本次实验最重要的发现:
- 普通 CR:返回 1 个 NetworkNode(粗粒度)
- CPG 中的 CR:返回 2 个 NetworkNode(更精细)
CPG CR 的拓扑中,上层节点 nn-a42db... 与普通 CR 一致(验证了层级关系),同时多了底层节点 nn-77092... 提供更精确的位置信息。
这说明:如果你需要精确的容量拓扑信息来优化作业调度,应该在 Cluster Placement Group 中创建 Capacity Reservation。
3. 不支持实例类型的优雅降级
对 m5.large CR 调用 API,返回记录但不包含 NetworkNodes 字段(不报错)。已查文档确认:API 仅支持特定 AI/ML/HPC 实例类型。
4. 已取消 CR 的行为
取消后的 CR 仍返回记录(state=cancelled),但不包含 NetworkNodes。已查文档确认:仅 pending/active 状态的 CR 提供拓扑信息。
边界测试汇总¶
| 场景 | 行为 | 备注 |
|---|---|---|
| 不支持的实例类型 (m5.large) | 返回记录,无 NetworkNodes | 实测发现,官方未明确记录 |
| 已取消的 CR | 返回记录(state=cancelled),无 NetworkNodes | 实测发现,文档仅说"pending/active 可查" |
| DryRun 参数 | 正常工作,返回 DryRunOperation | 与文档一致 |
| 按 AZ/实例类型过滤 | 正确过滤 | 与文档一致 |
踩坑记录¶
注意事项
-
Capacity Reservation 创建即计费 — 即使没有启动实例,CR 也按 On-Demand 费率计费。务必测试完成后立即取消。已查文档确认。
-
MaxResults 最大值仅为 10 — 与 Instance Topology API 的最大值 100 不同,CR Topology API 每页最多返回 10 条记录。管理大量 CR 时需要分页处理。已查 API Reference 确认。
-
Console 不支持查看拓扑 — 只能通过 API/CLI 查询,不提供可视化界面。已查文档确认。
-
普通 CR 的拓扑粒度较粗 — 普通 CR 可能只返回 1 个 NetworkNode。如果需要更精细的拓扑信息,应在 Cluster Placement Group 中创建 CR。实测发现,官方仅说"1-3个取决于CR类型"。
费用明细¶
| 资源 | 单价 | 用量 | 费用 |
|---|---|---|---|
| g6e.xlarge CR × 3 | $0.84/hr | ~3 min | ~$0.13 |
| m5.large CR × 1 | $0.096/hr | ~1 min | ~$0.002 |
| Placement Group | 免费 | - | $0 |
| API 调用 | 免费 | - | $0 |
| 合计 | < $0.15 |
清理资源¶
# 取消所有 Capacity Reservation
aws ec2 cancel-capacity-reservation --capacity-reservation-id cr-aaa --region us-east-1
aws ec2 cancel-capacity-reservation --capacity-reservation-id cr-bbb --region us-east-1
aws ec2 cancel-capacity-reservation --capacity-reservation-id cr-ccc --region us-east-1
aws ec2 cancel-capacity-reservation --capacity-reservation-id cr-ddd --region us-east-1
# 删除 Placement Group(必须先取消其中所有 active CR)
aws ec2 delete-placement-group --group-name topology-test-cpg --region us-east-1
# 确认无残留
aws ec2 describe-capacity-reservations \
--filters Name=state,Values=active,pending \
--region us-east-1
务必清理
Capacity Reservation 持续计费直到取消。Lab 完成后请立即执行清理步骤。
结论与建议¶
适用场景¶
- 大规模分布式训练 — 管理数百个 GPU 实例的容量规划,提前了解预留容量的网络位置
- HPC 作业调度 — 根据拓扑信息决定哪些 CR 的实例适合运行紧耦合任务
- 容量迁移规划 — 评估不同 AZ/Region 的容量布局
最佳实践¶
- 使用 Cluster Placement Group — 如果需要精确拓扑,在 CPG 中创建 CR 可获得更多层级信息
- 结合 Instance Topology API — CR Topology 做规划,Instance Topology 做运行时调度
- 注意分页 — MaxResults 仅 10,大量 CR 场景下需要分页遍历
- 自动化拓扑分析 — 将 API 输出集成到作业调度器中,自动选择网络距离最近的节点
与 Instance Topology API 的互补关系¶
规划阶段 运行阶段
┌─────────────────────┐ ┌─────────────────────┐
│ CR Topology API │ │ Instance Topology │
│ - 粗粒度(1-3 NN) │ → │ - 细粒度(3-4 NN) │
│ - 无需启动实例 │ │ - 需要运行中实例 │
│ - 容量规划 │ │ - 作业调度 + Rank │
└─────────────────────┘ └─────────────────────┘