MLA(Multi-head Latent Attention,多头潜在注意力)是 DeepSeek-V2 与 V3 提出的一种注意力机制创新,核心目标是大幅压缩推理时的 KV Cache,在更少显存下支撑更长上下文。相比传统 MHA,MLA 把每 token 的缓存从「头数 × 维度」压到「潜在向量维度」,让长文本推理的成本显著下降。本文从瓶颈出发,拆解 MLA 的压缩原理、数学表达与工程落地。
一、为什么需要 MLA:MHA 的 KV 缓存瓶颈
标准多头注意力(MHA)在自回归生成时,每生成一个新 token 都要把历史所有 token 的 Key 和 Value 缓存下来,避免重复计算。这部分 KV Cache 会随序列长度线性增长,是长上下文推理显存占用的大头。以一个 7B 级别、32 层、32 注意力头、每层维度 128 的模型为例,单条序列每 token 的 KV 缓存就已经不可忽视,而 32K 甚至 128K 上下文会让它膨胀数十倍。MLA 正是为了把这个膨胀「折叠」掉而生。
二、从 MHA 到 MLA:注意力压缩的演进
在 MLA 之前,业界已经用两类方法给 KV 缓存瘦身:
- MQA(Multi-Query Attention):所有头共享同一份 K/V,缓存最小,但表达力下降、效果受损。
- GQA(Grouped-Query Attention):把头分组,每组共享一份 K/V,在显存与效果间取得平衡,被 LLaMA 2/3 广泛采用。
MLA 则走了另一条路:不做「头之间的共享」,而是对 K/V 做低秩压缩,把它们映射到一个更小的「潜在向量」,推理时再上投影还原。它的缓存体积比 GQA 还小,却几乎不损失效果。
| 方案 | 每 token KV 缓存 | 显存占用 | 效果损失 |
|---|---|---|---|
| MHA | 头数 × 每头维度 × 2 | 高 | 基准 |
| MQA | 1 × 每头维度 × 2 | 最低 | 明显 |
| GQA | 组数 × 每头维度 × 2 | 中 | 较小 |
| MLA | 潜在维度(远小于头数×维度) | 低 | 几乎无损 |
三、MLA 的核心思想:潜向量压缩
MLA 的关键洞察是:注意力计算中真正需要的 K/V 信息,可以用一个低维的「潜在向量」近似表示。具体来说,MLA 引入一个下投影矩阵,把原始的 K/V(维度很大)压缩成一个很小的潜向量 c 存进缓存;推理时再用上投影矩阵把 c 还原成近似的 K/V。由于 c 的维度远小于原始 K/V,缓存体积大幅下降。
3.1 直觉类比
可以把 MLA 理解为「给 KV 做有损压缩」:原始 K/V 是无压缩的位图,MQA 是「所有人共用一张缩略图」,而 MLA 是「用一张更小的特征图 + 解码器还原」,既小又尽量保真。这让它能在 128K 上下文下仍保持可接受的显存曲线。
四、MLA 的数学表达
设某一层注意力头的维度为 d,潜在维度为 d_c(且 d_c ≪ d)。MLA 的缓存仅保存压缩后的潜向量:
# KV 压缩:把大的 Key/Value 投影到小潜向量 c
c_KV = W_DKV @ concat(K, V) # 下投影,W_DKV: (2d -> d_c)
# 缓存只存 c_KV(维度 d_c,远小于 2d)
# 推理时还原近似 K/V
K' = W_UK @ c_KV # 上投影,W_UK: (d_c -> d)
V' = W_UV @ c_KV # 上投影,W_UV: (d_c -> d)
# 用 K', V' 参与注意力计算
由于缓存维度从 2d 降到了 d_c,当 d_c 取 d 的几分之一时,KV 缓存直接成比例缩小。DeepSeek-V3 的实践里,MLA 配合解耦的 RoPE 设计,使每 token 的 KV 缓存比同规模 MHA 模型小一个数量级以上。
3.2 与 RoPE 的解耦
旋转位置编码(RoPE)需要把位置信息注入 K/V,但压缩后的潜向量不适合直接做旋转。DeepSeek 的解法是「解耦 RoPE」:位置相关的部分单独用一小份带 RoPE 的向量表示,位置无关的主体仍然走 MLA 压缩路径。这样既享受了 MLA 的缓存收益,又保留了长上下文的位置感知。
# 解耦 RoPE:位置信息走单独的「小头」,主体走 MLA 压缩
q, k_pe = split(q_proj(h)) # q 含主体+位置
k_main = W_UK @ c_KV # 压缩主体(无 RoPE)
k = concat(k_main, k_pe) # 拼接:主体 + 旋转位置
# 注意力 = softmax(q @ k^T / sqrt(d)) @ v
五、MLA 到底省了多少显存
用一个具体测算说明差距。假设层数 L=32、头维度 d=128、头数 h=32、MLA 潜在维度 d_c=64、FP16 每参数 2 字节:
| 方案 | 每 token 缓存维度 | 换算字节(FP16) |
|---|---|---|
| MHA | 2 × h × d = 8192 | 16,384 B ≈ 16 KB |
| GQA(8 组) | 2 × 8 × 128 = 2048 | 4,096 B ≈ 4 KB |
| MLA(d_c=64) | 2 × 64 = 128 | 256 B ≈ 0.25 KB |
在 128K 上下文下,仅 KV 缓存一项,MLA 就比 MHA 少占用约 2 GB/序列,这意味着同一张卡能并发更多请求,或把上下文拉得更长。对推理服务而言,这直接转化为吞吐与成本优势。
六、动手实现一个简化版 MLA
下面用 PyTorch 风格的代码给出 MLA 的推理骨架(省略 RoPE 细节,聚焦压缩/上投影):
import torch
class MLAttention(torch.nn.Module):
def __init__(self, d=128, d_c=64, heads=32):
super().__init__()
self.d, self.d_c, self.h = d, d_c, heads
self.W_DKV = torch.nn.Linear(2 * d, d_c, bias=False) # 下投影
self.W_UK = torch.nn.Linear(d_c, d, bias=False) # K 上投影
self.W_UV = torch.nn.Linear(d_c, d, bias=False) # V 上投影
def forward(self, hidden):
# 推理时:用缓存的潜向量 c 还原 K/V,不重算历史
kv = torch.cat([self.k_cache, self.v_cache], dim=-1)
c = self.W_DKV(kv) # 压缩(训练/预填阶段)
K = self.W_UK(c); V = self.W_UV(c) # 上投影还原
# ... 标准 scaled dot-product attention
return attn_output
实际工程中你不必自己写——主流推理框架已经把 MLA 的算子优化好了,重点在于选对框架与版本。
七、部署视角:vLLM 与 SGLang 如何支持 MLA
MLA 的「压缩—上投影」结构需要推理引擎专门优化 PagedAttention / 分页缓存,否则省下的显存会被频繁的上投影计算抵消。好消息是,两大高性能推理框架都已支持 MLA 路径:
- vLLM:从较新版本起支持 DeepSeek 系列的 MLA,配合 PagedAttention 管理压缩后的潜向量缓存。
- SGLang:通过 RadixAttention 与对 MLA 的算子融合,在长上下文、高并发场景表现突出。
如果你打算本地跑 DeepSeek 这类「原生 MLA」模型,建议优先选用上述框架并开启对应优化,避免用不支持 MLA 的旧版推理栈导致显存优势消失。关于 DeepSeek 的本地部署与量化选择,可参考本站 DeepSeek 本地部署实战;想了解 SGLang 的高吞吐推理,可延伸阅读 SGLang 推理引擎 与 vLLM 部署。
八、MLA 与推理模型的协同
推理模型(如 o1/R1 类长链思考)往往要生成上万 token 的「思考过程」,对 KV 缓存压力极大。MLA 的压缩特性让这类模型在有限显存下跑得更久、上下文更完整,是长思维链得以落地的底层支柱之一。延伸可看 推理模型是怎么炼成的,理解长上下文对推理能力的意义。
九、落地建议与 30 秒清单
- 选模型时,关注是否采用 MLA/MQA/GQA:同等效果下,带 KV 压缩的架构显存更友好。
- 跑长上下文服务,优先 vLLM / SGLang 等已优化 MLA 的推理栈。
- 评估成本时按「每 token 缓存 × 上下文长度 × 并发」估算,MLA 通常能把这条曲线压低一个量级。
- 自研注意力时,MLA 的低秩压缩思路值得借鉴,但要注意与位置编码(RoPE)的解耦设计。
十、小结
MLA 多头潜在注意力用「低秩压缩 + 解耦 RoPE」的组合,把推理时的 KV 缓存压到极小,同时几乎不损伤效果。它既是 DeepSeek 系列能撑起超长上下文的工程基石,也代表了「注意力机制本身也在被重新设计以适配推理成本」这一趋势。理解 MLA,有助于你在模型选型、推理部署与架构设计上做出更省显存的决策。




