Prhub

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

sgl-project/sglang · 作者 Prozac614 · 合并时间 2026-04-12 13:02

分析状态 已生成
文件变更 11提交数 55 · 评论 52
代码增减 +1870 / -168
run-ci diffusion multimodal dependencies

执行摘要

引入动态负载均衡分区机制,优化扩散模型 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

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

关键符号

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 中,用于时间测量)

评论区精华

代码重复问题 设计

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 链接,后续同步到相关引用后会出现在这里。

完整报告

PR 15528 分析报告

执行摘要

本 PR 通过引入动态负载均衡分区机制,优化了 sglang 仓库中扩散模型 CI 测试的平衡性和总运行时间,主要改动涉及 CI 工作流、测试运行脚本和新增工具脚本,旨在解决静态分区导致的时长不均问题,提升开发效率。

功能与动机

为什么做:当前扩散 CI 测试使用静态分区,导致部分分片远长于其他分片,延长了 CI 总周转时间。PR body 中明确指出,此变更旨在实现运行时感知的分区,使扩散 CI 任务更均衡,减少等待时间。

实现拆解

做了什么

  • CI 工作流层:修改 .github/workflows/pr-test-multimodal-gen.yml,添加 compute-diffusion-partitions 任务,动态计算分区矩阵,并更新 multimodal-gen-test-1-gpumultimodal-gen-test-2-gpu 使用动态分区数量。
  • 测试运行层:重构 python/sglang/multimodal_gen/test/run_suite.py,替换固定轮询分区为 LPT(Longest Processing Time)算法,支持参数化用例和独立文件分区,并生成执行报告。
  • 工具脚本层:新增 scripts/ci/utils/diffusion/ 下的脚本:
    • diffusion_case_parser.py:使用 AST 解析提取测试用例信息。
    • compute_diffusion_partitions.py:基于估算时间计算动态分区。
    • verify_diffusion_coverage.py:验证测试覆盖率。
  • 数据层:更新 python/sglang/multimodal_gen/test/server/perf_baselines.json,添加 estimated_full_test_time_s 字段,为分区提供时间估算。

评论区精华

讨论了什么

  • 代码重复:gemini-code-assist[bot] 指出 compute_partitions.pyrun_suite.py 中存在常量重复,Prozac614 已修复。
  • 最大分区限制:mickqian 建议设置硬限制,Prozac614 回应已在脚本中添加 max-partitions 参数。
  • case 列表维护:mickqian 询问是否需要维护相同 GPU 数的 case 列表,Prozac614 认为无需维护,计划简化。
  • 服务器启动时间估算:mickqian 提到 estimated_full_test_time_s 应包括服务器启动时间,Prozac614 计划硬编码估算,但尚未完全解决。

风险与影响

风险

  • 动态分区算法(LPT)可能计算错误,导致分区不均或 CI 失败。
  • AST 解析脚本对代码结构敏感,变更可能破坏解析逻辑。
  • 覆盖率验证可能遗漏边缘情况,如独立文件执行失败。
  • 估算时间不准确(如未计入服务器启动时间)可能影响分区效果。

影响

  • 用户无直接影响。
  • 系统:优化 CI 效率,减少总运行时间,但需维护新增估算字段。
  • 团队:提升开发体验,但增加对动态分区逻辑的维护负担。

关联脉络

与历史 PR 的关系

  • 与 PR #21960(Component Accuracy PR)冲突需整合,表明 CI 功能的持续演进和跨团队协作。
  • 近期历史 PR 如 #22609(更新 B200 测试时间)和 #22602(优化 CI 依赖下载)显示仓库对 CI 效率的持续关注,本 PR 是这一趋势的一部分,专注于扩散测试的负载均衡。

参与讨论