【DeepSeek-模型解读】DeepSeek-V3模型结构拆解
作者:昇腾实战派
DeepSeek知识地图:
https://blog.csdn.net/weixin_45216014/article/details/156450562?spm=1011.2415.3001.5331
0. 前言
这篇文档主要从原理出发,介绍DeepSeek-V3的关键模型结构。由于DeepSeek-V3的结构是一个持续演进的过程,所以本文首先会简单介混合专家模型(MoE)的基本结构,然后沿着DeepSeek-MoE、DeepSeek-V2和DeepSeek-V3的顺序逐步介绍关键的模型结构。
GitHub:https://github.com/deepseek-ai/DeepSeek-V3
Huggingface:https://huggingface.co/deepseek-ai/DeepSeek-V3
Paper:https://arxiv.org/abs/2412.19437
1. MoE结构简介——更大参数量更少激活的模型
近几年的研究和实践表明训练数据和模型规模的增大能显著增强模型的能力。但是大规模的模型训练也会导致极高的算力成本。为了实际解决成本问题,MoE结构的模型逐渐成为了流行的模型结构与方案。MoE结构的模型可以在大幅减少模型的激活参数量的同时保证模型的效果。
MoE层主要替换传统Transformer Block中的Feed Forward层。在MoE层中包含多个“专家(Expert)”,每个专家的结构与标准的Feed Forward层通常是相同的。在传统的MoE层中,每个token会被输入给一个、两个或topk个专家进行计算。
图1.1和1.2展示了MoE层的结构。图1.1中的蓝色部分即为MoE层的示意。在输入给MoE层前,每个token(即图中的 x 1 x_1 x1或 x 2 x_2 x2)会首先经过路由层(Router)计算出这个token被分发给各个专家的概率,然后取概率最高的topk个专家,将token输入给它们进行计算。当topk大于1的时候,每个token经过topk个专家计算的输出会根据路由层的概率加权求和(图1.2所示)。
2. DeepSeek-MoE——更细粒度的专家和共享专家
2024年1月,DeepSeek发布了它的MoE模型。如图2.1,对比16B DeepSeekMoE模型,DeepSeekMoE 16B达到了LLaMA2 7B模型相同的表现,而后者即激活量为前者的2.5倍。
在DeepSeek-MoE之前,虽然MoE结构表现出了极大的潜力,但它面临着知识混杂与知识冗余的问题(knowledge hybridity and knowledge redundancy)。
- 知识混杂:此前的MoE模型的实践通常包含有限数量的专家(如8个或者16个),由于数量较少,因此每个专家可能包含了多种知识,这导致专家之间难以同时使用。
- 知识冗余:被分配给不同专家的token可能需要获取一些通用的知识,因此,多个专家可能拥有相同的知识,从而造成参数冗余。
上面两个问题导致MoE无法达到理论上限,换句话说,我们希望“专家”之间需要拥有没有重叠的、更专业的知识。
因此,基于上面的分析,DeepSeek-MoE提出了两个优化点: 精细的专家细分(Fine-Grained Expert Segmentation)和共享专家隔离(Shared Expert Isolation)。
- 精细的专家细分
DeepSeekMoE在保持参数量不变的前提下,通过切分FFN层的intermediate hidden dimension将专家切分成更细的颗粒。在更细粒度专家的基础上,为了保持计算成本不变,DeepSeek-MoE会激活更多的专家来让专家的组合更灵活。此外,这么做也让知识的获取变得更加精确。
- 共享专家隔离
DeepSeekMoE隔离了一些固定的专家作为“共享专家”,其余的普通专家为“路由专家”。对于一个token来说,“共享专家”一定会被激活,而“路由专家”只会选topk激活。这么做旨在捕捉和整合不同情境下的共同知识。通过将共同知识压缩到这些共享专家中,其他路由专家之间的冗余将得到缓解。这样可以提高参数的效率,并确保每个路由专家都专注于不同的方面。DeepSeekMoE中的这些架构创新为训练每个专家都是高度专业化的参数高效MoE语言模型提供了机会。
图2.2展示了DeepSeek-MoE结构和传统MoE结构相比而言的演进路线。图(a)为传统MoE结构,在此基础上图,DeepSeek-MoE会将每个专家再切成m个更小的专家,小专家的 intermediate hidden dimension会变为原来的 1 / m 1/m 1/m,这样就会得到图(b)的结构。同时,激活的专家数量也会变成m倍。在图(b)的基础上,DeepSeek-MoE隔离出 K s K_s Ks个专家作为共享专家,并且为了保持计算开销不变,理由专家的激活数量会相应地减少 K s K_s Ks个。所以相对于传统的拥有N个专家的MoE层,DeepSeek-MoE会拥有总共 m N mN mN个专家, K s K_s Ks个共享专家, m N − K s mN-K_s mN−Ks个路由专家。
3. DeepSeek-V2——使用MLA大幅降低推理内存
2024年6月,发布了第二代MoE模型:DeepSeek-V2。它包含236B个参数,其中每个token的激活量为21B,支持128K个token的上下文长度。DeepSeek-V2最大的亮点在于提出了Multi-head Latent Attention(MLA)机制,大幅减少了推理时的显存占用。相比DeepSeek 67B, DeepSeek-V2性能大幅提升,同时节省42.5%的训练成本,KV缓存降低93.3%,最大生成吞吐量提升到5.76倍。
传统的Transformer模型通常会使用Multi-Head Attention(MHA),但在推理的时候,大量的Key-Value(KV)cache会变成限制推理效率的瓶颈。为了降低KV cache,此前的工作提先后出了Multi-Query Attention (MQA) 和Grouped-Query Attention (GQA),它们可以缓解KV cache的压力,但却在模型的表现方面也有所损失,不如MHA。
DeepSeek-V2提出了MLA机制。MLA的核心是对Key和Value进行低秩联合压缩(low-rank joint compression),以减少KV cache。MLA会把key和value的隐向量 h h h压缩成 c c c, h h h原本的最后一维大小为 h e a d _ d i m ∗ h e a d _ n u m head\_dim * head\_num head_dim∗head_num,而压缩之后的向量 c c c的最后一位维度为 d c d_c dc,并满足 d c d_c dc远小于 h e a d _ d i m ∗ h e a d _ n u m head\_dim*head\_num head_dim∗head_num。在推理过程中,MLA只需要缓存向量 c c c,因此KV cache中只有 d c ∗ l dc*l dc∗l个元素,其中 l l l表示层数。
图3.2较为直观地展示了MHA、GQA、MQA和MLA的差别。MHA中每个query头都对应一个key和value头,GQA中会对query头进行分组,每组query对应一个key和value,MQA更进一步,所有query共用一个key和value头。而MLA完全摒弃了这种朴素的优化方案,每个query依然有自己对应的key和value头,只是在推理阶段存储的仅有一个压缩向量 c c c,通过将c向上映射来获得所有的key和query。
图3.3展示了到DeepSeek-V2的模型结构,对于传统的transformer block来说,它将FFN部分改成了DeepSeekMoE结构,将MHA改成了MLA。
4. DeepSeek-V3——使用MTP更好地预测未来Token
2024年12月,DeepSeek发布了第三代MoE模型。这一代模型沿用了DeepSeek-V2的结构,仍然是DeepSeek-MoE加MLA的策略。DeepSeek-V3还开创了一种无辅助损失负载均衡策略(auxiliary-loss-free strategy)来保证专家间的负载均衡,并使用了多token预测(Multi-Token prediction,MTP)训练目标,以获得更强的性能。此外,DeepSeek-V3引入了很多降低训练成本的策略,如DualPipe、FP8混合进度训练等,使得DeepSeek-V3只需要2.788M H800 GPU小时就可以完成完整的训练。图4.1展示了DeepSeek-V3与多个主流模型在各个评估benchmark中的表现,能看到它的性能基本持平或超过GPT-4o和Claude-3.5-Sonnet,但训练成本只需要556万美元。
DeepSeek-V3的主模型在模型结构上和V2没有区别,唯一的区别在于引入了Multi-Token Prediction(MTP)模块。
MTP能将模型的预测范围拓展到未来时间的token。一方面,MTP的目标是使训练信号密集,并且可能可以提高数据使用效率。另一方面,另一方面,MTP 可能使模型能够预先规划其表示,以更好地预测未来的token。
具体来说,DeepSeek-V3训练时在原始模型结构的基础上会增加 D D D个额外的MTP模块,多预测 D D D个token,不过实际代码中D=1,仅多预测一个token。如图4.2所示,中间和右边的即为在原始模型结构基础上额外增加MTP模块。
每一个MTP模块包含共享的embedding层、共享的输出头、一个transformer block和一个从 2 d 2d 2d映射到 d d d的线性层。对于第 i i i个输入token,在第 k k k个预测深度处,即第 k k k个MTP模块处,首先会把第 i i i个token在第 k − 1 k-1 k−1个模块的输出 h i k − 1 h_i^{k-1} hik−1和第 i + k i+k i+k个token在第 k k k个MTP模块embedding层输出concat在一起,并做线性映射获得 h i k h_i^k hik,表示 t i t_i ti在第 k k k个MTP模块对应的输出。它经过Output Head之后,用来预测第 i + k + 1 i+k+1 i+k+1个token的概率。特别地,当 k = 1 k=1 k=1时,第 k − 1 个 k-1个 k−1个模块就表示main model,即图中左边部分。
为了更好理解,这里举个例子。如图中间MTP Moduel 1输入的第2个位置(图中 t 3 t_3 t3的位置),这个模块的 k = 1 k=1 k=1,第2个位置即 i = 2 i=2 i=2,那么这个位置的会把token2(即 t 2 t_2 t2)在第0个模块( k − 1 = 1 − 1 = 0 k-1=1-1=0 k−1=1−1=0,即左边主模块)的输出和token3( t o k e n ( i + k ) = t o k e n ( 2 + 1 ) = t o k e n 3 token(i+k)=token(2+1)=token3 token(i+k)=token(2+1)=token3,即 t 3 t_3 t3)在MTP1的embedding的输出concat到一起,此时最后一维为 2 d 2d 2d,然后再经过线性层,变为 d d d。随后再经过transformer block,获得 h 2 1 ( i = 2 , k = 1 ) h_2^1(i=2, k=1) h21(i=2,k=1),表示 t 2 t_2 t2在MTP1对应的输出。 h 2 1 h_2^1 h21经过Output head之后输出token4( i + k + 1 = 2 + 1 + 1 = 4 i+k+1=2+1+1=4 i+k+1=2+1+1=4)的预测概率。
至此,我们解析完了DeepSeek-V3的主要模型结构,最后,在这里对比一下DeepSeek模型的演进路线。
| 模型 | 主要贡献 | 模型层数 | 稠密层 | 模型参数 | 每个token激活量 | 共享专家数 | 路由专家数 | TOPK |
|---|---|---|---|---|---|---|---|---|
| DeepSeek-MoE | 细粒度的MoE结构、共享专家 | 62 | 0 | 145B | 22.2B | 4 | 128 | 12 |
| DeepSeek-V2 | Multi-head Latent Attention | 60 | 1 | 236B | 21B | 2 | 256 | 6 |
| DeepSeek-V3 | MTP、DualPipe、FP8混合精度训练等 | 61 | 3 | 671B | 37B | 1 | 160 | 8 |
更多推荐



所有评论(0)