AI++
模型能力·硬核·11 分钟阅读·AI++ 编辑部

MLA:DeepSeek 把 KV Cache 压到 1/10 的注意力改造

MLA(Multi-Head Latent Attention)是 DeepSeek-V2/V3 用来压缩 KV cache 的注意力变体。 核心是把每层的 K、V 先压成一个低维 latent 向量存进 cache,attention 时再上投影还原,KV cache 直接缩到原来的 ~7%。 为了不牺牲质量、还要兼容 RoPE,它用了一个「解耦 RoPE 头」的精巧设计,是工程与数学结合的典范。

一句话结论

MLA 把每个 token 在 KV cache 里要存的「K 和 V」替换成一个低维的 latent 向量,attention 计算时再把 K、V 现场还原出来——KV cache 缩小约 93%,质量几乎不掉,让 DeepSeek-V2/V3 在长上下文推理上比同体量模型便宜一个数量级。

背景问题

Transformer 自回归推理的瓶颈不在算力,而在显存带宽,具体说是 KV cache

标准多头注意力(MHA)里,每个 token 在每一层要存「它自己的 K 和 V」,维度是 $n_h \times d_h$(头数 × 每头维度)。一个 7B 级模型、单层就是几百 KB/token,叠满层数后:

  • 上下文 4k 时 KV cache 还能塞进显存;
  • 上下文 128k 时,KV cache 动辄几十 GB,比模型权重本身还大
  • KV cache 越大,每生成一个 token 要搬的数据越多,吞吐越低。

社区此前有几条压缩路径:

  • MQA(Multi-Query Attention):所有 query 头共享一对 K、V,KV cache 缩到 $1/n_h$,但质量明显掉。
  • GQA(Grouped-Query Attention):折中,几个 query 头共享一组 KV,Llama-2/3 都用这个,是质量与显存的平衡点。
  • KV 量化:把 fp16 压到 int8/int4,省显存但精度有损。

这些方法都在「K、V 本身」上做文章。DeepSeek 换了个思路:K、V 不是非得原样存,能不能存一个更小的「摘要」,要用时再恢复?

核心思路

MLA 的关键是低秩压缩。观察到 K、V 实际上由隐状态 $h_t$ 经过线性投影得到,而投影后的 K、V 在头维度上往往高度相关(低秩)。那就干脆把 $h_t$ 先压成一个低维向量 $c_t$,存 $c_t$ 进 cache,attention 时再上投影回 K、V。

形式化一点:

编码(每层、每 token,只在 prefill 时算一次):

$$ c_t^{KV} = W^{DKV},h_t \quad (\text{down-project,维度 }d_c \ll n_h d_h) $$

存进 KV cache 的只有 $c_t^{KV}$。

解码时还原 K、V:

$$ K_t = W^{UK},c_t^{KV}, \qquad V_t = W^{UV},c_t^{KV} $$

但这里有个工程坑:如果老老实实还原 $K_t$、$V_t$ 再算 attention,计算量并没省,反而多了一次上投影。MLA 的真正精妙在于——把 $W^{UK}$ 吸收进 query 的投影里,让 attention 直接在 latent 空间算,避免显式还原 K。

具体说,attention 的核心是 $Q K^{\top}$。把 $K = W^{UK} c^{KV}$ 代入:

$$ Q K^{\top} = Q,(W^{UK} c^{KV})^{\top} = (Q,W^{UK,\top}),c^{KV,\top} $$

也就是说,把 $W^{UK}$ 「挪」到 query 侧预算一次($Q’ = Q W^{UK,\top}$),attention 时就只需要算 $Q’ c^{KV,\top}$——用 latent 向量代替了完整 K。V 侧也用类似吸收技巧处理。这样解码阶段既省显存(cache 小),又不增加计算。

DeepSeek-V2 报告:MLA 把 KV cache 从 MHA 的 $n_h d_h L$ 维降到 $d_c L$,其中 $d_c = 512$,相比 $n_h d_h = 16384$(V2 配置),KV cache 缩到约 1/32;在综合质量评测上接近甚至略优于 MHA,明显优于 GQA。

关键技术点

1. 解耦 RoPE:兼容位置编码的最难一关

上面的吸收技巧有个致命障碍:RoPE(旋转位置编码)是乘在 K 上的非线性操作,无法被吸收进 query 的线性投影里。如果硬把 RoPE 塞进 K,吸收就破产。

MLA 的解法是把每个头的 K 拆成两部分:

  • 不带 RoPE 的 content 部分:走 latent 压缩 + 吸收路径;
  • 带 RoPE 的位置部分:单独存一个小的 decoupled RoPE key(维度 $d_h^R$,很小),不压缩、直接进 cache。

attention 时 query 也拆成 content query 和 RoPE query 两部分,分别和两部分 K 算内积再相加。这样既保住了 RoPE 的位置感知,又让 content 部分能享受压缩红利。这是 MLA 设计里最巧妙的一笔,也是后来想复刻的人最容易踩坑的地方。

2. 为什么低秩压缩不掉质量

直觉上「把 K、V 压低维再还原」会损失信息。但 MLA 能保住质量,原因有几条:

  • K、V 本身就是 $h_t$ 的线性投影,而 $h_t$ 维度远低于 $n_h d_h$,K、V 在多头维度上确实存在大量冗余,低秩假设成立。
  • 压缩维度 $d_c$ 可以取得比单头维度 $d_h$ 大(V2 是 512),给信息留足余量。
  • 解耦的 RoPE 头保留了位置信号,不依赖 content 部分表达位置。

实测 MLA 在长上下文任务上表现稳健,没有 MQA 那种明显的长程退化。

3. 和 GQA / MQA 的本质区别

方法 压缩对象 压缩方式 质量损失
MHA 不压缩 基准
MQA K、V 共享 跨头共享 明显
GQA K、V 分组共享 跨组共享 较小
MLA K、V 整体压成 latent 低秩投影 + 解耦 RoPE 几乎无

GQA/MQA 是「跨头共享」,MLA 是「跨头 + 跨 K/V 联合低秩压缩」——压缩比更狠,但需要解耦 RoPE 才能落地。

4. 训练侧也有收益

MLA 不只省推理 cache,训练时激活值也变小(cache 的中间态可重计算),且 attention 的通信开销下降。这让 DeepSeek-V2/V3 在训练超长上下文时也更经济。

效果与局限

效果:

  • DeepSeek-V2 在保持质量前提下,把生成阶段的 KV cache 压到 MHA 的 ~3%~7%(取决于配置),长上下文吞吐显著提升。
  • DeepSeek-V3 沿用 MLA,支持原生 128k 上下文,单机推理成本远低于同参数量 Dense 模型。
  • 质量上,MLA 在标准 benchmark 上与 MHA 持平,在长文档检索任务上优于 GQA。

局限:

  • 实现复杂度高。吸收技巧和解耦 RoPE 让 kernel 实现比标准 attention 难得多,需要定制 CUDA kernel 才能跑满——社区早期的「MLA 复现」常常因为 kernel 不优化而性能远不及论文。
  • 与部分推理框架兼容有摩擦。vLLM、SGLang 等框架对 MLA 的支持是逐步完善的,早期对 prefix sharing、chunked prefill 等优化有局限。
  • 压缩比对超参敏感。$d_c$ 取太小会掉点,取太大失去压缩意义;解耦 RoPE 维度 $d_h^R$ 也要单独调。
  • 不是所有模型都适合。MLA 的红利在「头数多、单头维度小」的配置下最大;头数本来就少的模型收益有限。

谁该关心

  • 做大模型推理 infra 的人:MLA 是 KV cache 优化的新范式,理解它的吸收技巧和解耦 RoPE 是支持 DeepSeek 系列模型的前提。
  • 设计长上下文模型的人:如果你在 100k+ 上下文上挣扎于 KV cache,MLA 提供了除 GQA、量化之外的第三条路,且质量更稳。
  • 复刻 DeepSeek 架构的团队:MLA 是 V2/V3 的招牌组件,但要警惕「论文写得简洁、实现极其 tricky」的落差,建议直接参考 DeepSeek 开源 kernel。
  • 研究 attention 效率的人:MLA 把「低秩压缩」和「吸收投影」两个思想用得很漂亮,对设计新的高效注意力有启发。

一个判断:MLA 不是 GQA 的简单升级,而是把 attention 重新参数化了一次。它的工程门槛意味着短期内不会取代 GQA 成为大众默认,但在追求极致长上下文性价比的模型上,它已经是事实标准之一。

注意力机制KV Cache长上下文推理优化