多头注意力的 KV 缓存随层数、头数和序列长度一起增长。多头潜在注意力保留多头计算,存入缓存的内容却换成一个更短的潜在向量。需要 Key 和 Value 时,再通过上投影从这个向量参与计算。
我对照了 DeepSeek-V2 技术报告的结构公式、缓存表和消融实验。MLA 先把当前隐藏状态下投影到联合的低维 KV 向量,然后分别上投影成 Key 和 Value。低维向量的维度远小于所有头的总维度,推理时只缓存这份压缩表示。查询也会做低秩压缩,目的是省训练激活显存,它不会减小历史 KV 缓存。
RoPE 的位置信息要单独放
低秩压缩与 RoPE 组合时会遇到一个具体问题。RoPE 会按位置旋转 Key 和 Query,上投影矩阵因此无法简单吸收进其他矩阵。若照普通方式处理,生成每个新 Token 时都要重算前缀 Key,速度优势就会丢掉。
DeepSeek-V2 把位置部分拆成较小的共享 Key 和每头 Query,只让这一部分承担 RoPE。缓存因此包含联合压缩向量和这个较小的位置 Key。报告表格把 MLA 每 Token 的缓存量折算成约等于 2.25 组的 GQA,同时保留了比 MQA 更多的表示空间。
这个对比也解释了 MLA 为何要做更复杂的联合压缩。报告训了三个约 70 亿参数的稠密模型,都看过 1.33 万亿 Token,只替换注意力。MQA、8 组 GQA 和 MHA 在 MMLU 上分别得到 37.9、41.2 和 45.2,CMMLU 上是 34.6、38.4 和 43.5。共享更多 KV 节省显存,也会压缩注意力能力。MLA 的目标是在较小缓存下恢复更强的多头表示,它与 MQA 的取舍并不一样。
DeepSeek-V2 的具体配置可以看出压缩比例。模型有 60 层,隐藏维度 5120,注意力用 128 个头,每头 128 维。KV 联合压缩维度只有 512,Query 压缩维度为 1536,额外承载 RoPE 的每头维度是 64。这些数字属于该模型的设计,不是 MLA 必须使用的固定规格。
报告还做了同规模消融。两个约 160 亿参数的 MoE 模型用相同训练设置对比,MHA 每 Token 缓存 11.06 万个元素,MLA 为 1.56 万。约 2500 亿参数的对照中,数字从 86.02 万降到 3.46 万。MLA 版本在 BBH、MMLU、C-Eval 和 CMMLU 中大部分分数还更高。这是 DeepSeek 报告自身的模型对照,不能直接推成所有架构都会提分。
压缩数字和实测速度要分开
DeepSeek-V2 报告称,相比 DeepSeek 67B,它的 KV 缓存减少 93.3%。8 张 H800 的单机部署中,按真实服务里的输入与生成长度分布测试,生成吞吐超过每秒 5 万 Token,为 DeepSeek 67B 最大吞吐的 5.76 倍。模型同时改了 MoE 结构、规模和训练方式,这个总体数字不能全部记到 MLA 名下。
通用框架若先恢复完整 Key 和 Value,再调用普通注意力内核,中间张量可能吃掉显存和带宽收益。部署时要同时核对模型配置、实际缓存形状、推理内核支持和长序列吞吐,还要记录批量变化。MLA 的压缩方式已经写在架构里,性能还要由运行它的软件完成。