esou 发表于 2025-7-8 13:25:27

deepseek技术解读(1)-彻底理解MLA(Multi-Head Latent Attention)

0. 引言

deepseek比来斗劲出圈,本人也一直存眷deepseek发布的一些技术陈述。在模型训练、推理性能和计算成本上一直能给大师惊喜。读了deepseek的技术陈述,我个人有两个斗劲强的感到感染。第一:deepseek在模型细节上扣的斗劲极致,魔改了一些模型框架(比如模型优化方面: MLA, GRPO,MTP);第二:工程能力上确实斗劲强,对于主流的一些框架和技术点能敏捷地整合到本身的系统内(比如:在Infra方面,能看到deepspeed, Megatron,DistServer、vLLM等框架的核心技术点)。后面筹备用几篇笔记学习和整理下deepseek的技术。
本文重点讲解下MLA(Multi-Head Latent Attention)
注:我在学习的过程中,凡是会有些常识盲点,或掌握不精确的处所,我会递归学习一些扩展的脉络。本文也是沿着一些必要的布景常识,逐层解读下MLH的提出布景、要解决的问题和最终的效果。MLA主要通过优化KV-cache来减少显存占用,从而提升推理性能。直接抛出这个结论可能不太好理解。首先我们来看下,对于生成模型,一个完整的推理阶段是什么样的,推理性能上有什么问题。
1. LLM模型推理过程

LLM推理分为两个阶段:prefill阶段和 decode阶段

[*]prefill阶段:是模型对全部的Prompt tokens一次性并行计算,最终会生成第一个输出token
[*]decode阶段:每次生成一个token,直到生成EOS(end-of-sequence)token,产出最终的response
在推理过程中,由于模型堆叠了多层transformer,所以核心的计算消耗在Transformer内部,包罗MHA,FFN等操作,此中MHA要计算Q,K ,V 矩阵,来做多头注意力的计算。
在LLM生成过程中,是一个基于前向序token列预测下一个token的过程,序列中的token(无论是prefill阶段,还是decode阶段)只与它前面的token交互来计算attention,我们也称这种Attention为Causal Attention。矩阵计算上通过一个下三角的Causal Attention Mask来实现token交互只感知前向序列。如图1所示,展现的Transformer内部的细节:



图1、Transformer 内部的计算细节

我们以一个序列的 t 位置的token为例,计算一层Tansformer的attention过程,如列下公式所示:

http://pic3.zhimg.com/v2-5b7dae1fc3d57e13c9d106c0c19d7660_r.jpg

图2、 DeepSeek-V3 中的Attention计算公式

公式中的符号: t 暗示计算序列中第 t 个token; q,k,v,o中的两个下标,前一个暗示token位置,后一个暗示对应的Head下标。
从公式 (7) 可以看到,在计算Attention时, t 位置的 q 只与 t 位置前的 k,v 做计算,所以我们有如下两个结论:

[*]计算前面的 k,v 并不受后面token的影响。
[*]后面计算 t+1, t+2,...., t+n 位置的Attention,要使用前序的 1\to t 位置的 k,v 的值是始终不变的。
所以为了加速训练和推理的效率,在token-by-token生成过程中,避免反复计算前序的 k,v 。研究者们提出把前序计算好的 k,v 缓存起来,这也就是目前主流的KV-cache的机制。KV-cache本质是通过空间换时间的方式。我们知道当前LLM size都斗劲大,GPU的显存空间也是斗劲宝贵的,通过显存来保留KV-cache势必会带来访存的瓶颈。换句话说,如果不用KV-cache模型直接计算(反复计算前序 k,v ),是个计算密集型任务;增加了KV-cache,此刻 k,v 不是通过计算得到,而是从「存储介质」里读出来,GPT内核与存储介质之间要频繁读写,这样就变成了一个访存密集型任务。所以使用了KV-cache的机制,解决的反复计算的问题,但访存的速率也就直接影响到训练和推理的速度。
接下来我们再详细看看对于一个典型的推理架构有几级访存速率,模型推理过程中又有哪些数据要做存储下来,应该如何分配存储。
2. LLM推理阶段显存使用情况

2.1 访存速率分级

为了直不雅观理解访存的速率,我们以一个分布式推理架构为例。
比如2台机器,每台机器有8张A100, 那么在这样一个系统内,卡内,单机卡间,机器之间的数据访谒效率如图3所示。
注:我们的例子中,只描述了一种访存介质HBM (也就是我们常说的显卡的显存),我们知道凡是GPU的存储介质除了显存,还有SRAM和DRAM。SRAM也被成为片上存储,是GPU计算单元上即时访谒更快的存储,所有的计算都要先调剂到片上存储SRAM才能做计算,一般只有几十M大小,带宽可达到20T/s摆布,SRAM是跟计算单元强绑定的,推理阶段一般不考虑将SRAM作为存储单元使用。而DRAM是我们常说的CPU的内存,由于访谒速率较慢,推理阶段一般也不考虑使用。所以我们讨论的推理存储介质,一般就指的是HBM(显存)
http://pica.zhimg.com/v2-853d72cdbf93816fdcf7a4bac4aa8eaa_r.jpg

图3、分布式推理架构卡内、卡间、跨机存储和带宽

由上图的访存带宽可知,卡内的带宽是单机卡间的带宽的3倍,是跨机带宽的20倍,所以我们对于存储的数据应该优先放到卡内,其次单机内,最后可能才考虑跨机存储。
接下来我们再看下,推理过程中,有哪些数据要存储到显存上。
2.2. 模型推理阶段显存分配

下面我画了一张图,如图4所示,推理阶段主要有三部门数据会放到显存里。

[*]KV Cache : 如上一节所述,前序token序列计算的 k,v 成果,会随着后面tokent推理过程逐步存到显存里。存储的量随着Batch,Sequence_len长度动态变化
[*]模型参数:包罗Transformer、Embedding等模型参数会存到显存里。模型大小固定后,这个存储空间是固定的。
[*]运行时中间数据: 推理过程中产出的一些中间数据会临时存到显存,即用即释放,一般占用空间斗劲小



图4. 推理阶段显存占用

由上述可知,推理阶段主要存储消耗是两部门: 模型参数和 KV Cache。那么模型参数占多少,KV Cache又占多少?
首先我们先以一个token的计算过程为例,看下一个token计算要存储多少KV?为了便利理解,我们以Qwen-72B模型为例,模型配置详见: Qwen-72B-Chat。
模型共80层,每层有64个Head,每个Head的向量维度是128,
l=80 , n_h =64 , d_h = 128
注:这里先不考虑qwen 72B GQA的设置(实际KV做了压缩措置),只考虑朴素的MHA的模型布局(假设未做任何措置),GQA后面再详细讨论。如下图5所示,计算一个token,每个Transformer层的每个Head都要存储一对 k,v 。



图5、单token kv缓存数据

所以针对一个token,缓存的 k,v 数据总量:
num_{kv} =2*l * n_h= 2 \times(80 \times 64)_{qwen\_72B} = 10240\tag1
此中公式里的 2 暗示1个 k 和 1个 v 。一个token就要缓存 10240 个 k,v ,这个数是不是有点意料之外!这么多 k,v 占了多少存储呢? 我们假设模型推理阶段是半精度(bf16)参数,每个参数占2Byte。最终一个token的存储占用,如公式 (2) 计算所示:
1token\_mem_{kv} = 2 * num_{kv} * d_h = 2 \times (10240 \times 128)_{qwen\_72B} = 2.62 (MB) \tag 2
我们此刻知道了一个Token计算后需要缓存的 k,v 数量和存储量。那么对于一个实际的推理场景,还要考虑批量Batch(B)和 序列长度Sequence_len(S) 两个维度,来确认整体KV Cache的存储消耗。这两个维度凡是是可以动态变化的。我们看看下面两个场景:
场景1:单条短文本场景
Batch和序列设置: B = 1 , S = 2048。此时 k,vcache总量:mem_{kv} = 1token\_mem_{kv} * B * S= (2.62(MB) \times 1\times 2048)_{qwen_72B} = 5.366GB\tag3
场景2:并发长文本场景
Batch和序列设置: B = 32 , S = 4096。此时 k,vcache总量:mem_{kv} = 1token\_mem_{kv} * B * S= (2.62(MB) \times 32\times 4096)_{qwen_72B} = 343.4 GB \tag4
除了 k,v 消耗存储空间,我们知道模型参数也要占用存储,推理阶段模型参数占用的存储空间是固定的,计算也斗劲简单。假设模型参数量为: \Phi ,以bf16 半精度做推理,则参数量为 2\Phi(Byte)。还是以qwen-72B为例,参数占用存储空间: mem_p = 2* \Phi= 2 \times (72)_{qwen\_72B} = 144 G\tag 5
我们再结合上面两个场景,看看显存的整体分配:

[*]场景1: 模型存储 mem_p =144G ,kv存储 mem_{kv} =5.366GB,模型的参数储存占主导,使用80G的A100, 至少需要2张卡做推理。
[*]场景2:模型存储 mem_p =144G ,kv存储 mem_{kv} =343.4GB,KV Cache储存占主导,使用80G的A100, 至少需要7张卡做推理。
这里还要多烦琐几句,推理阶段按照离线、在线的业务场景,到底组多大的Batch,其实是一个Balance的过程,Batch选择斗劲小,虽然并发度不高,但可能单卡就能装下完整模型参数和KV Cache,这时候卡内带宽会斗劲高,性能可能依然出众,可以考虑适当增加Batch把单卡显存用满,进一步提升性能。但当Batch再增大,超出单卡范围、甚至超出单机范围,此时并发会斗劲大,但跨卡或跨机访存性能会降低,导致访存成为瓶颈,GPU计算资源使用效率不高,可能实际导致整体推理性能不高。所以单从推理Batch设置角度来看,要实测找到性能最佳的平衡点。当前LLM都斗劲大,而访存的容量和访存速率有分级的特点。所以推理过程中,减少跨卡、卡机的访存读写是优化推理性能的一个有效路径。一方面单次读写的数据越少,整体速度会越快;另一方面整体显存占用越少,就能尽量把数据放到单卡或单机上,能使用更高的带宽读写数据。
本文要学习的MLA就是通过减少KV Cache来压缩显存占用,从而优化推理速度。我们在展开了解MLA之前,先看看当前有哪些优化KV Cache的方式。
3. 减小KV cache的方式

3.1. KV Cache 优化方式汇总

业界针对KV Cache的优化,衍生出很多方式,这里我按照本身的堆集,稍微总结下,只简单描述优化的思路,不外多展开。
方式主要有四类:

[*]共享KV:多个Head共享使用1组KV,将本来每个Head一个KV,变成1组Head一个KV,来压缩KV的存储。代表方式:GQA,MQA等
[*]窗口KV:针对长序列控制一个计算KV的窗口,KV cache只保留窗口内的成果(窗口长度远小于序列长度),超出窗口的KV会被丢弃,通过这种方式能减少KV的存储,当然也会损掉必然的长文推理效果。代表方式:Longformer等
[*]量化压缩:基于量化的方式,通过更低的Bit位来保留KV,将单KV成果进一步压缩,代表方式:INT8等
[*]计算优化:通过优化计算过程,减少访存换入换出的次数,让更多计算在片上存储SRAM进行,以提升推理性能,代表方式:flashAttention等
本文要讨论的MLA是共享KV分支下的一种优化方式,下面我们先展开看看共享KV方式有哪些,这些方式也是MLA拿来对比的方式。
3.2. 共享KV优化显存方式

共享KV主要有两种方式,MQA和GQA都是Google提出的,详见: MQA(2019),GQA(2023),如图6所示。



图6、KV Cache优化方式- 共享KV方式

3.2.1. MQA(Multi-Query Attention)
MQA方式斗劲简单,详见上图6最右侧的图,每一层的所有Head,共享同一个 k,v 来计算Attention。相对于MHA的单个Token需要保留的KV数( 2*l * n_h )减少到了( 2 \times l )个,即每一层共享使用一个 k 向量和一个 v 向量
3.2.2. GQA(Group-Query Attention)
GQA是平衡了MQA和MHA的一种折中的方式,不是每个Head一个KV,也不是所有Head共享一个KV,而是对所有Head分组,比如分组数为 g ,那么每组: n_h/g个Head 共享一个KV。当 g=1 时,GQA就等价于MQA,当 g=n_h时, GQA就等价于MHA。
为了便利本身更清晰的理解GQA和MQA ,我还是以一个Token计算KV过程(如图5),画了一些相对细节展开的图,把所有层都画出来,而且加了一些注释。如图7所示:



图7、MHA,MQA,GQA KVcache对比图

我们再总结下单token计算下,几种方式KV Cache的存储量(模型层数: l ,每层Head数量: n_h )

[*]MHA共缓存 2 \times l \times n_h 个 k,v
[*]MQA共缓存 2 \times l个 k,v
[*]GQA共缓存 2 \times l \times g 个 k,v , g 是分组数, 1 \le g \le n_h, 一般取值能被 n_h 整除
本文要讲的MLA也是一种优化共享KV优化的变体,下面我们看看MLA的道理和细节
4. MLA

4.1. MLA KV优化速览

我们先走马不雅观花看看MLA的计算方式和与MQA、GQA的压缩KV的效果对比。
首先我们看看MLA计算Attention的完整公式,如下图8所示



图8、MLA Attention计算公式

在论文中提到,每个Transformer层,只缓存了上述公式蓝框的向量: c_t^{KV}和 k_t^R ,这两个向量的大小分袂为:
c_t^{KV}: 维度为 d_c = 4 \times d_h =512
k_t^R:维度为 d_h^R = d_h /2 = 64
对比MQA(每层有一个 d_h 维度的 k 和 一个 d_h 维度的 v ,共 2d_h 个元素),MLA相当于增加了2.25倍的存储,但DeepSeek描述本身的方式不仅比MQA强,而且比非共享KV的原始MHA也要强,后面4.4节我们在展开讨论。
MLA号称又快又省又强大,下一节我们逐步看看具体的实现。
4.2. MLA道理解读

下面我们参照图8的公式看看MHA的计算过程,首先对图中公式的变量做如下解释说明:

[*]d_c :MLA低秩压缩的维度,论文中取值: d_c = 4 \times d_h
[*]d_h :是单个head的向量维度
[*]n_h :是每层head的数量
[*]d    :隐层维度, d = d_h \times n_h
[*]W^{DKV} \in \mathbb{R}^{d_c \times d} 是低秩变换矩阵
1. 先看下KV的计算过程

[*]首先公式(41)对输入 h_t 做一个低秩压缩,将 d维的输入颠末 W^{DKV} 变换后压缩成 d_c维的 c_t^{KV} 。DeepSeek-V3中 d = 7168 , d_c= 512



[*]然后通过公式(42)和公式(45)两个变换矩阵( W^{UK} , W^{UV} \in \mathbb R^{d_hn_h \times d_c} ),将KV的维度扩展回d = d_hn_h ,也就是每个Head有一个单独的 k,v (跟MHA的KV数量一致)

http://pica.zhimg.com/v2-36f78fff7323bf9f51423181f14b5c78_r.jpg

http://pic1.zhimg.com/v2-4e1e46f42c554e832825b3e53ed87510_r.jpg
注:颠末上述的变换,非常类似LoRA做低参数微调的逻辑。通过两个低秩矩阵先做压缩、再做扩展,最终能降低参数的数量。但MLA本质是要做到减少KV-cache的存储。LoRA强调的是参数量的减少,类似MLA这操作确实也减少了参数量,按DeepSeek-V3的参数配置,两个低秩矩阵参数量: 2 \times d_c \timesd= 2 \times 512 \times 7168,而正常MHA的参数矩阵参数量: d \times d = 7168 \times 7168 。但MLA强调的是KV-cache的减少,也就是KV的激活值减少。当前我们还看不出来怎么减少激活值的数量的,因为单从KV的数量和维度上看跟MHA是一个量级,比GQA和MQA都要多,同时计算又多了一步。当前是斗劲迷糊的...我们再往下继续看...2. 再看下Q的计算过程

[*]公式(37),(38)类似KV的逻辑,通过两个矩阵( W^{DQ}, W^{UQ} \in \mathbb R^{d_hn_h \times d_q} )也做了一层低秩变换,这一步Q的变换看着趋是为了减少模型的参数的数量。在Deepseek-V3里 d_q = 1536 。是KV压缩维度 d_c 的3倍。但相对于 d = 7168 还是压缩了不少。

http://pic3.zhimg.com/v2-3fd6f0e4cbb98502ff75ed1e2f3ce09c_r.jpg
3. q,k 增加Rope位置编码

[*]我们注意到在增加RoPE位置编码并没有在上述计算出的 q_t^C,k_t^C 的基础上乘以Rope的对角矩阵。而是单独计算了两个带着位置编码的 q_t^R, k_t^R 如公式(39)和公式(43)所示




注意这里计算带RoPE的 q_t^R, k_t^R 有两个细节:
1. q_t^R, k_t^R 的向量维度 d_h^R 是个斗劲小的维度,DeepSeek设置为单Attention Head维度的一半: d_h^R = d_h /2 = 64
2. 这部门计算的 k_t^R 实际是个MQA的计算方式,同一层中,所有的Head共享同一个 k

[*]然后按如下公式(40),(44)跟已经计算的 q_t^C,k_t^C 拼接,构成完整的 q_t,k_t 向量。
注:这里的下标 i 暗示Attention Head的索引
http://pica.zhimg.com/v2-82b225eaf19b2aebee42fd5bcbcb7f34_r.jpg

http://pic2.zhimg.com/v2-0343ccde57c6317f34e98c80a2ba4695_r.jpg
所以到目前为止,我们得到的 q,k包罗两部门拼接而成:一部门是做了低秩压缩得到的 q,k 向量,一部门是增加了RoPE位置编码的 q,k 向量。(后面这部门向量是基于MQA方式计算得到的,所有Head共享1个 k )。
如何理解上述的操作过程?这也是MLA方式的核心。
我们先来看看DeepSeek-V2论文中有一段原文解释(中文翻译):
位置编码使用RoPE,但RoPE与低秩KV不兼容。具体来说,RoPE对Q和K都是位置敏感的。如果我们为 k_t^C 应用RoPE,那么公式(42)的 W ^{} (K的权重矩阵)将与位置敏感的RoPE矩阵耦合。因此,在推理过程中, W^{UK} 无法再被吸收到 W^{UQ} (Q的权重矩阵)中,因为与当前生成的token相关的RoPE矩阵将位于 W^{UQ} 和 W^{UK} 之间,而矩阵乘法不满足交换律。因此,我们必需在推理过程中从头计算所有前缀token的k,这将极大地降低推理效率。论文中提到了「矩阵吸收计算」,这个概念对理解MLA斗劲重要,我们用一个简单的例子理解下:
假设有两个向量变量 x_1,x_2\in R^{3 \times1} 都是3维的向量。有两个固定的变换矩阵 P,Q \in R^{2 \times 3} 分袂对 x_1, x_2 做线性变换得到新的向量 x_1^{'},x_2^{'} 。最终求 x_1^{'},x_2^{'} 两个向量的乘积。
方式1: 常规计算
x_1^{'} = Px_1 \tag a
x_2^{'}= Qx_2 \tag b
x_1^ {'T} x_2^{'} = (Px_1)^T *(Qx_2) = x_1^T P^T Q x_2 \tag c
方式2:矩阵吸收计算
我们知道矩阵乘法是满足结合律的,对于公式 (c) 我们可以先计算好两个变换矩阵的乘积:
Q^{'}= P^T Q \tag d
然后通过 Q^{'} 与 x_2 相乘,计算出 x_2^{''} ,而 x_1 则不做任何操作
x_2^{''} = Q^{'} x_2 \tag e
再计算 x_1 和 x_2^{''}乘积
x_1^Tx_2^{''}= x_1^{T}Q^{'} x_2 = x_1^T P^T Q x_2 = x_1^ {'T} x_2^{'}\tag f 通过上面的例子我们可以看到,两种方式计算出的成果是一样的,但第二种方式是先做了矩阵乘法,相当于把 x_1    的变换矩阵 P 吸收到了 x_2 的变换矩阵 Q 里。
理解了上面的例子,我们再来看看原文说的「RoPE与低秩KV不兼容,没法做矩阵吸收计算」的问题。
a) 不加RoPE
我们先假设当前不增加RoPE,那么 q,k 乘积计算如下,此中(i) 暗示变换矩阵第 i 个Head的切片:
q_{t,i}^T \times k_{j,i}= (W_{(i)}^{UQ} c_t^Q)^T \times W_{(i)}^{UK}c_j^{KV} = (c_t^Q)^T\times (W_{(i)}^{UQ})^TW_{(i)}^{UK}\times c_j^{KV} \tag 6
不加RoPE,我们可以提前计算好 (W_{(i)}^{UQ})^TW_{(i)}^{UK}, 也就上面说的 W^{UK} 吸收到 W^{UQ} 中,这样在做 q 的变换的时候,也就同时计算了 W^{UK} 矩阵的乘法。
这样的好处是,我们只需要缓存 c_j^{KV} ,而不是缓存 W_{(i)}^{UK}\times c_j^{KV} 的成果。 c_j^{KV}维度只有 4d_h的长度,而 W_{(i)}^{UK}\times c_j^{KV} 是个 4d_h \to d 的变换,也就是完全恢复了隐层的维度 d = d_h * n_h =64d_h (DeepSeek-v3 n_h 配置为64)。这也是MLA的压缩KV Cache的核心道理。
b) 此刻假设增加RoPE
我们再看看,加上Rope后,计算 q,k 乘积,会在(W_{(i)}^{UQ})^T 和 W_{(i)}^{UK}   之间,增加一个融合了相对位置的变量 \mathcal R_{t-j} ,如公式(2)所示:
q_{t,i}^T \times k_{j,i}= (\mathcal R_tW_{(i)}^{UQ} c_t^Q )^T \times\mathcal R_j W_{(i)}^{UK}c_j^{KV}= (c_t^Q)^T\times (W_{(i)}^{UQ})^T\mathcal R_t^T\mathcal R_j W_{(i)}^{UK}\times c_j^{KV}=(c_t^Q)^T\times (W_{(i)}^{UQ})^T\mathcal R_{t-j} W_{(i)}^{UK}\times c_j^{KV} \tag 7
中间这个分量 (W_{(i)}^{UQ})^T\mathcal R_{t-j} W_{(i)}^{UK} 是随这相对位置变化而变化的,并不是个固定的矩阵,因此并不能提前计算好。所以论文中说RoPE与低秩变换不兼容。
c)通过增加一个很小 q,k 分量,引入RoPE
为了引入位置编码,作者在一个很小维度下,用MQA方式计算了 q,k ,也就是在每层网络中,所有Head只计算一个 k (如论文中公式43所示)。引入位置编码的向量维度取的斗劲小为: d_h /2 = 128/2 = 64 。
所以最终 q,k 向量通过两部门拼接而成,计算权重时,由前后两部门分袂相乘再相加得到,如下公式(8)所示:
q_{t,i}^T \times k_{j,i}= ^T \times =q_{t,i}^Ck_{j,i}^C + q_{t,i}^R k_t^R \tag 8
前一项 q_{t,i}^Ck_{j,i}^C 按公式(6)计算,通过矩阵吸收措置,全Head只缓存一个 c_t^{KV} ,后一项 q_{t,i}^R k_t^R 按正常MQA的方式计算,全Head只缓存了一个共享 k 。
通过类似的计算方式,可以措置将 v 的变换矩阵 W^{UV}吸收到最终的成果变换矩阵 W^O 中,这样也不用实际计算和缓存 v 的值。而是只缓存跟 k 一样的 c_t^{KV}即可,详细推导与上述类似,不外多赘述。
上面我们就完整介绍了MLA做KV Cache压缩的道理。我们再来回顾下,MLA实际缓存的向量(如图8蓝色框),维度如下:

[*]c_t^{KV} :维度为 4 \times d_h =512
[*]k_t^R:维度为 d_h /2 = 64
c_t^{KV}是低秩压缩的向量, k_t^R 是引入位置编码的MQA范式计算的共享 k
注:道理篇其实苏神已经解释的非常清晰了(详见:缓存与效果的极限拉扯:从MHA、MQA、GQA到MLA - 科学空间|Scientific Spaces),本文道理的部门也基本按苏神的逻辑概述下关键思路,感激苏神的分享4.3. MLA与MQA、GQA对比

最后我们再简单看看几种方式的对比,直接截取DeepSeeku-V2论文的图,如下:

http://pica.zhimg.com/v2-91ce40059dd409364fbc145b302fa8ca_r.jpg

图9、MLA,MHA,GQA,MQA对比图

从上图我们可以看到,虽然MLA缓存的Latent KV斗劲短(相当于2.25个MQA的缓存量),但MLA有恢复全 k,v 的能力,特征表达能力显著比GQA、MQA要强。所以MLA能做到又快又省又强。论文中也给出了下图的数据



图10、MLA与其他方式压缩性能和效果对比

注:图中能力的斗劲上,描述比MHA更强我斗劲存疑,并没看到有消融的尝试对比,也不太好从道理上解释。5. 总结

本文试图通过引入更多基础常识和辅助信息,来深入理解MLA。内容斗劲长,可能感觉斗劲烦琐。这是本人在理解MLA过程递归总结的一些扩展信息,最终整理了一个系统的脉络,发出来供大师参考。
6.参考文献


[*]deepseek-v1:https://arxiv.org/pdf/2401.02954
[*]deepseek-v2:https://arxiv.org/pdf/2405.04434
[*]deepseek-v3:https://arxiv.org/pdf/2412.19437
[*]缓存与效果的极限拉扯:从MHA、MQA、GQA到MLA - 科学空间|Scientific Spaces
[*]https://zhuanlan.zhihu.com/p/659770503
[*]GQA:https://arxiv.org/pdf/2305.13245
[*]MQA:https://arxiv.org/pdf/1911.02150
个人程度有限,欢迎斧正~
页: [1]
查看完整版本: deepseek技术解读(1)-彻底理解MLA(Multi-Head Latent Attention)