Prhub

#22810 [diffusion] CI: refactor diffusion ci and reduce redundancy

sgl-project/sglang · 作者 mickqian · 合并时间 2026-04-15 10:12

分析状态 已生成
文件变更 18提交数 10 · 评论 3
代码增减 +306 / -464
diffusion run-ci test refactor

执行摘要

重构扩散模型 CI 测试,删除冗余文件并合并测试套件以提升效率。

PR body中明确说明动机为"streamline component accuracy tests"和"always check consistency and perf, no fail-fast",即简化组件准确性测试并确保始终验证一致性和性能,避免因单个测试失败而中断整个套件。

建议技术管理者关注此PR以了解扩散模型测试基础设施的演进方向,工程师可精读testcase_configs.py中的自动模态推断设计和test_server_common.py中的失败聚合机制,这些设计决策有助于提升测试健壮性和可维护性。

讨论亮点

无review评论,本次PR讨论较少,主要变更由作者自行推进和合并。

实现拆解

  1. 重构测试配置核心文件:修改python/sglang/multimodal_gen/test/server/testcase_configs.py,在DiffusionServerArgs类中移除硬编码的modality默认值,改为通过新增的_infer_modality_from_model_path函数自动推断模型模态(图像、视频或3D),并引入lru_cache提升性能。
  2. 合并和删除冗余测试文件:删除test_accuracy_2_gpu_a.pytest_accuracy_2_gpu_b.py,将原有2-GPU准确性测试用例整合到新文件;重命名test_accuracy_1_gpu_a.pytest_accuracy_1_gpu_b.pytest_component_accuracy_1_gpu.pytest_component_accuracy_2_gpu.py,统一命名规范。
  3. 新增准确性测试用例配置:创建accuracy_testcase_configs.py文件,定义ACCURACY_ONE_GPU_CASE_IDSACCURACY_TWO_GPU_CASE_IDS常量,并通过_select_accuracy_cases函数筛选启用的测试用例,减少配置分散。
  4. 优化测试执行逻辑:修改test_server_common.py,添加run_case_check函数和failures列表来聚合多个检查点的失败信息,避免单点失败导致整体测试中断,同时新增validate_mesh_output辅助函数以增强3D模型验证。
  5. 调整CI工作流和脚本:更新.github/workflows/pr-test-multimodal-gen.yml简化测试触发逻辑,并修改scripts/ci/utils/diffusion/diffusion_case_parser.py中的_extract_case_ids_from_list函数以适配新配置结构,确保CI管道与重构后的测试套件兼容。
文件 模块 状态 重要度
python/sglang/multimodal_gen/test/server/testcase_configs.py 测试配置 modified 7.29
python/sglang/multimodal_gen/test/server/test_server_common.py 测试公共 modified 6.43
python/sglang/multimodal_gen/test/server/accuracy_testcase_configs.py 准确性配置 added 6.39
.github/workflows/pr-test-multimodal-gen.yml CI 工作流 modified 5.04
python/sglang/multimodal_gen/test/server/test_accuracy_2_gpu_a.py 准确性测试 removed 6.42
python/sglang/multimodal_gen/test/server/testcase_configs.py test-coverage

核心测试配置文件,修改了 DiffusionServerArgs 类以支持自动模态推断,并新增缓存函数,影响所有扩散模型测试用例的配置解析。

@lru_cache(maxsize=None)
def _infer_modality_from_model_path(model_path: str) -> str:
    """根据模型路径自动推断模态类型(图像、视频或3D)。"""
    model_info = get_model_info(model_path) # 从注册表获取模型信息
    if model_info is None:
        raise ValueError(f"无法解析模型信息: {model_path!r}")
​
    task_type = model_info.pipeline_config_cls.task_type # 获取任务类型
    if task_type == ModelTaskType.I2M:
        return "3d" # 3D模型任务
    if task_type.is_image_gen():
        return "image" # 图像生成任务
    return "video" # 默认为视频生成任务
python/sglang/multimodal_gen/test/server/test_server_common.py test-coverage

测试公共逻辑文件,引入 run_case_check 函数聚合多个验证步骤的失败信息,避免单点失败导致测试中断,提升测试健壮性。

def run_case_check(name: str, fn: Callable[[], None]) -> None:
    """运行单个检查点,捕获异常并记录失败信息。"""
    try:
        fn() # 执行检查函数
    except BaseException as exc:
        if isinstance(exc, (KeyboardInterrupt, SystemExit)):
            raise # 重新抛出中断异常
        failures.append((name, str(exc))) # 记录失败名称和消息

关键符号

_infer_modality_from_model_path _select_accuracy_cases run_case_check validate_mesh_output _extract_case_ids_from_list

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

技术风险包括:1. 回归风险:删除或合并测试文件可能意外移除某些测试覆盖,导致未检测到的功能退化;例如,test_accuracy_2_gpu_a.py的移除需确保其用例已迁移到新位置。2. 配置错误风险:自动推断模态的逻辑依赖get_model_info函数,若模型信息解析失败可能引发运行时异常。3. 性能影响lru_cache的使用可能引入内存开销,但对于频繁调用的模型路径推断是合理权衡。4. CI稳定性:工作流简化可能影响测试触发条件,需验证CI任务仍能正确执行所有必要测试。

影响范围:1. 用户影响:对终端用户透明,主要影响开发者和CI流水线;测试执行更高效,但需注意重构后测试报告格式变化。2. 系统影响:提升扩散模块测试的维护性和可读性,减少冗余代码,长期利于团队协作;CI执行时间可能因测试合并而略有优化。3. 团队影响:工程师需适应新的测试文件结构和配置方式,但总体降低了测试套件复杂度。

测试覆盖变更 配置解析风险 CI 稳定性影响

关联 Issue

未识别关联 Issue

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

完整报告

执行摘要

本次PR对sglang仓库的扩散模型CI测试进行了系统性重构,主要删除冗余测试文件、合并测试套件并优化配置逻辑,旨在提升测试维护性和执行效率,同时确保始终检查一致性和性能。变更影响扩散模块的测试基础设施,对终端用户透明,但开发者需适应新结构。

功能与动机

PR的动机源于简化组件准确性测试流程的需求。作者在PR body中指出:"streamline component accuracy tests"和"always check consistency and perf, no fail-fast",即希望减少测试冗余,避免因单个检查点失败而中断整个测试套件,从而提升CI的健壮性和开发体验。这响应了扩散模型测试日益复杂化带来的维护挑战。

实现拆解

  1. 重构测试配置核心

    • 文件:python/sglang/multimodal_gen/test/server/testcase_configs.py
    • 关键符号:DiffusionServerArgs类、_infer_modality_from_model_path函数
    • 变更:移除modality字段的硬编码默认值(原为"image"),改为可选并自动推断。新增_infer_modality_from_model_path函数,利用模型注册表(get_model_info)和任务类型(ModelTaskType)动态判断模态,并添加lru_cache装饰器以缓存结果,提升重复调用性能。
      ```python
      @lru_cache(maxsize=None)
      def _infer_modality_from_model_path(model_path: str) -> str:
      """根据模型路径自动推断模态类型(图像、视频或3D)。"""
      model_info = get_model_info(model_path) # 从全局注册表查询模型信息
      if model_info is None:
      raise ValueError(f"无法解析模型信息: {model_path!r}")

    task_type = model_info.pipeline_config_cls.task_type
    if task_type == ModelTaskType.I2M:
    return "3d" # 3D模型任务,如mesh生成
    if task_type.is_image_gen():
    return "image" # 图像生成任务,包括T2I、I2I等
    return "video" # 默认为视频生成任务,涵盖T2V、I2V等
    ```
    - 影响:所有扩散测试用例现在自动推断模态,减少手动配置错误,但依赖模型注册表的准确性。

  2. 合并冗余测试文件

    • 删除test_accuracy_2_gpu_a.pytest_accuracy_2_gpu_b.py,将原有2-GPU准确性测试用例迁移到新结构中;重命名test_accuracy_1_gpu_a.pytest_component_accuracy_1_gpu.py,统一命名规范。
    • 新增accuracy_testcase_configs.py文件,集中定义ACCURACY_ONE_GPU_CASE_IDSACCURACY_TWO_GPU_CASE_IDS元组,并通过_select_accuracy_cases函数筛选用例,避免配置分散。
    • 示例代码片段:
      python def _select_accuracy_cases(cases: list[DiffusionTestCase], enabled_ids: tuple[str, ...]) -> list[DiffusionTestCase]: """根据启用的ID列表筛选测试用例。""" enabled = set(enabled_ids) return [case for case in cases if case.id in enabled] # 过滤未启用的用例
    • 影响:测试套件更简洁,易于维护和扩展新用例。
  3. 优化测试执行逻辑

    • 文件:python/sglang/multimodal_gen/test/server/test_server_common.py
    • 关键符号:run_case_check函数、failures列表
    • 变更:将原本分散的性能验证、一致性检查、LoRA API测试等封装到run_case_check中,该函数捕获异常并记录失败信息,最后统一报告,避免单点失败导致测试提前终止。新增validate_mesh_output辅助函数,专门处理3D模型输出验证。
    • 影响:提升测试健壮性,开发者能一次性看到所有失败点,便于调试。
  4. 调整CI工作流和脚本

    • 更新.github/workflows/pr-test-multimodal-gen.yml,简化触发逻辑,减少冗余步骤;修改scripts/ci/utils/diffusion/diffusion_case_parser.py中的_extract_case_ids_from_list函数,适配新的测试用例结构。
    • 影响:CI执行更高效,但需确保重构后所有测试仍能被正确触发和解析。

关键源码片段

python/sglang/multimodal_gen/test/server/testcase_configs.py

核心测试配置文件,修改了DiffusionServerArgs类以支持自动模态推断,并新增缓存函数,影响所有扩散模型测试用例的配置解析。

@lru_cache(maxsize=None)
def _infer_modality_from_model_path(model_path: str) -> str:
    """根据模型路径自动推断模态类型(图像、视频或3D)。"""
    model_info = get_model_info(model_path) # 从注册表获取模型信息
    if model_info is None:
        raise ValueError(f"无法解析模型信息: {model_path!r}")
​
    task_type = model_info.pipeline_config_cls.task_type # 获取任务类型
    if task_type == ModelTaskType.I2M:
        return "3d" # 3D模型任务
    if task_type.is_image_gen():
        return "image" # 图像生成任务
    return "video" # 默认为视频生成任务

python/sglang/multimodal_gen/test/server/test_server_common.py

测试公共逻辑文件,引入run_case_check函数聚合多个验证步骤的失败信息,避免单点失败导致测试中断,提升测试健壮性。

def run_case_check(name: str, fn: Callable[[], None]) -> None:
    """运行单个检查点,捕获异常并记录失败信息。"""
    try:
        fn() # 执行检查函数
    except BaseException as exc:
        if isinstance(exc, (KeyboardInterrupt, SystemExit)):
            raise # 重新抛出中断异常
        failures.append((name, str(exc))) # 记录失败名称和消息

评论区精华

本次PR无review评论,讨论较少,变更主要由作者通过多次提交(如"upd"和"fix ut")迭代完成,最终由自己合并。这表明重构过程可能涉及内部调整,但未引发团队争议。

风险与影响

  • 技术风险:测试覆盖变更可能导致某些边缘用例未被覆盖,引发回归错误;自动模态推断依赖外部注册表,若模型信息缺失会抛出异常;CI工作流简化可能意外跳过必要测试。
  • 影响范围:对用户无直接影响,但提升开发者效率;系统层面,测试代码更整洁,长期利于维护;团队需更新测试文档或指南以反映新结构。

关联脉络

从近期历史PR看,本次重构与扩散模块的其他改进紧密相关:

  • PR 22763(自动启用最佳并行设置)优化了扩散模型性能配置,本PR的CI重构确保这些配置能高效测试。
  • PR 22667(支持LTX-2.3两阶段视频生成)扩展了模型功能,本PR通过测试合并为新功能集成提供了稳定的CI基础。
    整体上,这些PR共同推动扩散模块向更高效、可维护的方向演进,反映团队在基础设施上的持续投入。

参与讨论