桃子桃子快讯
返回首页
工具

Qwen3-8B 实验:KV 缓存 q8 量化并非无损

Reddit 用户实验发现,Qwen3-8B 在 125k 上下文下,KV 缓存逐 token 量化会损害 needle…

2026.08.28 · 周五3 分钟阅读

近日,Reddit 用户 maddie-lovelace 在 r/LocalLLaMA 板块分享了一组关于 KV 缓存量化的实验结果。测试在 Qwen3-8B-27B(原文写作 Qwen3.8-27b)上进行,核心发现是:llama.cpp 等推理后端默认的「写入时量化」(on-write quantization)会显著影响模型在长上下文场景下的表现,而批量整体量化则几乎无损。

实验现象:q8 量化导致 needle 检索失败

在 125k 上下文长度的 needle 检索测试中,bf16 全精度下的 KV 缓存可以顺利通过,但改为 q8 量化后则失败。表面上,8bit 量化仅引入不到 1% 的舍入误差,对模型权重来说通常「几乎无损」,但对 KV 缓存却并非如此。

原因分析:误差随 prefill 逐层累积

用户指出问题并非出在量化精度本身,而在于量化的执行时机:

  • 大多数后端(如 llama.cpp)在每一步 prefill 写入 KV 时就进行量化。
  • 后续每一步 prefill 都会读到被量化的 key,并基于这些略有偏差的 key 计算注意力。
  • 写出的下一层 key 又基于已经「略有偏差」的注意力结果。
  • 误差由此在每一层、每一个 token 上逐步累积。

换言之,1% 的量化误差并不是一次性施加,而是被反复叠加,最终严重影响长程依赖的检索能力。

验证:事后整体量化可恢复性能

为验证上述机制,用户做了对照实验:先以 bf16 构建完整 KV 缓存,再一次性将其整体量化为 q8。结果显示,此时 needle 检索能力恢复正常,行为与 bf16 接近一致,验证了「误差源于逐 token 写入」而非量化本身不可用。

适用边界与作者说明

  • 模型范围:仅在 Qwen3-8B 系列上测试。
  • 试验次数有限,部分实验跑在作者自有的定制版 MLX 栈上。
  • 结论是否可推广到其他模型家族与后端,尚待更多验证。

实践启示

对部署长上下文 LLM 推理的用户而言,若使用 q8 KV 缓存量化后出现质量下降,可尝试以下思路排查:

  • 确认后端是否采用 on-write 量化策略。
  • 测试先以高精度跑完 prefill、再离线整体量化的方案。
  • 在小规模 needle 检索任务上对比两种方式的输出差异。

该帖子的核心观点是:KV 缓存量化的「时机」比「精度」更值得关注,这一区分对推理引擎开发者与重度长上下文用户均有一定参考意义。

信源