Prhub

#23214 Fix test_modelopt_export using stale ModelConfig kwargs

原始 PR 作者 Kangyan-Zhou 合并时间 2026-04-20 14:18 文件变更 1 提交数 1 评论 10 代码增减 +2 / -3

执行摘要

修复模型优化导出测试中因 ModelConfig 参数过时而导致的 TypeError。

根据 PR body 描述,ModelConfig.init 中的 modelopt_quant 和 modelopt_export_path 参数已在 #10154 中被移除(分别被统一的 quantization 标志和 LoadConfig.modelopt_export_path 替代),但 test_full_workflow_with_export 测试用例从未更新。该 bug 一直潜伏,因为当 nvidia-modelopt 未安装时,TestModelOptExportIntegration 测试类会被跳过。PR #23119 昨天在 CI 镜像中添加了该依赖,从而暴露了失败(例如 https://github.com/sgl-project/sglang/actions/runs/24649475047/job/72069610508)。

该 PR 变更简单直接,无需精读。值得关注的是它揭示了历史重构(#10154)后测试未及时更新的问题,提醒团队在接口变更时需同步更新所有相关测试。

讨论亮点

本次 PR 没有 review 评论,所有讨论均在 PR body 和 issue 评论中。作者通过多次 /rerun-ut/rerun-stage/rerun-test 命令触发 CI 运行,以验证修复后的测试通过情况,最终确认修复成功。

实现拆解

  1. 更新测试用例参数:修改 test/registered/unit/model_loader/test_modelopt_export.py 中的 test_full_workflow_with_export 方法,将 ModelConfig 构造时的 modelopt_quant="fp8"modelopt_export_path=self.export_dir 参数,分别替换为 quantization="modelopt_fp8" 和将 modelopt_export_path=self.export_dir 移至 LoadConfig 的构造函数中。
  2. 验证修复:作者在远程开发容器中复现了未修复时的失败(TypeError: ModelConfig.__init__() got an unexpected keyword argument 'modelopt_quant'),并在应用修复后确认测试通过(python3 test/srt/test_modelopt_export.pyRan 7 tests in 2.6s OK)。
文件 模块 状态 重要度
test/registered/unit/model_loader/test_modelopt_export.py 模型导出 modified 3.87

关键符号

test_full_workflow_with_export

关键源码片段

test/registered/unit/model_loader/test_modelopt_export.py test-coverage

唯一变更的文件,包含修复过时 ModelConfig 参数的测试用例。

# 修复后的测试用例片段,展示了正确的参数传递方式
def test_full_workflow_with_export(self, mock_model, mock_tokenizer, mock_arch):
    """Test the complete workflow from model config to export."""
    # Arrange
    mock_arch.return_value = ("TestModel", "TestConfig")
    mock_tokenizer.return_value = Mock()
    mock_model.return_value = Mock(spec=torch.nn.Module)
​
    # 关键变更:ModelConfig 使用统一的 quantization 参数,而非已移除的 modelopt_quant
    model_config = ModelConfig(
        model_path="TinyLlama/TinyLlama-1.1B-Chat-v1.0",
        quantization="modelopt_fp8", # 替换原来的 modelopt_quant="fp8"
    )
​
    # 关键变更:LoadConfig 接收 modelopt_export_path 参数,而非通过 ModelConfig 传递
    load_config = LoadConfig(modelopt_export_path=self.export_dir) # 新增参数
    device_config = DeviceConfig()
​
    # 后续模拟和断言逻辑保持不变
    with patch.object(
        ModelOptModelLoader, "_setup_modelopt_quantization"
    ) as mock_setup:
        with patch.object(
            ModelOptModelLoader, "_load_modelopt_base_model"
        ) as mock_load_base:
            mock_load_base.return_value = mock_model.return_value
            model_loader = ModelOptModelLoader(load_config)
            result = model_loader.load_model(
                model_config=model_config,
                device_config=device_config,
            )
            self.assertIsNotNone(result)
            mock_setup.assert_called_once()

评论区精华

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

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

风险与影响

风险极低。变更仅涉及单个测试文件,修改的是测试用例的模拟参数,不涉及生产代码逻辑。主要风险是测试覆盖的准确性:如果更新后的参数与实际 ModelConfig 和 LoadConfig 的接口不匹配,可能导致测试通过但实际功能异常。但鉴于变更直接对应 #10154 的接口变更,且作者已验证测试通过,此风险可控。

对用户和系统无直接影响,仅修复测试用例。对团队的影响是消除了 CI 中的一个失败点,确保模型优化导出相关的集成测试在 CI 中能正确运行,提高了测试套件的可靠性。影响范围仅限于测试模块。

测试覆盖滞后

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论