# PR #2585 完整报告

- 仓库：`radixark/miles`
- 标题：fix: add H200, B200 and B300 to NUM_GPUS_OF_HARDWARE
- 合并时间：2026-08-18 07:18
- 原文链接：http://prhub.com.cn/radixark/miles/pull/2585

---

# 执行摘要

- 一句话：补齐 H200/B200/B300 的每节点 GPU 数映射
- 推荐动作：值得快速合并（已合并）。这个修复解除了真实的启动阻断，但属于防御性薄弱的小改动。建议后续为 `NUM_GPUS_OF_HARDWARE` 补充单元测试，或与 `GENERATION_HARDWARE` 合并维护，避免同源字段不同步。

# 功能与动机

PR body 描述：运行 `scripts/run_qwen3_30b_a3b.py --hardware B300` 而不带 `--num-gpus-per-node` 时，`ScriptArgs.__post_init__` 会抛 `KeyError: 'B300'`，因为 `NUM_GPUS_OF_HARDWARE` 只列了 H100/GB200/GB300/MI350X/MI355X。H200 和 B200 同样缺失。该问题是在 release/v0.1.0 nvfp4 训练的 B300 devbox 冒烟测试中暴露的。

# 实现拆解

1. 入口定位：`miles/utils/external_utils/command_utils.py` 中的模块级字典 `NUM_GPUS_OF_HARDWARE`，它被 `ScriptArgs`（`miles/utils/arguments.py`）用来在只传 `--hardware` 时推断默认的 `num-gpus-per-node`。
2. 字典扩展：在 `"H100": 8` 之后依次插入 `"H200": 8`、`"B200": 8`、`"B300": 8`，与 Hopper 和 MI300 系列保持一致，因为这几款 Blackwell/Hopper 变体的 devbox 均为 8 卡节点。
3. 演进过程：第一个 commit 先加 H200 与 B300，第二个 commit 补充 B200，说明作者在复查时意识到 Blackwell 系列同样缺失。
4. 配套：本次没有任何测试、文档或配置变更。没有为 `NUM_GPUS_OF_HARDWARE` 增加校验或测试，未来新增硬件名时仍可能漏改。

关键文件：
- `miles/utils/external_utils/command_utils.py`（模块 硬件映射；类别 source；类型 core-logic；符号 NUM_GPUS_OF_HARDWARE）: 唯一改动文件，`NUM_GPUS_OF_HARDWARE` 字典为 `--hardware` 参数推断每节点 GPU 数提供依据，本次新增 H200/B200/B300 三个键，直接修复 `ScriptArgs.__post_init__` 抛 `KeyError` 的问题。

关键符号：未识别

## 关键源码片段

### `miles/utils/external_utils/command_utils.py`

唯一改动文件，`NUM_GPUS_OF_HARDWARE` 字典为 `--hardware` 参数推断每节点 GPU 数提供依据，本次新增 H200/B200/B300 三个键，直接修复 `ScriptArgs.__post_init__` 抛 `KeyError` 的问题。

```python
# 硬件名 -> 每节点 GPU 数的映射表
# 供 ScriptArgs 解析 --hardware 参数时推断默认的 num-gpus-per-node 使用
NUM_GPUS_OF_HARDWARE = {
    "H100": 8,   # H100 节点按 8 卡配置
    "H200": 8,   # 新增：H200 与 H100 同规格，也是 8 卡 / 节点
    "B200": 8,   # 新增：B200 按 8 卡 / 节点
    "B300": 8,   # 新增：B300 devbox 为 8 卡 / 节点
    "GB200": 4,  # GB200 NVL 机柜按 4 卡 / 节点
    "GB300": 4,  # GB300 NVL 机柜按 4 卡 / 节点
    "MI350X": 8, # AMD MI350X 按 8 卡 / 节点
    "MI355X": 8, # AMD MI355X 按 8 卡 / 节点
}

```

# 评论区精华

本 PR 没有实质 review 讨论：`comments_count` 与 `review_comments_count` 均为 0，`claude[bot]` 仅提示仓库配置了手动 review，`Zhichenzzz` 直接批准。因此无争议点或未决疑虑。

- 暂无高价值评论线程

# 风险与影响

- 风险：变更仅是在字典中增加 3 个键，风险极低。潜在关注点：1）`NUM_GPUS_OF_HARDWARE` 与 `GENERATION_HARDWARE` 是两处独立字典，本 PR 未同步更新 `GENERATION_HARDWARE`（该字典仍只有 H100/GB200/GB300），未来若需要把 H200/B200/B300 映射到代际名，可能再次遗漏；2）没有测试覆盖，无法防止未来新增硬件名时再次出现 `KeyError`；3）假设 B200/B300 均为 8 卡 / 节点，若实际节点拓扑不同（如 4 卡机柜），推断的 `num-gpus-per-node` 会不准确，但当前 devbox 场景符合。
- 影响：影响范围较小。对用户：使用 `--hardware H200/B200/B300` 且不显式传 `--num-gpus-per-node` 的脚本命令不再崩溃，黑盒行为与 H100 一致。对系统：仅影响参数解析路径，不影响训练核心逻辑。对团队：修复了 release/v0.1.0 冒烟测试中遇到的启动报错，也统一了硬件规格声明方式，便于后续新增模型 recipe 时直接引用。
- 风险标记：缺少测试覆盖 , 硬件映射与代际映射不同源

# 关联脉络

- PR #2564 release: bump miles version to 0.1.0: 本 PR 在 release/v0.1.0 冒烟测试中发现，同一发布周期内版本重置为 0.1.0。
- PR #2538 release: miles version release workflow: 该 PR 建立了版本发布工作流，本次硬件映射缺失正是在该流程的 B300 devbox 冒烟测试中暴露。