Prhub

#33254 [CI] Add speculative_draft_attention_backend to the page-constraint test view

原始 PR 作者 alisonshao 合并时间 2026-08-02 19:58 文件变更 1 提交数 1 评论 3 代码增减 +1 / -0

执行摘要

测试桩补全字段,修复 base-a-test-cpu CI 失败

PR body 明确指出:base-a-test-cpumain 上失败,报错 AttributeError: 'types.SimpleNamespace' object has no attribute 'speculative_draft_attention_backend';原因是 #25545 在 _mla_backend_page_constraints 中新增一行 or view.speculative_draft_attention_backend == "trtllm_mha",而测试桩 SimpleNamespace 只含四个字段,ResolvedView.__getattr__ 转发到它时就会抛错。属于回归性 CI 不稳定的快速修复。

建议

  • 值得快速浏览即可,不必精读;核心价值在于理解测试桩与真实配置对象的字段同步问题。
  • 值得关注的设计点:ResolvedView.__getattr__ 的隐式转发会让桩缺失字段在运行时才暴露;更健壮的做法是让桩直接基于 ServerArgs 的字段集生成默认值,或在测试中引入字段覆盖检查,避免手工维护。
  • 若后续 _mla_backend_page_constraints 继续演进,建议在同一 PR 中同步更新该测试桩。
讨论亮点

本 PR 没有实质性的 review 讨论,评审者 kpham-sgl 直接批准。有价值的讨论来自 PR body 自身的根因分析:作者准确指出了 #25545 引入的字段读取与测试桩字段集合不一致的问题,并用两次验证(本地复现 + CI rerun)佐证修复。GitHub 评论中只有 gemini-code-assist[bot] 宣告服务下线、alisonshao 发起 /rerun-test 以及 github-actions[bot] 汇报重跑成功,属于自动化流程噪音。

实现拆解

实现拆解

  1. 定位根因:在 test/registered/unit/test_model_overrides.pytest_page_constraint_passes_at_callable_level 中,_view 辅助函数用 SimpleNamespace 构造只含 attention_backenddecode_attention_backendprefill_attention_backendpage_size 四个字段的桩。ResolvedView.__getattr__ 将属性访问转发给该桩,而 #25545 让 _mla_backend_page_constraints 在判定 trtllm_mha 页约束时读取 view.speculative_draft_attention_backend,于是触发 AttributeError

  2. 修复方案:在 _view 的默认字段字典中加入 speculative_draft_attention_backend=None,一行补齐桩与真实 ServerArgs 的字段对齐,使被测试的约束函数能正常读取该属性。

  3. 验证:作者在 H100 devbox 上于失败 sha 131bd51b01 复现完全相同的 AttributeError;应用该行后 test_model_overrides.py 共 68 个测试全部通过。随后通过 /rerun-test test_model_overrides.py 触发 GitHub Actions 验证成功(ubuntu-latest 1 个步骤 ✅)。

  4. 配套改动:无。仅测试文件修改,无源码、配置、部署或 schema 变更。

文件 模块 状态 重要度
test/registered/unit/test_model_overrides.py 配置覆盖 modified 3.81

关键符号

test_page_constraint_passes_at_callable_level _view

关键源码片段

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

唯一变更文件,在 `_view` 桩的默认字段中加入 `speculative_draft_attention_backend=None`,修复 `ResolvedView.__getattr__` 转发导致的 `AttributeError`。

def _view(**kw):
    # 构造与真实 ServerArgs 对齐的桩对象。
    # ResolvedView.__getattr__ 会转发到该桩,
    # 因此缺少任何字段都会让被测试的约束函数抛 AttributeError。
    defaults = dict(
        attention_backend=None,
        decode_attention_backend=None,
        prefill_attention_backend=None,
        # #25545 让 _mla_backend_page_constraints 读取该字段,
        # 所以测试桩必须补上它,否则 base-a-test-cpu 会失败。
        speculative_draft_attention_backend=None,
        page_size=1,
    )
    defaults.update(kw)
    return ResolvedView(SimpleNamespace(**defaults))

评论区精华

测试桩字段缺失导致 CI 失败 测试

PR 正文指出 #25545 在 `_mla_backend_page_constraints` 中新增读取 `view.speculative_draft_attention_backend`,而 `_view` 桩只含四个字段,`ResolvedView.__getattr__` 转发时抛出 `AttributeError`。作者在 H100 上复现后确认是桩字段未同步。

结论:在 `_view` 默认字段中补齐 `speculative_draft_attention_backend=None`,68 个测试全部通过。 · 已解决

CI 重跑验证 测试

作者发起 `/rerun-test test_model_overrides.py`,由 GitHub Actions 在 `ubuntu-latest` 上单独运行该测试文件。

结论:重跑结果 ✅,验证通过。 · 已解决

风险与影响

风险分析

  • 低风险:改动仅为测试桩补字段,不影响生产代码路径。
  • 测试桩同步隐患_mla_backend_page_constraints 等约束函数后续再读取新的 ServerArgs 字段时,需同步维护此 _view 桩;否则同类 AttributeError 会再次打断 main 的 CI。建议后续考虑让桩字段自动派生自真实 ServerArgs 字段集,或在 CI 中增加字段一致性检查。
  • 回归边界:该测试失败只在 #25545 合并后的连续 scheduled run 中出现,且此前四次均绿,说明修复范围准确,未引入额外的兼容性风险。

影响分析

  • 对用户:完全无影响,纯测试修复。
  • 对系统:恢复 base-a-test-cpumain 上的稳定性,避免后续 PR 因既有失败而被误导。
  • 对团队:提示了配置对象桩(SimpleNamespace + ResolvedView.__getattr__ 转发)的脆弱性——字段契约变化时测试桩容易失同步。同类测试桩在仓库其他单元测试中也可能存在,值得盘点。
测试桩字段易失同步 CI 稳定性回归

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论