模型部署与推理优化

KV Cache 压缩:GQA/MQA、滑动窗口与 KV 量化

kp-016进阶25 分钟04-KV与注意力

一句话定义

KV 压缩有四条正交路径:减少 KV 头数(GQA/MQA)、限制注意力视野(滑动窗口)、降低存储位宽(KV 量化)、淘汰低价值 token(eviction/选择性注意力),实际系统常组合使用。

为什么重要

长上下文 × 高并发时 KV 显存可以超过权重成为第一成本项(kp-004 推导过 4 倍差距的例子)。KV 压缩是"在不换模型的前提下把并发翻倍"的主要杠杆,也是读懂现代模型架构表("GQA 8 头""32k-128k 上下文")的必备知识。

前置知识

  • kp-013(KV 显存公式与线性增长);kp-005(量化噪声)。

核心概念

  • 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 压缩比:

BytesKVGQA = BytesKVMHA × HkvHq

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。
  • "淘汰类方法有理论保证":多基于启发式(注意力分数),对抗性/长程引用场景可能失效,需灰度。

自测题

  1. H_q=32、H_kv=4 的模型,KV 相对 MHA 压缩多少?

要点:÷8。

  1. 滑动窗口注意力牺牲了什么能力?适合什么任务?

要点:远程精确检索;适合局部性强的任务(摘要续写、代码补全)。

  1. KV INT8 相比 FP16 改变了哪两项成本?

要点:KV 显存减半;decode 读取带宽减半(速度也可能受益)。

与其他知识点的关系

压缩的是 kp-013 定义的量; kp-015 解决读取效率、本页解决读取体积;kp-022/kp-024 中长上下文部署方案直接消费这些结论。

延伸阅读

《GQA》(Ainslie 等,2023)第 2 节的"上采样转换"方法说明 GQA 可以低成本地从既有 MHA 检查点改造。

#GQA#MQA#滑动窗口#KV 量化#token 淘汰#MLA