Prhub

#45052 [Bug] Fix test flashmla for DSv4

原始 PR 作者 yewentao256 合并时间 2026-06-12 04:22 文件变更 1 提交数 2 评论 0 代码增减 +5 / -3

执行摘要

修复 DSv4 FlashMLA 测试用例

PR body 指出 pytest tests/kernels/attention/test_flashmla_sparse.py 会因上游 API 接口变更而报错:AttributeError: 'FlashMLASchedMeta' object has no attribute 'dtype'AttributeError: module 'vllm.v1.attention.ops.flashmla' has no attribute 'flash_mla_sparse_prefill'。修复后测试全部通过。

建议合并,这是一个及时的测试修复,确保上游 API 变更后测试仍然有效。可略读,逻辑简单。

讨论亮点

无 review 讨论。

实现拆解

修改 tests/kernels/attention/test_flashmla_sparse.py 文件,共 5 行增加、3 行删除:

  1. 更新 test_sparse_flashmla_metadata_smoke 断言:将 assert tile_md.dtype == torch.int32assert num_splits.dtype == torch.int32 替换为 assert isinstance(tile_md, fm.FlashMLASchedMeta)assert tile_md.tile_scheduler_metadata is Noneassert tile_md.num_splits is Noneassert num_splits is None,适配 FlashMLASchedMeta 的新结构。
  2. 更新 test_sparse_flashmla_prefill_smoke 函数调用:将 fm.flash_mla_sparse_prefill(q, kv, indices, 1.0, d_v) 改为 fm.flash_mla_sparse_fwd(q, kv, indices, 1.0, d_v),匹配重命名后的 API。
  3. 其他行不变test_sparse_flashmla_decode_smoke 用例未受影响,断言已正确使用新 API。
文件 模块 状态 重要度
tests/kernels/attention/test_flashmla_sparse.py 测试 modified 4.05

关键符号

test_sparse_flashmla_metadata_smoke test_sparse_flashmla_prefill_smoke

关键源码片段

tests/kernels/attention/test_flashmla_sparse.py test-coverage

唯一变更文件,修复了两个因上游 API 变更导致的测试失败,确保 DSv4 稀疏 FlashMLA 注意力测试通过。

# tests/kernels/attention/test_flashmla_sparse.py
# 修复:使用 FlashMLASchedMeta 新属性断言,而非废弃的 dtypedef test_sparse_flashmla_metadata_smoke():
    import vllm.v1.attention.ops.flashmla as fm
    ok, reason = fm.is_flashmla_sparse_supported()
    if not ok:
        pytest.skip(reason)
    device = torch.device("cuda")
    batch_size = 1
    seqlen_q = 1
    num_heads_q = 128
    num_heads_k = 1
    q_seq_per_hk = seqlen_q * num_heads_q // num_heads_k
    topk = 128
    cache_seqlens = torch.zeros(batch_size, dtype=torch.int32, device=device)
    tile_md, num_splits = fm.get_mla_metadata(
        cache_seqlens,
        q_seq_per_hk,
        num_heads_k,
        num_heads_q=num_heads_q,
        topk=topk,
        is_fp8_kvcache=True,
    )
    # 旧 assert: 检查 tile_md.dtype 和 num_splits.dtype
    # 新 assert: 检查 FlashMLASchedMeta 类型和内部属性
    assert isinstance(tile_md, fm.FlashMLASchedMeta)
    assert tile_md.tile_scheduler_metadata is None
    assert tile_md.num_splits is None
    assert num_splits is None
​
​
def test_sparse_flashmla_prefill_smoke():
    import vllm.v1.attention.ops.flashmla as fm
    ok, reason = fm.is_flashmla_sparse_supported()
    if not ok:
        pytest.skip(reason)
    device = torch.device("cuda")
    s_q = 1
    s_kv = 1
    h_q = 64
    h_kv = 1
    d_qk = 576
    d_v = 512
    topk = 128
    q = torch.zeros((s_q, h_q, d_qk), dtype=torch.bfloat16, device=device)
    kv = torch.zeros((s_kv, h_kv, d_qk), dtype=torch.bfloat16, device=device)
    indices = torch.zeros((s_q, h_kv, topk), dtype=torch.int32, device=device)
    # 旧调用 : fm.flash_mla_sparse_prefill
    # 新调用 : fm.flash_mla_sparse_fwd
    out, max_logits, lse = fm.flash_mla_sparse_fwd(q, kv, indices, 1.0, d_v)
    assert out.shape == (s_q, h_q, d_v)
    assert max_logits.shape == (s_q, h_q)
    assert lse.shape == (s_q, h_q)

评论区精华

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

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

风险与影响

低风险。仅修改了测试文件中的断言和函数名,不涉及生产代码。测试通过验证了与上游 API 的一致性,无回归风险。

修复了 DSv4 相关测试的 CI 失败,确保 DeepSeek V4 模型的稀疏 FlashMLA 注意力功能持续可测。对用户无直接影响,但保障了后续开发质量。

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论