Prhub

#24599 [codex] Split diffusion quant CI coverage

原始 PR 作者 BBuf 合并时间 2026-05-16 22:05 文件变更 4 提交数 10 评论 10 代码增减 +18 / -9

执行摘要

拆分 diffusion 量化 CI 为 FP8 和 B200 两套测试

随着 diffusion 模型量化覆盖的增加,FP8 和 NVFP4 测试对硬件要求不同——FP8 可在 H100 运行,NVFP4 需要 B200。原设计将所有 ModelOpt 量化测试混在一个列表,导致每次 CI 都需要 B200 资源。拆分后,FP8 测试可在常规 GPU CI 上执行,NVFP4 测试仅在 B200 上执行,从而降低 CI 整体等待时间并提高硬件利用率。

值得阅读,尤其是了解如何通过简单的配置拆分优化 CI 硬件利用率。建议关注 gpu_cases.py 中列表定义的模式,以及 diffusion_case_parser.py 中分区映射的写法,这种模式可以在其他需要硬件隔离的测试场景中复用。

讨论亮点

Review 中 gemini-code-assist[bot] 在 transformer_load_utils.py 上对 nunchaku 路径选择逻辑提出改进建议,建议使用 safetensors_list[0] 而非 nunchaku_config.transformer_weights_path 以避免潜在错误。但该 PR 最终移除了全部 nunchaku 相关变更,此评论已不再适用。除此之外无其他实质讨论。

实现拆解

  1. 拆分测试用例列表:在 python/sglang/multimodal_gen/test/server/gpu_cases.py 中,将原有的 ONE_GPU_MODELOPT_CASES 拆分为 ONE_GPU_MODELOPT_FP8_CASES(6 个 FP8 测试)和 ONE_GPU_MODELOPT_NVFP4_CASES(3 个 NVFP4 测试)。新增别名 ONE_GPU_B200_CASES = ONE_GPU_MODELOPT_NVFP4_CASES,并修改 ONE_GPU_CASES 的拼接来源为 ONE_GPU_MODELOPT_FP8_CASES,确保 FP8 测试加入常规 1-GPU suite。
  2. 更新 B200 测试入口:修改 python/sglang/multimodal_gen/test/server/test_server_b200.py,将 fixture 参数从 ONE_GPU_MODELOPT_CASES 改为 ONE_GPU_B200_CASES,类文档字符串也随之更新。
  3. 同步文档注释:修改 python/sglang/multimodal_gen/test/server/testcase_configs.py 中的用例添加指引文档,反映新的列表名称。
  4. 更新 CI 分区映射:在 scripts/ci/utils/diffusion/diffusion_case_parser.py 中添加 "ONE_GPU_MODELOPT_FP8_CASES": "1-gpu""ONE_GPU_B200_CASES": "1-gpu-b200" 条目,保证分区脚本能正确将 NVFP4 测试分配到 B200 分区。
文件 模块 状态 重要度
python/sglang/multimodal_gen/test/server/gpu_cases.py 测试用例 modified 5.49
python/sglang/multimodal_gen/test/server/test_server_b200.py B200 测试 modified 4.51
python/sglang/multimodal_gen/test/server/testcase_configs.py 测试配置 modified 3.59
scripts/ci/utils/diffusion/diffusion_case_parser.py CI 配置 modified 3.35

关键源码片段

python/sglang/multimodal_gen/test/server/gpu_cases.py test-coverage

核心变更:拆分原有的 ONE_GPU_MODELOPT_CASES 为 FP8 和 NVFP4 两组列表,并新增 ONE_GPU_B200_CASES 别名。

# 在 AMD 上跳过全部 ModelOpt 测试
if current_platform.is_hip():
    ONE_GPU_MODELOPT_FP8_CASES = []
    ONE_GPU_MODELOPT_NVFP4_CASES = []
else:
    # FP8 测试:可运行在 H100 等常规 GPU 上
    ONE_GPU_MODELOPT_FP8_CASES = [
        _make_modelopt_ci_case("flux1_modelopt_fp8_t2i", ...),
        _make_modelopt_ci_case("flux2_modelopt_fp8_t2i", ...),
        _make_modelopt_ci_case("wan22_modelopt_fp8_t2v", ...),
        _make_modelopt_ci_case("hunyuanvideo_modelopt_fp8_t2v", ...),
        _make_modelopt_ci_case("qwen_image_modelopt_fp8_t2i", ...),
        _make_modelopt_ci_case("qwen_image_edit_modelopt_fp8_ti2i", ...),
    ]
    # NVFP4 测试:仅在 Blackwell (B200) 上运行
    ONE_GPU_MODELOPT_NVFP4_CASES = [
        _make_modelopt_ci_case("flux1_modelopt_nvfp4_t2i", ...),
        _make_modelopt_ci_case("flux2_modelopt_nvfp4_t2i", ...),
        _make_modelopt_ci_case("wan22_modelopt_nvfp4_t2v", ...),
    ]# B200 suite 直接引用 NVFP4 列表
ONE_GPU_B200_CASES = ONE_GPU_MODELOPT_NVFP4_CASES# 常规 1-GPU suite 只包含 FP8 测试
ONE_GPU_CASES += ONE_GPU_MODELOPT_FP8_CASES

评论区精华

Nunchaku 文件路径选择建议 设计

gemini-code-assist[bot] 在 transformer_load_utils.py 中建议使用 safetensors_list[0] 作为 checkpoint 路径而非可能为 Hugging Face reference 的 nunchaku_config.transformer_weights_path,以避免 get_metadata_from_safetensors_file 失败。

结论:该评论对应的 nunchaku 相关变更在后续提交中被完全移除,因此建议未采纳。 · outdated

风险与影响

本次变更仅涉及测试配置和 CI 映射,核心逻辑无变化。主要风险在于分区配置错误导致 FP8 测试被错误调度到 B200 分区(反之亦然),但作者已在 H200 环境下通过 compute_diffusion_partitions.py 验证分区结果符合预期。另一风险是未来新增测试用例时忘记更新分区映射,但已有文档说明。

对用户无影响。对 CI 系统:1-GPU 常规 CI 将承担更多 FP8 量化测试,B200 CI 则专注于 NVFP4 和未来可能的 Nunchaku 测试,从而减少 B200 资源占用,提高整体 CI 吞吐。对开发流程:测试用例列表拆分为更细粒度的职责,方便按需调整覆盖。

配置一致性 测试覆盖拆分遗漏 硬件依赖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论