快速结论:当同时启用 OffloadingConnector 和 per‑token‑head 量化 KV cache(如 fp8_per_token_head)时,输出会立即被破坏,即使第一轮推理也会产生乱码文本。优先检查是否同时使用了这两个功能,并考虑改用 bf16 KV cache 或者应用 PR #49226 中的修复。
报错原文:[Bug]: OffloadingConnector corrupts outputs with per‑token‑head quantized KV cache (cross‑layer allocation lacks scale packing)
适用环境:vLLM v0.23.0(经测试)及当前 main 分支;H100 GPU;模型 Qwen/Qwen2.5‑0.5B‑Instruct;后端 VLLM_ATTENTION_BACKEND=TRITON_ATTN;启用 enforce_eager=True 和 enable_prefix_caching=True。
最快修复方案:暂无官方发布的修复版本。已验证的解决方案是修改 OffloadingConnector.prefer_cross_layer_blocks 属性,使其在 per‑token‑head 量化时返回 False(即改用 per‑layer 路径)。具体修改已在 PR #49226 中合并至 vLLM main 分支,可通过拉取最新主线代码并重新安装 vLLM 来获得修复。
注意事项:修复会跳过 cross‑layer 的传输优化,但 offloading 功能仍可正常工作。对于 bf16 或普通 fp8 KV cache,cross‑layer 路径保持不变。
问题场景
用户在使用 vLLM 的 OffloadingConnector 进行 CPU 卸载,同时将 KV cache 设为 fp8_per_token_head 量化类型时触发。即使未触发卸载(即数据集完全在 GPU 内存中),第一轮推理的输出就已变为乱码,且逐轮输出不同。
报错原文
# 示例输出(乱码)
' Item\xa0 \n \n \n �� ...'
# 第二轮输出(另一段乱码)
'... different garbage ...'
原因分析
OffloadingConnector.prefer_cross_layer_blocks 默认返回 True,导致模型 runner 分配跨层(cross‑layer)KV cache。Per‑token‑head 量化需要在每个 (head, token) 单元内内联存储 fp32 scale,其内存布局为 2 * (head_size + 4) 字节。而 cross‑layer 分配仅预留了 head_size(例如 64)的空间,没有为 scale 填充预留空间,导致 _ensure_scale_caches 写入 scale 时覆盖了相邻的 K/V 数据,从而在第一次前向传播时就污染了整个缓存。


![Eval bug: [SYCL] garbled output using Qwen3.6-35B-A3B-UD-Q4_K_M using last docker image](https://www.chat-gpts.plus/wp-content/uploads/2026/07/25708-165639ed-768x403.jpg)
