[Bug]: OffloadingConnector corrupts outputs with per-token-head quantized KV cache (cross-layer allocation lacks scale packing)

当同时启用 OffloadingConnector 和 per‑token‑head 量化 KV cache(如 fp8_per_token_head )时,输出会立即被破坏,即使第一轮推理也会产生乱码文本。优先检查是否同时使用了这两个功能,并考虑改用 bf16 KV cache 或者应用 PR #

快速结论:当同时启用 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=Trueenable_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 数据,从而在第一次前向传播时就污染了整个缓存。

环境排查

celebrityanime
celebrityanime
文章: 15234

发表回复

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