RuntimeError: mha_varlen_fwd, /workspace/.deps/vllm-flash-attn-src/csrc/flash_attn/flash_api.cpp:601, query and key must have the same dtype

该报错通常出现在 bf16 模型上同时指定 quantization="fp8" 与 kv_cache_dtype="float16" 时,vLLM 启动阶段 FlashAttention 发现 query 与 key 的 dtype 不一致而中止。优先排查 KV cache dtype 是否与模型

快速结论:该报错通常出现在 bf16 模型上同时指定 quantization="fp8" 与 kv_cache_dtype="float16" 时,vLLM 启动阶段 FlashAttention 发现 query 与 key 的 dtype 不一致而中止。优先排查 KV cache dtype 是否与模型 dtype 一致,而不是先怀疑在线量化本身。

适用环境:Issue 中确认的环境:Ubuntu 22.04.4 LTS、Python 3.12.13、PyTorch 2.13.0+cu130、CUDA runtime 12.6.20、驱动 580.82.07、NVIDIA RTX A6000 / RTX 5880 Ada Generation;复现另在 1× B200 上完成,模型为 OLMoE-1B-7B-0924-Instruct,vLLM 0.31.0 与 nightly 0.32.1rc1.dev36+ge68efc685。

最快修复方案:升级到 vLLM v0.32.1rc0 及之后版本(对应 PR #60885)。新版本会在配置阶段直接以 ValueError 拒绝这种 dtype 不匹配组合;随后把 kv_cache_dtype 保持默认或改为与模型一致的 bfloat16,即可正常启动。

注意事项:修复方式是把不一致的配置提前拒绝,并非让 fp16 KV cache 与 bf16 模型真正兼容;Issue 中明确说明“将 query 强制转换”的方案未实现。因此升级后若仍显式传 float16,启动会被拒绝,需要改配置而非期待报错消失。

问题场景

用户在 vLLM 中加载 bf16 模型(OLMoE-1B-7B-0924-Instruct),同时开启在线量化 quantization="fp8" 并显式指定 kv_cache_dtype="float16",启动引擎时报 dtype 断言失败。Issue 指出这与 #60859 是同一个 flash-attn dtype 断言问题,只是这次出现在在线量化路径上。

报错原文

RuntimeError: mha_varlen_fwd, /workspace/.deps/vllm-flash-attn-src/csrc/flash_attn/flash_api.cpp:601, query and key must have the same dtype

在 vLLM 0.31.0 的其他后端配置下,复现中还观察到以下启动错误:

AssertionError at flashinfer.py:801 (assert self.kv_cache_spec.dtype == self.model_config.dtype)
AssertionError: q.dtype torch.bfloat16 != k.dtype torch.float16

原因分析

最可能的原因是显式设置的 KV cache dtype(float16)与模型自身 dtype(bfloat16)不一致。FlashAttention 的 mha_varlen_fwd 要求 query 和 key 使用相同 dtype,因此在校验阶段直接失败。Issue 中确认该问题与是否走在线 fp8 量化路径无关:FlashInfer 后端会在引擎初始化时触发自身的 dtype 断言,FLASH_ATTN 后端则触发 query/key dtype 不一致断言,两者根因相同。

环境排查

  • 确认 vLLM 版本:低于 v0.32.1rc0 时才会出现此崩溃;Issue 在 0.31.0 上复现,nightly 0.32.1rc1.dev36+ge68efc685 上已被配置校验拦截。
  • 确认模型 dtype:本文场景为 bfloat16 模型。
  • 确认是否显式传入 kv_cache_dtype="float16" 或 --kv-cache-dtype float16。
  • 确认注意力后端:auto 在复现中落到 FLASHINFER;指定 FLASH_ATTN 时出现 flash_api.cpp:601 的 FA2 检查(SM89 等架构)或 FA4 cute 接口的 dtype 断言。
  • 确认 GPU 架构与驱动是否满足所选后端要求;Issue 环境为 A6000 / RTX 5880 Ada,复现另用了 B200。

解决步骤

  1. 将 vLLM 升级到 v0.32.1rc0 或更高版本(该修复由 PR #60885 引入,首次随 v0.32.1rc0 发布)。
  2. 升级后不要给 bf16 模型显式指定 kv_cache_dtype="float16";保持 kv_cache_dtype 为 auto(默认)或 bfloat16。
  3. 重新启动引擎,让新增的配置校验先于引擎初始化执行。

验证方法

若仍传入 float16,启动应在引擎初始化前立即报出:

ValueError: kv_cache_dtype="float16" is incompatible with dtype="bfloat16". Please set --kv-cache-dtype to auto or bfloat16.

这属于预期的提前拒绝,而非修复失败。把 kv_cache_dtype 改为 auto 或 bfloat16 后,engine init 不再出现 dtype 断言;Issue 中 auto 后端在 B200 上正常返回了生成结果(' Paris.\n\nThe currency of France'),可据此确认启动已恢复正常。

参考来源

vllm-project/vllm #61314

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 29507

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注