Prhub

#24630 [NPU] Diffusion CI Ground Truth Generation (NPU)

原始 PR 作者 e-martirosian 合并时间 2026-06-04 05:14 文件变更 12 提交数 42 评论 28 代码增减 +551 / -610

执行摘要

为 NPU 扩散测试增加 GT 生成并重构套件

PR描述指出需要在Ascend测试中增加一致性检查的GT生成,这是实现扩散模型在NPU上持续集成的基础设施改造。

值得仔细阅读,特别是run_suite.py中的条件导入模式和compute_diffusion_partitions.py的环境变量切换,这是多平台测试框架的设计模板。同时关注后续的路径优化和URL迁移,避免遗留硬编码风险。

讨论亮点

核心讨论聚焦于平台检测的正确性、代码复用和环境适配:

  • 平台检测问题:gemini-code-assist指出在compute_diffusion_partitions.py中直接使用current_platform.is_npu()是错误的,因为分区脚本运行在CPU协调器上,应当使用环境变量或参数。作者后续改用USE_NPU_CONFIGS环境变量解决。
  • 代码重复:ping1jing2询问run_suite.py中的重复代码(FILE_SUITES等)能否避免,作者添加了TODO,但最终通过条件导入消除了重复。
  • 硬编码路径:gemini-code-assist指出/root/...等绝对路径不可移植,建议使用repo_root构造路径。作者表示将替换为变量。
  • 个人仓库URL:ground truth数据URL指向e-martirosian个人仓库,被要求迁移到sgl-project组织仓库以确保长期维护。
  • 性能基线波动:Makcum888e要求仔细检查基线数字,因为不同CI服务器可能给出不同值。作者表示数字来自测试输出,后续又因CI失败再次更新。

实现拆解

  1. 新增NPU GT生成workflow:创建.github/workflows/diffusion-ci-gt-gen-npu.yml,支持workflow_dispatch触发,包含计算分区、1-NPU和2-NPU的ground truth生成作业,测试结果发布到sgl-project/ci-data仓库。

  2. 重构测试套件结构:修改python/sglang/multimodal_gen/test/run_suite.py,移除内联的套件定义(FILE_SUITESPARAMETRIZED_CASE_GROUPS等),改为通过current_platform.is_npu()条件导入对应平台配置:NPU从testcase_configs_npu.py导入,GPU从gpu_cases.py导入。这消除了原有的run_suite_npu.py重复代码。

  3. 删除冗余文件和测试:删除run_suite_npu.py(299行)和test_server_8_npu.py(31行),将8-NPU测试用例(如wan2_2_t2v_14b_w8a8_8npu)转换为2-NPU,减少设备占用。

  4. 移动配置集中化:在python/sglang/multimodal_gen/test/server/gpu_cases.py尾部新增_discover_unit_tests函数及一系列套件常量,在testcase_configs_npu.py中导出NPU版配置,形成平台独立的配置模块。

  5. 更新性能基线:修改perf_baselines_npu.json,将所有基线数据替换为在Ascend A3硬件上重新测量后的数值,并调整hardware字段为Ascend A3

  6. 调整CI脚本:修改compute_diffusion_partitions.pydiffusion_case_parser.py,通过环境变量USE_NPU_CONFIGS切换NPU配置,避免在CPU协调器上误判平台。同时更新pr-test-npu.yml移除8-NPU相关作业。

  7. 添加辅助配置:在test_utils.py中添加Ascend专用的ground truth URL常量(指向sgl-project/ci-data),并在CODEOWNERS中新增NPU测试目录的所有者行。

文件 模块 状态 重要度
.github/workflows/diffusion-ci-gt-gen-npu.yml CI 工作流 added 6.33
python/sglang/multimodal_gen/test/run_suite.py 测试套件 modified 6.33
python/sglang/multimodal_gen/test/server/gpu_cases.py GPU 用例 modified 5.82
python/sglang/multimodal_gen/test/run_suite_npu.py 测试套件 removed 7.21
python/sglang/multimodal_gen/test/server/ascend/test_server_8_npu.py 8-NPU 测试 removed 5.53
python/sglang/multimodal_gen/test/server/ascend/perf_baselines_npu.json 性能基线 modified 5.31
python/sglang/multimodal_gen/test/server/ascend/testcase_configs_npu.py NPU 配置 modified 5.5

关键符号

_discover_unit_tests parse_args collect_test_items run_pytest TestDiffusionServerEightNpu.case

关键源码片段

python/sglang/multimodal_gen/test/run_suite.py test-coverage

重构核心文件,改为通过平台检测动态导入配置,消除了 run_suite_npu.py 的重复。

# python/sglang/multimodal_gen/test/run_suite.py (head)
"""
Test runner for multimodal_gen that manages test suites and parallel execution.For diffusion 1-gpu/2-gpu suites, cases are partitioned by estimated runtime
using LPT so each CI shard has a similar total runtime.
"""from sglang.multimodal_gen.runtime.platforms import current_platform
from sglang.multimodal_gen.test.server.testcase_configs import (
    BASELINE_CONFIG,
    DiffusionTestCase,
)# 根据当前平台动态导入对应的套件配置
# 避免维护两份 run_suite.py 复制,TODO: remove duplicated code
if current_platform.is_npu():
    from sglang.multimodal_gen.test.server.ascend.testcase_configs_npu import (
        _UPDATE_WEIGHTS_FROM_DISK_TEST_FILE,
        COMPONENT_ACCURACY_SUITES,
        DEFAULT_EST_TIME_SECONDS,
        DEFAULT_STANDALONE_EST_TIME_SECONDS,
        FILE_SUITES,
        PARAMETRIZED_CASE_GROUPS,
        STANDALONE_FILES,
        STARTUP_OVERHEAD_SECONDS,
        SUITES,
    )
else:
    from sglang.multimodal_gen.test.server.gpu_cases import ( # noqa: F401
        _UPDATE_WEIGHTS_FROM_DISK_TEST_FILE,
        _UPDATE_WEIGHTS_MODEL_PAIR_ENV,
        _UPDATE_WEIGHTS_MODEL_PAIR_IDS,
        COMPONENT_ACCURACY_FILE_NUM_GPUS,
        COMPONENT_ACCURACY_SUITES,
        DEFAULT_EST_TIME_SECONDS,
        DEFAULT_STANDALONE_EST_TIME_SECONDS,
        FILE_SUITES,
        ONE_GPU_CASES,
        PARAMETRIZED_CASE_GROUPS,
        STANDALONE_FILE_EST_TIMES,
        STANDALONE_FILES,
        STARTUP_OVERHEAD_SECONDS,
        STRICT_SUITES,
        SUITES,
        TWO_GPU_CASES,
    )
python/sglang/multimodal_gen/test/server/gpu_cases.py test-coverage

原 run_suite.py 中的套件配置被移到该文件尾部,使其成为 GPU 套件配置的中心文件。

# python/sglang/multimodal_gen/test/server/gpu_cases.py (head 末尾新增部分 )def _discover_unit_tests() -> list[str]:
    """自动发现 unit 目录下的测试文件"""
    unit_dir = Path(__file__).resolve().parent.parent / "unit"
    if not unit_dir.is_dir():
        return []
    return sorted(
        f"../unit/{f.name}" for f in unit_dir.glob("test_*.py") if f.is_file()
    )FILE_SUITES = {
    "unit": _discover_unit_tests(),
    "component-accuracy": ["test_component_accuracy_1_gpu.py", "test_component_accuracy_2_gpu.py"],
    "component-accuracy-1-gpu": ["test_component_accuracy_1_gpu.py"],
    "component-accuracy-2-gpu": ["test_component_accuracy_2_gpu.py"],
    "1-gpu-b200": ["test_server_b200.py"],
}PARAMETRIZED_CASE_GROUPS = {
    "1-gpu": [("test_server_1_gpu.py", ONE_GPU_CASES)],
    "2-gpu": [("test_server_2_gpu.py", TWO_GPU_CASES)],
}
# ... 其他常量和向后兼容的 SUITES 字典

评论区精华

平台检测方法选择 正确性

gemini-code-assist 指出在 compute_diffusion_partitions.py 中使用 current_platform.is_npu() 会导致在 CPU 协调器上错误地使用 NPU suite 名称。建议使用命令行参数或环境变量。

结论:改用环境变量 USE_NPU_CONFIGS 来切换 NPU 配置。 · 已解决

硬编码路径不可移植 正确性

gemini-code-assist 指出 testcase_configs_npu.py 中模型缓存路径硬编码为 /root/.cache/modelscope/...,这在其他环境会失败。

结论:作者表示将替换为变量,但最终代码中路径仍存在,是否完全解决存疑。 · partially resolved

个人仓库 URL 可靠性 安全

gemini-code-assist 指出 ground truth URL 指向 e-martirosian 个人仓库,应该使用 sgl-project 组织仓库保证长期维护。

结论:标记为待修复,但本次 PR 未完全迁移。 · unresolved

代码重复问题 设计

ping1jing2 询问 run_suite.py 中是否有办法避免重复代码(FILE_SUITES 等定义)。

结论:作者添加 TODO,最终通过条件导入消除了重复,但留下了 TODO 标记。 · 已解决

8-NPU 测试必要性 question

ping1jing2 问是否真的需要 8-npu 扩散测试,作者表示已用 2-npu 替代。

结论:确认不需要 8-npu,移除。 · 已解决

性能基线准确性 测试

Makcum888e 要求双重检查 perf 基线数字,因为不同 CI 服务器可能给出不同值。作者回应数字来自测试输出,但后续 CI 失败又再次更新。

结论:多次调整后通过,但基线仍然可能因环境波动。 · 已解决

测试失败上报问题 other

Makcum888e 上传截图显示测试失败但被报告为通过,该问题可能涉及测试框架的退出码处理。

结论:未在讨论中明确解决,但最终批准。 · unresolved

风险与影响

  1. 平台检测混杂:虽然改用环境变量,但diffusion_case_parser.py中仍可能残留current_platform.is_npu()调用(需要确认最终代码),若在非NPU环境下运行会选错配置。
  2. 硬编码路径testcase_configs_npu.py中的模型缓存路径(/root/.cache/modelscope/...)依赖特定CI环境,在其他环境(如开发者本地)会直接失败。
  3. 外部数据源可靠性:Ground truth数据存储于个人仓库e-martirosian/ci-data,若账号变动或仓库迁移将导致GT下载失败。
  4. 性能基线波动:NPU CI机器性能可能波动,更新后的基线(如wan2_1_t2v_1.3b_1_npuDenoisingStage从26240ms变为27796ms)可能仍需多次调整。
  5. 删除8-NPU测试影响:如果未来需要8-NPU规模扩散测试,需重新添加,当前改动彻底移除了基础设施。

用户影响:无。
系统影响

  • CI基础设施:新增一个手动触发的workflow用于GT生成,NPU CI测试套件从8-NPU缩减为2-NPU,降低了设备需求。
  • 代码库:删除299+31行冗余代码,新增214行workflow和约200行配置移动,整体行数减少。
  • 团队影响:NPU测试维护者现在可以直接在testcase_configs_npu.py中管理套件,无需同步run_suite_npu.py。但条件导入增加了run_suite.py的理解成本。
平台检测依赖环境变量 硬编码路径不稳定 个人仓库 URL 可靠性 性能基线可能波动 删除 8-NPU 测试无保留

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论