执行摘要
- 一句话:拆分 diffusion 量化 CI 为 FP8 和 B200 两套测试
- 推荐动作:值得阅读,尤其是了解如何通过简单的配置拆分优化 CI 硬件利用率。建议关注
gpu_cases.py 中列表定义的模式,以及 diffusion_case_parser.py 中分区映射的写法,这种模式可以在其他需要硬件隔离的测试场景中复用。
功能与动机
随着 diffusion 模型量化覆盖的增加,FP8 和 NVFP4 测试对硬件要求不同——FP8 可在 H100 运行,NVFP4 需要 B200。原设计将所有 ModelOpt 量化测试混在一个列表,导致每次 CI 都需要 B200 资源。拆分后,FP8 测试可在常规 GPU CI 上执行,NVFP4 测试仅在 B200 上执行,从而降低 CI 整体等待时间并提高硬件利用率。
实现拆解
- 拆分测试用例列表:在
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。
- 更新 B200 测试入口:修改
python/sglang/multimodal_gen/test/server/test_server_b200.py,将 fixture 参数从 ONE_GPU_MODELOPT_CASES 改为 ONE_GPU_B200_CASES,类文档字符串也随之更新。
- 同步文档注释:修改
python/sglang/multimodal_gen/test/server/testcase_configs.py 中的用例添加指引文档,反映新的列表名称。
- 更新 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(模块 测试用例;类别 test;类型 test-coverage;符号 ONE_GPU_MODELOPT_FP8_CASES, ONE_GPU_MODELOPT_NVFP4_CASES, ONE_GPU_B200_CASES): 核心变更:拆分原有的 ONE_GPU_MODELOPT_CASES 为 FP8 和 NVFP4 两组列表,并新增 ONE_GPU_B200_CASES 别名。
python/sglang/multimodal_gen/test/server/test_server_b200.py(模块 B200 测试;类别 test;类型 test-coverage): B200 测试入口更新,导入列表从 ONE_GPU_MODELOPT_CASES 改为 ONE_GPU_B200_CASES。
python/sglang/multimodal_gen/test/server/testcase_configs.py(模块 测试配置;类别 test;类型 documentation): 更新文档注释,引用新的列表名称。
scripts/ci/utils/diffusion/diffusion_case_parser.py(模块 CI 配置;类别 infra;类型 infrastructure): 更新 CI 分区映射,添加新列表的分区标识。
关键符号:未识别
关键源码片段
python/sglang/multimodal_gen/test/server/gpu_cases.py
核心变更:拆分原有的 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
评论区精华
Review 中 gemini-code-assist[bot] 在 transformer_load_utils.py 上对 nunchaku 路径选择逻辑提出改进建议,建议使用 safetensors_list[0] 而非 nunchaku_config.transformer_weights_path 以避免潜在错误。但该 PR 最终移除了全部 nunchaku 相关变更,此评论已不再适用。除此之外无其他实质讨论。
- Nunchaku 文件路径选择建议 (design): 该评论对应的 nunchaku 相关变更在后续提交中被完全移除,因此建议未采纳。
风险与影响
- 风险:本次变更仅涉及测试配置和 CI 映射,核心逻辑无变化。主要风险在于分区配置错误导致 FP8 测试被错误调度到 B200 分区(反之亦然),但作者已在 H200 环境下通过
compute_diffusion_partitions.py 验证分区结果符合预期。另一风险是未来新增测试用例时忘记更新分区映射,但已有文档说明。
- 影响:对用户无影响。对 CI 系统:1-GPU 常规 CI 将承担更多 FP8 量化测试,B200 CI 则专注于 NVFP4 和未来可能的 Nunchaku 测试,从而减少 B200 资源占用,提高整体 CI 吞吐。对开发流程:测试用例列表拆分为更细粒度的职责,方便按需调整覆盖。
- 风险标记:配置一致性, 测试覆盖拆分遗漏, 硬件依赖
关联脉络
参与讨论