KV Cache
自回归 Transformer 推理时缓存历史 token 的 Key 和 Value 张量,避免每一步重复计算,以内存换速度的核心推理优化技术。
是什么
自回归生成时,每个新 token 需要与所有历史 token 做注意力计算。若不缓存,每一步都要重新计算所有历史 token 的 K 和 V — 计算量随序列长度平方增长。
KV Cache 的核心思想:每生成一个 token,只计算新 token 的 K、V,将其追加到缓存中。后续步骤直接读取缓存中的历史 K、V,避免重复计算。生成第 t 个 token 时,注意力计算量从 O(t²) 降至 O(t)。
为什么重要
- 推理效率的基石:自回归生成中,KV Cache 将每步计算量从 O(n²) 降至 O(n),是 LLM 服务的核心优化
- 推理内存瓶颈:KV Cache 是长上下文推理时的主要内存消耗 — 大 batch / 长序列场景下,缓存大小可能远超模型权重
- 推动架构创新:KV Cache 的显存压力直接催生了 GQA(分组建模)、MQA(复用 KV)、MLA(低秩压缩)等一系列注意力机制改进,是 LLM 架构演进的核心驱动力
工作原理
# 无 KV Cache(每步重算所有 K、V)
step t: Q_t · [K_1...K_t]ᵀ · [V_1...V_t] → O(t) 次 K/V 投影
# 有 KV Cache(仅计算新 token 的 K、V)
step t: 只算 K_t, V_t,追加到缓存
Q_t · [cached_K_1...K_t]ᵀ · [cached_V_1...V_t] → O(1) 次 K/V 投影
Q_t · K_{1..t}^T → O(t) 次点积(注意力的本质开销,无法避免)
显存估算:每层每个 token 缓存 2 × n_kv_heads × d_head 个元素(K + V)。以 Llama 2 70B 为例:80 层 × 8 KV 头 × 128 维 × 2 × 2 字节(bf16) ≈ 320KB/token。2048 token 上下文 → 约 640MB。
历史与演进
| 阶段 | 方案 | 关键思想 |
|---|---|---|
| 原始 Transformer (2017) | MHA + 完整 KV Cache | 标准方案,缓存占用 = 模型权重数 |
| MQA (PaLM, 2022) | 所有头共享 KV | KV 缓存减少 n_heads 倍 |
| GQA (Llama 2, 2023) | 分 G 组共享 KV | MHA 与 MQA 的折中,2023-24 主流 |
| MLA (DeepSeek-V2, 2024) | 低秩联合压缩 | 缓存减少 57×,性能反超 MHA |
常见误解
- “KV Cache 加速了每步计算” — 它只是避免了重复计算,单步的注意力计算量 O(t) 无法消除(但 FlashAttention 等优化加速了实际执行)
- “KV Cache 大小与序列长度线性增长” — 正确,但这恰是核心问题:长上下文 + 大批次时内存爆炸
与相邻概念的区别
| 概念 | 关系 |
|---|---|
| GQA | 通过减少 KV 头数来降低 KV Cache 大小,是压缩 KV Cache 的主流方案 |
| MLA | 通过低秩压缩从根本上减少每个 token 的 K、V 维度,压缩比远超 GQA |
| MQA | GQA 的极端情况(G=1),KV Cache 最小但质量损失大 |
| PagedAttention | KV Cache 的内存管理优化(而非压缩),类比操作系统分页 |