注意力的显存战争:从 MHA 到 MLA,KV Cache 是怎么被一步步压缩的
长上下文时代,推理显存的大头不是权重而是 KV Cache。本文从公式和维度出发,拆解 MHA、MQA、GQA、MLA 四种注意力变体各自的缓存账,以及 DeepSeek MLA 低秩压缩为什么能把每 token 缓存压到 1/57。
大模型推理时,显存消耗由两部分构成:模型权重(一次性加载,大小固定)和 KV Cache(随上下文长度和并发数线性增长)。当上下文窗口来到几十万甚至 100 万 token 的时代,KV Cache 取代权重成为显存的第一大头——这就是过去三年注意力机制几乎所有架构演进的驱动力。本文把 MHA、MQA、GQA、MLA 四种方案的缓存账一笔一笔算清楚。
一、基线:MHA 的缓存账有多贵
多头注意力(MHA)的公式人人会背,但值得把每个变量的维度标清楚:
Q = X·W^Q, K = X·W^K, V = X·W^V
Attention(Q,K,V) = softmax(QKᵀ / √d_h)·V
其中:n_h = 注意力头数,d_h = 每头维度,L = 层数
推理是自回归的:每生成一个新 token,都要拿它的 Q 去和历史上所有 token 的 K、V 做注意力。为了不重复计算,历史 K、V 必须全部驻留显存——这就是 KV Cache。它的大小:
每 token 每层缓存 = 2 · n_h · d_h 个元素(K 一份、V 一份)
代入 DeepSeek-V3 的配置(n_h=128,d_h=128,L=61):
- 每 token 全模型缓存 = 2 × 128 × 128 × 61 ≈ 200 万元素,bf16 下约 4 MB
- 100 万 token 上下文 ≈ 4 TB 显存——这还只是单请求
4 TB 是什么概念?一张 H100 是 80 GB。MHA 在超长上下文下根本不可行,压缩 KV Cache 不是优化项,是生死线。
二、MQA 与 GQA:拿”头的数量”开刀
最直观的压缩思路:Q 的头保留,K、V 的头大家共享。
MQA(Multi-Query Attention):所有 Q 头共享同一份 K、V。缓存直接除以 n_h(128 倍压缩),但共享太狠,注意力表达力下降明显,模型质量有可见损失。
GQA(Grouped-Query Attention):折中方案——把 Q 头分成 n_g 组,每组共享一份 K、V:
每 token 每层缓存 = 2 · n_g · d_h
以 Llama-2-70B 为例:64 个 Q 头、8 个 KV 组,缓存压到 MHA 的 1/8,而质量损失在多数任务上小到可以接受。GQA 因此成为 2023 年后开源模型的标配。但它的压缩倍数受限于”组数不能太少”,量级上最多压一到两个数量级,对百万级上下文仍然不够。
三、MLA:换一条思路,压缩”表示本身”
DeepSeek 在 V2(2024 年 5 月技术报告)中提出的 MLA(Multi-head Latent Attention,多头潜在注意力)换了一个方向:不减少头,而是把 K、V 压缩进一个低秩潜在向量,缓存的是压缩后的表示而不是 K、V 本身。
核心公式三步:
c_t = W^DKV · h_t # ① 低秩联合压缩:c_t ∈ R^{d_c},d_c = 512
k_t = W^UK · c_t # ② 需要时从潜在向量"升维"还原 K
v_t = W^UV · c_t # (d_c = 512 ≪ n_h·d_h = 16384)
关键在第②步:推理时并不需要真的把 K、V 展开。注意力分数 qᵀk 可以改写为:
qᵀ·k = (W^UQ·c^Q)ᵀ · (W^UK·c) = (c^Q)ᵀ · (W^UQᵀ·W^UK) · c
W^UQᵀ·W^UK 可以在加载权重时预先合并成一个矩阵——这就是所谓的”矩阵吸收”(absorption)。于是推理全程只需要缓存潜在向量 c_t,每 token 每层只有 512 个元素。
还剩一个问题:RoPE 位置编码。RoPE 是直接乘在 Q、K 上的旋转矩阵,和低秩压缩不兼容(压缩后再旋转,吸收技巧就失效了)。MLA 的解法是解耦 RoPE 键:额外保留一条小的旁路,
k_t^R = RoPE(W^KR · h_t) # 解耦 RoPE 键,维度 d_R = 64
位置信息只由这个 64 维的小向量携带,主潜在向量保持”位置无关”从而可以吸收。最终每 token 每层的缓存是:
MLA 缓存 = d_c + d_R = 512 + 64 = 576 个元素
MHA 缓存 = 2 · n_h · d_h = 32768 个元素
压缩比 ≈ 32768 / 576 ≈ 57 倍
四、四种方案对照
| 方案 | 每 token 每层缓存 | 相对 MHA | 质量表现 | 代表模型 |
|---|---|---|---|---|
| MHA | 2·n_h·d_h = 32768 | 1× | 基线 | GPT-3 时代 |
| MQA | 2·d_h = 256 | ~1/128 | 可见下降 | Falcon 等 |
| GQA | 2·n_g·d_h(n_g=8) | 1/8(随组数) | 损失可接受 | Llama-2/3、Qwen |
| MLA | d_c + d_R = 576 | ~1/57 | 官方口径不降反升 | DeepSeek V2/V3/V4 |
回到第一节的账:DeepSeek-V3 用 MLA 后,100 万 token 上下文的 KV Cache 从约 4 TB 降到约 70 GB——从”一个集群都装不下”变成”几张卡就能服务”。这就是为什么 V2 之后 DeepSeek 全系坚持 MLA,也是它敢把 API 价格打到行业地板价的架构底气之一。
五、工程启示
- 选模型时看注意力架构不是玄学:同样标称 1M 上下文,MLA 架构的服务成本结构性和 GQA 架构不同,这会直接传导到 API 定价和并发能力
- 自部署时长上下文预算要按架构算:GQA 模型(如 Llama 系)的 KV Cache 预算按
2·n_g·d_h·L算,MLA 模型按(d_c+d_R)·L算,两者差一个数量级以上 - MLA 的代价:低秩压缩对训练提出更高要求(压缩矩阵要学得好),这是”训练时多花算力、推理时永久省钱”的典型权衡
📋 来源与核验记录:
- DeepSeek-V2 技术报告(MLA 提出,低秩压缩/解耦 RoPE/矩阵吸收):arXiv:2405.04434
- DeepSeek-V3 技术报告(n_h=128、d_c=512、d_R=64、L=61 等配置):arXiv:2412.19437
- Llama-2 论文(GQA 配置 64 头/8 组):arXiv:2307.09288
- 缓存倍数均为文中所列维度直接计算得出;数据核验日期:2026-07-24