执行摘要
- 一句话:ROCm CI 容器固定 NUMA 节点,解决 e2e 超时
- 推荐动作:值得快速阅读,但不需要精读。它展示了一个很有价值的运维经验:在虚拟化环境(QEMU VM)下,容器自由调度导致的跨 NUMA 启动开销可能被误判为计算性能问题;
--cpuset-cpus/--cpuset-mems 组合是恢复 NUMA 局部性的标准手段。对于负责 CI 基础设施的工程师,建议关注:
1) NUMA 拓扑感知的容器调度实践;
2) YAML folded scalar 中反斜杠陷阱(作者在 PR body 中特别提醒);
3) 这类硬编码硬件假设应记录到 workflow 注释或文档,以便环境迁移时更新。
功能与动机
ROCm MI300 e2e CI 任务持续超时。PR body 指出:ROCm runners 位于 rocm7.14 QEMU VM 中,暴露 160 vCPU 分布在两个 NUMA 节点(node0 = CPUs 0-79,node1 = CPUs 80-159)。容器可在全部 CPU 上自由调度时,主机侧 launch 路径严重退化:进程和线程引导在节点间扇出,跨节点流量主导任务 wall clock,任务大部分时间消耗在启动而非工作负载上,最终命中 60 分钟超时。PR 明确这是主机侧/虚拟化问题而非 verl 问题,训练脚本本身不受影响。
实现拆解
本 PR 是纯 CI 配置修复,变更集中在单个 workflow 文件,实现步骤如下:
- 修改目标文件:
.github/workflows/e2e_ppo_trainer_megatron_vllm_rocm.yml,涉及两个任务 e2e_ppo_trainer_fsdp_vllm_rocm 和 e2e_ppo_trainer_megatron-moe-expert-parallel_rocm。
- 添加容器 NUMA 固定选项:在两个任务的
container.options 中追加 --cpuset-cpus 0-31(限制容器使用 NUMA node 0 的 32 个 CPU)和 --cpuset-mems 0(将内存分配固定到同一节点)。PR body 特别说明 options 是 YAML folded scalar(>-),因此每个选项单独一行、不加尾部反斜杠——若加 \ 会在折叠后以字面参数传给 docker create。
- 保留其他配置不变:GPU 数量、并行度配置、超时均未修改,仅动容器调度约束。
- 验证方式:无新增测试(CI 配置本身就是测试)。作者在应用前已在同一 rocm7.14 MI300 VM 上验证 CPU 固定方案有效。
关键文件:
.github/workflows/e2e_ppo_trainer_megatron_vllm_rocm.yml(模块 CI 工作流;类别 infra;类型 infrastructure): 唯一变更文件,为 ROCm e2e 两个任务容器添加 NUMA 固定选项,解决 CI 超时回归。
关键符号:未识别
评论区精华
该 PR 无 review 评论和讨论线程(review_comments_count = 0,comments_count = 0),唯一审核由 wuxibin89 给出 APPROVED 且无文字说明。因此没有可提炼的争议或权衡交锋;PR body 中作者自己强调了 YAML folded scalar 的换行细节(不能写尾部反斜杠),这是唯一值得注意的实现注意事项。
风险与影响
关联脉络
- PR #7629 [ci] chore: fix ci failure: 同为 CI 稳定性修复,处理 E2E 超时与不稳定测试,反映近期 CI 维护主线。
- PR #7585 [ci] chore: Remove Ascend CI: 同类 CI 基础设施调整(临时停用不稳定 job),展示跨硬件 CI 维护策略。
- PR #7584 [ci] fix: drop stale enable_chunked_prefill=False from Ascend NPU scripts: 同为硬件相关 CI 配置清理,体现 CI 配置与硬件环境匹配的持续维护。
参与讨论