KV Cache 压缩:GQA/MQA、滑动窗口与 KV 量化
一句话定义
KV 压缩有四条正交路径:减少 KV 头数(GQA/MQA)、限制注意力视野(滑动窗口)、降低存储位宽(KV 量化)、淘汰低价值 token(eviction/选择性注意力),实际系统常组合使用。
为什么重要
长上下文 × 高并发时 KV 显存可以超过权重成为第一成本项(kp-004 推导过 4 倍差距的例子)。KV 压缩是"在不换模型的前提下把并发翻倍"的主要杠杆,也是读懂现代模型架构表("GQA 8 头""32k-128k 上下文")的必备知识。
前置知识
核心概念
- MQA/GQA:所有或分组 query 头共享同一组 KV 头。GQA 把 KV 头从 32 减到 8,KV 体积 ÷4;训练时决定(也可由 MHA 权重"均值上采样"转换而来),现代开源模型几乎标配。
- 滑动窗口注意力(SWA):每个 token 只看最近 W 个 token,KV 只需保留窗口内部分;适合局部性强的任务,纯局部窗口会损失远程检索能力(常与全注意力层交错使用)。
- KV 量化:把 KV 存成 INT8/FP8,读取带宽同比例下降(对 decode 带宽是双重收益);对长文本检索精度有影响,需评测。
- Token 淘汰/选择性注意力:H2O(按累计注意力分数留"重型击手"token)、SnapKV(压缩 prompt 段)等;本质是承认 KV 中大量 token 从未被关注。
- MLA(DeepSeek 系):把 KV 投影到低秩潜空间再缓存,等效压缩数倍且保持精度,是架构级方案的前沿代表。
原理与机制
KV 压缩的四个方向各自攻击体积公式中的一项:GQA/MQA 减头数,滑动窗口减有效序列长度,KV 量化减每元素字节,token 淘汰减有效 token 数。四者互不冲突、可以叠加;共同的边界条件是检索精度——每种方法都在赌"被丢弃或降精度的信息不会再被注意到",而长程检索任务最容易证伪这个赌注,所以验收永远要以任务指标收口。
公式与模型
GQA 压缩比:
Llama-2-70B:H_q=80、H_kv=8 → KV ÷10;7B 级常见 32→8 → ÷4。KV INT8 在此基础上再 ÷2,检索评测通过时是近乎免费的组合。
图示
MHA: Q头[Q1..Q32] 各配一对 KV头 → KV = 32×2
GQA: Q1..Q4 共享 KV1, Q5..Q8 共享 KV2, … → KV = 8×2 (÷4)
MQA: 所有 Q 共享 1 组 KV (÷32, 精度风险更高)
实例或案例
部署选型案例:把 7B(GQA 8 头)服务从 4k 扩到 32k 上下文,KV 从 20 并发 10.5GB 涨到 84GB——不可行;叠加 KV INT8(÷2)与滑动窗口压缩 prompt 段后压回可部署区间,代价是检索类任务必须重测。另一例:代码补全场景窗口注意力几乎无损,因为局部性强。
常见误区
- "GQA 有明显精度损失":训练时原生 GQA 的损失极小,已是标配;但从 MHA 权重转换的 GQA 需要重校准/微调。
- "KV 量化随便开":检索/RAG 类任务对 KV 精度敏感,必须过任务评测闸门。
- "窗口越大越好":窗口大小与 KV 显存线性挂钩,按任务真实注意力跨度选,而非拍脑袋 32k。
- "淘汰类方法有理论保证":多基于启发式(注意力分数),对抗性/长程引用场景可能失效,需灰度。
自测题
- H_q=32、H_kv=4 的模型,KV 相对 MHA 压缩多少?
要点:÷8。
- 滑动窗口注意力牺牲了什么能力?适合什么任务?
要点:远程精确检索;适合局部性强的任务(摘要续写、代码补全)。
- KV INT8 相比 FP16 改变了哪两项成本?
要点:KV 显存减半;decode 读取带宽减半(速度也可能受益)。
与其他知识点的关系
压缩的是 kp-013 定义的量; kp-015 解决读取效率、本页解决读取体积;kp-022/kp-024 中长上下文部署方案直接消费这些结论。
延伸阅读
《GQA》(Ainslie 等,2023)第 2 节的"上采样转换"方法说明 GQA 可以低成本地从既有 MHA 检查点改造。