跳到主要内容

Attention 演进与 KV Cache 压缩

在自回归大模型(Autoregressive LLMs)推理中,自注意力机制(Self-Attention)生成阶段是严格的显存与内存带宽瓶颈(Memory-Bound)。长上下文生成下,KV Cache 随着序列长度线性增长,甚至会迅速超过模型静态权重本身的显存占用。


1. 架构演进全景:从 MHA 到 GQA 与 MLA


2. 显存与计算开销对比

对于隐藏层维度 dd、头数 nhn_h、单头维度 dh=d/nhd_h = d / n_h、层数 LL 与序列长度 SS

2.1 Multi-Head Attention (MHA)

标准 MHA 为每个 Query 头独立分配一个 Key 头和一个 Value 头:

extKVCache容量(MHA)=2imesLimesnhimesdhimesSimesbextelem ext{KV Cache 容量 (MHA)} = 2 imes L imes n_h imes d_h imes S imes b_{ ext{elem}}
  • 瓶颈:当 nh=128n_h = 128S=128extkS = 128 ext{k} 时,单并发 KV Cache 占用可超过 50 GB,导致显存迅速耗尽。

2.2 Grouped-Query Attention (GQA)

GQA 将 nhn_h 个 Query 头分组,共享 nkvn_{kv} 个 Key/Value 头(通常 nkv=8n_{kv} = 8):

extKVCache容量(GQA)=2imesLimesnkvimesdhimesSimesbextelem ext{KV Cache 容量 (GQA)} = 2 imes L imes n_{kv} imes d_h imes S imes b_{ ext{elem}}
  • 妥协:压缩比固定为 nh/nkvn_h / n_{kv}(通常为 4imes4 imes8imes8 imes),但强行共享 KV 会在复杂检索任务中损失部分多头表达能力。

3. DeepSeek MLA(多头潜在注意力)底层机制

DeepSeek 提出的 MLA(Multi-Head Latent Attention)通过低秩联合压缩(Low-Rank Joint Compression),实现了超过 93% 的 KV Cache 显存削减,同时在推理时保持全多头注意力的表达力。

3.1 低秩投影与潜在向量缓存

MLA 不直接缓存多头 Key 和 Value,而是将隐层状态 hth_t 投影到极低维度的潜在空间 ct(KV)Rdcc_t^{(KV)} \in \mathbb{R}^{d_c}(其中 dcnhimesdhd_c \ll n_h imes d_h):

ct(KV)=WDKVht,[kt,1(C),,kt,nh(C)]=WUKct(KV),[vt,1(C),,vt,nh(C)]=WUVct(KV)c_t^{(KV)} = W_{DKV} h_t, \quad [k_{t,1}^{(C)}, \dots, k_{t,n_h}^{(C)}] = W_{UK} c_t^{(KV)}, \quad [v_{t,1}^{(C)}, \dots, v_{t,n_h}^{(C)}] = W_{UV} c_t^{(KV)}
  • 缓存内容:推理显存中只需常驻单一低维向量 ct(KV)c_t^{(KV)},上投影矩阵 WUVW_{UV}WUKW_{UK} 可以直接与 Query 投影矩阵在权重层面吸收融合(Matrix Absorption),完全无需物化多头 Value Cache!

3.2 解耦 RoPE(Decoupled Rotary Position Embedding)

由于旋转位置编码(RoPE)包含相对位置矩阵,无法被线性上投影吸收,MLA 巧妙引入了解耦 Key 头 kt(R)RdRk_t^{(R)} \in \mathbb{R}^{d_R} 专门携带位置信息:

extMLAToken缓存大小=(dc+dR)imesbextelem ext{MLA 单 Token 缓存大小} = (d_c + d_R) imes b_{ ext{elem}}
架构单 Token 单层 KV Cache 大小 (fp16)相对 MHA 显存占用表达能力保留
MHA2imes128imes128imes2=65,536ext字节2 imes 128 imes 128 imes 2 = 65,536 ext{ 字节}100%100\% (基准)完全独立多头
GQA (nkv=8n_{kv}=8)2imes8imes128imes2=4,096ext字节2 imes 8 imes 128 imes 2 = 4,096 ext{ 字节}6.25%6.25\%分组受限多头
DeepSeek MLA(512+64)imes2=1,152ext字节(512 + 64) imes 2 = 1,152 ext{ 字节}1.75%1.75\% (削减 98.2%)满血多头注意力

4. 稀疏注意力压缩机制:SnapKV 与 PyramidKV

在超长上下文(128k–1M Tokens)生成中,即使采用 MLA,历史 Token 的绝对数量依然庞大。稀疏注意力算法通过动态剪枝与分层分配进一步压缩:

4.1 SnapKV:注意力观测窗口命中

  • 观察结论:注意力头对历史上下文的关注呈现高度稳定的“特征指纹(Attention Fingerprint)”。在 Prompt 尾部的一小段观察窗口(Observation Window, 约 32 个 Token)内高频交互的 Historical Key,在后续解码中将持续主导注意力权重;
  • 动态剪枝:基于观察窗口内的聚类注意力分数,丢弃 80% 的无用历史 Token,仅保留 20% 核心锚点,在 128k 评测集上实现近乎无损(Perplexity 变动 <0.1< 0.1)的生成质量。

4.2 PyramidKV:层感知金字塔分配

  • 观察结论:Transformer 浅层(Shallow Layers)负责广域事实抽取与聚合,需要较大的 KV Cache 窗口;而深层(Deep Layers)主要聚焦于高阶语义推理与当前输出对齐,对早期历史 Token 的敏感度显著下降;
  • 金字塔分层:将浅层的 KV 窗口设大,深层的 KV 窗口逐层线性递减,形成金字塔式显存分配结构,整体显存再降 50%–70%

5. 架构选型与工程权衡建议

  1. 大吞吐服务端与超长上下文:优先采用原生 MLA 架构(如 DeepSeek-V3 / DeepSeek-R1 系列),从底层彻底消除 KV Cache 带宽瓶颈;
  2. 边缘单卡与消费级推理:对于现存基于 GQA 的开源模型(如 Qwen2.5/3 系列、Llama-3 系列),通过引入 SnapKV 稀疏算子4-bit KV Cache 动态量化,将 64k 上下文显存从 16GB 压至 4GB 以内;
  3. 不可行方案警示:避免在未进行注意力特征指纹校验的情况下采用简单步长截断(Stride Truncation),这会导致模型在 Needle-in-a-Haystack 跨文档检索中发生严重记忆丢失。