多头潜在注意力 MLA

MLA (Multi-head Latent Attention)

多头潜在注意力 MLA 是 DeepSeek 提出的注意力架构,用低秩联合压缩把每个 Token 的 Key/Value 投影成一个潜在向量后再缓存,KV 缓存体积相比标准多头注意力降低 90% 以上,并通过解耦的旋转位置编码保住位置信息,是长上下文推理显存与成本大幅下降的关键。

详细解释

多头潜在注意力(Multi-head Latent Attention,MLA) 是 DeepSeek 团队在 2024 年发布的 DeepSeek-V2 中提出的注意力架构,并一路延续到 DeepSeek-V3 与后续的推理模型,如今已成为开源长上下文模型最具代表性的技术名片之一。它要解决的是长上下文推理中最现实的一道坎:上下文越长,KV 缓存 占用的显存就越夸张,直接把并发能力和单位成本卡死。传统 多头注意力 的每层、每个 KV 头都要把完整的 Key 和 Value 张量留在显存里,序列长度翻一倍缓存就翻一倍,128K 上下文下 70B 级模型的 KV 缓存动辄几十 GB,几乎与模型权重同量级,显存水位一高,能同时服务的请求数就急剧下降。MLA 的出发点很明确——想办法让显存里真正缓存的东西变得更小,而不是像早年的做法那样简单粗暴地砍掉 KV 头数、用质量换空间。对商用推理来说,这直接意味着同一张卡能承载的并发请求更少、长文档类业务的单位成本更高,MLA 的压缩正是冲着这个成本痛点来的。

MLA 的机制可以用一句话概括:把每个 Token 的 Key 与 Value 先用一个低秩投影联合压缩成一个维度小得多的潜在向量,推理时显存里只缓存这一个潜在向量,需要计算注意力时再用上投影矩阵把它还原成 Key 和 Value。这里的「低秩」指的是中间向量的维度远小于原本 Key、Value 拼接后的维度,相当于先把高维的 KV 信息打包压成一个小「压缩包」,用时再解压展开。于是显存里缓存的就不再是完整的 Key 和 Value,而是一个体积小得多的潜在向量,KV 缓存体积相比标准 MHA 通常下降 90% 以上。位置信息则采用「解耦」设计:模型专门留出一部分通道用来承载 旋转位置编码,让这部分与压缩后的潜在向量分开处理,避免位置信息在低秩压缩的过程中被一并抹掉。用中文把整个流程说清楚就是——先把 Key 和 Value 压成一条短向量存进显存,用的时候再用两组上投影矩阵分别把它还原成 Key 和 Value 参与注意力计算,缓存的对象始终是那条短向量,而不是还原后的完整结果。

把它和 MQA、分组查询注意力 放在一起比较,思路差异很直观:MQA 和 GQA 是从「数量」入手,让多个 Query 头共享更少的 KV 头,本质上是直接减少要缓存的头数;MLA 是从「体积」入手,头数可以保留得比较多,但每个头缓存的内容被低秩压缩成了一条潜在向量,压缩得更彻底,也更容易兼顾质量。MLA 通常与 混合专家模型 搭配出现(DeepSeek 系列正是 MLA 加 MoE 的组合),一个省显存、一个省算力,在 长上下文扩展 场景里叠加收益很可观。唯元智创 在长上下文网关侧的实践是:把采用 MLA 架构的开源模型作为长序列请求的默认后端,对上层完全透明——调用方依旧按标准接口发请求,无需关心底层是 MLA 还是 GQA,但同样的显存预算下可承载的并发与最大上下文都明显提升,长文档与长会话类业务的单位成本随之下降。权威依据可参考 DeepSeek-V2 论文。

主流注意力变体的 KV 缓存压缩对比表

变体KV 头数策略KV 缓存相对体积压缩方式是否需训练期改动推理精度损失典型代表模型
MHA(多头注意力)每个 Query 头各配一组 KV 头基准 100%无压缩本身即原始结构,无需改动无GPT-3.5 早期、多数早期 Dense 模型
MQA(多查询注意力)所有 Query 头共享一组 KV 头约降到 1/H,个位数百分比共享 KV 头需在预训练时确定明显,长文本与代码任务尤甚PaLM、Falcon
GQA(分组查询注意力)Query 头分组,组内共享一组 KV 头约为 MHA 的 12% 至 25%组内共享 KV 头需在预训练时确定接近 MHALlama 3.x、Qwen3
MLA(多头潜在注意力)KV 头保留较多,但每头内容被低秩压缩相比 MHA 下降 90% 以上低秩联合压缩为潜在向量需在预训练时确定极小,长上下文反有增益DeepSeek-V2、DeepSeek-V3
唯元智创 支持的长上下文模型组合以 GQA 与 MLA 架构模型为主视模型而定,普遍低于 MHA 一半以上架构层压缩叠加网关侧前缀复用取决于所选开源模型低DeepSeek 系列等开源长上下文模型

注意力架构四代演进对照表

代际结构特征KV 缓存开销训练稳定性长上下文友好度
第一代 MHA每个 Query 头独立配 KV 头,结构最直接最高,随序列长度线性增长高,训练最成熟一般,长上下文显存压力大
第二代 MQA全部 Query 头共享一组 KV 头最低,但以输出质量为代价较低,训练易震荡掉点尚可,但长文本质量不理想
第三代 GQA分组共享 KV 头,在质量与开销之间折衷中低,约为 MHA 的 12% 至 25%高,工程落地最广泛较好,128K 场景常见选择
第四代 MLA低秩联合压缩加解耦位置编码很低,相比 MHA 下降 90% 以上高,已被超大规模训练验证优,长上下文首选之一

实战经验与避坑

  1. MLA 的收益只有在长上下文和高并发时才会显现,短请求场景几乎感知不到。 因为压缩优化的是显存里缓存的 KV 体积,只有当缓存本身足够大时,压缩带来的显存与带宽节省才有意义。一段几百 Token 的短问答,KV 缓存本来就很小,无论底层是 MLA 还是 MHA,延迟和成本差别可以忽略。所以如果你的业务以短请求为主,不要因为「MLA 更先进」就盲目追求;真正该看的指标是长序列占比、平均上下文长度和并发水位,只有这些指标上去了,MLA 的优势才会转化成实打实的并发容量与单位成本下降。

  2. 不要试图在推理阶段把 MLA 改回 MHA 来「提精度」,那会重新引入显存问题。 MLA 的关键收益正是来自那层低秩压缩,推理时若强行展开成完整的 Key 和 Value,等于把压缩的好处全部退回去,显存占用瞬间回到 MHA 水平,长上下文很容易直接爆显存。而且不少推理引擎只实现了 MLA 的压缩路径,强行改结构还可能触发未测路径导致结果错误。精度方面,MLA 在长上下文任务上通常并不吃亏,反而因为能稳定容纳更长上下文而表现更好,因此没有必要为理论上的一点点精度去做这种得不偿失的改动。

  3. MLA 是预训练阶段就确定的结构,无法对已经训练好的 MHA 模型做事后转换。 压缩用的下投影矩阵和还原用的上投影矩阵都是模型权重的一部分,是在预训练中一起学出来的,不是推理时临时拼装的。给一份纯 MHA 权重硬塞一套随机初始化的投影矩阵,得到的只是随机压缩,输出会严重退化。因此选型时要在模型层面就选好架构,而不是指望部署阶段「升级」成 MLA。把这一点在选型阶段就把前提讲清楚,可以避免团队到部署时才发现方案不可行。若你手上已有 MHA 模型又不便更换,现实的做法是在新一批 GQA 与 MLA 模型里重新选型,或借助 长上下文扩展 技巧缓解显存压力,而不是硬改架构。在这一步上多做一次确认,往往能省下后期大量返工成本。

  4. 量化与 MLA 组合时要格外留意潜在向量的量化误差会被放大。 潜在向量是压缩后的中间表示,本身维度低、信息密度高,一旦量化到较低位宽,误差会随着上投影还原过程被放大,导致注意力分布偏离。实践中比较稳妥的做法是对潜在向量所在的缓存保持较高精度(例如 INT8 起步甚至更高),而把量化力度更多放在权重侧,并且在采用 MLA 模型的场景下务必做一轮长上下文质量回归,确认没有出现长距离依赖变差、细节回忆失败等问题,再决定是否进一步压低位宽。

  5. 部署前一定要确认推理引擎版本支持 MLA,老版本 vLLM 并不支持。 MLA 不是标准注意力,需要推理引擎有对应的内核实现和 KV 缓存管理逻辑。早期版本的 vLLM 对 MLA 支持不完整甚至完全没有,强行加载会走错误路径或直接报错。上线前应核对引擎版本说明与模型适配清单,必要时升级到明确支持 MLA 的版本,或换用 SGLang 等对 DeepSeek 系列适配较好的引擎。不要只看「模型能加载成功」就认为万事大吉,还要实测长上下文下的正确性与稳定性,尤其是超长序列的端到端回归。

  6. 选型时不要只盯着 KV 体积,还要看解码阶段的计算开销。 MLA 把缓存压小了,但还原 Key 和 Value 需要额外的投影计算,这部分开销在解码每一步都会发生,并不是免费的。因此比较不同注意力方案时,要把显存占用、解码每步计算量、实测吞吐与延迟一起看,尤其在高并发高吞吐场景里,计算开销的差异可能比显存差异更早成为瓶颈。最可靠的方式是用真实业务流量做压测,观察长上下文下的显存水位、每步延迟和整体吞吐,而不是只比较一张对比表上的单个数字。尤其在你计划同时上线多路长上下文服务时,务必先用接近真实的并发组合跑出容量曲线,再据此决定显存与实例规格。

常见问题

MLA 和 GQA 到底该选哪个?
没有绝对优劣,取决于你的上下文长度与并发压力:短上下文、追求部署简单选 GQA,长上下文、显存紧张选 MLA。先看业务画像。如果你的请求大多在几千 Token 以内,GQA 模型生态成熟、引擎支持广、调优资料多,落地风险最低;只有当平均上下文拉长到几万甚至十几万 Token、并且并发上不去时,MLA 的压缩收益才会明显体现在显存水位和单位成本上。再看落地成本。MLA 对推理引擎版本有要求,部署链路可能需要升级或更换引擎,而 GQA 几乎开箱即用;如果团队希望尽量少改基础设施,GQA 更省心。稳妥策略是两条腿走路:长文档、长会话这类重负载走 MLA 后端,短请求走 GQA 或更轻量的模型,用网关按请求特征分流,既拿到 MLA 的成本优势又保留 GQA 的兼容性。落地时先用小流量灰度,对比两条路径的延迟与成本,再决定分流比例。
为什么 DeepSeek 的 MLA 能同时做到省显存又不明显掉精度?
关键不在于「少存东西」,而在于「存得更聪明」——MLA 用低秩压缩降低缓存体积,同时用解耦位置编码和相对充分的 KV 头保留来守住质量。第一,压缩是有损但可控的。低秩投影把高维 KV 信息压成潜在向量,确实会损失一部分细节,但注意力真正需要的权重分布往往具有较强的低秩结构,因此在长上下文任务上压缩带来的精度损失很小。第二,位置信息被单独保护。解耦设计把承载旋转位置编码的通道和压缩部分分开,避免了位置信息被一并压掉,这也是它能稳定支持长上下文的重要原因。此外,MLA 并未像 MQA 那样把 KV 头砍到只剩一组,而是保留了较多头数的表达能力。真正值得警惕的是量化叠加:如果把潜在向量也压到很低的位宽,误差会被放大,所以实践中应让缓存侧保持较高精度,并做长上下文回归验证,回归时重点看长距离依赖与细节回忆这两类指标。
自部署 MLA 模型时最容易踩的坑是什么?
最容易被忽视的坑是推理引擎版本与量化精度这两件事,其次是别在短请求业务上强上 MLA。引擎版本必须先核对。MLA 不是标准注意力,需要推理引擎有对应的内核与缓存管理实现,老版本 vLLM 支持不完整,直接加载可能报错或走错路径;上线前请对照模型适配清单确认版本,必要时升级或换用适配更好的引擎。量化要谨慎。潜在向量信息密度高,低精度量化会放大误差,建议缓存侧保持较高精度并做长上下文质量回归。此外,MLA 的收益在长上下文和高并发时才显著,短请求业务强上只会增加部署复杂度,却看不到成本下降。最后提醒一点:不要幻想把已训练好的 MHA 模型事后转成 MLA,投影矩阵是预训练学出来的,无法在部署阶段补上。把这几件事在上线清单里逐条确认过,基本可以避开绝大多数 MLA 部署事故。