Untitled article

Author

PDF

DeepSeek 在 2024 年 1 月 5 日发布了 DeepSeek LLM, 包括 7B 和 67B 两个 size, 作者主要强调了对于 scaling law 的探究

Introduction

已有的 scaling law 如 KaplanChinchilla 介绍了 model size, dataset size, compute budget 与模型表现之间的关系。在本文中,作者进一步探究了 learning rate 和 batch size 等超参数与模型表现之间的关系。基于发现的 scaling law, 作者为不同大小的模型设置了最优的超参数。并且,作者还发现不同数据集与模型表现之间的关系。

最终,基于这些实验结果,作者提出了 DeepSeek LLM, 模型使用 2T token 进行预训练,使用 1M samples 进行后训练,后训练包括 SFT 以及 DPO.

Pre-training

Architecture

DeepSeek-LLM 的架构与 LLaMA 基本相同,作者在 67B 的模型上使用了 GQA 来提高 inference 效率。最终模型的配置如下表所示

Params7B67B
nlayersn_{\text{layers}}30309595
dmodeld_{\text{model}}4096409681928192
nheadsn_{\text{heads}}32326464
nkv_headsn_{\text{kv\_heads}}323288
Context Length4096409640964096
Sequence Batch Size2304230446084608
Learning Rate4.2e44.2e-43.2e43.2e-4
Tokens2T2T

Data

作者主要从 Common Crawl 构建预训练数据,数据处理过程包括:去重,过滤以及 remixing 三个步骤。

对于 tokenizer, 作者使用了 BBPE 算法,tokenizer 的大小设置为 100,000, 最终的 tokenizer 大小为 102400.

Hyper Parameters

作者主要对比了一下不同 learning rate schedule 的表现:

  1. cosine learning schedule
  2. multi-step learning rate schedule: 包含三个 Stage, 第一个 stage 保持最大学习率,第二个 stage 将学习率降低为最大学习率的 31.6%31.6\%, 第三个 stage 降低为最大学习率的 10%10\%.

对比的实验结果如下图所示

Comparison of different learning schedulers

实验结果显示,multi-step learning rate scheduler 的表现与 cosine learning rate 表现差不多。并且,multi-step learning rate scheduler 对于 continue pretraining 支持更好。因此在本文中作者使用了 multi-step learning rate scheduler.

Infra

作者使用了数据并行,张量并行,序列并行以及 1F1B pipeline 并行。作者还使用了 flash attention 来提高硬件利用率。

Scaling Law

本节中,作者分析了 scaling law, 主要有以下三点:

  1. 构建了针对 learning rate 和 batch size 的 scaling law
  2. 作者使用 non-embedding FLOPs/token MM 来表示 model scale
  3. 预训练数据的质量对最后中的 scaling 影响很大

作者首先构建了针对 batch size 和 learning rate 的 scaling law, 结果显示最优的 learning rate 和 batch size 范围都比较广,这个结论与 Kaplan 一致。

接下来,作者构建了 batch size BB, learning rate η\eta 与 compute budget $C 之间的关系,实验结果如下图所示

Scaling curves of batch size and learning rate

拟合得到的曲线为

ηopt=0.3118C0.1250Bopt=0.2920C0.3271\begin{aligned} \eta_{opt} &= 0.3118* C^{-0.1250}\\ B_{opt} &= 0.2920 * C^{0.3271} \end{aligned}

可以看到,随着 compute budget 增加,BoptB_{opt} 也逐渐增加,而 ηopt\eta_{opt} 逐渐减小。并且,最优参数的范围都比较广。

接下来,作者进一步探究了 batch size 与 generalization error LL 之间的关系。作者希望找到 model scale NN, data scale DD 与 compute budget CC 之间的关系,即

NoptCa,DoptCbN_{opt} \varpropto C^a,D_{opt} \varpropto C^b

compute budget 与 model scale, data scale 之间的关系可以近似表示为 C=6NDC=6ND, 这个公式的推导见 LLM FLOPs computation。我们用 N1,N2N_1,N_2 分别表示模型的 non-embedding parameter 以及 complete parameters, 则我们可以用 6N16N_1 或者 6N26N_2 来近似 model scale, 但是 6N16N_16N26N_2 均没有考虑 attention 的计算开销,因此这两种近似的误差都比较大。

为了解决这个问题,作者提出了一个新的 model scale 表示形式,即 non-embedding FLOPS/token MM, 其中 MM 包含 attention 的计算开销但是不包含 vocabulary computation. 基于这种表示,compute budget 可以近似表示为 C=MDC=MD. MM6N1,6N26N_1,6N_2 的区别表示如下所示

6N1=72nd26N2=72nd2+6VdM=72nd2+12ndl\begin{aligned} 6N_1 &= 72nd^2\\ 6N_2 &= 72nd^2 + 6Vd\\ M &= 72nd^2+12ndl \end{aligned}

其中, dd 是 hidden size, nn 是 layers 个数, VV 是 vocabulary size, ll 是 sequence length. 作者在不同 scale 的模型上比较了三种表示方式,结果发现 6N16N_16N26N_2 要么低估,要么高估了模型的参数量。

基于 model scale 的表示方式,作者构建了如下的优化问题

Mopt(C),Dopt(C)=argminM,D s.t. C=MDL(N,D)M_{opt}(C), D_{opt}(C) = {\arg\min}_{M,D\ s.t.\ C=MD} L(N,D)

作者使用了 Chinchilla 提出来的 IsoFLOP 曲线进行拟合,实验结果如下图所示

IsoFLOP curve and optimal model/data allocation

拟合的曲线为

Mopt(C)=0.1715C0.5243,Dopt(C)=5.8316C0.4757M_{opt}(C) = 0.1715*C^{0.5243}, D_{opt}(C) = 5.8316*C^{0.4757}

作者还进一步拟合了 compute budget 与 optimal generalization error 之间的关系,结果如下图所示

Performance Scaling curve

实验结果显示,作者提出的 scaling law 可以很好预测模型的表现。

最后,作者探究了以下不同数据集的 scaling law, 作者使用 early in-house data, current in-house data 以及 OpenWebText2 来将进行实验,结果如下图所示

Comparison of different dataset scaling

结果显示,scaling law 与数据质量高度相关。当数据质量提升时,model scaling exponent aa 逐步提升,data scaling exponent bb 逐步下降,说明 compute budget 更多由模型参数量决定。因此,作者认为提升 compute budget 之后,我们应该优先提高模型的 model size.

Post-training

作者构建了 1.5M 的中英文指令数据。其中安全性的数据有 300K, 有帮助性的数据有 1.2M, 其中包括 31.2%31.2\% 的通用数据,46.6%46.6\% 的数学相关数据,22.2%22.2\% 的代码数据。

post-training 包含两个阶段:

  1. SFT:7B 的模型训练了 4 个 epoch, 67B 的模型训练了 2 个 epoch, 作者发信进一步训练 67B 的模型会导致过拟合。作者发现,模型在训练过程中会出现重复输出的情况,特别是数学 SFT 数据,为了解决这个问题,作者使用了一个两阶段的 SFT 以及 DPO.
  2. DPO: 提高模型的能力,作者发现 DPO 可以提高模型 open-ended generation skill.

Evaluation

我们主要关注一下消融实验。

首先作者探究了分阶段 SFT 对模型表现的影响。作者发现,小模型在 math 和 code 数据集上需要训练更长时间,但是这也损害了模型的对话能力。为了解决这个问题,作者使用两阶段的训练模式,第一个阶段使用所有的数据进行训练,第二个阶段仅使用对话数据进行训练,实验结果如下表所示

ModelHumanEvalGSM8KRepetitionIFEval
DeepSeek LLM 7B Chat Stage148.263.90.02038.0
DeepSeek LLM 7B Chat Stage248.263.00.01441.2

可以看到,经过第二阶段训练之后,模型的表现有所提升

接下来,作者探究了 Multi-choice question 对模型表现的影响,MCQ 要求模型不仅需要有相关的知识,还要理解每个选项的含义。作者使用 20M 中文 MCQ 来进行消融实验,结果如下表所示

ModelMMLUCEvalCMMLUTriviaQAChineseQA
DeepSeek LLM 7B Chat49.447.049.757.975.0
DeepSeek LLM 7B Chat + MC60.971.373.857.974.4

实验结果显示,MCQ 确实可以提高模型在上述几个 benchmark 上的表现,但是其泛化性会下降。因此,作者在 pre-training 和 fine-tuning 阶段并没有使用 MCQ 数据进行训练。

作者还探究了在 pre-training 阶段加入 instruction data, 来提高 base model 在下游 benchmark 上的表现。结果发现,base model 的表现提升优先。作者认为,尽管 instruction data 可以提高 base model 表现,但是如果 Instruction data 数量过少,则模型表现不太可能学习到有用的知识。因此,作者的做法是不在 pretraining 阶段加入 Instruction data.

最后,作者探究了 system prompt 对模型表现的影响。受 LLaMA 2 启发,作者也尝试在输入中加入 system prompt. 实验结果如下所示

ModelMT Bench
DeepSeek LLM 7B Chat7.15
DeepSeek LLM 7B Chat + System Prompt7.11
DeepSeek LLM 67B Chat8.35
DeepSeek LLM 67B Chat + System Prompt8.58

可以看到,7B 的模型加入 system prompt 之后,模型表现有所下降;67B 的模型加入 system prompt 之后,模型表现有所提升。作者认为,大模型更容易理解 system prompt 的意图,而小模型的指令跟随能力则较差,因此 system prompt 反而会影响模型表现。

Conclusion

作者在本文中提出了 DeepSeek LLM 系列大语言模型,作者详细介绍了超参数的选择以及 scaling law 等。

    DeepSeek 在 2024 年 1 月发布了 DeepSeekMoE, 一个解决 MoE 模型 specialization 不足以及 redundancy 问题的大模型系列。

    Introduction

    作者首先回顾了已有 MoE 模型的不足,主要有两点:

    1. knowledge hybridity: 已有 MoE 模型的专家个数比较少,这就导致每个专家需要掌握更多样化的知识,提高了训练难度
    2. knowledge redundancy: 不同专家掌握的知识可能有重叠,从而导致了模型参数的 redundancy

    为了解决这两个问题,作者提出了 DeepSeek-MoE, DeepSeek-MoE 主要做出了两点改变:

    1. Fine-Grained Expert Segmentation: 作者使用了更多的专家,来提高每个专家的 specialization, 降低训练成本
    2. Shared Expert Isolation: 作者在 Routing expert 的基础上,加入了 shared expert 来学习 common knowledge.

    作者在 2B-A0.6B 的模型进行了实验,结果显示模型表现超过了 GShard, 说明了 DeepSeekMoE 模型架构的有效性。

    作者还进一步将模型 scale 到了 16B-A2.8B 和 145B-A22B, 实验结果均验证了模型的 scaling 效果。

    Method

    Preliminary

    作者首先回顾了 transformer 架构,transformer 的第 \ell 层 decode layer 可以表示为

    u1:T=self_attention(h1:T1)+h1:Tht=FFN(ut)+ut\begin{aligned} u_{1:T}^{\ell} &= \mathrm{self\_attention}(h_{1:T}^{\ell-1}) + h_{1:T}^{\ell}\\ h_t^\ell &= \mathrm{FFN}(u_t^{\ell}) + u_t^{\ell} \end{aligned}

    其中 TT 是 sequence length, h1:T1h_{1:T}^{\ell-1} 是第 1\ell-1 层 decoder layer 输出的 hidden states.

    接下来,我们可以将 dense 架构转换为 MoE 架构,MoE 架构与 dense 架构不同的地方在与 FFN\mathrm{FFN} 不再是 MLP, 而是一个 MoE 模块,其表达式如下

    ht=i=1N(gi,tFFNi(ut))+utgi,t={si,t,,si,tTopk({sj,t1jN},K)0,otherwisesi,t,=softmaxi(utTei)\begin{aligned} h_t^\ell &= \sum_{i=1}^N\left(g_{i,t}\mathrm{FFN}_i(u_t^{\ell})\right) + u_t^{\ell}\\ g_{i,t} &= \begin{cases} s_{i,t,}, &s_{i,t}\in\mathrm{Topk}(\{s_{j,t}\mid 1\leq j \leq N\},K)\\ 0, &\text{otherwise} \end{cases}\\ s_{i,t,} &= \mathrm{softmax}_i({u_t^{\ell}}^Te_i^{\ell}) \end{aligned}

    这里 NN 是专家的总个数, KK 是激活专家个数, eie_{i}^{\ell} 是 routing layer 的权重矩阵,FFNi\mathrm{FFN}_i 是每个专家对应的 FFN.

    DeepSeekMoE Architecutre

    DeepSeekMoE 架构如下图所示

    Architecture of DeepSeekMoE

    相比于其他 MoE 架构,DeepSeekMoE 主要做了以下几点改变。

    Fine-Grained Expert Segmentation

    作者首先解决了每个专家学习内容过多的问题。作者的做法就是将每个 expert FFN 分割为 mm 个更小的专家,具体做法就是将 FFN intermediate hidden size 降低为原来的 1/m1/m. 这样的话就可以在不增加模型参数量的情况下提高模型的表现。修正后的 MoE 模块为

    ht=i=1mN(gi,tFFNi(ut))+utgi,t={si,t,,si,tTopk({sj,t1jmN},mK)0,otherwisesi,t,=softmaxi(utTei)\begin{aligned} h_t^\ell &= \sum_{i=1}^{mN}\left(g_{i,t}\mathrm{FFN}_i(u_t^{\ell})\right) + u_t^{\ell}\\ g_{i,t} &= \begin{cases} s_{i,t,}, &s_{i,t}\in\mathrm{Topk}(\{s_{j,t}\mid 1\leq j \leq mN\},mK)\\ 0, &\text{otherwise} \end{cases}\\ s_{i,t,} &= \mathrm{softmax}_i({u_t^{\ell}}^Te_i^{\ell}) \end{aligned}

    可以看到,现在我们一共有 mNmN 个专家,激活专家个数为 mKmK 个。作者认为,通过提高专家的粒度,我们可以有效增加专家组合的可能性,这就提高了最终的组合多样性。

    Shared Expert Isolation

    接下来,作者介绍了解决不同专家学习到重复知识的问题,作者的做法是在 routing Expert 的基础上加入 Shared expert. 也就是说,有固定几个专家始终都会被激活,这部分专家复杂学习通用知识,从而减少知识冗余。增加 shared expert 之后的 MoE 模块为

    ht=i=1KsFFNi(ut)+i=Ks+1mN(gi,tFFNi(ut))+utgi,t={si,t,,si,tTopk({sj,tKs+1jmN},mKKs)0,otherwisesi,t,=softmaxi(utTei)\begin{aligned} h_t^\ell &= \sum_{i=1}^{K_s}\mathrm{FFN}_i(u_t^{\ell})+\sum_{i=K_s+1}^{mN}\left(g_{i,t}\mathrm{FFN}_i(u_t^{\ell})\right) + u_t^{\ell}\\ g_{i,t} &= \begin{cases} s_{i,t,}, &s_{i,t}\in\mathrm{Topk}(\{s_{j,t}\mid K_s+1\leq j \leq mN\},mK-K_s)\\ 0, &\text{otherwise} \end{cases}\\ s_{i,t,} &= \mathrm{softmax}_i({u_t^{\ell}}^Te_i^{\ell}) \end{aligned}

    此时,模型中一共包含 KsK_s 个共享专家,mNKsmN-K_s 个 routing expert, 其中激活专家个数为 mKKsmK-K_s.

    Load Balancing Loss

    接下来,作者解决了训练时的 load imbalance 问题,作者提出了两个 loss 来分别解决不同层面的 load imbalance 问题。

    首先,在 expert 层面,作者使用了如下的 load balancing loss:

    L=α1i=1NfiPi\mathcal{L} = \alpha_1\sum_{i=1}^{N'}f_iP_i

    其中 α1\alpha_1 是超参数,

    fi=NKTi=1N1(Token i selects Expert i),Pi=1Tt=1Tsi,tf_i = \frac{N'}{K'T}\sum_{i=1}^{N'}\mathbb{1}(\text{Token }i \text{ selects Expert }i),\quad P_i = \frac{1}{T}\sum_{t=1}^Ts_{i,t}

    分别为以及分配给第 ii 个专家的 token 比例以及概率之和。N=mNKsN'=mN-K_s, K=mKKsK'=mK-K_s. 1()\mathbb{1}(\cdot) 是 indicator function.

    其次,在 device 层面,作者也是用了 load balancing loss 来减少不同设备之间不必要的通信。作者将 routed experts 分为 DD 个 group E1,,ED\mathcal{E}_1,\dots,\mathcal{E}_D, 然后每个设备部署一个 group, group level 的 load balancing loss 定义如下:

    L=α2i=1DfiPi\mathcal{L} = \alpha_2\sum_{i=1}^D f_i' P_i'

    其中 α2\alpha_2 是超参数,

    fi=1EijEifi,Pi=jEiPif_i' = \frac{1}{|\mathcal{E}_i|}\sum_{j\in\mathcal{E}_i}f_i,\quad P_i' = \sum_{j\in\mathcal{E}_i}P_i

    实际中,作者使用了一个较小的 α1\alpha_1 来避免 routing collapse, 使用了一个较大的 α2\alpha_2 来提高 Device 层面的负载均衡。

    Training

    作者使用了中英文数据进行训练,tokenizer 基于 BPE 算法,vocab size 为 8K. 模型训练基于 HAI-LLM.训练时使用了 TP, DP, PP, EP 等并行策略。

    2B, 16B, 145B 模型的参数如下表所示

    Model2B16B145B
    total params2B16.4B144.6B
    activated params0.3B2.8B22.2B
    hidden size128020484096
    layers92862
    attention heads101632
    head dimension128128128
    routed experts6364128
    activated experts7612
    shared experts124
    training tokens100B2T245B

    Experiments

    Alignment

    作者针对 DeepseekMoE 16B 进行了微调,微调使用了 1.4M 的训练样本,覆盖了 math, code, QA, reasoning 等任务。

    Ablation Study

    作者在 2B 的模型上进行了 ablation study.

    首先,作者探究了细粒度专家和共享专家的有效性,结果如下图所示

    Ablation on experts

    实验结果显示,与 GShard 相比,使用共享专家可以有效提高模型的表现。并且,使用更细粒度的专家也可以进一步提高模型的表现

    作者还探究了共享专家与路由专家的比例,作者分别使用不同的比例进行实验,结果发现共享专家:路由专家个数为 1:3 的时候模型效果最好。

    作者还探究了模型的泛化性,作者 mask 掉一部分概率最高的 routing expert, 然后从剩下的专家里进行 topK 的挑选,然后作者比较模型和 GShard 的表现,结果如下图所示

    Ablation study on expert specialization

    实验结果显示,DeepSeekMoE 对于 mask 操作更敏感,这说明 DeepSeekMoE 模型中专家的 specialization 更强。

    作者还探究了 mask 掉共享专家对模型表现的影响,结果显示共享专家与路由专家之间的 overlap 很小,去掉共享专家之后,模型表现会变差。

    作者进一步分析了共享专家与路由专家组合的有效性。作者探究 DeepSeekMoE 是否可以使用更少的路由专家来获取知识。作者通过使用不同的 activated routed experts 来进行实验,实验结果如下图所示

    Ablation study on activated routed experts

    实验结果显示,DeepSeekMoE 仅需激活 4 个路由专家,就可以达到与 GShard 相同的表现。这说明了 DeepSeekMoE 模型中每个专家可以学习到更准确的知识。

    Conclusion

    作者在本文中提出了 DeepSeekMoE 架构,来提高 MoE 模型中专家的利用效率。为了达到这一点,作者首先使用了更细粒度的专家,降低每个专家的学习成本,然后,作者使用了共享专家,来降低不同专家之间的知识冗余。作者先在 2B 的模型上验证了方法的有效性,然后作者将模型 scale 到了 16B 和 125B。结果显示模型的效果均超过了以前的工作。

      Introduction

      作者首先提到如何提高模型的训练效率以及 inference efficiency 是两个尚未解决的问题。

      基于这两个问题,作者在本文中提出了 DeepSeek-V2,一个开源的 MoE 模型,DeepSeek-V2 的亮点在于训练和推理都非常高效。最终 DeepSeeK-V2 包含 236B 总参数,激活参数为 21B, 上下文长度为 128K. 作者还开源了 DeepSeek-V2-Lite, 一个 15.7B-A2.4B 的 MoE 模型,用于学术研究。

      DeepSeek-V2 主要改进点为:

      1. 基于 DeepSeekMoE, 使用了 MoE 架构
      2. 使用了 MLA 压缩 KV cache, 大幅度提高推理效率

      DeepSeek-V2 预训练使用了 8.1T tokens, 相比于 DeepSeek-LLM, 预训练数据主要增加了中文数据以及提高了数据的质量。

      接下来,作者收集了 1.5M 对话数据来进行 SFT, 最终作者基于 DeepSeek Math 提出的 GRPO 来进行对齐。

      Architecture

      DeepSeek-V2 的模型架构如下

      Architecture of DeepSeek-V2

      模型基于 DeepSeekMoE 开发得到,相比于 DeepSeekMoE, DeepSeek-V2 主要是使用了 MLA

      MLA

      这部分介绍见 MLA

      DeepSeekMoE

      Architecture

      关于架构的介绍见 DeepSeekMoE

      Device-Limited Routing

      由于 DeepSeek-MoE 使用了细粒度的专家,因此专家会分布在更多的设备(GPU)上,计算时,基于 routing 的 expert 所在设备,会产生不同大小的通信开销。为了降低通信开销,作者构建了 device-limited routing mechanism. 具体的做法就是,在 Routing 之前,先基于 experts 的 affinity score 挑选 MM 个设备,然后基于这 MM 个设备的专家挑选 top-K 专家进行计算。

      作者通过实验发现,当 M3M\geq3 时,device-limited routing 可以和标准的 top-K routing 表现差不多。

      Auxiliary Loss for Load Balance

      作者使用了三个 loss 来实现负载均衡。其中,expert level 和 device level 的 load balancing loss 与 DeepSeekMoE 相同。第三个 loss 是 communication balance loss, 这个 loss 的目的是让每个设备的通信开销保持平衡。损失函数的表达式如下所示

      Lcommunication=αi=1DfiPi\mathcal{L}_{communication} = \alpha\sum_{i=1}^D f_iP_i

      其中 α\alpha 是超参数,DD 是 expert group 的个数。

      fi=DMTt=1T1(Token t is sent Device i),Pi=jEiPjf_i = \frac{D}{MT}\sum_{t=1}^T\mathbb{1}(\text{Token }t \text{ is sent Device }i),\quad P_i = \sum_{j\in\mathcal{E}_i}P_j

      device limited routing 让每个 device 发送至多 MTMT 个 hidden states 到其他设备上。而 communication balancing loss 则让每个设备最多从其他设备接收 MTMT 个 hidden states.

      Token-Dropping Strategy

      尽管前面已经增加了 load balance loss, 但毕竟不是硬约束。因此,作者就从硬件层面提出了 Token dropping 策略,来提高训练效率。核心思想就是,在训练时,主动丢弃部分 token, 强制让各个设备的计算量不会超过额度限制,进而减少资源浪费。

      具体做法就是,在训练之前,先将每个设备的 capacity factor 设置为 1 (定义见 Switch Transformer). 然后按照 affinity score 来丢弃一些分数比较低的 token, 直到该设备的 token 数量刚到达到 capacity。为了避免过度学习导致模型表现较差,对于 10%10\% 的训练数据,作者不执行 token dropping 策略。

      最终,在 inference 时,可以根据需求来决定是否丢弃 token, 比如在 low latency 场景,我们可以丢弃低价值的 token, 在高精度场景,我们就可以保留所有的 token.由于在训练阶段已经才去过 token dropping 策略,因此在推理时不管是丢弃还是全部保留模型都能比较好的适应。

      Pre-training

      Data

      预训练数据与 DeepSeek-LLM 基本上差不多,作者针对中文数据,数据质量进行了改进。最终预训练数据包括 8.1T token, 其中中文数据比英文数据多 12%12\%.

      tokenizer 与 DeepSeek-LLM 一致。

      Model Configuration

      模型配置如下表所示

      ModelDeepSeek-V2DeepSeek-V2-Lite
      Date2024-52024-5
      # Total Parameters236B15.7B
      # Activated Parameters21B2.4B
      # tokens8.1T5.7T
      # Dense Layers11
      # MoE Layers6026
      Hidden Dim51202048
      Dense Intermediate Dim1228810944
      MoE Intermediate Dim15361408
      AttentionMLAMLA
      # Attention Heads12816
      # Key-Value Heads12816
      # Routed Experts16064
      # Experts Active Per Token66
      # Shared Experts22

      这里比较特殊的一点在于,模型在第一层使用了 MoE layer, 这个做法的原因在后面的 olmoe 里有提到,核心思想是 early layer 特别是第一层 layer 收敛比较慢。

      MLA 的配置如下 (DeepSeek-V2)

      fieldvalue
      dcd_c512
      dcd_c'1536
      nhn_h16
      dhd_h128
      dhRd_h^R64

      Training Recipe

      训练的配置也与 DeepSeek-LLM 差不多,对于 MoE,作者使用了 PP 将不同的 layers 分配在不同的 device 上,然后 MoE 的 experts 被分配在 8 个 device 上 (D=8D=8), 对于 device-limited routing, 每个 token 发送到至多 3 个 device, 也就是 M=3M=3.

      Infra

      在 infra 上,DeepSeek-V2 也是用了 HAI-LLM 框架进行训练。这里面使用了 16-way zero-bubble PP, 8-way EP, ZeRO-1 DP.

      由于 DeepSeek-V2 的激活参数比较少,因此,作者没有使用 TP, 进而降低通信开销。作者还将 shared experts 的计算与 expert all-to-all 通信进行重叠来提高计算效率。作者还使用了 kernel fusion 和 flash attention 2 来加速训练。

      Long Context

      在预训练阶段结束之后,作者使用了 YARN 来将模型的上下文从 4K 扩展到 128K. 超参数设置为

      ParameterValue
      ss40
      α\alpha1
      β\beta32
      target context length160K
      scaling factort=0.0707lns+1\sqrt{t} = 0.0707\ln s + 1

      作者在 32K 的上下文下额外训练了 1000 步,然后在推理阶段通过 YaRN 将模型的上下文长度扩展到 128K.

      Evaluation

      作者对比了 DeepSeek-LLM, Qwen1.5, Mixtral MoE 以及 LLaMA 3, 实验结果如下

      Performance of DeepSeek-V2 base

      Efficiency

      作者对比了以下 DeepSeek-MoE 和 DeepSeek-LLM 的训练效率,结果发现,对于 1T 的 token, DeepSeek-LLM 需要 300.6K GPU hours, 而 DeepSeek-V2 仅需要 127.8K GPU hours. 也就是说,DeepSeeK-V2 节省了 42.5%42.5\% 的训练成本

      在推理时,作者首先将模型的精度转换为 FP8,然后作者进一步对模型进行 KV cache quantization 来进一步压缩每个 token 的 KV cache 到 6bits. 最终,DeepSeek-V2 的 throughtput 为 50K tokens/s.

      Post-training

      post-training 分为 SFT 和 RL 两个阶段。

      SFT

      在 SFT 阶段,作者构建了 1.5M 样本,包括 1.2M 有帮助性的样本和 0.3M 安全性相关的样本。模型训练了 2 个 epoch, 学习率为 5e65e-6.

      RL

      作者使用了 GRPO 算法来进一步对齐模型的表现。

      作者通过实验发现,在 reasoning data, 如 code 和 math 相关数据上进行训练时,可以有效提高模型的表现。因此作者将 RL 的训练分为两个阶段,第一个阶段用于提高模型的 reasoning 能力,第二个阶段用于对齐人类偏好。

      在第一个阶段,作者首先训练了一个针对 code 和 Math 的 reward model RMreasoning\mathrm{RM}_{\mathrm{reasoning}}, 然后基于这个 reward model 来训练 policy model:

      ri=RMreasoning(oi)r_i=\mathrm{RM}_{\mathrm{reasoning}}(o_i)

      在第二阶段,作者使用了一个 Multi-reward 框架,包括一个 helpful reward model RMhelpful\mathrm{RM}_{\mathrm{helpful}}, 一个 safety reward model RMsafety\mathrm{RM}_{\mathrm{safety}} 和一个 rule-based reward model RMrule\mathrm{RM}_{\mathrm{rule}}, 最终的 reward 为

      ri=c1RMhelpful+c2RMsafety+c3RMruler_i = c_1\mathrm{RM}_{\mathrm{helpful}}+c_2\mathrm{RM}_{\mathrm{safety}}+c_3\mathrm{RM}_{\mathrm{rule}}

      训练时,reward model 由 SFT model 初始化得到,然后基于 point-wise 或者 pair-wise loss 进行训练。

      Evaluation

      chat 版本的模型评估结果如下所示

      Performance of DeepSeek-V2-chat

      Discussion

      作者讨论了三点发现:

      1. SFT data 数量。已有工作认为进需要 10K 左右的样本就可以进行 SFT,但是作者发现当数据量小于 10K 时,模型在 IFEval benchmark 上的表现大幅度下降。作者认为,这是由于数据过少导致模型很难掌握特定的技能。因此,作者认为足够的数据以及数据质量都很重要,特别是写作类任务和 open-ended QA 类任务。
      2. alignment tax. 作者发现通过 human preference alignment, 模型在 open-ended generation benchmark 上的保险有了很大提升。与 RLHF 一样,作者也发现了 alignment 之后模型在一些 benchmark 上表现也会下降。作者通过改进解决了这个问题,作者认为如何在不损失模型表现的情况下实现对齐是一个值得探究的方向。
      3. online RL. 作者发现 Online RL 比 offline RL 的表现更好。作者认为如何根据不同的任务来选取 offline RL 和 online RL 也是一个值得探究的问题。

      Conclusion

      在本文中,作者提出了 DeepSeek-V2, 一个基于 MoE 架构的大语言模型系列,模型的上下文为 128K. 作者基于 DeepSeek-MoE, 提出了 MLA 来提高模型的 inference 效率,并大幅度降低了训练的成本。

      作者介绍了几点未来工作:

      1. 进一步 scaling up MoE 模型,降低模型的训练以及推理成本
      2. 进一步对齐模型和人类的价值观,然后最小化人类监督信号
      3. 扩展模型到多模态版本

      Reference

      Introduction

      作者首先回顾了开源模型如 MiniMax-01, Kimi-k2, Qwen3, GLM-4.5 和闭源模型的进展,作者指出,现在的开源模型和闭源模型在表现上仍然存在较大差距。作者认为这种差距主要是由于三个原因:

      1. Transformer 提出的 softmax attention 在处理长文本时效率非常低
      2. 已有的开源模型在 post-training 阶段使用的算力不够
      3. 开原模型的泛化和指令跟随能力不如闭源模型

      基于这三个问题,DeepSeek-V3.2 分别进行了改进:

      1. 在架构上,作者提出了 DSA,一个高效的稀疏注意力机制,用于降低计算复杂度
      2. 在 post-training 阶段,作者使用了比 pre-training 阶段高 10%10\% 的算力,用于提高模型的能力
      3. 作者提出了一个 pipeline 用于提高模型在工具调用场景下的 reasoning 能力

      通过实验作者发现,模型达到了和 Kimi-k2 以及 GPT-5 差不多的 reasoning 表现。

      Method

      Architecture

      DeepSeek-V3.2 与 DeepSeek-V3.1 不同之处在于使用了 DeepSeek Sparse Attention (DSA). 架构如下图所示

      Attention architecture of DeepSeek-V3.2-Exp

      DSA 包含两个模块:

      1. lightning indexer
      2. fine-grained token selection mechanism

      其中,lightning indexer 负责计算 query token htRdh_t\in\mathbb{R}^d 和一个 preceding token hsRdh_s\in\mathbb{R}^d 之间的 index score It,sI_{t,s} 来决定 query token 选择的 token:

      It,s=j=1HIwt,jIReLU(qt,jIksI)I_{t,s} = \sum_{j=1}^{H_I}w_{t,j}^I \mathrm{ReLU}(q_{t,j}^I\cdot k_s^I)

      其中, HIH^I 代表 indexer heads 的个数,qt,jIRdIq_{t,j}^I\in\mathbb{R}^{d^I}wt,jIw_{t,j}^I 由 query token hth_t 得到,ksIRdIk_s^I\in\mathbb{R}^{d^I} 由 preceding token hsh_s 得到

      给定 query token hth_t 对应的 index score {It,s}\{I_{t,s}\}, fine-grained token selection mechanism 负责选取 top-K index score 对应的 key-value entries {cs}\{c_s\}, 然后 attention 的输出由 query token 个选取的 key value entries 得到:

      ut=Attn(ht,{csIt,sTopK(It,:)})u_t = \mathrm{Attn}(h_t,\{c_s\mid I_{t,s}\in \mathrm{TopK}(I_{t,:})\})

      [!Recall] MoBA 也提出了类似的方法,但是 MoBA 是一个无需训练的策略

      NSA 启发,作者实现了基于 MQA 模式的 MLA, 其中 latent vector 对于 query token 所有的 query heads 都是共享的。示意图如下所示

      Different modes of MLA

      Continue Pre-training

      作者在 DeepSeek-V3.1 的基础上进行了 continue pre-training. Continue pre-training 包含两个阶段:

      Dense Warm-up stage 这个阶段用于训练 lightning indexer, 作者冻结除 lightning indexer 之外的参数,为了对齐 indexer output 和 main attention distribution, 对于第 tt 个 query token, 作者首先计算所有 attention heads 的 main attention score 之和,然后在 sequence 层面进行 L1-normalization 得到 pt,:Rtp_{t,:}\in\mathbb{R}^t, 最后计算 lightning indexer 输出与 pt,:p_{t,:} 之间的 KL divergence:

      LI=tDKL(pt,:  Softmax(It,:))\mathcal{L}^I = \sum_{t}\mathcal{D}_{KL}(p_{t,:}\ \Vert\ \mathrm{Softmax}(I_{t,:}))

      这个阶段训练一共使用了 2.1B 的 token, lr 为 1e-3, 训练的步数为 1000 steps, batch size 为 16.

      Sparse training stage 这个阶段模型所有的参数都参与训练,该阶段的目的是让模型学习到 DSA 的 sparse pattern. 训练时,作者让 lightning indexer 的输出与 pt,Stp_{t,S_t} 之间的输出进行对齐,其中 St={sIt,sTopK(It,:)}S_t=\{s\mid I_{t,s}\in\mathrm{TopK}(I_{t,:})\}:

      LI=tDKL(pt,St  Softmax(It,:))\mathcal{L}^I = \sum_{t}\mathcal{D}_{KL}(p_{t,S_t}\ \Vert\ \mathrm{Softmax}(I_{t,:}))

      实际训练时,lightning indexer 仅接受 LI\mathcal{L}^I 的反向传播,而 LLM 则仅接受 next-token prediction loss. 这个阶段模型一共使用了943.7B token, 其中 KK 设置为 20482048. 学习率为 7.3×1e67.3\times 1e-6, 训练步数为 15,000 steps, batch size 为 480.

      Post-training

      post-training 与 DeepSeek-V3.1 一致:

      Specialist Distillation 作者基于 DeepSeek-V3.2 base 构建了不同领域的 specialized model, 这些领域包括:

      1. math
      2. competitive programming
      3. general logical reasoning
      4. agentic coding
      5. agentic search

      每个 specialized model 都使用 RL 进行训练,训练数据包括 long CoT reasoning 数据以及 direct response generation 数据,specialized model 训练完毕之后,就被用于生产 domain-specific data, 作者通过实验发现,基于这种蒸馏方法,模型的表现仅比 specialized model 低一点,并且这个 gap 可以被后续的 RL 训练所抵消。GLM-4.5 也采取了类似的做法

      Mixed RL Training 作者使用了 GRPO 算法进行训练,与 DeepSeek-V3 不同,作者将 reasoning, agent 以及 human alignment 的 RL 训练合并为了一个阶段,作者认为这种方法可以平衡模型在多个 domain 上的表现,并且可以防止 multi-stage training 带来的灾难性遗忘问题。对于 reasoning 和 agent 任务,作者使用了 rule-basd outcome reward, length penalty 以及 language consistency reward. 对于通用任务,作者使用了 generative reward model, 每个 prompt 都有对应的 rubris 用于 evaluation. 作者构建 reward 时主要考虑了:

      1. length versus accuracy
      2. language consistency versus accuracy

      DeepSeek-V3.2-Speciale 除了 DeepSeek-V3.2 之外,作者还训练了 DeepSeek-V3.2-Speciale 模型,该模型仅使用 reasoning 数据进行训练,reasoning 数据包含了 DeepSeek-Math-V2 的训练数据以及 reward 方法。训练时,作者降低了 length penalty 的惩罚系数,最终 DeepSeek-V3.2-Speciale 模型拥有更强的 reasoning 能力

      Scaling GRPO

      作者在 GRPO 的基础上对 KL estimate 进行了改进(见 KL divergence),使用了 importance sampling 对 K3 estimator 进行修正:

      DKL(πθ(oi,t)πref(oi,t))=πθ(oi,tq,oi,<t)πold(oi,tq,oi,<t)(πref(oi,tq,oi,<t)πθ(oi,tq,oi,<t)πref(oi,tq,oi,<t)πθ(oi,tq,oi,<t)1)\mathcal{D}_{\mathrm{KL}}(\pi_\theta(o_{i,t})\Vert\pi_{\mathrm{ref}}(o_{i,t})) = \frac{\pi_\theta(o_{i,t}\mid q, o_{i,<t})}{\pi_{\mathrm{old}}(o_{i,t}\mid q, o_{i,<t})}\left(\frac{\pi_{\mathrm{ref}}(o_{i,t}\mid q, o_{i,<t})}{\pi_\theta(o_{i,t}\mid q, o_{i,<t})}-\frac{\pi_{\mathrm{ref}}(o_{i,t}\mid q, o_{i,<t})}{\pi_\theta(o_{i,t}\mid q, o_{i,<t})}-1\right)

      使用 K3 estimator 之后,现在 KL estimator 的梯度估计就变成无偏估计了,从而提高了整体训练的稳定性。作者还发现不同任务对 KL regularization 的需求不一致,对数学等 domain, 我们应该采取较小的 KL penalty 或者不使用 KL penalty 反而能提升性能

      Off-Policy Sequence Masking 作者还使用了 sequence masking 来提高 off-policy data 的数据使用效率,由于不同 rollout 的完成时间不一致,训练过程中会出现 off-policy 现象,即某些 mini-batch 不是由当前 policy 产生,这个现象在 Magistral 中也有提到,这种训练 - 推理不一致性会进一步加剧 off-policy 程度,为了提高训练稳定性,作者将 policy divergence 程度比较高的 sequence 给 mask 掉,更新后的损失函数如下所示

      JGRPO(θ)=E(q,a)D,{oi}i=1Gπθold(q)[1Gi=1G1oit=1oimin(ri,t(θ)A^i,t,clip(ri,t(θ),1ϵ,1+ϵ)A^i,t)Mi,tβDKL(πθ(oi,t)πref(oi,t))]\mathcal{J}_{\mathrm{GRPO}}(\theta) = \mathbb{E}_{(q,a)\sim\mathcal{D},\{o_i\}_{i=1}^G\sim \pi_{\theta_{old}}(\cdot\mid q)}\left[ \frac{1}{G}\sum_{i=1}^G\frac{1}{|o_i|}\sum_{t=1}^{|o_i|}\min\left(r_{i,t}(\theta)\hat{A}_{i,t},\mathrm{clip}\left(r_{i,t}(\theta), 1-\epsilon, 1+\epsilon\right)\hat{A}_{i,t}\right)M_{i,t}-\beta \mathcal{D}_{\mathrm{KL}}(\pi_\theta(o_{i,t})\Vert\pi_{\mathrm{ref}}(o_{i,t}))\right]

      其中,

      Mi,t={0,A^i,t<0,1oit=1oilogri,t(θ)<δ1,otherwiseM_{i,t} = \begin{cases} 0, &\hat{A}_{i,t}<0, \frac{1}{|o_i|}\sum_{t=1}^{|o_i|}\log r_{i,t}(\theta)<\delta\\ 1, &\text{otherwise} \end{cases}

      用于决定是否对当前 sequence 进行 mask, δ\delta 是一个超参数控制 policy divergence 程度。作者认为,模型主要从自身的错误进行学习,而 off-policy 的负样本模型学习提升有限甚至有害。作者发现加入这个 masking 策略之后,模型的训练稳定性有所提升。

      Keep Routing MoE 模型在进行 On-policy RL 训练是,由于 policy 的更新,新 policy 和旧 policy 专家的 routing 可能会不一致,这种不一致性会降低训练的稳定性以及 off-policy 现象。为了解决这个问题,作者在采样室,保存了训练阶段所使用的 expert routing path, 来保证训练推理的一致性。这种策略可以有效提高针对 MoE 模型的 RL 训练稳定性

      Keep Sampling Mask 作者发现,使用 top-p 和 top-K 可以提高 LLM 输出的质量,但是这种采样擦略也会导致 πold\pi_{\mathrm{old}}πθ\pi_{\theta} action space 的不匹配,因此,作者记录了 πold\pi_{\mathrm{old}} 采样过程中的 truncation mask, 然后再训练的时候将其应用到 πθ\pi_{\theta} 上,作者发现通过这种方式可以有效提高 RL 训练过程中的 language consistency

      Thinking in Tool-Use

      本节的目的是希望能够将 reasoning 能力应用到工具调用的场景下。

      作者发现,如果使用 DeepSeek-R1 的策略,在下一轮对话到来时,丢弃到当前的 reasoning content 会让模型重新生成针对问题的 CoT, 从而产生 token inefficiency. 为了解决这个问题,作者构建了一个上下文管理策略,如下图所示

      Context Management of DeepSeek V3.2 in tool-calling senarios

      具体做法为:

      在训练时,作者认为模型已经掌握了比较好的指令跟随能力,我们仅需要将 reasoning data (non-agentic) 和 non-reasoning data(agentic) 以不同的 prompt 输入给模型就能够得到比较好的结果。

      对于训练的数据,作者认为 RL 任务的多样性可以有效提高模型的 robustness, 因此作者构建了不同的环境及其对应的 prompt, 生成的任务如下表所示

      number of tasksenvironmentprompt
      code agent24667realextracted
      search agent50275realsynthesized
      general agent4417synthesizedsynthesized
      code interpreter5908realextracted

      Experiments

      作者对比了 DeepSeek-V3.2-Exp 和 Claude-4.5 Sonnet, GPT-5, Gemini 3.0 Pro, Kimi-K2 thinking, MiniMax M2 的表现,评测结果如下

      Performance of DeepSeek V3.2

      结果显示,DeepSeek V 3.2 和 GPT-high 在 reasoning 任务上的表现差不多。作者认为,进一步提高 RL 阶段的算力可以有效提高模型的表现

      作者还对比了 DeepSeek-V 3.2-Speciale 的表现,结果显示,提高 token budget 之后,模型的表现显著提高,与 Gemini 3.0 Pro 可以相比,但是其 token efficiency 仍然弱于 Gemini 3.0 Pro, 结果如下图所示

      Performance of DeepSeek V 3.2 speciale

      接下来作者验证了 synthesis agentic tasks 对模型表现的影响。首先,作者随机采样一批样本使用闭源 LLM 进行测试,发现闭源模型表现最好为 62%62\%, 这说明了合成数据对于 DeepSeek V3.2 和闭源模型都是有挑战的。

      其次,作者探究了合成数据是否能够提高 RL 的泛化性,作者构建了两个额外模型:

      对比结果发现,合成数据缺失可以有效提高模型的表现

      作者还对比了 DSA 的效率,DSA 可以将 attention 的计算复杂度由 O(L2)\mathcal{O}(L^2) 降低到 O(LK)\mathcal{O}(LK), 其中 KK 是选取的 top-K tokens. 尽管 lightning indexer 的复杂度仍然是 O(L2)\mathcal{O}(L^2), 但是其计算量远小于 MLA, 作者对比了两者的效率,实验结果如下图所示

      Efficiency of DeepSeek-V3.2

      可以看到,DeepSeek-V3.2 的 prefilling 和 decoding 效率都远高于 DeepSeek-V3.1

      最后,作者对比了不同上下文管理策略对模型表现的影响,对比策略有:

      1. Summary: 对轨迹进行总结然后重新初始化 rollout
      2. Discard 75%: 丢弃到初始 75% 的工具调用历史
      3. Discard-all: 丢弃掉所有的工具调用历史
      4. Parallel-fewest step: 多次采样然后保留步数最少得轨迹

      实验结果如下图所示

      Ablation study on context management

      结果显示,使用上下文管理策略之后,模型的表现有了显著提升。并且,discard-all 策略虽然很简单,但是其表现非常好。作者认为如何根据不同场景来选取合适的策略是一个待解决的问题。

      Conclusion

      作者在本文中提出了 DeepSeek-V 3.2, DeepSeek-V 3.2 使用了一个稀疏注意力机制来提高模型在长上下文场景下的计算效率。作者还通过提升 RL 阶段的算力来提高模型在下游任务上的表现。最后,作者合成了大规模的 agentic task 来提升模型的 agent 能力。

      作者认为,相比于 Gemini 3.0 Pro, 模型的知识广度仍然有限。并且,目前模型的 token efficiency 仍然是一个问题,模型需要更长的轨迹输出才能达到 Gemini 3.0 Pro 的表现。最后,模型解决复杂问题的能力仍然弱于闭源模型。

        DeepSeek 在 24 年 11 月发布了 DeepSeek-V3, 一个仅花费 2.8M H800 hours 的大语言模型,且在各个 benchmark 上达到了 SOTA 表现

        Introduction

        作者在本文中提出了 DeepSeek-V3, 一个 671B-A37B 的 MoE 大语言模型。

        在训练目标和架构上,作者做了如下改进:

        1. efficiency inference: 采用了 DeepSeek-V2 提出的 MLA
        2. cost-effective training: 采用了 DeepSeekMoE 提出了 MoE 架构
        3. auxiliary-loss-free strategy: 采用了 Loss-Free Balancing 提出的 loss balancing 策略
        4. multi-token prediction: 采用了 MTP 的训练目标来提升模型的表现

        在训练上,作者做了如下改进:

        1. 使用了 FP8 混合精度进行训练并验证了其在大规模模型上的有效性
        2. 作者构建了 DualPipe 算法用于高效的 pipeline parallelism
        3. 构建了 cross-node all-to-all communication kernel 来高效使用 InfiniBand 以及 NVLink bandwidth
        4. 优化了 memory footprint, 来避免使用 tensor parallelism

        预训练阶段,DeepSeek-V3 使用了14.8T token. 在 mid-training 阶段,作者将模型的上下文长度由 8K 扩展到 32K, 再扩展到 128K.

        后训练阶段,作者使用了 SFT 和 RL 两个阶段来提高模型的表现,作者还对 DeepSeek-R1 进行蒸馏来提高模型的 reasoning 能力

        Architecture

        Basic Architecture

        DeepSeek-V3 的架构与 DeepSeek-V2 的架构一致,如下图所示

        Architecture of DeepSeek-V2

        MLA 的介绍见 MLA, MoE 架构的介绍见 DeepSeekMoE. DeepSeek-V3 在 DeepSeekMoE 的基础上做了两点改变:

        1. Loss-Free Balancing 启发,作者使用了 sigmoid fu nction 来计算 affinity score
        2. 对于 selected affinity score 应用了 normalization

        DeepSeekMoE 的基础上,作者使用了 Loss-Free Balancing. 其表达式如下

        gi,t={si,t,si,t+biTopk({si,j+bj1jN},K)0,otherwiseg_{i,t} = \begin{cases} s_{i,t}, & s_{i,t}+b_i\in\mathrm{Topk}(\{s_{i,j}+b_j\mid 1\leq j\leq N\}, K)\\ 0, &\text{otherwise} \end{cases}

        其中 bib_i 仅影响 routing, 训练时,如果对应的 expert 负载不均衡,则对 bib_i 进行更新,更新方式为增加/减少 γ\gamma, 这里 γ\gamma 是一个超参数

        为了提高 routing 在 sequence 层面的负载均衡,作者还是用了一个 complementary sequence-wise balance loss:

        LBal=αi=1NrfiPifi=t=1T1(si,tTopK({sj,t1jNr},Kr))si,y=si,tj=1Nrsj,tPi=1Tt=1Tsi,t\begin{aligned} \mathcal{L}_{\mathrm{Bal}} &= \alpha\sum_{i=1}^{N_r} f_iP_i\\ f_i &= \frac{}{}\sum_{t=1}^T\mathbb{1}(s_{i,t}\in\mathrm{TopK}(\{s_{j,t}\mid 1\leq j \leq N_r\}, K_r))\\ s_{i,y}' &= \frac{s_{i,t}}{\sum_{j=1}^{N_r}s_{j,t}}\\ P_i &= \frac1T\sum_{t=1}^T s_{i,t}' \end{aligned}

        其中 α\alpha 是 balance factor, 为超参数,TT 是 sequence length, 加入这个损失后,每个 sequence 上的负载会变得更加均衡

        DeepSeekMoE 一样,作者也在 node 层面实现负载均衡,具体做法就是,根据 node 中所包含 expert 的 affinity score 之和来选取最高的 MM 个 nodes, 这样就可以进一步提高 computation 和 communication 之间的 overlap.

        由于 DeepSeek-V3 负载均衡比较好,因此作者使用了 no token-dropping strategy.

        MTP

        受 MTP 启发,DeepSeek-V3 也构建了 MTP 模块,作者认为 MTP 模块有两个优势:

        1. MTP objective 提供了更多的学习信号,进而提高了数据使用效率
        2. MTP 可以让模型更好预测未来的 token

        与 MTP 不同,DeepSeek-V3 【todo】, DeepSeek-V3 所使用的 MTP 模块架构图如下所示

        Illustration of MTP

        MTP 模块使用了 DD sequential modules 来预测未来的 DD 个 token. 其中,第 kk 个 MTP 模块包含一个共享的 embedding layer Emb()\mathrm{Emb}(\cdot) , 一个共享的 output head OutHead()\mathrm{OutHead}(\cdot), 一个 transformer block TRMk()\mathrm{TRM}_k(\cdot) 和一个 projection matrix MkRd×2dM_k\in\mathbb{R}^{d\times 2d}.

        对于第 ii 个 token 以及第 kk 个 MTP 模块,作者首先将第 k1k-1 个 MTP 模块的第 ii 个 token 的 hidden states hik1Rdh_i^{k-1}\in\mathbb{R}^d 和第 i+ki+k 个 token 的 embedding Emb(ti+1)Rd\mathrm{Emb}(t_{i+1})\in\mathbb{R}^d 联合在一起

        hik=Mk[RMSNorm(hik1);RMSNorm(Emb(ti+k))]h_i'^{k}=M_k[\mathrm{RMSNorm(h_{i}^{k-1});\mathrm{RMSNorm(\mathrm{Emb}(t_{i+k}))}}]

        其中 [;][\cdot;\cdot] 代表 concatenation 操作。当 k=1k=1 时,hik1h_{i}^{k-1} 就代表了 main model 的输出。每个 MTP 模块的 embedding layer 和 main model 的 embedding layer 是共享的,接下来, hikh_i'^k 作为第 kk 个 MTP 模块 transformer block 的输入,得到

        hik=TRMk(hil)h_{i}^k = \mathrm{TRM}_k(h_{i}'^l)

        最后,共享的 output head 输出对应的概率分布:

        Pi+k+1k=OutHead(hik)P_{i+k+1}^k = \mathrm{OutHead}(h_i^k)

        这里的 OutHead()\mathrm{OutHead}(\cdot) 的权重与 main model 也是共享的。作者这里提到,所使用的思想与 EAGLE 是类似的,但是不同的地方在于,EAGLE 主要是用于 speculative decoding, 而 MTP 主要用于提升训练。

        MTP 的训练目标为未来 Tk1T-k-1 个 token 的 cross-entropy loss:

        LMTPk=CrossEntropy(P2+k:T+1k,t2+k:T+1)=1Tt=k+2T+1logPik[ti],\mathcal{L}_{\mathrm{MTP}}^k = \mathrm{CrossEntropy}(P_{2+k:T+1}^k,t_{2+k:T+1}) = -\frac1T\sum_{t=k+2}^{T+1}\log P_i^k[t_i],

        其中 TT 是 sequence length, tit_i 是第 ii 个位置对应的 ground truth token, Pik[ti]P_i^k[t_i] 代表低 kk 个 MTP 模块给出的 tit_i 的预测概率。最后,作者对所有的 MTP loss 进行求和,得到

        LMTP=λDk=1DLMTPk.\mathcal{L}_{\mathrm{MTP}} = \frac{\lambda}{D}\sum_{k=1}^D \mathcal{L}_{\mathrm{MTP}}^k.

        Infra

        DeepSeek-V3 训练使用了 2048 张 H800, 每个 node 包含 8 张 GPU, node 内部使用 NVLink 和 NVSwitch 进行连接,node 之间使用 InfiniBand 进行连接

        与之前的 DeepSeek 系列相同,DeepSeek-V3 也是用了 HAI-LLM 框架来支持训练。训练时,DeepSeek-V3 使用了 16-way PP, 64-way EP (spanning 8 nodes, GShard) 以及 ZeRO-1 DP.

        作者主要进行了三点优化:

        1. 构建了 DualPipe 用于高效 pipeline parallelism
        2. 构建了 cross-node all-to-all communication kernels 来高效利用 IB 以及 NVLink bandwidth
        3. 优化了训练时的 memory footprint, 使得训练时不再依赖 TP

        Training Framework

        DualPipe

        DeepSeek-V3 中,由于 cross-node EP, computation-to-communication ratio 近似为 1:1, 为了解决这个问题,作者提出了 DualPipe. DualPipe 的核心思想是将 forward 和 backward 过程中的 computation 以及 communication 进行重叠。与 ZeroBubble 类似,作者将每个 chunk 分为四个部分:attention, all-to-all dispatch, MLP 以及 all-to-all combine. 对于 attention 和 MLP, 作者还进一步将 backward 拆分为 针对权重和输入的 backward. 其示意图如下所示,这里橙色部分代表 forward, 绿色代表了针对输入的 backward, 蓝色代表了针对权重的 backward

        Overlapping stategy of DeepSeek-V3

        示意图里包含两个 block, 我们记为 block1, block2, 前向计算过程为

        dispatch(F, block1) -> MLP(F, block1) -> combine(F, block1) -> attention(F, block2)
        

        其中,dispatch(F, block1) 与 MLP 的反向传播 MLP(B, block1) 计算重叠, MLP(F, block1) 与 MLP 反向传播的 dispatch dispatch(B, block1) 通信重叠,combine(F, block1) 与 attention 反向传播的 attention(B, block2) 重叠,attention(F, block2) 与反向传播的 combine combine(block2) 重叠。下面是一个具体的例子

        DualPipe scheduling

        作者进一步对比了 DualPipe, 1F1B 和 ZeroBubble, 结果如下表所示

        MethodBubbleParameterActivation
        1F1B(PP1)(F+B)(PP-1)(F+B)1×1\timesPPPP
        ZB1P(PP1)(F+B2W)(PP-1)(F+B-2W)1×1\timesPPPP
        DualPipe (Ours)(PP21)(F&B+B3W)(\frac{PP}{2}-1)(F\&B+B-3W)2×2\timesPP+1PP+1

        这里 FF 是 forward chunk 的执行时间,BB 是 backward chunk 执行的时间,WW 是一个 chunk “backward for weights” 的执行时间,F&BF\&B 是一个 chunk 前向反向传播重叠的时间。可以看到,DualPipe 只使用了额外的 1/PP1/PP 倍的 peak activation memory, 就大幅度降低了 bubble 时间

        Cross-node All-to-all Communication

        作者针对 DualPipe 构建了 cross-node all-to-all communication kernels 来提高通信效率。

        作者提到,跨节点通信使用的是 IB, 节点内部通信使用的是 NVLink, 通信方式如下图所示。

        Communication of GPU

        对于 H800 来说,NVLink 的带宽为 160GB/s, IB 的带宽为 50GB/s, 因此 NVLInk 的通信效率是 IB 的 3.2 倍,即节点内部通信效率高于节点之间的通信效率。为了提高通信效率,作者限制每个 token 只能被分发到至多 4 个节点上(DeepSeek-V2 里提到的 device limited routing)。其具体通信方式为想传输到目标 node index 相同的 rank 上,然后再通过节点内部通信传输到目标的 rank 上。通过这种方式,我们可以让节点间通信与节点内部通信进行重叠,从而每个 token 可以从一个节点上选取 3.2 个专家,这样 DeepSeek-V3 可以在不损失效率的情况下最高选取 1313 个专家。

        作者进一步采用了 warp specialization 技巧来将 20 个 SM 划分为 10 个通信 channel. 作者分别针对 dispatching 和 combing 阶段使用了不同数量的 warps.

        Memory saving

        作者使用了如下技巧来减少内存访问:

        1. Recomputation of RMSNorm and MLA Up-Projection. 在 backward 过程中重新计算 RMSNorm operation 以及 MLA up projection 来避免存储器对应的输出
        2. Exponential Moving Average in CPU. 作者将 EMA 参数保存在 CPU 中,然后进行异步更新来进一步减少内存访问
        3. Shared Embedding and Output Head for Multi-Token Prediction. 作者将 embedding layer 和 output head 放在一个 PP rank 上,这样就可以提高 MTP 的内存访问效率

        FP8 Training

        作者提出了一个基于 FP8 的混合精度训练框架。作者提出了两个改进方案:

        1. 分组量化,将 tensor 按照 tile 分组或者按照 block 分组来分组量化,这样就避免了全局量化的精度损失
        2. 高精度累加,作者在乘法计算时,使用了 FP8 格式,然后在累加阶段,使用了更高精度的格式

        为了进一步减少内存和通信开销,对于 activation 的 cache 以及 dispatch, 作者使用了 FP8 数据格式,然后对于优化器状态,作者使用了 BF16 数据格式。下面是对上面改进的具体说明。

        Mixed Precision Training

        作者在本文中提出了使用 FP8 混合精度进行预训练,作者参考了 low precision training 构建 FP8 训练框架,即计算量高的使用 FP8 精度,计算量低的使用原本的数据精度, 框架如下图所示

        Mix-precision training of DeepSeek-V3

        其中各个模块使用的精度如下表所示

        PrecisionModules
        FP8Linear (Fprop, Dgrad, Wgrad)
        higher precision- embedding
        - output head
        - Moe gating
        - normalization
        - attention operator
        - master weights
        - weight gradients
        - optimizer states

        Enhancing Low-precision Training Accuracy

        作者介绍了几个策略用于提高 FP8 混合精度训练的表现:

        Quantization of DeepSeek-V3
        1. fine-grained quantization: 对于激活值,作者将 tensor 分割为 1×1281\times 128 大小的 groups, 然后每个 group 内部进行 quantization; 对于权重,作者将其分割为 128×128128\times 128 大小的 groups, 然后进行 quantization, 这样可以降低 quantization error, 如上图左图所示
        2. increasing accumulation precision: 低精度训练会带来 underflow 的问题,而 FP8 GEMM 累加仅能保留约 14bit 精度,远低于 FP32 的 32bit 精度。为了解决这个问题,作者采用了 Tensor Core 不分累加 +CUDA core 高精度聚合的协同策略。即在 Tensor Core 上执行 MMA 指令时,先按照 14bit 精度对 NCN_C 个元素进行累加,当达到 NCN_C 时,作者将结果复制到 CUDA core 的 FP32 寄存器中,在 FP32 精度下完成累加。过程如上图右图所示
        3. Mantissa over exponents. 与之前的工作不同,作者使用了 E4M3 的数据格式来达到更高的精度
        4. Online Quantization. 为了降低 quantization 的误差,作者实时计算了 activation block 以及 weight block 的最大绝对值来导出 scaling factor 并量化为 FP8 精度

        Low Precision Storage and Communication

        作者通过压缩 cached activation 和 optimizer states 来进一步减少内存访问以及通信访问次数

        作者对比了 FP8 和 BF16 精度训练,结果如下图所示

        FP8 v.s. BF16

        实验结果显示,FP8 混合精度训练的损失降低不足 0.25%0.25\%.

        Inference and Deployment

        作者在 H800 集群上部署 DeepSeek-V3, 作者分别针对 prefilling 和 decoding 两个阶段进行了优化

        Prefilling

        prefilling 阶段在 4 节点 32 GPU 上进行,并行策略如下

        模块并行策略说明
        Dense MLP1-wat TP减少 TP 通信
        Attention4-way TP, SP, 8-way DPSP 用于长文本处理
        MoE32-way EP每个 GPU 包含 8 个专家

        为了实现负载均衡,作者提出了redundant experts的策略,具体就是将负载比较高的专家进行复制。模型会周期性进行统计,然后计算出负载比较高的专家,接下来每个 GPU 除了原来的 8 个专家之外,还会 host 一个额外的 redundant expert.

        为了提高 throughput, 作者同时处理两个 micro-batch, 来重叠 attention, MoE 和 dispatch, combine 通信,如下图所示

        Prefiling overlap of DeepSeek-V3

        作者还探索了 dynamic redundancy 策略,即每个 GPU host 更多的专家(比如 16 个)然后 inference 的每一步仅激活其中的 9 个,在进行 all-to-all operation 时,作者首先进行 global optimal routing 来计算最合适的专家。作者认为 prefilling 计算量很大,因此 routing 的计算量可以忽略不计

        Decoding

        在 decoding 阶段,作者在 40 个节点 320 GPU 上进行部署,并行策略如下

        模块并行策略说明
        Attention4-way TP, SP, 80-way DPSP 用于长文本处理
        MoE320-way EP每个 GPU 包含 8 个专家

        这个阶段,每个 GPU 只 host 一个专家,64 个 GPU 负责 host redundant expert 以及 shared expert. 作者通过在 IB 上直接进行 P2P 的传输来降低通信的开销,作者还是用了 IBGDA 来进一步最小化 latency 以及提高通信效率

        在这个阶段,attention 的计算占据了大部分时间,因此,作者采取了如下的 overlap 策略

        Decoding overlap of DeepSeek-V3

        由于 decoding 阶段一般 batch size 比较小,因此整个 decoding 的瓶颈在于 memory access, 因此为了避免影响 attention 的计算效率,作者仅安排一小部分 SM 用于 dispatch-MoE-combine.

        Suggestions on Hardware Design

        Communication Hardware

        尽管作者将计算与通信重叠来提高训练效率,但是已有的通信仍然依赖于 SM, 这样限制了计算的效率。作者希望工能够构建专门针对通信的设备,另一方面,作者希望统一 IB 和 NVLink 来降低实现难度

        Computation Hardware

        1. 提升 FP8 GEMM 的累加精度,当前精度只有 14bit, 作者希望能够在 GPU 设计上进行改进,将这个精度提升到 34-bit
        2. 支持 tile 以及 block 层面的 quantization, 尽管前文作者已经设计出了改进的算法,但是 Tensor Core 以及 CUDA 之前平凡的数据移动降低了计算效率,作者希望未来能够支持细粒度的 quantization
        3. online quantization, 作者希望将 FP8 cast 以及 TMA 结合在一起,从而 quantization 可以在传输的时候完成计算,减少了内存读写。作者还建议使用 warp-level cast instruction
        4. Transposed GEMM operations. 本文中,矩阵被切分为不同的 tiles, 在计算的时候需要先加载这些 tiles 然后进行 dequantization, transpose 等操作,作者希望未来能够直接支持 transposed reads of matrices

        Pre-training

        Pre-training Data

        相比于 DeepSeek-V2, DeepSeek-V3 提升了数学和代码数据的比例,以及增加了多语种数据。最终训练数据一共包括 14.8T

        作者还使用了 DeepSeekCoder-V2 里应用的 Fill in the middle 策略来让模型基于上下文越策中间的文本,对应的数据格式如下

        <|fim_begin|>f_pre<|fim_hole|>f_suf<|fim_hole|>f_middle<|fim_end|>
        

        这个结构与 sequence packing 结合在一起。

        Tokenizer 基于 BBPE, 大小为 128K tokens. 在训练时,作者将随机一部分 combine token 进行切分来减少 token boundary bias 问题

        Hyper-parameters

        模型参数如下表所示,最终 DeepSeek-V3 拥有 671B 总参数,激活参数为 37B

        variablenotationvalue
        layers\ell61
        dense layers-3
        hidden dimensiondd7168
        num of attention headsnhn_h128
        head dimensiondhd_h128
        KV compression dimensiondcd_c512
        query compression dimensiondcd_c'1536
        decouple query and key dimensiondhRd_h^R64
        routed expertNrN_r256
        shared expertNsN_s1
        MoE hidden dimensiondMoEd_{MoE}2048
        activated expertsKK8
        limited node routingMM4
        MTP depthDD1

        训练时,作者使用了 learning rate scheduling, batch size scheduling 等方法。对于 PP, routed expert 会均匀分布为 8node 对应的 64 个 GPU 上,预训练时模型的上下文长度为 4k

        Long Context Extension

        作者使用了 YARN 来扩展模型的上下文长度,模型上下文长度经过两个额外的训练阶段从 4K 扩展到 32K 再扩展到 128K, 均训练了 1000 步。

        YARN 配置与 DeepSeek-V2 基本一致,在额外的 decoupled query and key 上作者没有应用这一点。参数配置如下表

        parameterssα\alphaβ\betat\sqrt{t}
        value401320.1lns+10.1\ln s+1

        第一阶段的上下文长度为 32K, batch size 为 1920, 第二个阶段的上下文长度为 128K, batch size 为 480.

        Performance

        DeepSeek-V3 base 的表现下图所示,作者对比了 DeepSeek-V2, Qwen2.5, LLaMA 3.1

        Performance of DeepSeek-V3 base

        Discussion

        作者首先验证了 MTP 的有效性,结果如下图所示

        Ablation study on MTP

        可以看到,在模型架构相同,训练数据相同的情况下,1-MTP 的效果超过了 baseline 的表现,说明了 MTP 策略的有效性

        接下来,作者还验证了 Loss-Free Balancing 的有效性,结果如下图所示

        Ablation on loss-free balancing

        可以看到,loss-free Balancing 的效果比 loss balancing 的效果更好

        接下来,作者对比了 loss-free balancing 和 sequence-wise auxiliary loss, 即 batch-wise v.s. sequence-wise. 作者认为,前者的约束更灵活,因为其不要求 in-domain balance. 作者在测试集上进行可视化,结果如下图所示

        Ablation study on batch-wise load balancing

        实验结果发现,loss-free 策略对应的 expert specialization 更强。作者进一步设计了一个 batch-wise auxiliary loss 来实现 batch-wise load balance, 结果发现,这种策略也能达到和 loss-free balancing 一样的效果,这说明了 batch-wise load balancing 效果更好

        最后,作者提了两点 loss-free 策略的问题:

        1. 在特定的 sequence 或者小 batch 里出现负载不均衡。作者通通过增大 batch size 来解决这个问题
        2. 在推理阶段因为 domain-shift 导致的负载不均衡。作者实现了一个基于 redundant expert 的推理框架来解决这个问题

        Post-training

        SFT

        post-training 包含 1.5M 样本,数据包括 reasoning 数据以及 non-reasoning 数据,前者由 DeepSeek-R1 合成,后者由 DeepSeek-V2.5 合成

        SFT 时,作者训练了两个 epoch, 使用了 sequence packing 技巧

        RL

        Reward model 包含 rule-based reward model 和 model-based reward model.

        RL 训练使用的算法为 GRPO

        Post-training Performance

        Performance of DeepSeek-V3

        Post-training Discussion

        作者首先探究了 Distillation 对模型表现的影响,作者使用 DeepSeek-R1 来蒸馏 DeepSeek-V2.5, 结果如下图所示

        ModelLiveCodeBench-CoTMATH-500
        Pass@1LengthPass@1Length
        DeepSeek-V2.5 Baseline31.171874.6769
        DeepSeek-V2.5 +R1 Distill37.478383.21510

        可以看到,distillation 可以显著提高模型的表现。但是其问题在于也会让模型输出的长度增加。作者认为知识蒸馏是 post-training optimization 的一个重要方向。

        接下来,作者讨论了 self-rewarding, 具体做法就是使用 DeepSeek-V3 来对评估结果进行投票,结果发现最终的效果很好,作者认为 LLM 可以很好地将非结构化信息转换为 rewards.

        最后,作者讨论了 MTP. MTP 可以于 speculative decoding 结合,进一步提高 decoding 的速度。通过实验作者发现,second token prediction 的接受率在 85%90%85\%\sim 90\% 之间,说明了其有效性。

        Conclusion

        在本文中,作者提出了 DeepSeek-V3, 一个 671B-A37B 的 MoE 大语言模型,训练 token 数为 14.8T. 作者使用了 loss-free-balancing strategy 来实现负载均衡。训练时作者使用了 FP8 混合精度。评估发现 DeepSeek-V3 的达到了 SOTA 表现。

        作者认为,DeepSeek-V3 model size 太大,不适合部署。第二,部署策略需要进一步改进。

        最后,作者认为未来工作有以下几点:

        1. 改进模型架构,进一步提高训练以及推理效率,扩展模型的上下文
        2. 提升训练数据的数量和质量
        3. 提高模型的 reasoning 能力
        4. 更详尽的评估