Prhub

#34483 [AMD] CI: cut two setup cycles from the AMD multimodal-gen lanes

原始 PR 作者 michaelzhang-ai 合并时间 2026-08-21 13:01 文件变更 3 提交数 11 评论 3 代码增减 +53 / -129

执行摘要

AMD 多模态 CI 削减 4 个 setup 周期,约省 8 runner- 小时

PR body 指出:在 run 31443692177 中,AMD 多模态任务每个 job 需承担 27–97 分钟的容器拉取和 23–98 分钟的依赖安装,总计每 job 100–155 分钟固定成本,而实际测试仅占约 5.6 小时对比 setup 约 15.8 runner-小时,约 74% 开销被浪费;作为对照,CUDA 的依赖安装仅需 27 秒。因此作者希望去掉整个 setup 周期,而不是继续优化矩阵调参。

建议精读本 PR 以及其基础提交(如 run_suite.py 分片分配与平衡逻辑),因为它展示了 CI 编排中基于实测数据做资源重组的完整思路:先量化 setup 成本,再选择“折叠/收敛”而不是简单增加超时,并保持失败隔离与独立超时。值得关注的设计决策是 if: (success() || failure()) 的失败隔离手法,以及“分片数量可由调度器自由选择”的弹性做法。

讨论亮点

PR 内仅作者在 Issue/PR 评论中记录验证情况,无实质性 review 讨论。作者在评论中说明了 run-ci 无法覆盖本 PR 修改的 jobs:因为 check-changesmultimodal_gen 输出为 false,除非改动该路径的代码否则 1-GPU/2-GPU 任务在 gate 中会被跳过,因此只能通过手动 dispatch ROCm 7.2 lane 来验证;最终 run 31638833841 和 31660972923 的结果确认 unit fold 工作正常(diffusion 失败后单元步骤仍执行并通过 1360 个测试),且 2-GPU 分片在超时内完成。此外作者指出了已知的 ROCm flux 缺陷 #34351/#34352 导致的重试放大问题,是当前最大时间消耗项,但本 PR 有意不处理。

实现拆解

  1. 将 unit 套件折叠进 1-GPU 分片:在 .github/workflows/pr-test-amd.ymlpr-test-amd-rocm720.ymlmultimodal-gen-test-1-gpu-amd / -rocm720 任务 part 0 中新增 Run diffusion unit tests 步骤,if: matrix.part == 0 && (success() || failure()) 保证 diffusion 步骤失败也执行,并设 timeout-minutes: 30 独立预算。
  2. 2-GPU 套件由 3 分片改为 2 分片:将 multimodal-gen-test-2-gpu-amd / -rocm720part: [0, 1, 2] 改为 [0, 1],并把 run_suite.py --total-partitions 3 改为 --total-partitions 2。依据同一 run 的逐用例耗时(14/26/21 分钟健康工作),两分片各约 30 分钟用例时间,即使 flux 重试仍在 180 分钟超时内。
  3. 移除独立 unit 任务:删除 multimodal-gen-unit-test-amd / -rocm720 整个 job 以及其在 target_stage_selectneeds 中的条目。
  4. 更新覆盖率报告:在 scripts/ci/utils/ci_coverage_report.py 中更新注释,说明 unit 套件现作为 multimodal-gen-test-1-gpu-amd part 0 的步骤在 ROCm 上运行,从而保留 "unit": ("CUDA", "AMD") 映射。
  5. 配套修复:合入的提交还包含为 2-GPU 分片配置传递预计算分区分配、确保 standalone 文件在用例失败后继续运行、以及为每个分片数量测试完整套件调度的辅助改动(run_suite.py 相关),这些改动是提前为本次分片收敛打的基础。
文件 模块 状态 重要度
.github/workflows/pr-test-amd.yml CI 工作流 modified 5.5
.github/workflows/pr-test-amd-rocm720.yml CI 工作流 modified 5.5
scripts/ci/utils/ci_coverage_report.py 覆盖率脚本 modified 3.08

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

评论区精华

run-ci 无法覆盖被修改的 CI jobs question

作者在评论中说明:即使加了 run-ci 触发完整 PR 测试,PR 修改不含 multimodal_gen 源码,check-changes 的 multimodal_gen 输出为 false,因此被修改的 AMD 多模态 jobs 仍会被跳过。

结论:作者通过手动 dispatch ROCm 7.2 lane 来验证修改,run 31638833841 和 31660972923 确认单元折叠与分片收敛有效。 · 已解决

2-GPU 分片超时余量不足 性能

验证中 shard 0 达到 149 分钟(180 分钟 step 超时),主要是 flux 用例失败重试导致的,且作者提到若 flux 修复后分片时间会降至 45-65 分钟,但若继续 broken 可能接近超时。

结论:作者决定不提高超时,因为更大的 cap 会使坏 job 占用稀缺的 mi300 runner 更久;当前 split 是安全的。 · 已解决

风险与影响

风险主要集中 CI 基础设施层面:

1) 2-GPU 分片从 3 片减到 2 片后,每个分片承载的测试更多,若 flux 用例恢复或新增用例可能挤爆 180 分钟 step 超时(验证中 shard 0 已到 149 分钟,接近上限);作者明确不提高超时以避免长时间的 runner 占用,但未来若某分片超时会导致 2-GPU 测试覆盖率下降。
2) unit 套件折叠进 1-GPU part 0 后,若 if: matrix.part == 0 && (success() || failure()) 在 Actions 中表现异常(如失败后不触发),会静默失去 unit 覆盖。
3) 修改了 ci_coverage_report.py 的注释,若该脚本后续解析这些注释或逻辑依赖任务名,会产生误导。
4) 删除独立 unit job 会让 AMD 覆盖矩阵在 dashboard 上消失,除非 coverage 报告正确映射。整体风险受限于 CI 编排,不涉及推理核心代码。

影响是 CI 层面的效率和资源消耗:AMD lane 上每次完整 PR 运行的 job 数从 8 个降至 5 个,预计节省约 4 个 setup 周期,约 8 runner-小时/次 PR run;同时减少了对稀缺 mi300 runner 的占用(避免每个 job 单独拉镜像和装依赖)。对用户在模型推理能力上没有直接影响,但对 AMD 开发者体验有显著改善——验证时间更短、PR gate 更快。团队需要留意 2-GPU 分片在 flux 修复后的负载变化,以及 unit 步骤折叠后失败时的可观测性。

CI 超时风险 资源密集型基础设施 缺少自动化回归测试覆盖 CI 改动

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论