Prhub

#44892 [DSV4][Minor] Fix supported KV cache dtypes

原始 PR 作者 WoosukKwon 合并时间 2026-06-16 08:14 文件变更 3 提交数 5 评论 2 代码增减 +8 / -8

执行摘要

修正 DSV4 支持的 KV cache 数据类型

PR #44699 引入了 FlashMLA V4 后端,但 DeepseekV4FlashMLABackend 错误地声明了 bfloat16 KV cache 支持(FlashMLA kernel 不支持),且 DeepseekV4FlashInferMLASparseBackend 错误地声明了 fp8_ds_mla 支持(FlashInfer 使用普通 per-tensor fp8 而非 FlashMLA 的 packed 格式)。

此 PR 可直接合并,无需特别关注。它是一个小的 bugfix,修正了先前引入的不正确声明,避免用户遇到运行时错误。

讨论亮点

本 PR 没有实质性的讨论。zyongye 审核并批准了 PR。

实现拆解

本 PR 通过调整 supported_kv_cache_dtypes 和 supported_dtypes 类的类变量,修正了两个后端声明的 KV cache 数据类型支持。

  1. 修正 DeepseekV4FlashMLABackend.supported_kv_cache_dtypes(vllm/models/deepseek_v4/sparse_mla.py):从支持列表中移除 "bfloat16",因为 FlashMLA kernel 不支持 bfloat16 KV cache。保留 "auto", "fp8_ds_mla", 和 "fp8"。

  2. 修正 DeepseekV4FlashInferMLASparseBackend(vllm/models/deepseek_v4/nvidia/flashinfer_sparse.py):新增 supported_dtypes 和 supported_kv_cache_dtypes 类变量,明确声明仅支持 [torch.bfloat16] 输入 dtype,以及 ["auto", "bfloat16", "fp8"] KV cache dtype。之前继承父类的声明,导致错误地声明支持 fp8_ds_mla(FlashInfer 使用普通 per-tensor fp8 而非 FlashMLA 的 packed 格式)。同时简化了类文档字符串,移除了过时的 V3.2 对比描述。

  3. 更新文档(docs/design/attention_backends.md):更新表格中 FLASHINFER_MLA_SPARSE_DSV4 和 FLASHMLA_SPARSE_DSV4 的 dtype 和 KV dtype 列,与代码中的声明保持一致。

文件 模块 状态 重要度
vllm/models/deepseek_v4/nvidia/flashinfer_sparse.py 模型 modified 6.22
vllm/models/deepseek_v4/sparse_mla.py 模型 modified 4.65
docs/design/attention_backends.md 文档 modified 1.83

关键源码片段

vllm/models/deepseek_v4/nvidia/flashinfer_sparse.py data-contract

新增 `supported_dtypes` 和 `supported_kv_cache_dtypes` 类变量,修正 FlashInfer 后端错误声明支持 `fp8_ds_mla` 的问题。

class DeepseekV4FlashInferMLASparseBackend(DeepseekV4FlashMLABackend):
    """Shares the FlashMLA V4 metadata/cache pipeline; swaps the attention impl."""
​
    # 显式声明该后端支持的数据类型和 KV cache 数据类型
    # FlashInfer 只支持 bf16 输入,以及 auto/bfloat16/fp8 KV cache 格式
    supported_dtypes: ClassVar[list[torch.dtype]] = [torch.bfloat16]
    supported_kv_cache_dtypes: ClassVar[list[CacheDType]] = ["auto", "bfloat16", "fp8"]
​
    @staticmethod
    def get_name() -> str:
        return "FLASHINFER_MLA_SPARSE_DSV4"
vllm/models/deepseek_v4/sparse_mla.py data-contract

从 `DeepseekV4FlashMLABackend.supported_kv_cache_dtypes` 列表中移除 `"bfloat16"`,因为 FlashMLA kernel 不支持 bfloat16 KV cache。

class DeepseekV4FlashMLABackend(AttentionBackend):
    # ...
    supported_dtypes: ClassVar[list[torch.dtype]] = [torch.bfloat16]
    supported_kv_cache_dtypes: ClassVar[list[CacheDType]] = [
        "auto",
        # "bfloat16", # removed: FlashMLA kernel does NOT support bfloat16 KV cache
        "fp8_ds_mla",
        "fp8", # alias for fp8_ds_mla
    ]
    # ...

评论区精华

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

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

风险与影响

此 PR 风险极低:

  • 变更仅为修正声明常量,不涉及任何运行时逻辑。
  • 移除了后端不支持的数据类型,用户将无法再选择错误的 KV cache 类型,执行路径更安全。
  • 没有测试文件变更,但此类声明修正通常不需要测试,因为属于类型定义。

影响范围小,仅影响 DeepSeek V4 模型的稀疏 MLA 后端的 KV cache 数据类型声明。用户将无法再为 FLASHMLA_SPARSE_DSV4 选择 bfloat16 KV cache(之前选择它会导致运行时错误),为 FLASHINFER_MLA_SPARSE_DSV4 选择 fp8_ds_mla KV cache(同样会导致运行时错误)。文档修正有助于用户正确配置。

关联 Issue

#44699 [DSV4] Decouple DS V4 Sparse MLA Metadata from DS V3.2

完整报告

参与讨论