Prhub

#33277 [CI] Fix stale CPU test fixtures

原始 PR 作者 mmangkad 合并时间 2026-08-02 22:38 文件变更 2 提交数 1 评论 5 代码增减 +2 / -1

执行摘要

修复两个过期 CPU 测试夹具,字段对齐新配置

PR body 明确指出这两个 fixture 已过期:一是 reasoning 配置 fixture 在 #33025 与 #30177 交叉合入后过期,二是 #25545 引入了 draft attention backend 字段但测试桩未同步。过期字段会导致 base-a-test-cpu 套件中的单测因缺少属性或字段名不匹配而失败,属于典型的跨 PR 演进带来的测试漂移。

不值得精读,但值得作为「跨 PR fixture 漂移」案例被记录:它和 #33254 一起展示了当多个功能 PR 并行演进配置结构时,手写测试桩需要及时同步。若后续有梳理测试基建的计划,可考虑把这类 SimpleNamespace 桩替换为真实配置工厂方法,从根上避免同类 CI 失败。

讨论亮点

本 PR 没有实质性的技术争论。Review 层面 BBuf 直接 APPROVED 且未留评论;Issue 评论中主要是自动化流程:作者发起 /rerun-test 指定两个单测文件,GitHub Actions bot 返回两个测试均通过的运行结果;另有 gemini-code-assist[bot] 的停用提示,说明该 bot 已停止代码审查活动,不影响本 PR。整体属于低分歧的纯测试修复。

实现拆解

  1. 补全 test_model_overrides.py_view 测试桩:在 test_page_constraint_passes_at_callable_level 内的 _view 辅助函数默认字典中新增 speculative_draft_attention_backend=None。该字段由 #25545(Gemma 4 MTP draft attention backend 支持)引入到 ResolvedView,缺少它时 _mla_backend_page_constraints 等 page 约束校验在读取 ResolvedView 属性时会抛 AttributeError。
  2. 更新 test_batch_result_processor_hidden_states.py 的 model_config 字段名:将 SimpleNamespace(think_end_id=None) 改为 SimpleNamespace(think_end_ids=None)。这是 reasoning 配置在 #33025(Kimi K3 reasoning parser)与 #30177(return_hidden_states="last")交叉演进后的字段名变更,SchedulerBatchResultProcessor 构造时按新字段名读取,旧名称已失效。
  3. 验证与收尾:作者先在本地运行两个测试文件确认通过,再发起 /rerun-test 让 CI 在 ubuntu-latest 上分别执行 test_batch_result_processor_hidden_states.pytest_model_overrides.py,两个测试均通过;随后 /tag-and-rerun-ci 触发完整 CI 并由维护者 BBuf 批准合入。

配套改动仅限测试文件本身,无生产代码、配置或部署变更。

文件 模块 状态 重要度
test/registered/unit/test_model_overrides.py 模型覆盖 modified 3.49
test/registered/unit/managers/test_batch_result_processor_hidden_states.py 结果处理器 modified 3.42

关键符号

_view _make_processor test_page_constraint_passes_at_callable_level

关键源码片段

test/registered/unit/test_model_overrides.py test-coverage

在 `_view` 测试桩默认参数中补上 #25545 引入的 `speculative_draft_attention_backend` 字段,修复 `test_page_constraint_passes_at_callable_level` 因 `ResolvedView` 缺属性而失败的问题。

def _view(**kw):
    # 手写测试桩:用 SimpleNamespace 模拟 ResolvedView 的字段
    defaults = dict(
        attention_backend=None,
        decode_attention_backend=None,
        prefill_attention_backend=None,
        # #25545 引入 draft attention backend 后,ResolvedView 新增该字段;
        # 若不补上,page 约束校验在读取属性时会抛 AttributeError
        speculative_draft_attention_backend=None,
        page_size=1,
    )
    defaults.update(kw)
    return ResolvedView(SimpleNamespace(**defaults))
test/registered/unit/managers/test_batch_result_processor_hidden_states.py test-coverage

将 `model_config` 的 `think_end_id` 改为 `think_end_ids`,适配 #33025 与 #30177 交叉后 reasoning 配置字段名的演进,修复 `_make_processor` 构造失败。

def _make_processor(server_mode: str = "full") -> SchedulerBatchResultProcessor:
    metrics_reporter = Mock()
    metrics_reporter.num_generated_tokens = 0
    metrics_reporter.forward_ct_decode = 0
    return SchedulerBatchResultProcessor(
        is_generation=True,
        disaggregation_mode=None,
        enable_overlap=False,
        enable_overlap_mlx=False,
        server_args=SimpleNamespace(
            enable_metrics=False,
            enable_hisparse=False,
            enable_return_hidden_states=True,
            return_hidden_states_mode=server_mode,
        ),
        # #33025 与 #30177 交叉后,reasoning 配置字段已从 think_end_id
        # 演进为复数 think_end_ids,旧字段名会导致构造失败
        model_config=SimpleNamespace(think_end_ids=None),
        token_to_kv_pool_allocator=Mock(),
        tree_cache=None,
        hisparse_coordinator=None,
        req_to_token_pool=None,
        decode_offload_manager=None,
        metrics_collector=None,
        metrics_reporter=metrics_reporter,
        draft_worker=None,
        model_worker=Mock(),
        logprob_result_processor=None,
        output_streamer=Mock(),
        abort_request=lambda *args, **kwargs: None,
    )

评论区精华

CI 失败定位与 /rerun-test 验证 test

作者对两个单测文件发起 `/rerun-test`,GitHub Actions bot 返回 ubuntu-latest 两个测试均通过(workflow run #30744287305),随后作者又触发 `/tag-and-rerun-ci` 完整 CI。

结论:两个受影响测试文件在本地与 CI 均通过,无代码分歧,可直接合入。 · 已解决

Review 批准 other

维护者 BBuf 直接 APPROVED 且未留任何评论;gemini-code-assist bot 提示其 GitHub 消费者版本已停用,不再产生审查意见。

结论:无实质技术讨论,作为低风险测试修复直接合入。 · 已解决

风险与影响

风险极低:改动仅涉及两个测试文件内的测试桩字段,无任何生产代码路径变更。唯一值得注意的隐患是这些 fixture 仍然依赖手写的 SimpleNamespace 模拟配置对象,字段列表与真实配置演进完全靠人工同步——本次与 #33254 都是在 #25545 等 PR 之后出现同类漂移,说明这种手写桩在字段频繁演进时容易再次过期。若后续配置对象能改为从真实 server_args 派生,可从根本上消除这类 CI 噪声。

影响范围限定在 CI 测试领域:修复 base-a-test-cpu 套件中两个单测的失败,恢复 CPU 测试流水线的稳定性,减少维护者处理 CI 噪声的时间。对生产用户、推理服务运行无任何影响;对团队而言,这类小修是多个功能 PR 并行合入后必要的配套维护,且通过 /rerun-test 精准验证,展示了高效的验证流程。

纯测试文件变更 手写测试桩易随配置演进再次漂移

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论