DeepSeek 在 2024 年 1 月 5 日发布了 DeepSeek LLM, 包括 7B 和 67B 两个 size, 作者主要强调了对于 scaling law 的探究
Introduction
已有的 scaling law 如 Kaplan 和 Chinchilla 介绍了 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 效率。最终模型的配置如下表所示
| Params | 7B | 67B |
|---|---|---|
| Context Length | ||
| Sequence Batch Size | ||
| Learning Rate | ||
| Tokens | 2T | 2T |
Data
作者主要从 Common Crawl 构建预训练数据,数据处理过程包括:去重,过滤以及 remixing 三个步骤。
对于 tokenizer, 作者使用了 BBPE 算法,tokenizer 的大小设置为 100,000, 最终的 tokenizer 大小为 102400.
Hyper Parameters
作者主要对比了一下不同 learning rate schedule 的表现:
- cosine learning schedule
- multi-step learning rate schedule: 包含三个 Stage, 第一个 stage 保持最大学习率,第二个 stage 将学习率降低为最大学习率的 , 第三个 stage 降低为最大学习率的 .
对比的实验结果如下图所示
实验结果显示,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, 主要有以下三点:
- 构建了针对 learning rate 和 batch size 的 scaling law
- 作者使用 non-embedding FLOPs/token 来表示 model scale
- 预训练数据的质量对最后中的 scaling 影响很大
作者首先构建了针对 batch size 和 learning rate 的 scaling law, 结果显示最优的 learning rate 和 batch size 范围都比较广,这个结论与 Kaplan 一致。
接下来,作者构建了 batch size , learning rate 与 compute budget $C 之间的关系,实验结果如下图所示
拟合得到的曲线为
可以看到,随着 compute budget 增加, 也逐渐增加,而 逐渐减小。并且,最优参数的范围都比较广。
接下来,作者进一步探究了 batch size 与 generalization error 之间的关系。作者希望找到 model scale , data scale 与 compute budget 之间的关系,即
compute budget 与 model scale, data scale 之间的关系可以近似表示为 , 这个公式的推导见 LLM FLOPs computation。我们用 分别表示模型的 non-embedding parameter 以及 complete parameters, 则我们可以用 或者 来近似 model scale, 但是 和 均没有考虑 attention 的计算开销,因此这两种近似的误差都比较大。
为了解决这个问题,作者提出了一个新的 model scale 表示形式,即 non-embedding FLOPS/token , 其中 包含 attention 的计算开销但是不包含 vocabulary computation. 基于这种表示,compute budget 可以近似表示为 . 与 的区别表示如下所示
其中, 是 hidden size, 是 layers 个数, 是 vocabulary size, 是 sequence length. 作者在不同 scale 的模型上比较了三种表示方式,结果发现 和 要么低估,要么高估了模型的参数量。
基于 model scale 的表示方式,作者构建了如下的优化问题
作者使用了 Chinchilla 提出来的 IsoFLOP 曲线进行拟合,实验结果如下图所示
拟合的曲线为
作者还进一步拟合了 compute budget 与 optimal generalization error 之间的关系,结果如下图所示
实验结果显示,作者提出的 scaling law 可以很好预测模型的表现。
最后,作者探究了以下不同数据集的 scaling law, 作者使用 early in-house data, current in-house data 以及 OpenWebText2 来将进行实验,结果如下图所示
结果显示,scaling law 与数据质量高度相关。当数据质量提升时,model scaling exponent 逐步提升,data scaling exponent 逐步下降,说明 compute budget 更多由模型参数量决定。因此,作者认为提升 compute budget 之后,我们应该优先提高模型的 model size.
Post-training
作者构建了 1.5M 的中英文指令数据。其中安全性的数据有 300K, 有帮助性的数据有 1.2M, 其中包括 的通用数据, 的数学相关数据, 的代码数据。
post-training 包含两个阶段:
- SFT:7B 的模型训练了 4 个 epoch, 67B 的模型训练了 2 个 epoch, 作者发信进一步训练 67B 的模型会导致过拟合。作者发现,模型在训练过程中会出现重复输出的情况,特别是数学 SFT 数据,为了解决这个问题,作者使用了一个两阶段的 SFT 以及 DPO.
- DPO: 提高模型的能力,作者发现 DPO 可以提高模型 open-ended generation skill.
Evaluation
我们主要关注一下消融实验。
首先作者探究了分阶段 SFT 对模型表现的影响。作者发现,小模型在 math 和 code 数据集上需要训练更长时间,但是这也损害了模型的对话能力。为了解决这个问题,作者使用两阶段的训练模式,第一个阶段使用所有的数据进行训练,第二个阶段仅使用对话数据进行训练,实验结果如下表所示
| Model | HumanEval | GSM8K | Repetition | IFEval |
|---|---|---|---|---|
| DeepSeek LLM 7B Chat Stage1 | 48.2 | 63.9 | 0.020 | 38.0 |
| DeepSeek LLM 7B Chat Stage2 | 48.2 | 63.0 | 0.014 | 41.2 |
可以看到,经过第二阶段训练之后,模型的表现有所提升
接下来,作者探究了 Multi-choice question 对模型表现的影响,MCQ 要求模型不仅需要有相关的知识,还要理解每个选项的含义。作者使用 20M 中文 MCQ 来进行消融实验,结果如下表所示
| Model | MMLU | CEval | CMMLU | TriviaQA | ChineseQA | |
|---|---|---|---|---|---|---|
| DeepSeek LLM 7B Chat | 49.4 | 47.0 | 49.7 | 57.9 | 75.0 | |
| DeepSeek LLM 7B Chat + MC | 60.9 | 71.3 | 73.8 | 57.9 | 74.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. 实验结果如下所示
| Model | MT Bench |
|---|---|
| DeepSeek LLM 7B Chat | 7.15 |
| DeepSeek LLM 7B Chat + System Prompt | 7.11 |
| DeepSeek LLM 67B Chat | 8.35 |
| DeepSeek LLM 67B Chat + System Prompt | 8.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 模型的不足,主要有两点:
- knowledge hybridity: 已有 MoE 模型的专家个数比较少,这就导致每个专家需要掌握更多样化的知识,提高了训练难度
- knowledge redundancy: 不同专家掌握的知识可能有重叠,从而导致了模型参数的 redundancy
为了解决这两个问题,作者提出了 DeepSeek-MoE, DeepSeek-MoE 主要做出了两点改变:
- Fine-Grained Expert Segmentation: 作者使用了更多的专家,来提高每个专家的 specialization, 降低训练成本
- 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 的第 层 decode layer 可以表示为
其中 是 sequence length, 是第 层 decoder layer 输出的 hidden states.
接下来,我们可以将 dense 架构转换为 MoE 架构,MoE 架构与 dense 架构不同的地方在与 不再是 MLP, 而是一个 MoE 模块,其表达式如下
这里 是专家的总个数, 是激活专家个数, 是 routing layer 的权重矩阵, 是每个专家对应的 FFN.
DeepSeekMoE Architecutre
DeepSeekMoE 架构如下图所示
相比于其他 MoE 架构,DeepSeekMoE 主要做了以下几点改变。
Fine-Grained Expert Segmentation
作者首先解决了每个专家学习内容过多的问题。作者的做法就是将每个 expert FFN 分割为 个更小的专家,具体做法就是将 FFN intermediate hidden size 降低为原来的 . 这样的话就可以在不增加模型参数量的情况下提高模型的表现。修正后的 MoE 模块为
可以看到,现在我们一共有 个专家,激活专家个数为 个。作者认为,通过提高专家的粒度,我们可以有效增加专家组合的可能性,这就提高了最终的组合多样性。
Shared Expert Isolation
接下来,作者介绍了解决不同专家学习到重复知识的问题,作者的做法是在 routing Expert 的基础上加入 Shared expert. 也就是说,有固定几个专家始终都会被激活,这部分专家复杂学习通用知识,从而减少知识冗余。增加 shared expert 之后的 MoE 模块为
此时,模型中一共包含 个共享专家, 个 routing expert, 其中激活专家个数为 .
Load Balancing Loss
接下来,作者解决了训练时的 load imbalance 问题,作者提出了两个 loss 来分别解决不同层面的 load imbalance 问题。
首先,在 expert 层面,作者使用了如下的 load balancing loss:
其中 是超参数,
分别为以及分配给第 个专家的 token 比例以及概率之和。, . 是 indicator function.
其次,在 device 层面,作者也是用了 load balancing loss 来减少不同设备之间不必要的通信。作者将 routed experts 分为 个 group , 然后每个设备部署一个 group, group level 的 load balancing loss 定义如下:
其中 是超参数,
实际中,作者使用了一个较小的 来避免 routing collapse, 使用了一个较大的 来提高 Device 层面的负载均衡。
Training
作者使用了中英文数据进行训练,tokenizer 基于 BPE 算法,vocab size 为 8K. 模型训练基于 HAI-LLM.训练时使用了 TP, DP, PP, EP 等并行策略。
2B, 16B, 145B 模型的参数如下表所示
| Model | 2B | 16B | 145B |
|---|---|---|---|
| total params | 2B | 16.4B | 144.6B |
| activated params | 0.3B | 2.8B | 22.2B |
| hidden size | 1280 | 2048 | 4096 |
| layers | 9 | 28 | 62 |
| attention heads | 10 | 16 | 32 |
| head dimension | 128 | 128 | 128 |
| routed experts | 63 | 64 | 128 |
| activated experts | 7 | 6 | 12 |
| shared experts | 1 | 2 | 4 |
| training tokens | 100B | 2T | 245B |
Experiments
Alignment
作者针对 DeepseekMoE 16B 进行了微调,微调使用了 1.4M 的训练样本,覆盖了 math, code, QA, reasoning 等任务。
Ablation Study
作者在 2B 的模型上进行了 ablation study.
首先,作者探究了细粒度专家和共享专家的有效性,结果如下图所示
实验结果显示,与 GShard 相比,使用共享专家可以有效提高模型的表现。并且,使用更细粒度的专家也可以进一步提高模型的表现
作者还探究了共享专家与路由专家的比例,作者分别使用不同的比例进行实验,结果发现共享专家:路由专家个数为 1:3 的时候模型效果最好。
作者还探究了模型的泛化性,作者 mask 掉一部分概率最高的 routing expert, 然后从剩下的专家里进行 topK 的挑选,然后作者比较模型和 GShard 的表现,结果如下图所示
实验结果显示,DeepSeekMoE 对于 mask 操作更敏感,这说明 DeepSeekMoE 模型中专家的 specialization 更强。
作者还探究了 mask 掉共享专家对模型表现的影响,结果显示共享专家与路由专家之间的 overlap 很小,去掉共享专家之后,模型表现会变差。
作者进一步分析了共享专家与路由专家组合的有效性。作者探究 DeepSeekMoE 是否可以使用更少的路由专家来获取知识。作者通过使用不同的 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 主要改进点为:
- 基于 DeepSeekMoE, 使用了 MoE 架构
- 使用了 MLA 压缩 KV cache, 大幅度提高推理效率
DeepSeek-V2 预训练使用了 8.1T tokens, 相比于 DeepSeek-LLM, 预训练数据主要增加了中文数据以及提高了数据的质量。
接下来,作者收集了 1.5M 对话数据来进行 SFT, 最终作者基于 DeepSeek Math 提出的 GRPO 来进行对齐。
Architecture
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 挑选 个设备,然后基于这 个设备的专家挑选 top-K 专家进行计算。
作者通过实验发现,当 时,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 的目的是让每个设备的通信开销保持平衡。损失函数的表达式如下所示
其中 是超参数, 是 expert group 的个数。
device limited routing 让每个 device 发送至多 个 hidden states 到其他设备上。而 communication balancing loss 则让每个设备最多从其他设备接收 个 hidden states.
Token-Dropping Strategy
尽管前面已经增加了 load balance loss, 但毕竟不是硬约束。因此,作者就从硬件层面提出了 Token dropping 策略,来提高训练效率。核心思想就是,在训练时,主动丢弃部分 token, 强制让各个设备的计算量不会超过额度限制,进而减少资源浪费。
具体做法就是,在训练之前,先将每个设备的 capacity factor 设置为 1 (定义见 Switch Transformer). 然后按照 affinity score 来丢弃一些分数比较低的 token, 直到该设备的 token 数量刚到达到 capacity。为了避免过度学习导致模型表现较差,对于 的训练数据,作者不执行 token dropping 策略。
最终,在 inference 时,可以根据需求来决定是否丢弃 token, 比如在 low latency 场景,我们可以丢弃低价值的 token, 在高精度场景,我们就可以保留所有的 token.由于在训练阶段已经才去过 token dropping 策略,因此在推理时不管是丢弃还是全部保留模型都能比较好的适应。
Pre-training
Data
预训练数据与 DeepSeek-LLM 基本上差不多,作者针对中文数据,数据质量进行了改进。最终预训练数据包括 8.1T token, 其中中文数据比英文数据多 .
tokenizer 与 DeepSeek-LLM 一致。
Model Configuration
模型配置如下表所示
| Model | DeepSeek-V2 | DeepSeek-V2-Lite |
|---|---|---|
| Date | 2024-5 | 2024-5 |
| # Total Parameters | 236B | 15.7B |
| # Activated Parameters | 21B | 2.4B |
| # tokens | 8.1T | 5.7T |
| # Dense Layers | 1 | 1 |
| # MoE Layers | 60 | 26 |
| Hidden Dim | 5120 | 2048 |
| Dense Intermediate Dim | 12288 | 10944 |
| MoE Intermediate Dim | 1536 | 1408 |
| Attention | MLA | MLA |
| # Attention Heads | 128 | 16 |
| # Key-Value Heads | 128 | 16 |
| # Routed Experts | 160 | 64 |
| # Experts Active Per Token | 6 | 6 |
| # Shared Experts | 2 | 2 |
这里比较特殊的一点在于,模型在第一层使用了 MoE layer, 这个做法的原因在后面的 olmoe 里有提到,核心思想是 early layer 特别是第一层 layer 收敛比较慢。
MLA 的配置如下 (DeepSeek-V2)
| field | value |
|---|---|
| 512 | |
| 1536 | |
| 16 | |
| 128 | |
| 64 |
Training Recipe
训练的配置也与 DeepSeek-LLM 差不多,对于 MoE,作者使用了 PP 将不同的 layers 分配在不同的 device 上,然后 MoE 的 experts 被分配在 8 个 device 上 (), 对于 device-limited routing, 每个 token 发送到至多 3 个 device, 也就是 .
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. 超参数设置为
| Parameter | Value |
|---|---|
| 40 | |
| 1 | |
| 32 | |
| target context length | 160K |
| scaling factor |
作者在 32K 的上下文下额外训练了 1000 步,然后在推理阶段通过 YaRN 将模型的上下文长度扩展到 128K.
Evaluation
作者对比了 DeepSeek-LLM, Qwen1.5, Mixtral MoE 以及 LLaMA 3, 实验结果如下
Efficiency
作者对比了以下 DeepSeek-MoE 和 DeepSeek-LLM 的训练效率,结果发现,对于 1T 的 token, DeepSeek-LLM 需要 300.6K GPU hours, 而 DeepSeek-V2 仅需要 127.8K GPU hours. 也就是说,DeepSeeK-V2 节省了 的训练成本
在推理时,作者首先将模型的精度转换为 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, 学习率为 .
RL
作者使用了 GRPO 算法来进一步对齐模型的表现。
作者通过实验发现,在 reasoning data, 如 code 和 math 相关数据上进行训练时,可以有效提高模型的表现。因此作者将 RL 的训练分为两个阶段,第一个阶段用于提高模型的 reasoning 能力,第二个阶段用于对齐人类偏好。
在第一个阶段,作者首先训练了一个针对 code 和 Math 的 reward model , 然后基于这个 reward model 来训练 policy model:
在第二阶段,作者使用了一个 Multi-reward 框架,包括一个 helpful reward model , 一个 safety reward model 和一个 rule-based reward model , 最终的 reward 为
训练时,reward model 由 SFT model 初始化得到,然后基于 point-wise 或者 pair-wise loss 进行训练。
Evaluation
chat 版本的模型评估结果如下所示
Discussion
作者讨论了三点发现:
- SFT data 数量。已有工作认为进需要 10K 左右的样本就可以进行 SFT,但是作者发现当数据量小于 10K 时,模型在 IFEval benchmark 上的表现大幅度下降。作者认为,这是由于数据过少导致模型很难掌握特定的技能。因此,作者认为足够的数据以及数据质量都很重要,特别是写作类任务和 open-ended QA 类任务。
- alignment tax. 作者发现通过 human preference alignment, 模型在 open-ended generation benchmark 上的保险有了很大提升。与 RLHF 一样,作者也发现了 alignment 之后模型在一些 benchmark 上表现也会下降。作者通过改进解决了这个问题,作者认为如何在不损失模型表现的情况下实现对齐是一个值得探究的方向。
- online RL. 作者发现 Online RL 比 offline RL 的表现更好。作者认为如何根据不同的任务来选取 offline RL 和 online RL 也是一个值得探究的问题。
Conclusion
在本文中,作者提出了 DeepSeek-V2, 一个基于 MoE 架构的大语言模型系列,模型的上下文为 128K. 作者基于 DeepSeek-MoE, 提出了 MLA 来提高模型的 inference 效率,并大幅度降低了训练的成本。
作者介绍了几点未来工作:
- 进一步 scaling up MoE 模型,降低模型的训练以及推理成本
- 进一步对齐模型和人类的价值观,然后最小化人类监督信号
- 扩展模型到多模态版本
Reference
Introduction
作者首先回顾了开源模型如 MiniMax-01, Kimi-k2, Qwen3, GLM-4.5 和闭源模型的进展,作者指出,现在的开源模型和闭源模型在表现上仍然存在较大差距。作者认为这种差距主要是由于三个原因:
- Transformer 提出的 softmax attention 在处理长文本时效率非常低
- 已有的开源模型在 post-training 阶段使用的算力不够
- 开原模型的泛化和指令跟随能力不如闭源模型
基于这三个问题,DeepSeek-V3.2 分别进行了改进:
- 在架构上,作者提出了 DSA,一个高效的稀疏注意力机制,用于降低计算复杂度
- 在 post-training 阶段,作者使用了比 pre-training 阶段高 的算力,用于提高模型的能力
- 作者提出了一个 pipeline 用于提高模型在工具调用场景下的 reasoning 能力
通过实验作者发现,模型达到了和 Kimi-k2 以及 GPT-5 差不多的 reasoning 表现。
Method
Architecture
DeepSeek-V3.2 与 DeepSeek-V3.1 不同之处在于使用了 DeepSeek Sparse Attention (DSA). 架构如下图所示
DSA 包含两个模块:
- lightning indexer
- fine-grained token selection mechanism
其中,lightning indexer 负责计算 query token 和一个 preceding token 之间的 index score 来决定 query token 选择的 token:
其中, 代表 indexer heads 的个数, 和 由 query token 得到, 由 preceding token 得到
给定 query token 对应的 index score , fine-grained token selection mechanism 负责选取 top-K index score 对应的 key-value entries , 然后 attention 的输出由 query token 个选取的 key value entries 得到:
[!Recall] MoBA 也提出了类似的方法,但是 MoBA 是一个无需训练的策略
受 NSA 启发,作者实现了基于 MQA 模式的 MLA, 其中 latent vector 对于 query token 所有的 query heads 都是共享的。示意图如下所示
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, 对于第 个 query token, 作者首先计算所有 attention heads 的 main attention score 之和,然后在 sequence 层面进行 L1-normalization 得到 , 最后计算 lightning indexer 输出与 之间的 KL divergence:
这个阶段训练一共使用了 2.1B 的 token, lr 为 1e-3, 训练的步数为 1000 steps, batch size 为 16.
Sparse training stage 这个阶段模型所有的参数都参与训练,该阶段的目的是让模型学习到 DSA 的 sparse pattern. 训练时,作者让 lightning indexer 的输出与 之间的输出进行对齐,其中 :
实际训练时,lightning indexer 仅接受 的反向传播,而 LLM 则仅接受 next-token prediction loss. 这个阶段模型一共使用了943.7B token, 其中 设置为 . 学习率为 , 训练步数为 15,000 steps, batch size 为 480.
Post-training
post-training 与 DeepSeek-V3.1 一致:
Specialist Distillation 作者基于 DeepSeek-V3.2 base 构建了不同领域的 specialized model, 这些领域包括:
- math
- competitive programming
- general logical reasoning
- agentic coding
- 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 时主要考虑了:
- length versus accuracy
- 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 进行修正:
使用 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 掉,更新后的损失函数如下所示
其中,
用于决定是否对当前 sequence 进行 mask, 是一个超参数控制 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 输出的质量,但是这种采样擦略也会导致 和 action space 的不匹配,因此,作者记录了 采样过程中的 truncation mask, 然后再训练的时候将其应用到 上,作者发现通过这种方式可以有效提高 RL 训练过程中的 language consistency
Thinking in Tool-Use
本节的目的是希望能够将 reasoning 能力应用到工具调用的场景下。
作者发现,如果使用 DeepSeek-R1 的策略,在下一轮对话到来时,丢弃到当前的 reasoning content 会让模型重新生成针对问题的 CoT, 从而产生 token inefficiency. 为了解决这个问题,作者构建了一个上下文管理策略,如下图所示
具体做法为:
- reasoning content 只有当有新的 user message 进入时才会丢弃;如果只有工具调用相关的 message, 则 reasoning content 会保留
- 移除 reasoning content 时,会保留对应的工具调用及其结果
在训练时,作者认为模型已经掌握了比较好的指令跟随能力,我们仅需要将 reasoning data (non-agentic) 和 non-reasoning data(agentic) 以不同的 prompt 输入给模型就能够得到比较好的结果。
对于训练的数据,作者认为 RL 任务的多样性可以有效提高模型的 robustness, 因此作者构建了不同的环境及其对应的 prompt, 生成的任务如下表所示
| number of tasks | environment | prompt | |
|---|---|---|---|
| code agent | 24667 | real | extracted |
| search agent | 50275 | real | synthesized |
| general agent | 4417 | synthesized | synthesized |
| code interpreter | 5908 | real | extracted |
- search agent: 作者使用了 multi-agent 的策略,包括 question-construction agent 用于构建 QA pair, multiple answer-generation agent 用于构建不同的 response, 一个 verification agent 用于评估生成的 response. 最后作者使用 generative reward model 来评分
- code agent: 作者爬取了 Github 上的 pull request, 然后进行过滤,接下来作者通过一个 environment-setup agent 来构建对应的环境
- code interpreter agent: 作者使用 jupyter notebook 作为代码解释器来解决复杂的 reasoning tasks, 包括 math, logic, data science 等
- general agent: 作者构建了验证简单解决困难的任务。首先作者基于 agent 和 task category 来生成或检索相关数据;接下来作者合成一个任务相关的工具集合;最后,作者让一个 agent 来提出任务以及对应的解法,并不断提高任务的难度。最后得到
<environment, tools, task, verifier>的 tuple 格式
Experiments
作者对比了 DeepSeek-V3.2-Exp 和 Claude-4.5 Sonnet, GPT-5, Gemini 3.0 Pro, Kimi-K2 thinking, MiniMax M2 的表现,评测结果如下
结果显示,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, 结果如下图所示
接下来作者验证了 synthesis agentic tasks 对模型表现的影响。首先,作者随机采样一批样本使用闭源 LLM 进行测试,发现闭源模型表现最好为 , 这说明了合成数据对于 DeepSeek V3.2 和闭源模型都是有挑战的。
其次,作者探究了合成数据是否能够提高 RL 的泛化性,作者构建了两个额外模型:
- SFT: 在 SFT checkpoint 上进行 RL
- Exp: 仅在 search 以及 code environment 上进行 RL
对比结果发现,合成数据缺失可以有效提高模型的表现
作者还对比了 DSA 的效率,DSA 可以将 attention 的计算复杂度由 降低到 , 其中 是选取的 top-K tokens. 尽管 lightning indexer 的复杂度仍然是 , 但是其计算量远小于 MLA, 作者对比了两者的效率,实验结果如下图所示
可以看到,DeepSeek-V3.2 的 prefilling 和 decoding 效率都远高于 DeepSeek-V3.1
最后,作者对比了不同上下文管理策略对模型表现的影响,对比策略有:
- Summary: 对轨迹进行总结然后重新初始化 rollout
- Discard 75%: 丢弃到初始 75% 的工具调用历史
- Discard-all: 丢弃掉所有的工具调用历史
- Parallel-fewest step: 多次采样然后保留步数最少得轨迹
实验结果如下图所示
结果显示,使用上下文管理策略之后,模型的表现有了显著提升。并且,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 大语言模型。
在训练目标和架构上,作者做了如下改进:
- efficiency inference: 采用了 DeepSeek-V2 提出的 MLA
- cost-effective training: 采用了 DeepSeekMoE 提出了 MoE 架构
- auxiliary-loss-free strategy: 采用了 Loss-Free Balancing 提出的 loss balancing 策略
- multi-token prediction: 采用了 MTP 的训练目标来提升模型的表现
在训练上,作者做了如下改进:
- 使用了 FP8 混合精度进行训练并验证了其在大规模模型上的有效性
- 作者构建了 DualPipe 算法用于高效的 pipeline parallelism
- 构建了 cross-node all-to-all communication kernel 来高效使用 InfiniBand 以及 NVLink bandwidth
- 优化了 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 的架构一致,如下图所示
MLA 的介绍见 MLA, MoE 架构的介绍见 DeepSeekMoE. DeepSeek-V3 在 DeepSeekMoE 的基础上做了两点改变:
- 受 Loss-Free Balancing 启发,作者使用了 sigmoid fu nction 来计算 affinity score
- 对于 selected affinity score 应用了 normalization
在 DeepSeekMoE 的基础上,作者使用了 Loss-Free Balancing. 其表达式如下
其中 仅影响 routing, 训练时,如果对应的 expert 负载不均衡,则对 进行更新,更新方式为增加/减少 , 这里 是一个超参数
为了提高 routing 在 sequence 层面的负载均衡,作者还是用了一个 complementary sequence-wise balance loss:
其中 是 balance factor, 为超参数, 是 sequence length, 加入这个损失后,每个 sequence 上的负载会变得更加均衡
与 DeepSeekMoE 一样,作者也在 node 层面实现负载均衡,具体做法就是,根据 node 中所包含 expert 的 affinity score 之和来选取最高的 个 nodes, 这样就可以进一步提高 computation 和 communication 之间的 overlap.
由于 DeepSeek-V3 负载均衡比较好,因此作者使用了 no token-dropping strategy.
MTP
受 MTP 启发,DeepSeek-V3 也构建了 MTP 模块,作者认为 MTP 模块有两个优势:
- MTP objective 提供了更多的学习信号,进而提高了数据使用效率
- MTP 可以让模型更好预测未来的 token
与 MTP 不同,DeepSeek-V3 【todo】, DeepSeek-V3 所使用的 MTP 模块架构图如下所示
MTP 模块使用了 sequential modules 来预测未来的 个 token. 其中,第 个 MTP 模块包含一个共享的 embedding layer , 一个共享的 output head , 一个 transformer block 和一个 projection matrix .
对于第 个 token 以及第 个 MTP 模块,作者首先将第 个 MTP 模块的第 个 token 的 hidden states 和第 个 token 的 embedding 联合在一起
其中 代表 concatenation 操作。当 时, 就代表了 main model 的输出。每个 MTP 模块的 embedding layer 和 main model 的 embedding layer 是共享的,接下来, 作为第 个 MTP 模块 transformer block 的输入,得到
最后,共享的 output head 输出对应的概率分布:
这里的 的权重与 main model 也是共享的。作者这里提到,所使用的思想与 EAGLE 是类似的,但是不同的地方在于,EAGLE 主要是用于 speculative decoding, 而 MTP 主要用于提升训练。
MTP 的训练目标为未来 个 token 的 cross-entropy loss:
其中 是 sequence length, 是第 个位置对应的 ground truth token, 代表低 个 MTP 模块给出的 的预测概率。最后,作者对所有的 MTP loss 进行求和,得到
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.
作者主要进行了三点优化:
- 构建了 DualPipe 用于高效 pipeline parallelism
- 构建了 cross-node all-to-all communication kernels 来高效利用 IB 以及 NVLink bandwidth
- 优化了训练时的 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
示意图里包含两个 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, 1F1B 和 ZeroBubble, 结果如下表所示
| Method | Bubble | Parameter | Activation |
|---|---|---|---|
| 1F1B | |||
| ZB1P | |||
| DualPipe (Ours) |
这里 是 forward chunk 的执行时间, 是 backward chunk 执行的时间, 是一个 chunk “backward for weights” 的执行时间, 是一个 chunk 前向反向传播重叠的时间。可以看到,DualPipe 只使用了额外的 倍的 peak activation memory, 就大幅度降低了 bubble 时间
Cross-node All-to-all Communication
作者针对 DualPipe 构建了 cross-node all-to-all communication kernels 来提高通信效率。
作者提到,跨节点通信使用的是 IB, 节点内部通信使用的是 NVLink, 通信方式如下图所示。
对于 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 可以在不损失效率的情况下最高选取 个专家。
作者进一步采用了 warp specialization 技巧来将 20 个 SM 划分为 10 个通信 channel. 作者分别针对 dispatching 和 combing 阶段使用了不同数量的 warps.
Memory saving
作者使用了如下技巧来减少内存访问:
- Recomputation of RMSNorm and MLA Up-Projection. 在 backward 过程中重新计算 RMSNorm operation 以及 MLA up projection 来避免存储器对应的输出
- Exponential Moving Average in CPU. 作者将 EMA 参数保存在 CPU 中,然后进行异步更新来进一步减少内存访问
- Shared Embedding and Output Head for Multi-Token Prediction. 作者将 embedding layer 和 output head 放在一个 PP rank 上,这样就可以提高 MTP 的内存访问效率
FP8 Training
作者提出了一个基于 FP8 的混合精度训练框架。作者提出了两个改进方案:
- 分组量化,将 tensor 按照 tile 分组或者按照 block 分组来分组量化,这样就避免了全局量化的精度损失
- 高精度累加,作者在乘法计算时,使用了 FP8 格式,然后在累加阶段,使用了更高精度的格式
为了进一步减少内存和通信开销,对于 activation 的 cache 以及 dispatch, 作者使用了 FP8 数据格式,然后对于优化器状态,作者使用了 BF16 数据格式。下面是对上面改进的具体说明。
Mixed Precision Training
作者在本文中提出了使用 FP8 混合精度进行预训练,作者参考了 low precision training 构建 FP8 训练框架,即计算量高的使用 FP8 精度,计算量低的使用原本的数据精度, 框架如下图所示
其中各个模块使用的精度如下表所示
| Precision | Modules |
|---|---|
| FP8 | Linear (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 混合精度训练的表现:
- fine-grained quantization: 对于激活值,作者将 tensor 分割为 大小的 groups, 然后每个 group 内部进行 quantization; 对于权重,作者将其分割为 大小的 groups, 然后进行 quantization, 这样可以降低 quantization error, 如上图左图所示
- increasing accumulation precision: 低精度训练会带来 underflow 的问题,而 FP8 GEMM 累加仅能保留约 14bit 精度,远低于 FP32 的 32bit 精度。为了解决这个问题,作者采用了 Tensor Core 不分累加 +CUDA core 高精度聚合的协同策略。即在 Tensor Core 上执行 MMA 指令时,先按照 14bit 精度对 个元素进行累加,当达到 时,作者将结果复制到 CUDA core 的 FP32 寄存器中,在 FP32 精度下完成累加。过程如上图右图所示
- Mantissa over exponents. 与之前的工作不同,作者使用了 E4M3 的数据格式来达到更高的精度
- Online Quantization. 为了降低 quantization 的误差,作者实时计算了 activation block 以及 weight block 的最大绝对值来导出 scaling factor 并量化为 FP8 精度
Low Precision Storage and Communication
作者通过压缩 cached activation 和 optimizer states 来进一步减少内存访问以及通信访问次数
- Low-precision optimizer states: 对于 optimizer states, 作者使用了 BF16 数据格式来保存 AdamW 的优化器的一阶和二阶动量,但是对于 master weight 和 gradients 作者仍然使用了 FP32 来保证训练的数值稳定性
- Low-Precision Activation: 对于 linear operator, 作者将其 cache activation 使用 FP8 格式进行存储,对于 attention 的输出,作者使用了 E5M6 数据格式来存储 activations, 这些 activations 的 tile size 为 , 作者还是用了 2 的幂次作为 scale factor 来减少 quantizationerror; 对于 SwiGLU, 作者将其输入也保存为 FP8 的数据格式来降低内存消耗
- Low-Precision Communication: 在 MoE up-projection 之前,作者将 attention 的输出量化为 FP8 数据格式再执行 dispatch 操作,这样可以降低通信开销。在反向传播的时候同理,先进行 FP8 量化,然后再进行反向 dispatch. 对于 combine 阶段,为了避免精度损失,作者还是使用了 BF16 数据格式
作者对比了 FP8 和 BF16 精度训练,结果如下图所示
实验结果显示,FP8 混合精度训练的损失降低不足 .
Inference and Deployment
作者在 H800 集群上部署 DeepSeek-V3, 作者分别针对 prefilling 和 decoding 两个阶段进行了优化
Prefilling
prefilling 阶段在 4 节点 32 GPU 上进行,并行策略如下
| 模块 | 并行策略 | 说明 |
|---|---|---|
| Dense MLP | 1-wat TP | 减少 TP 通信 |
| Attention | 4-way TP, SP, 8-way DP | SP 用于长文本处理 |
| MoE | 32-way EP | 每个 GPU 包含 8 个专家 |
为了实现负载均衡,作者提出了redundant experts的策略,具体就是将负载比较高的专家进行复制。模型会周期性进行统计,然后计算出负载比较高的专家,接下来每个 GPU 除了原来的 8 个专家之外,还会 host 一个额外的 redundant expert.
为了提高 throughput, 作者同时处理两个 micro-batch, 来重叠 attention, MoE 和 dispatch, combine 通信,如下图所示
作者还探索了 dynamic redundancy 策略,即每个 GPU host 更多的专家(比如 16 个)然后 inference 的每一步仅激活其中的 9 个,在进行 all-to-all operation 时,作者首先进行 global optimal routing 来计算最合适的专家。作者认为 prefilling 计算量很大,因此 routing 的计算量可以忽略不计
Decoding
在 decoding 阶段,作者在 40 个节点 320 GPU 上进行部署,并行策略如下
| 模块 | 并行策略 | 说明 |
|---|---|---|
| Attention | 4-way TP, SP, 80-way DP | SP 用于长文本处理 |
| MoE | 320-way EP | 每个 GPU 包含 8 个专家 |
这个阶段,每个 GPU 只 host 一个专家,64 个 GPU 负责 host redundant expert 以及 shared expert. 作者通过在 IB 上直接进行 P2P 的传输来降低通信的开销,作者还是用了 IBGDA 来进一步最小化 latency 以及提高通信效率
在这个阶段,attention 的计算占据了大部分时间,因此,作者采取了如下的 overlap 策略
由于 decoding 阶段一般 batch size 比较小,因此整个 decoding 的瓶颈在于 memory access, 因此为了避免影响 attention 的计算效率,作者仅安排一小部分 SM 用于 dispatch-MoE-combine.
Suggestions on Hardware Design
Communication Hardware
尽管作者将计算与通信重叠来提高训练效率,但是已有的通信仍然依赖于 SM, 这样限制了计算的效率。作者希望工能够构建专门针对通信的设备,另一方面,作者希望统一 IB 和 NVLink 来降低实现难度
Computation Hardware
- 提升 FP8 GEMM 的累加精度,当前精度只有 14bit, 作者希望能够在 GPU 设计上进行改进,将这个精度提升到 34-bit
- 支持 tile 以及 block 层面的 quantization, 尽管前文作者已经设计出了改进的算法,但是 Tensor Core 以及 CUDA 之前平凡的数据移动降低了计算效率,作者希望未来能够支持细粒度的 quantization
- online quantization, 作者希望将 FP8 cast 以及 TMA 结合在一起,从而 quantization 可以在传输的时候完成计算,减少了内存读写。作者还建议使用 warp-level cast instruction
- 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
| variable | notation | value |
|---|---|---|
| layers | 61 | |
| dense layers | - | 3 |
| hidden dimension | 7168 | |
| num of attention heads | 128 | |
| head dimension | 128 | |
| KV compression dimension | 512 | |
| query compression dimension | 1536 | |
| decouple query and key dimension | 64 | |
| routed expert | 256 | |
| shared expert | 1 | |
| MoE hidden dimension | 2048 | |
| activated experts | 8 | |
| limited node routing | 4 | |
| MTP depth | 1 |
训练时,作者使用了 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 上作者没有应用这一点。参数配置如下表
| parameter | ||||
|---|---|---|---|---|
| value | 40 | 1 | 32 |
第一阶段的上下文长度为 32K, batch size 为 1920, 第二个阶段的上下文长度为 128K, batch size 为 480.
Performance
DeepSeek-V3 base 的表现下图所示,作者对比了 DeepSeek-V2, Qwen2.5, LLaMA 3.1
Discussion
作者首先验证了 MTP 的有效性,结果如下图所示
可以看到,在模型架构相同,训练数据相同的情况下,1-MTP 的效果超过了 baseline 的表现,说明了 MTP 策略的有效性
接下来,作者还验证了 Loss-Free Balancing 的有效性,结果如下图所示
可以看到,loss-free Balancing 的效果比 loss balancing 的效果更好
接下来,作者对比了 loss-free balancing 和 sequence-wise auxiliary loss, 即 batch-wise v.s. sequence-wise. 作者认为,前者的约束更灵活,因为其不要求 in-domain balance. 作者在测试集上进行可视化,结果如下图所示
实验结果发现,loss-free 策略对应的 expert specialization 更强。作者进一步设计了一个 batch-wise auxiliary loss 来实现 batch-wise load balance, 结果发现,这种策略也能达到和 loss-free balancing 一样的效果,这说明了 batch-wise load balancing 效果更好
最后,作者提了两点 loss-free 策略的问题:
- 在特定的 sequence 或者小 batch 里出现负载不均衡。作者通通过增大 batch size 来解决这个问题
- 在推理阶段因为 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
Post-training Discussion
作者首先探究了 Distillation 对模型表现的影响,作者使用 DeepSeek-R1 来蒸馏 DeepSeek-V2.5, 结果如下图所示
| Model | LiveCodeBench-CoT | MATH-500 | ||
|---|---|---|---|---|
| Pass@1 | Length | Pass@1 | Length | |
| DeepSeek-V2.5 Baseline | 31.1 | 718 | 74.6 | 769 |
| DeepSeek-V2.5 +R1 Distill | 37.4 | 783 | 83.2 | 1510 |
可以看到,distillation 可以显著提高模型的表现。但是其问题在于也会让模型输出的长度增加。作者认为知识蒸馏是 post-training optimization 的一个重要方向。
接下来,作者讨论了 self-rewarding, 具体做法就是使用 DeepSeek-V3 来对评估结果进行投票,结果发现最终的效果很好,作者认为 LLM 可以很好地将非结构化信息转换为 rewards.
最后,作者讨论了 MTP. MTP 可以于 speculative decoding 结合,进一步提高 decoding 的速度。通过实验作者发现,second token prediction 的接受率在 之间,说明了其有效性。
Conclusion
在本文中,作者提出了 DeepSeek-V3, 一个 671B-A37B 的 MoE 大语言模型,训练 token 数为 14.8T. 作者使用了 loss-free-balancing strategy 来实现负载均衡。训练时作者使用了 FP8 混合精度。评估发现 DeepSeek-V3 的达到了 SOTA 表现。
作者认为,DeepSeek-V3 model size 太大,不适合部署。第二,部署策略需要进一步改进。
最后,作者认为未来工作有以下几点:
- 改进模型架构,进一步提高训练以及推理效率,扩展模型的上下文
- 提升训练数据的数量和质量
- 提高模型的 reasoning 能力
- 更详尽的评估