Transformer升级之路:21、MLA好在哪里?(下)
By 苏剑林 | 2025-07-10 | 70938位读者 |在文章《Transformer升级之路:20、MLA好在哪里?(上)》中,我们对MLA相比常见MHA、GQA、MQA的一些变化分别做了消融实验,其中的变化包括“增大head_dims”、“Partial RoPE”和“KV共享”,实验的初步结果是这三个变化很可能都是MLA效果优异的原因。
本文我们将从一个更加偏理论的角度出发,来理解MLA的成功之处。
部分旋转 #
首先,我们把最终的断言放在前面:
在相同训练成本和推理成本下,MLA可能是效果最好的Full Attention变体。
很明显,这个判断把MLA摆在了非常高的位置。这是在比较理想和简化的假设下,根据上一篇文章的实验结果以及本文接下来的理论分析所得的结论。由于实际的训练和推理存在诸多复杂的因素,所以该结论大概率会有所偏差,但我们至少可以得出,MLA应该是走在了正确的改进方向上。
MLA之所以能够表现出色,有一个非常大的前提,那就是部分旋转的Partial RoPE效果不逊色于甚至可能优于完全体的RoPE。这里的Partial RoPE可以有两种含义:一是我们对Attention的$\boldsymbol{Q}$、$\boldsymbol{K}$加RoPE时,可以只对小部份维度加,剩下的维度保持不变;二是我们可以考虑层间RoPE与NoPE交替出现,并且NoPE的层可以占多数。
说白了,RoPE可以只加“一点点”,但不能不加,完全不加的话效果不行。如果需要理论,笔者比较认同《Transformer升级之路:18、RoPE的底数选择原则》的解释,大致意思是Partial RoPE使得检索结果更兼顾位置与语义。此外,像FoX、SBA等新工作也体现出一定潜力,但对于MLA来说,这些变体就相当于NoPE,因此不改变结论。
“Partial RoPE效果不差”的结论,允许我们把Attention的主要计算复杂度放到NoPE部分上,这提供了更大的腾挪空间,MLA便是得益于此。
键值共享 #
Full Attention的变化大致上是从MHA、MQA、GQA然后到MLA,虽然MQA可以看作是GQA的特例,但按时间顺序来说确实是GQA在后。在MLA之后,还出现了MFA、TPA两个变体。这些变体本质上都是在尽量保持效果的前提下,尽可能压榨KV Cache以提高生成速度。
简单来说,Attention模型的复杂度可以分训练、Prefill和Decoding三部分,其中训练和Prefill是相似的,所以本质上是Prefill和Decoding两部分。Prefill是指模型处理输入、直至吐出第一个token的阶段,这部分我们下节再谈;Decoding是指Token by Token的生成阶段,它可以通过KV Cache机制来加速,但同时也导致了KV Cache大小几乎是Decoding速度的唯一瓶颈。
所以,压缩KV Cache就是提高Decoding速度。现在问大家一个问题:在NoPE背景下,给定KV Cache大小后,效果最好的Attention是什么呢?如果不考虑参数量差异,只在单层MHA/GQA/MQA内讨论(TPA和MFA我们后面再补充讨论),那么答案将会是:
一个head_dims等于KV Cache大小、K和V共享的MQA。
看上去是不是让人意外?其实不难理解。因为MHA、MQA都可以看成是GQA的一个特例,所以我们只需要分析GQA,我们在《缓存与效果的极限拉扯:从MHA、MQA、GQA到MLA》已经给出了,GQA可以重新表示成一个K、V拼接起来的模型:
\begin{equation}\underbrace{\left[\boldsymbol{k}_i^{(1)},\cdots,\boldsymbol{k}_i^{(g)},\boldsymbol{v}_i^{(1)},\cdots,\boldsymbol{v}_i^{(g)}\right]}_{\boldsymbol{c}_i\in\mathbb{R}^{g(d_k+d_v)}} = \boldsymbol{x}_i \underbrace{\left[\boldsymbol{W}_k^{(1)},\cdots,\boldsymbol{W}_k^{(g)},\boldsymbol{W}_v^{(1)},\cdots,\boldsymbol{W}_v^{(g)}\right]}_{\boldsymbol{W}_c\in\mathbb{R}^{d\times g(d_k+d_v)}}\end{equation}
这里$g(d_k+d_v)$正是单个Token的KV Cache总大小。接着我们算Attention的时候,$\boldsymbol{c}$到$\boldsymbol{k},\boldsymbol{v}$的变换分别吸收到$\boldsymbol{W}_q$和$\boldsymbol{W}_o$那边去,那么就得到了一个K、V都是$\boldsymbol{c}$的MQA。所以说,“head_dims等于KV Cache大小、K和V共享的MQA”,实际上是给定KV Cache大小后MHA/GQA/MQA的“超集”,那么它自然是理论上效果最好的选择。
双重投影 #
综上所述,如果我们想要在相同Decoding速度下效果最优,那么应该训练一个指定head_dims的、KV共享的MQA,比如约定KV Cache不超过512,那么head_dims=512的、KV共享的MQA就是最佳选择。事实上,MLA在Decoding阶段正是KV共享的MQA(NoPE部分),这就是它走在正确方向上的体现之一。
然而,将head_dims升到512,Decoding是没问题,但训练和Prefill都很难接受,因为它们俩的瓶颈是计算,而影响计算速度的主要因素是num_heads和head_dims。为了保证效果,num_heads变动的空间不大,因此head_dims大小可以说是计算量的唯一指标,head_dims升到512意味着计算量要增加到原来的4倍(相比head_dims=128)。
现在再来问大家一个问题:同样在NoPE背景下,给定num_heads和head_dims后,效果最好的Attention是什么呢?这个问题的答案我相信大家都能接受,那就是MHA,因为它限制最少。所以,单从训练和Prefill成本来看,我们希望的是训练一个head_dims=128的MHA。
怎么调和Prefill与Decoding这两个不同的期望呢?这就是MLA的“大招”了,它通过两步投影得到K、V:先将输入投影到单个512维的向量,然后将该向量投影到多个128维的向量,然后利用“Attention + NoPE”固有的恒等变换性质,可以让模型在MHA-128和MQA-512间自由切换。
$$\require{cancel}\begin{array}{c|c}
\text{训练/Prefill} & \text{Decoding} \\
\\
\begin{gathered}
\boldsymbol{o}_t = \left[\boldsymbol{o}_t^{(1)}, \boldsymbol{o}_t^{(2)}, \cdots, \boldsymbol{o}_t^{(h)}\right] \\[10pt]
\boldsymbol{o}_t^{(s)} = \frac{\sum_{i\leq t}\exp\left(\boldsymbol{q}_t^{(s)} \boldsymbol{k}_i^{(s)}{}^{\top}\right)\boldsymbol{v}_i^{(s)}}{\sum_{i\leq t}\exp\left(\boldsymbol{q}_t^{(s)} \boldsymbol{k}_i^{(s)}{}^{\top}\right)} \\[15pt]
\boldsymbol{q}_i^{(s)} = \boldsymbol{x}_i\boldsymbol{W}_q^{(s)}\in\mathbb{R}^{d_k},\quad \boldsymbol{W}_q^{(s)}\in\mathbb{R}^{d\times d_k}\\
\boldsymbol{k}_i^{(s)} = \boldsymbol{c}_i\boldsymbol{W}_k^{(s)}\in\mathbb{R}^{d_k},\quad \boldsymbol{W}_k^{(s)}\in\mathbb{R}^{d_c\times d_k} \\
\boldsymbol{v}_i^{(s)} = \boldsymbol{c}_i\boldsymbol{W}_v^{(s)}\in\mathbb{R}^{d_v},\quad \boldsymbol{W}_v^{(s)}\in\mathbb{R}^{d_c\times d_v} \\[10pt]
\boldsymbol{c}_i = \boldsymbol{x}_i \boldsymbol{W}_c\in\mathbb{R}^{d_c},\quad \boldsymbol{W}_c\in\mathbb{R}^{d\times d_c}
\end{gathered}
&
\begin{gathered}
\boldsymbol{o}_t = \left[\boldsymbol{o}_t^{(1)}\boldsymbol{W}_v^{(1)}, \boldsymbol{o}_t^{(2)}\boldsymbol{W}_v^{(2)}, \cdots, \boldsymbol{o}_t^{(h)}\boldsymbol{W}_v^{(h)}\right] \\[10pt]
\boldsymbol{o}_t^{(s)} = \frac{\sum_{i\leq t}\exp\left(\boldsymbol{q}_t^{(s)} \boldsymbol{k}_i^{\color{#ccc}{\smash{\bcancel{(s)}}}}{}^{\top}\right)\boldsymbol{v}_i^{\color{#ccc}{\smash{\bcancel{(s)}}}} }{\sum_{i\leq t}\exp\left(\boldsymbol{q}_t^{(s)} \boldsymbol{k}_i^{\color{#ccc}{\smash{\bcancel{(s)}}}}{}^{\top}\right)} \\[15pt]
\boldsymbol{q}_i^{(s)} = \boldsymbol{x}_i\boldsymbol{W}_q^{(s)}\boldsymbol{W}_k^{(s)}{}^{\top}\in\mathbb{R}^{d_c}\\
\boldsymbol{k}_i^{\color{#ccc}{\smash{\bcancel{(s)}}}} = \boldsymbol{v}_i^{\color{#ccc}{\smash{\bcancel{(s)}}}} = \boldsymbol{c}_i= \boldsymbol{x}_i \boldsymbol{W}_c\in\mathbb{R}^{d_c}
\end{gathered}
\end{array}$$
总而言之 #
我们将前面的推理逻辑做个总结:
1、大前提:Partial RoPE的效果不差于甚至可能优于RoPE,这使得我们可以把主要精力放在NoPE上;
2、Decoding主要瓶颈是KV Cache,理论效果最优的模型是head_dims=KV Cache、KV共享的MQA;
3、训练和Prefill的主要瓶颈都是head_dims,理论效果最优的模型是head_dims为期望值的MHA;
4、在NoPE前提下,Attention具有恒等变换性质,可以通过LoRA来尽可能地兼顾两个理想方向,这正好是MLA所做的。
剩下的,就是给K拼接一个共享的低维RoPE,以最小的成本给MLA补充上位置信息,同时还“一箭双雕”:拼接RoPE的做法暗合了“Partial RoPE”,同时也增加了head_dims,这跟上一篇文章的结论相符。换句话说,有意或者无意之中使用了Partial RoPE和增加了head_dims,是MLA在极致压缩之下还能媲美MHA的主要原因。
从MQA的角度看,MLA是给Q加了rank=128的LoRA;从MHA的角度看,MLA是给K、V加了rank=512的LoRA。可以说,MLA是一场NoPE结合LoRA、MHA结合MQA的极致“魔术秀”,成功实现了Prefill和Decoding的“双向奔赴”。
当然,上述思考过程肯定有一些过于简化的地方。比如,实际的训练和推理还有诸多细节因素,笼统地归结为head_dims和KV Cache是不完全准确的,例如MQA在Decoding阶段无法TP(张量并行),这可能会带来新的效率问题;还有,分析过程中我们也没有特别注重参数量的对齐,比如在head_dims=128时我们也可以考虑增加Q、K、V的投影复杂度来提高性能,而不一定要增大head_dims;等等。
总之,上下两篇文章旨在提供一些实验和思考,来论证MLA在一定范围内的最优性。当然,MLA是DeepSeek首先提出的,第三方使用MLA总会给人一种复制DeepSeek的感觉,但在更好的变体出现之前,或者在发现严重的缺陷之前,MLA始终是一个相当有竞争力的选择,如果单纯是为了显示自己不“追随”DeepSeek而不用MLA,那是一个相当不明智的选择。
举个例子,现在Linear Attention和Softmax Attention的混合模型也体现出极大的竞争力,但如果我们将Linear Attention跟LLAMA使用的GQA8-128按3:1混合,那么KV Cache大致上降低到GQA8-128的1/4,然而MLA本身就能将KV Cache降低到GQA8-128的1/4了。
补充讨论 #
前面我们都在围绕MHA、GQA、MQA和MLA讨论,这一节我们来简单聊聊两个比较少谈及的Attention变体:TPA和MFA。
TPA全称是Tensor Product Attention,作者给它安了个Tensor Product的名字,显得比较“唬人”,实际上它是一个介乎GQA和MLA的中间产物。我们以目标KV Cache=512为例,TPA先投影得到一个512维向量,然后reshape为(4, 128),然后分成两个(2,128)分别代表K Cache和V Cache。到目前为止,TPA的做法都跟GQA2-128一致。
接下来,TPA借鉴了MLA的思想,将(2,128)的K/V重新投影成Multi-Head,但它不是像MLA那样整个向量投影,而是沿着“2”所在的维度投影,说白了就是将2个128维向量做head_dims次不同的线性组合。显然,这样TPA的上限是不如MLA直接从整个512维向量出发来投影的。为了缓解这个问题,TPA又引入了data-dependent的组合系数来增强K、V的表达能力,即便如此,笔者还是认为它上限不如MLA。
为什么TPA要这样设计呢?大体上是为了兼容RoPE,这也是它相比MLA的最大“优点”。然而,这里的“优点”是要加个双引号的,因为在Partial RoPE不逊色甚至还可能更优的背景下,兼容RoPE就有点啼笑皆非的感觉了。还有,TPA这样设计,堵死了它升head_dims的空间,比如head_dims想要升到256,那么K Cache、V Cache就只是(1,256)形状了,单个向量没有线性组合的自由度。
再来看MFA,它全称是“Multi-matrix Factorization Attention”,这个名字看上去也有点“唬人”,它实际上就是一个带有Q-LoRA的、head_dims=256的MQA。看到这个配置,是不是有点熟悉?因为这配置跟我们上一篇文章的结论完全吻合——增大head_dims到256来提升MQA的效果,并且KV Cache跟MLA接近,同时通过Q-LoRA来控制参数量。
所以,MFA能“打”MLA,笔者并不意外,上一篇文章我们也实验过差不多的做法了。此外,上一篇文章我们还提出另外两个提升MQA效果的方向,一个是本文已经多次提及的Partial RoPE,另一个是通过QKVO-RoPE的方式实现完全的KV共享,让MQA变成GQA2-256,这两点叠加上去,MFA应该还能再涨一点。
文章小结 #
本文在上一篇文章的实验结果基础上,给出一个偏理论的思考过程,以论证MLA在一定范围内的最优性。总的来说,在Partial RoPE的背景下,MLA似乎是一个非常难以超越的Attention变体。
转载到请包括本文地址:https://www.kexue.fm/archives/11111
更详细的转载事宜请参考:《科学空间FAQ》
如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。
如果您觉得本文还不错,欢迎分享/打赏本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!
如果您需要引用本文,请参考:
苏剑林. (Jul. 10, 2025). 《Transformer升级之路:21、MLA好在哪里?(下) 》[Blog post]. Retrieved from https://www.kexue.fm/archives/11111
@online{kexuefm-11111,
title={Transformer升级之路:21、MLA好在哪里?(下)},
author={苏剑林},
year={2025},
month={Jul},
url={\url{https://www.kexue.fm/archives/11111}},
}










July 10th, 2025
typo: 总而言之一节的总结第4点 通过LoRA来金可能地兼顾->通过LoRA来尽可能地兼顾
fixed, thanks
July 10th, 2025
从剑林老师关于MLA的两篇文章学习到了很多,我想从工程框架的视角简单补充一下信息:
在上半篇文章(https://kexue.fm/archives/10907)中,对我来说最重要的实验是Part VI部分的实验:
参数实验1(模型总参数量943MB):
1. GQA-2-128-32:Group-Query Attention,2个KV head,32个query head,head_dim=128,immediate_size=5456,不使用qo_lora;
2. GQA-1-256-16:Group-Query Attention,1个KV head,16个query head,head_dim=256,immediate_size=5456,不使用qo_lora。
这个实验是严格控制了参数量(qkv_proj、o_proj)、prefill阶段 attention的计算量,以及decode阶段KVCache大小和attention计算量的,说明增加head_dim,降低head个数,效果是不降低甚至有稳定提升的。
之所以觉得这个实验重要,是因为Part VI部分的其他实验,如:
参数实验2(模型总参数量842MB):
1. GQA-2-128-16:Group-Query Attention,2个KV head,16个query head,head_dim=128,immediate_size=5456,不使用qo_lora;
2. GQA-1-256-16:Group-Query Attention,1个KV head,16个query head,head_dim=256,immediate_size=4096,不使用qo_lora。
3. GQA-1-256-16:Group-Query Attention,1个KV head,16个query head,head_dim=256,immediate_size=5456,使用qo_lora。
虽然参数量基本相同,但是GQA-1-256-16在prefill阶段attention的计算量是GQA-2-128-16的2倍;在decode阶段二者访存量一样,但是attention计算量GQA-1-256-16也是GQA-2-128-16的2倍。虽然GQA的计算密度相比GPU的硬件带宽比是很低的,增加decode计算强度不会导致实际性能变化,但是实际上计算量确实是更多的,因此会有疑问效果提升有多少是计算量增加带来的。
扩展起来,我更感兴趣的问题是,能否实现一个同参数MLA,head_dim=192(rope)+64(rope),head_num=96,效果和原始的MLA相同甚至有提升。背景是MLA的计算密度是2*query_head_num,原始的MLA计算强度是256,接近H800/H100和B200的算力带宽比(H800:295,B200:281),远高于A100(156)和H20(37),这个会导致两个问题:
1. 在A100和H20等GPU上,MLA是计算bound,性能非常差;
2. 在H800和B200上,如果开启MTP(draft长度=1的投机采样会导致计算密度翻倍),那么MLA在H800/H100上延迟也会接近翻倍,这个太重了。
总结起来就是原始的MLA对于即使是英伟达最好的GPU来说也有点算力使用过于极限,从B200来看算力带宽比也没有进一步提升的趋势,所以如果能够扩大head_dim,降低head_num,比如head_num=96或者64,那么就可以带来非常多的工程好处,比如也用更低配的卡,再比如H800/H100上对部分请求开启MTP来近似免费的提升吞吐(原始MLA开启MTP,是因为虽然MLA计算时间接近翻倍,但是MOE吞吐可以提升,所以并不能算免费提升,更接近一个tradeoff)。
此外,另一种优化计算密度的思路是Tri Dao他们最近提出来的GLA,但是这个我觉得和GQA一样是牺牲了表达能力的,所以我对剑林老师这种扩大head_dim降低head_num实验背后的可能性更感兴趣。
最后,想从工程视角说一下MLA可能是怎么设计出来的。在23年的时候,我有考虑怎么优化MHA的KVCache存储,当时想到一个方案就是只存储hidden states,然后利用结合律调整矩阵计算顺序,基于decode阶段query里面token长度=1的特点,来优化计算性能。这个其实就是MHA版本的“矩阵吸收”,我当时管这个叫做HiddenStatesCache(https://yywangcs.notion.site/KVCache-3e80054a486e46fcb940f20ecc2db10a,或者知乎:https://zhuanlan.zhihu.com/p/656558274):
1. 优点:效果和MHA严格相同,KVCache节省一半(本质就是KVShared),同时可以通过矩阵计算顺序调整优化掉计算开销。
2. 缺点:解决不了rotary embedding的问题。所以我当时主要是用在ALIBI,以及部分类似absolute position embedding的场景。当时我一方面是以为ALIBI效果和ROPE没有什么区别(因为当时的Baichuan2模型已经开始用ALIBI了),另一方面如果要优化ROPE,想到的几个方案(比如按照head或者frequency维度合并参数),都是有损的。
上面的设计是出于纯工程角度的分析,另一方面,当时也有分析过kv_proj的矩阵性质,大概分析的原因是这篇文章(https://zhuanlan.zhihu.com/p/30996145042)里提到的想对k_proj做逆矩阵,结果发现kv_proj是一个low rank的矩阵,所以可以很自然想到可以将kv_proj分解成两个low rank矩阵的乘积。但是这个地方和ROPE那个一样,没有办法做到工程上完全等价,没有办法做实验。
所以从我的角度一种更接近工程优化顺序的思路线:先考虑到MHA KVCache等价但是空间只有一半的HiddenStatesCache,使用矩阵结合律交换顺序优化性能,然后偶然发现kv_proj可以做成low rank。我不确定DeepSeek的工程师是怎么想到的,但是从工程角度这条优化线是比较自然能想到的(当然要说明一下,这里并没有任何claim什么23年就想过MLA这种idea的意思,毕竟partial rope这个我肯定是没有考虑的,low rank这个也只是偶然发现kv_proj condition number的性质后和朋友聊过一次,并没有特别认真的去实验过可行性)。
我对硬件其实不熟,更专业的问题可以邀请您跟我们infra同学一起吐槽一下hhh,我从理论角度简单谈一下我的看法。
首先,按照本文的观点,MLA可能已经是qk_head_dims=192、v_head_dims=128、KV Cache=576这些条件下的MHA、GQA、MQA的“超集”,即理论上可能是最强的(即便不double q_heads)。那么,如果GQA、MQA这些子集架构如果想要超越MLA,总得有些额外的付出,不然没有免费的午餐。
这些额外的付出,可能是增加head_dims到256,又或者是增加Q、K、V投影的复杂度(比如像linear attention那样加short conv),又或者增加FFN/MoE层的参数,等等。
感谢苏剑林老师和 YyWangCS 网友的精彩讨论。
这个讨论完美地揭示了理论最优设计与工程实践之间的尖锐冲突。苏老师从理论上证明了 MLA 的先进性,它作为“超集”的设计确实非常巧妙。
然而,YyWangCS 网友的工程视角切中了要害,尤其是在国内当前的硬件现实下。目前,国内大厂(如阿里、腾讯、字节)的主力推理芯片是 H20。H20 的理论算力大约只有 H100 的 15%,其算力/带宽比非常低。正如您指出的,原始 MLA 的高计算密度(`2 * query_head_num = 256`)在这种算力严重受限的卡上会立刻变为 compute-bound (参考Tri Dao的论文,关于Arithmetic Intensity: https://arxiv.org/pdf/2505.21487)。
这意味着,尽管 MLA 理论上非常优雅,但在 H20 成为主流算力基座的现实面前,它的实用价值会大打折扣。对于大量使用 H20 的厂商来说,一个无法充分利用硬件带宽、反而处处受限于计算瓶颈的架构,几乎没有大规模部署的价值。
再次感谢这个极具价值的讨论,它指出了一个架构设计必须面对的、残酷的现实问题。
英伟达官方确认 H20 芯片对华销售解禁,意味着什么?将产生哪些影响?
https://www.zhihu.com/question/1928405081889404837
稍微声明一下,这个帖子评论线里面只有最原始的长评论是我发的,那个也只是一个技术讨论。Claude4和HazResearch总结的内容,以及下面关于国产GPU的帖子,都不是我发的,我没有讨论过相关内容。
可能是我之前的回答写的太多了,简单总结一下我自己上面这个长回答的观点:
1. 这两篇文章给我个人提供了非常多有价值的信息,特别是扩大head_dim降低head_num效果不降甚至微涨这点。
2. MLA如果能够降低head_num到96甚至64,然后通过扩大head_dim来补足效果,不仅对算法有好处,对工程也是很友好的,当时是觉得剑林老师不一定意识到这个工程上的好处,所以补充了一下(不过从前两天Kimi的Infra工程师的知乎回复看,肯定是意识到了这点的)。
因为我是做工程的,所以我觉得这两篇文章中的结论对我挺有启发的。
感谢 @YyWangCS 和 @苏剑林 老师的深入讨论。虽然苏剑林老师删除了Kingfall关于Speculative Decoding相关的帖子,但互联网是有痕迹的。
我们将需要指出的是,苏剑林老师对MLA的理论分析虽然精妙,但未充分考虑当前主流的投机解码技术(Multi-Token Prediction (MTP) /EAGLE (https://github.com/SafeAILab/EAGLE))对架构设计的影响。
核心问题在于MLA的高计算密度(2 * query_head_num = 256)与投机解码存在根本冲突:
- 投机解码要求单次前向处理K个候选token(通常K=4~8),使计算量倍增
- MLA在H100上原始计算密度(256)已接近硬件极限(算力带宽比295)
- 开启投机解码后(如K=4),计算密度飙升至1024,远超硬件承载能力,导致延迟倍增
对比GQA/MQA等低计算密度架构(通常 < 128):
- 投机解码下计算增量仍在硬件冗余范围内
- 延迟增长更平缓(1.2~1.5倍)
- 吞吐收益明显优于MLA
若未来推理以投机解码为标配,MLA需降低计算密度,否则其理论优势难以转化为工程实践价值。
我删除的是某些阴阳人自以为幽默的阴阳怪气言论,如果一个人好好说话,即便是批评,我也会保留的。
首先,我已经在文章中表示过,我考虑的因素可能会有些片面,我大部份结论都会谨慎地加上“可能”两个字。我也不否认会有比MLA更好的模型架构的可能性,只是从我的审美观点来看我还没遇到。
其次,MLA跟double heads是解耦的,double heads只是DeepSeek自己对MLA的用法,并不是唯一正确的用法,比如我们的K2就没有double heads;再者,我记得MTP是DeepSeek-V3提的,我相信对方也清楚你说的这些问题。
就文章而言,我只是在一定假设下去品鉴一下MLA,如果要对MLA指手画脚,那可能走错场地了,我并不是MLA的提出者。如果单纯是想冷嘲热讽我一下我不懂硬件,那倒是说对了,我确实不懂,不妨请留下大名让我请教一翻,而不是做藏头露尾的无胆匪类。
处于工作保密原因,在此匿名地简单提两个问题。
1. 贵司 Moonshot (Kimi) 的H100是通过什么途径购买的?据我了解23年开始国内就无法合法的购买H100了。
2. 如何看待国产GPU芯片的发展?例如华为晟腾910C以及CloudMatrix 384。910C算力约为H100的60%,但内存带宽颇具优势,在这种设定下,MLA 4.5倍于GQA的计算量是否有落地的可能性?
“CloudMatrix 384 芯片数量 5 倍于 GB200 NVL72,功耗是 GB200 NVL72 的 4 倍,内存容量大概是 GB200 NVL72 的 3.6 倍,内存带宽是 GB200 NVL72 的 2 倍。”
1、我特意请教了Infra同学,当MLA不去double heads时,正好在H20的舒适区间边缘内,即便MTP,也只是Attention部分没什么加速,MoE多数还是有加速空间的;
2、我要表达的观点是“MLA可能是同等训练成本和推理成本下最好的Attention变体”,你要表达的是“对于某些显卡MLA的计算/推理成本还是太大”,这是两个不算冲突的问题,你的问题不在我的兴趣/能力范围内;
3、关于我们的显卡,我只能说我倒是希望网上的某些谣言是真的,可惜并不是,以及“出于保密原因”并不是你冠冕堂皇窥探别司商业机密的理由。
“美国在2022年年底颁布对华芯片出口禁令,英伟达的王牌人工智能芯片H100和A100都受到了禁令的影响。为了避开禁令限制,英伟达对这两款芯片进行调整,推出了既符合禁令规定又能够基本满足中国用户需求的H800和A800芯片(将NVLink互连总线的连接速率降至400GB/s,比A100芯片下降了200GB/s,)。”
attention和ffn (moe) 计算占比和context length有关,context length越大,attention计算占比越大。请问context length 64K, 128K, 256K的时候, 是H800, H20和晟腾910C的区间吗?
苏老师,根据Deepseek V3 官方论文第十一页: https://arxiv.org/abs/2412.19437, MTP 主要目的是作为额外的训练信号提升训练性能,而不是随机解码 (EAGLE)。MLA 和 MTP 是否适配,我想请教一下苏剑林老师,严格计算的话这里的加速比大概是多少?
论文5.4.3节(35页)提到了:
Instead of predicting just the next single token, DeepSeek-V3 predicts the next 2 tokens through the MTP technique. Combined with the framework of speculative decoding (Leviathan et al., 2023; Xia et al., 2023), it can significantly accelerate the decoding speed of the model.
所以还是有用来做推测解码的。
July 10th, 2025
苏神怎么看Tri Dao最近提的GTA和GLA https://arxiv.org/pdf/2505.21487
GTA 跟我们上一篇文章 https://kexue.fm/archives/10907 所提的KV-shared GQA基本一致的(其实还没我们的优雅),这条路我认为可行性;GLA是将MLA的c分为m份,然后做m个dims/m大小的MLA的意思?这个做法很像SSM、Mamba1那套做法,疯狂增加dims。
其实MLA珠玉在前,这些变体都很难觉得有新意了,甚至单从新意上看还不如TPA。至于效果,在自己跑实验之前都不好说。
July 12th, 2025
苏老师您好,
我们是TPA的作者,一直非常欣赏和认可您的工作,也经常拜读您的博客,受益良多。不过,因为您在这篇博客中提到了TPA,我们学习之后感觉有一些困惑,也有一些想要澄清的地方,所以冒昧在这里留言。
1. TPA也可以做Partial RoPE。
AI架构发展日新月异,我们不敢说Partial RoPE和RoPE哪个会有更好的前景。但是我们认为,TPA的核心贡献是改进了MLA中的低秩压缩部分,使其可以和RoPE无缝融合,并没有不支持Partial RoPE。事实上,如果人们想要实现TPA的Partial RoPE,只需要在TPA上直接加partial RoPE即可,或者还可以加上其他的位置编码。所以,我们不清楚在这里是否需要把TPA和Partial RoPE对立起来?
2. TPA回答了您在2024-05-13日的博客中提到的一个“非常本质”的问题。
我们注意到,您在《缓存与效果的极限拉扯:从MHA、MQA、GQA到MLA》文中提到,“...到目前为止的MLA有一个难以绕开的缺陷——不兼容RoPE(旋转位置编码)。...如果加了RoPE的话,这一步就无法实现了。...这个问题可以说非常本质...”
根据我们的理解,通过从张量的角度来观察注意力矩阵,把多个注意力头合并到一起处理,确实是可以很好地和RoPE结合,我们论文中的实验也验证了这一点。因此,TPA至少是给这个问题提供了一个答案。
3. TPA为高效解码提供了支撑。
您在博文中提到,TPA不像MLA那样是整个向量投影,而是拆分成了两个部分,变成了128维向量的线性组合。所以,即使是加入了data-dependent组合,它的上限还是不如MLA。这可能也是您认为TPA其实并没有真正解决您上述“非常本质”的问题,从而觉得“啼笑皆非”的一个原因。
但是实际上,根据我们的实验结果,TPA在使用同样(甚至更小)的KV cache的前提下,它的性能并不比MLA差。当然,我们的实验只是小规模的实验,也许在更大规模的实验上会有不一样的结果。
不过除了性能考量之外,我们认为TPA还有它的独特优势:
(1). TPA从三维张量的角度对注意力矩阵进行分解,天然更加适合张量并行等操作。
(2). 我们基于TPA设计出了更加高效的解码算法FlashTPA(详见我们论文的第4节以及开源实现:github.com/tensorgi/TPA)。
FlashTPA和TPA是同一个算法,但是它在解码过程中,完全不需要实际计算出完整的Q, K, V矩阵,因此可以大幅减少计算量。相比之下,MHA、GQA、MLA都是做不到这一点的。
根据我们论文附录(Appendix C.8),在一次典型的解码步骤中,当模型配置相近时(例如 d_model=2048, d_h=64),各个机制的计算量(FLOPs)有显著差异:
- MHA / GQA: ~4096M
- MLA: ~17408M
- FlashTPA (Rk=Rv=1): ~3648M
- FlashTPA (Rk=Rv=2): ~7296M (其中M为当前KV Cache的长度)。
所以,从计算量上来看,FlashTPA是要远低于MLA的。在我们看来,解码速度对实际应用来说意义重大,也是TPA的核心亮点之一。
简单写了三点想法,期待和您深入交流!
TPA论文作者团队
感谢袁老师。
首先,“啼笑皆非”说的是TPA为了兼容RoPE做了一定程度上的“妥协”(至少在我看来是妥协),结果实际上Partial RoPE更好或者不差,有种被RoPE“背刺”的无奈感,纯粹调侃一下,并不是说TPA不能Partial RoPE。
然后,我看TPA的论文,以及您这里的回复,都是只考虑了head_dims=64,我不知道为啥要取这个非主流选择,现在应该主流都是128,甚至已经有点往256发展的趋势了吧。我看论文附录,TPA是用A100训的,所以我猜测这是A卡的舒适区间?还有TPA的num_heads比MLA多挺多的,我感觉这是一个比较有争议的变量。
MLA其实很大程度上是为H卡定制的,所以哪怕Decoding阶段按MQA-512来推理(也就是您说的计算量显著增加),一定程度上也是划得来的,或者说Infra同学肯定会把这笔账算清楚才决定使用MLA的。当然,如果是A卡或者其他低端卡的话,结论可能有变化。
TPA的另一个问题是KV Cache还跟num_heads相关,在模型变大时这部分也是足够可观的,比如我们的K2的num_heads=64,DeepSeek-V3更是到了128,如果rank=2,那么128*4=512,这就直接导致KV Cache翻倍了。
苏老师您好,
感谢您的回复,我们想要再谈谈如下三点:
1. 关于head_dims和计算成本
您提到的head_dims选择以及与MLA的num_heads对比是非常好的问题。
首先,关于head_dims的选择,我们实验中采用的d_h=64是100M到1.5B参数规模模型在学术界的标准配置之一,与众多已发表模型(如GPT-2,LLaMA3,Qwen2.5,Qwen3等)的设定保持一致。
不过,我们也在论文附录中补充了head_dim=128的配置对比(见论文第31-32页,Example Comparison II & III)。数据显示,在各项成本上:
- 训练/Prefill成本:MLA的QKV projection计算量远大于GQA和TPA(在d_model=8192时,MLA约为306.7M FLOPs,TPA仅为15.7M FLOPs)。这意味着MLA的训练和Prefill成本显著更高, MLA的训练成本和Prefill成本会达到GQA的1.5倍以上。
- Decoding成本:通过我们提出的FlashTPA算法,在解码单个token时,TPA的计算量(FLOPs)也远低于MLA(在d_model=4096, d_h=128, head_num=32时,MLA约为34816T,而TPA仅为6720T,T为cache长度; 在d_model=8192, d_h=128, head_num=64时,MLA约为69632T,而TPA仅为11392T)。
2. 关于KV Cache与num_heads解耦
您指出的“TPA的KV Cache还跟num_heads相关”是完全正确的,但这仅仅是TPA的一种形式。TPA论文中其实提供了一种关键变体:TPA with non-contextual factors A_k, A_v(详见论文第8-9页和第7页的Table 1) 。
在这种配置下,KV Cache的大小仅为 (R_K + R_V) * d_h,与num_heads完全解耦。更有趣的是,我们在论文第四节Page 9中论证了MQA和GQA都可以被视为这种TPA的特例。这意味着TPA可以视为GQA的严格超集,不仅覆盖其结构,还享有更高效的FlashTPA解码算法。
3. 关于训练稳定性:QK Norm
最后,我们想补充一点关于模型训练稳定性的考量。您在最近的博文《Muon QK-Clip》(https://kexue.fm/archives/11126)中提到,MLA因其隐式计算Q、K的方式,无法使用QK-Norm来稳定训练。而TPA的结构允许对因子B(token-dimension factors)进行归一化,这在功能上类似于QK-Norm,可能为TPA在大规模训练中的稳定性带来额外优势。
以上几点是我们的一些思考,期待能与您有更多深入的交流!
TPA论文作者团队
1、“MLA的QKV projection计算量远大于GQA和TPA(在d_model=8192时,MLA约为306.7M FLOPs,TPA仅为15.7M FLOPs)”,我感觉您这里是不是点错了小数点?如果是2倍我认为是合理的,但20倍明显不大正常;
2、“MLA的训练成本和Prefill成本会达到GQA的1.5倍以上”,这个我认同,这是因为head_dims从128增加到了192,而不是MLA设计带来的问题;
3、而且我始终相信,增加head_dims能提升模型的效果天花板,所以head_dims从128增加192,是增加了成本,但也增加了效果,这一点是使用者可以自主决定是否接受增加的;
4、我看TPA的论文附录,TPA采用的是对齐参数量的方式,这导致TPA的num_heads比MLA多挺多的,TPA的num_heads增加比例,大于MLA的head_dims增加比例,所以从这点看,TPA的计算量应该更大才对;
5、non-contextual TPA是GQA的超集倒是没错,但根据本文的推理,相同设置下的non-contextual TPA是严格弱于MLA的(可能还要加个NoPE条件),不知道您能否理解这一点?
6、TPA正是引入了contextual系数,才可能有跟MLA竞争的可能性,我无法断言contextual的TPA一定优于或者弱于MLA便是为此,我只是说“按照我的直觉来看contextual系数可能还是不如MLA”,请允许我有这个(可能不正确的)直觉;
7、QK-Clip是解决MaxLogit爆炸的通用方法,MHA、GQA、MLA、TPA都可以用;有了QK-Clip之后,MLA无法用QK-Norm不再是遗憾,TPA或许有QK-Clip、QK-Norm以外的Stable方案,但也够不成优势,某种意义上还是劣势,因为TPA要保证实现类似QK-Norm的效果,可能还需要同时对A、B都进行Normalize。
总之,我对TPA并不是有什么意见,我的评价可以总结为两点:1、TPA为了兼容RoPE带来的“妥协”,按照我的直觉是无法带来效果优势的(即之前说的“啼笑皆非”);2、TPA的contextual系数,使得KV Cache依赖于num_heads,这一点看起来还是不利于Scaleup。
July 13th, 2025
"一切似乎都很完美,看上去一个又好又省的理想设计就要出炉了。不过别急,当我们再深入思考一下就会发现,到目前为止的MLA有一个难以绕开的缺陷——不兼容RoPE(旋转位置编码)。"
"前段时间,笔者也很荣幸跟DeepSeek团队讨论过这个问题,但这个问题可以说非常本质,所以当时笔者实际上也没能提出什么有效的建议。"
苏剑林. (May. 13, 2024). 《缓存与效果的极限拉扯:从MHA、MQA、GQA到MLA 》[Blog post]. Retrieved from https://spaces.ac.cn/archives/10091
July 14th, 2025
typo: 总而言之一节的总结第1点 Partial RoPE的效果不差于甚至可能【由】于RoPE->通Partial RoPE的效果不差于甚至可能【优】于RoPE
谢谢,已更正。
July 14th, 2025
很喜欢苏剑林老师的一句话: "QK-Norm确实是压制MaxLogit非常有效的方法,然而它只适用于MHA、GQA等,不适用于MLA,因为QK-Norm需要把Q,K给Materialize出来"
苏剑林. (Jul. 12, 2025). 《QK-Clip:让Muon在Scaleup之路上更进一步 》[Blog post]. Retrieved from https://kexue.fm/archives/11126
July 16th, 2025
partial rope明显更优这一结果的存在,我觉得至少意味着rope理论存在明显漏洞。诸位大佬论证来论证去,也发表了n多paper,结果竟然是有一部份维度不加位置编码更好?这怎么叫人信服!
首先,我们对RoPE的生效机制的了解确实是远远不足,这是对的,但这个事情跟RoPE还是Partial RoPE的好坏没关系。
Partial RoPE也是RoPE的一种,RoPE只是推出了旋转这个形式,但旋转多少角度才好是没有定论的,Partial RoPE只不过是说将某些分量的旋转角度设为0也能表现得很好而已,属于旋转角度的一种选择,并没有超出RoPE的范围。
另外就是Partial RoPE也可以在一定假设下从理论推出来:https://kexue.fm/archives/10122#%E9%83%A8%E5%88%86%E6%97%8B%E8%BD%AC 。
July 16th, 2025
如果DeepSeek V4不用MLA了,我们怎么办?
那当然是好消息,又可以学到新东西了。
又得辛苦Infra的同学了呀
July 16th, 2025
感谢苏老师和各位专家的深入分析。这篇文章从理论上把MLA的优势讲得很透彻,确实非常精妙。
不过,我从实际应用的角度有一个疑问。Kimi K2 的 API 输出速度大约在15-20 tokens/s,根据 https://artificialanalysis.ai 的数据,像 Gemini 2.5 Pro (约146 t/s) 和 GPT-4.1 (约118-201 t/s) 等主流模型的速度要快得多。
这就让我很困惑,MLA 在理论上如此高效,但为何最终产品的推理速度(TPS)反而远低于主流模型呢?尤其是在其激活参数(32B)远小于对手的情况下。希望各位老师能解惑,这其中是否有硬件适配、工程实现或其他方面的权衡?
See https://artificialanalysis.ai/models/grok-4/providers
就你提供的这个链接来说,开源模型就只有DeepSeek、Qwen3 235B和Llama4 Maverick,我们就拿这几个来对比一下。
DeepSeek-V3/R1的速度都是20多,K2模型架构上跟它大同小异,我们的参数量大一点,所以慢一点也可以理解,另外其实我们还没开MTP(在调),开了MTP后还能快一点,所以K2的工程实现应该是不落后于DeepSeek-V3/R1的。
Qwen3 235B的参数量只有K2的1/4,激活参数量也更少(22B vs 32B),但生成速度大致上也只有K2的两倍左右,这大概率还受累于它所用的GQA4-128(KV Cache大概是MLA的2倍)。
Llama4 Maverick总参数量是400B,激活参数则只有17B,更少的总参数量、更少的激活参数量以及大量使用了Chunked attention,这都是它能这么快(160)的原因,然而它的Intelligence并不理想。
其他模型,并没有公布详细的模型结构和部署方式,所以无从猜测,也许有架构上的技巧,也许有硬件上的区别。
Qwen3 235B 接入EAGLE/MTP 应该能快3倍以上,不知道K2接入MTP有多少收益?
15 token per second 这个基本上用户体验和gemini/grok差的比较远了,慢10倍以上。
所以你就只关心快不快,条件你是一点也不看是吧。DeepSeek-R1的Intelligence是68,Qwen3 235B只有62,你又做如何评价?如果只关心快,挑快的模型用就是了,主动权在用户手里。
至于gemini/grok或其他模型,如果他们愿意公布相关细节,我们肯定也乐意学习一波的。还有,K2才是刚刚开始,对于进一步加速我们也有自己的一些思路,未来还有K3、K4,欢迎期待。
哈哈,我比较看好RWKV
linear也在测了。
期待K2 开启MTP之后的效果,比较好奇长context下能提高多少TPS,这个对agentic intelligence还挺重要的哈
如何评价 Qwen3-235B-A22B-Instruct-2507 吊打 Kimi K2? (https://github.com/QwenLM/Qwen3), Qwen3-235B 参数量仅为Kimi K2的1/5.
让子弹飞
我实测Kimi 官方API 只有9-10 TPS,有没有说法啊,搞半天推理速度慢到这种程度?
参见DeepSeek过年期间官网API的可用性。Kimi K2 这次也算一个小爆了,而且应用场景更多是agent这种长链路的请求,服务端端压力大是很正常的。鉴于K2已经开放权重了,应该有很多第三方服务商会跟进服务的。
Qwen3-Coder-480B-A35B-Instruct 激活参数35B, Kimi K2 激活参数32B, Qwen3 -Coder API 60TPS, Kimi K2 API 15TPS, MLA优势在我!
看不懂人话的话,可以问一下各个LLM“MLA可能是同等训练成本和推理成本下最好的Attention变体”的意思,以及它和“对于某些显卡MLA的计算/推理成本还是太大”是否冲突。
MLA快也好,慢也好,都不是否定这个判断的依据。要否定这个判断,只有在完全相同的训练数据、训练设置下,证明效果一样时MLA更慢,或者速度一样时MLA更差。此外,就这里@zhiyuan77|comment-28161的链接来看,235B-A22B的速度也就是40TPS左右,不知道480B-A35B是怎么来的60TPS。
不过我也可能难为你了,怎么能奢求阴阳人听懂正常人话呢。为了不影响其他读者胃口,你后面的任意回复,我都当作你对本文的点赞。
就这样,感谢阴阳哥点赞。