Prhub

#15528 [CI] dynamic load-balanced partitioning for diffusion CI

原始 PR 作者 Prozac614 合并时间 2026-04-12 13:02 文件变更 11 提交数 55 评论 52 代码增减 +1870 / -168

执行摘要

引入动态负载均衡分区机制,优化扩散模型 CI 测试的平衡性和总运行时间。

PR body 中明确指出:当前扩散 CI 测试使用静态分区,导致部分分片远长于其他分片。此变更引入运行时感知的分区,使扩散 CI 任务更均衡,减少总 CI 周转时间。

建议工程师精读此 PR,关注 LPT 算法在 CI 分区中的应用设计,以及如何通过动态估算时间优化资源分配。对于 CI 维护者,值得参考其模块化设计,但需注意新增脚本的稳定性和估算时间的准确性。

讨论亮点

review 中的核心讨论包括:

1) 代码重复问题:gemini-code-assist[bot] 指出 compute_partitions.py 和 run_suite.py 中常量重复,Prozac614 已修复;
2) 最大分区限制:mickqian 建议设置硬限制,Prozac614 回应已在脚本中添加 max-partitions 参数控制;
3) case 列表维护:mickqian 询问是否需要维护相同 GPU 数的 case 列表,Prozac614 认为无需维护,计划简化;
4) 服务器启动时间估算:mickqian 提到应包括服务器启动时间,Prozac614 计划硬编码估算。结论是大部分问题已解决或计划解决,未解决疑虑包括服务器时间估算的准确性。

实现拆解

实现分为三个层次:

1) CI 工作流层(.github/workflows/pr-test-multimodal-gen.yml),添加 compute-diffusion-partitions 任务动态计算矩阵,并更新 multimodal-gen-test-1-gpu 和 multimodal-gen-test-2-gpu 使用动态分区数量;
2) 测试运行层(python/sglang/multimodal_gen/test/run_suite.py),替换固定轮询分区为 LPT 算法,支持参数化用例和独立文件分区,添加执行报告生成;
3) 工具脚本层(scripts/ci/utils/diffusion/ 下的新脚本),包括 diffusion_case_parser.py 解析用例信息、compute_diffusion_partitions.py 计算分区、verify_diffusion_coverage.py 验证覆盖率。此外,更新性能基线(perf_baselines.json)和测试工具以包含 estimated_full_test_time_s 字段,提升分区质量。

文件 模块 状态 重要度
.github/workflows/pr-test-multimodal-gen.yml CI/Workflow modified 7.0
python/sglang/multimodal_gen/test/run_suite.py Test/Runner modified 8.0
scripts/ci/utils/diffusion/compute_diffusion_partitions.py CI/Tools added 7.0
scripts/ci/utils/diffusion/diffusion_case_parser.py CI/Tools added 6.0
python/sglang/multimodal_gen/test/server/perf_baselines.json Test/Baseline modified 6.0

关键符号

lpt_partition(在 run_suite.py 或 compute_diffusion_partitions.py 中) compute_partition_count(在 compute_diffusion_partitions.py 中) collect_diffusion_suites(在 diffusion_case_parser.py 中) run_command(在 test_utils.py 中,重构为共享函数) diffusion_server fixture(在 test_server_common.py 中,用于时间测量)

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

评论区精华

代码重复问题 设计

gemini-code-assist[bot] 指出 compute_partitions.py 和 run_suite.py 中常量(如 DEFAULT_EST_TIME_SECONDS)和函数重复,影响维护性

结论:Prozac614 已修复,移除了重复代码,可能通过共享工具文件解决 · 已解决

最大分区限制 设计

mickqian 在 .github/workflows/pr-test.yml 评论中建议设置硬限制,防止分区过多

结论:Prozac614 回应已在 compute_diffusion_partitions.py 中添加 max-partitions 参数控制 · 已解决

case 列表维护 设计

mickqian 询问动态分区后是否需要维护相同 GPU 数的 case 列表(如 ONE_GPU_CASES_A)

结论:Prozac614 认为无需维护,计划简化列表结构,但状态仍为待定 · pending

服务器启动时间估算 性能

mickqian 指出 estimated_full_test_time_s 应包括服务器启动时间,建议硬编码估算

结论:Prozac614 计划切换到硬编码估算,但尚未完全实现 · pending

风险与影响

技术风险:

1) 动态分区算法(如 LPT)可能计算错误,导致分区不均或 CI 失败,具体在 run_suite.py 和 compute_diffusion_partitions.py 中;
2) 新增脚本依赖 AST 解析(diffusion_case_parser.py),对代码结构敏感,变更可能破坏解析逻辑;
3) 覆盖率验证(verify_diffusion_coverage.py)可能遗漏边缘情况,如独立文件执行失败;
4) 性能基线中的 estimated_full_test_time_s 若不准确(如服务器启动时间未计入),可能影响分区效果,导致 CI 时间估算偏差。

影响范围:

1) 用户:无直接影响;
2) 系统:优化扩散 CI 测试效率,减少总运行时间,提升开发体验,但需维护新增的估算时间字段;
3) 团队:CI 更平衡,减少等待时间,但增加对动态分区逻辑的维护负担。影响程度:中等,主要影响 CI 管道,不改变核心功能。

动态算法风险 解析依赖风险 覆盖率验证风险 估算时间不准确

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论