声明:本文来自于微信公众号 赛博禅心,作者:赛博禅心,授权站长之家转载发布。
这两天,DeepSeek-V3低调发布,在国际上狠狠秀了一波肌肉:只用了500多万美金的成本,带来了不输 Claude3.5的成绩,并开源!
下面,让我们以更加系统的方式,来看看这次的 DeepSeek-V3,是这么炼成的。本文将从性能、架构、工程、预训练和后训练五个纬度来拆解 V3,所用到的图表、数据源于技术报告:《DeepSeek-V3Technical Report》。
公众号后台回复:DSV3,获得详细报告。
性能
DeepSeek-V3的性能优势,在各项基准测试中得到了充分验证。
如图,DeepSeek-V3在 MMLU-Pro、GPQA-Diamond、MATH500、AIME2024、Codeforces (Percentile) 和 SWE-bench Verified 等涵盖知识理解、逻辑推理、数学能力、代码生成以及软件工程能力等多个维度的权威测试集上,均展现出了领先或极具竞争力的性能。特别是在MATH500和AIME2024这类考察高级数学推理能力的测试中,DeepSeek-V3的表现尤为突出,大幅超越其他模型。
在与 DeepSeek-V2-Base、Qwen2.572B Base 和 LLaMA-3.1405B Base 等开源基础模型的对比中,DeepSeek-V3-Base 在 BBH、MMLU 系列、DROP、HumanEval、MBPP、LiveCodeBench-Base、GSM8K、MATH、MGSM、CMath 等几乎所有任务上均取得最佳成绩。
经过指令微调后,DeepSeek-V3的性能进一步提升。在与包括 GPT-4o、Claude-3.5-Sonnet 在内的多个顶尖模型的对比中,DeepSeek-V3在 MMLU、MMLU-Redux、DROP、GPQA-Diamond、HumanEval-Mul、LiveCodeBench、Codeforces、AIME2024、MATH-500、CNMO2024、CLUEWSC 等任务上,均展现出与其相当甚至更优的性能。
并且,这么棒的数据,总成本只需要约550万美金:如果是租 H800来搞这个(但我们都知道,DeepSeek 背后的幻方,最不缺的就是卡)
架构
DeepSeek-V3的这次发布,伴随三项创新:Multi-head Latent Attention (MLA)、DeepSeekMoE 架构以及无额外损耗的负载均衡策略。
Multi-head Latent Attention (MLA):高效处理长文本
MLA 通过将 Key (K) 和 Value (V) 联合映射至低维潜空间向量 (cKV),显著降低了 KV Cache 的大小,从而提升了长文本推理的效率。DeepSeek-V3中 MLA 的 KV 压缩维度 (dc) 设置为512,Query 压缩维度 (d') 设置为1536,解耦 Key 的头维度 (dr) 设置为64。这种设计在保证模型性能的同时,大幅减少了显存占用和计算开销。
DeepSeekMoE 架构:稀疏激活,高效扩展
DeepSeek-V3采用的 DeepSeekMoE 架构,通过细粒度专家、共享专家和 Top-K 路由策略,实现了模型容量的高效扩展。每个 MoE 层包含1个共享专家和256个路由专家,每个 Token 选择8个路由专家,最多路由至4个节点。这种稀疏激活的机制,使得 DeepSeek-V3能够在不显著增加计算成本的情况下,拥有庞大的模型容量。
无额外损耗的负载均衡:MoE 的关键优化
DeepSeek-V3提出了一种创新的无额外损耗负载均衡策略,通过引入并动态调整可学习的偏置项 (Bias Term) 来影响路由决策,避免了传统辅助损失对模型性能的负面影响。该策略的偏置项更新速度 (γ) 在预训练的前14.3T 个 Token 中设置为0.001,剩余500B 个 Token 中设置为0.0;序列级平衡损失因子 (α) 设置为0.0001。
以上图(报告第28页,图9)中的数据为例,使用了该策略的训练模型在不同领域的专家负载情况,相比于添加了额外负载损失(Aux-Loss-Based)的模型,分工更为明确,这表明该策略能更好地释放MoE的潜力。
工程
DeepSeek-V3的这次发布,伴随多项工程优化贯穿了流水线并行、通信优化、内存管理和低精度训练等多个方面。
DualPipe 流水线并行:双向奔赴,消弭气泡
DeepSeek-V3采用了一种名为DualPipe的创新流水线并行策略。与传统的单向流水线 (如1F1B) 不同,DualPipe 采用双向流水线设计,即同时从流水线的两端馈送 micro-batch。这种设计可以显著减少流水线气泡 (Pipeline Bubble),提高 GPU 利用率。
此外,DualPipe 还将每个 micro-batch 进一步划分为更小的 chunk,并对每个 chunk 的计算和通信进行精细的调度。通过巧妙地编排计算和通信的顺序,实现了两者的高度重叠。
单个 forward 和 backward chunk 的重叠策略(原报告第12页)。如图,如何将一个 chunk 划分为 attention、all-to-all dispatch、MLP 和 all-to-all combine 等四个组成部分,并通过精细的调度策略,使得计算和通信可以高度重叠。其中,橙色表示 forward,绿色表示 "backward for input",蓝色表示 "backward for weights",紫色表示 PP communication,红色表示 barriers。
8个 PP rank 和20个 micro-batch 的 DualPipe 调度示例(原报告第13页)。通过在8个 PP rank 上,20个 micro-batch 的 DualPipe 调度情况,可以看到,通过双向流水线的设计,以及计算和通信的重叠,流水线气泡被显著减少,GPU 利用率得到了极大提升。
DualPipe 在流水线气泡数量和激活内存开销方面均优于1F1B 和 ZeroBubble 等现有方法。(原报告第13页)
通信优化:多管齐下,突破瓶颈
跨节点 MoE 训练的一大挑战是巨大的通信开销。DeepSeek-V3通过一系列精细的优化策略,有效地缓解了这一瓶颈。
- 节点限制路由 (Node-Limited Routing):将每个 Token 最多路由到4个节点,有效限制了跨节点通信的范围和规模。
- 定制化 All-to-All 通信内核:DeepSeek 团队针对 MoE 架构的特点,定制了高效的跨节点 All-to-All 通信内核。这些内核充分利用了 IB 和 NVLink 的带宽,并最大程度地减少了用于通信的 SM 数量。
- Warp 专业化 (Warp Specialization):将不同的通信任务 (例如 IB 发送、IB-to-NVLink 转发、NVLink 接收等) 分配给不同的 Warp,并根据实际负载情况动态调整每个任务的 Warp 数量,实现了通信任务的精细化管理和优化。
- 自动调整通信块大小:通过自动调整通信块的大小,减少了对 L2缓存的依赖,降低了对其他计算内核的干扰,进一步提升了通信效率。
内存管理:精打细算,极致利用
DeepSeek-V3在内存管理方面也做到了极致,通过多种策略最大程度地减少了内存占用。
- RMSNorm 和 MLA 上投影的重计算 (Recomputation):在反向传播过程中,DeepSeek-V3会重新计算 RMSNorm 和 MLA 上投影的输出,而不是将这些中间结果存储在显存中。这种策略虽然会略微增加计算量,但可以显著降低显存占用。
- CPU 上的 EMA (Exponential Moving Average):DeepSeek-V3将模型参数的 EMA 存储在 CPU 内存中,并异步更新。这种策略避免了在 GPU 上存储 EMA 参数带来的额外显存开销。
- 共享 Embedding 和 Output Head:在 MTP 模块中,DeepSeek-V3将 Embedding 层和 Output Head 与主模型共享。这种设计减少了模型的参数量和内存占用。
FP8低精度训练:精度与效率的平衡
DeepSeek-V3通过 FP8混合精度训练,在保证模型精度的同时,大幅降低显存占用并提升训练速度。
- 选择性高精度:对于模型中对精度较为敏感的组件(例如 Embedding、Output Head、MoE Gating、Normalization、Attention 等),DeepSeek-V3仍然采用 BF16或 FP32进行计算,以保证模型的性能。(图7,来自原报告第15页)
- 细粒度量化 (Fine-Grained Quantization):DeepSeek-V3没有采用传统的 per-tensor 量化,而是采用了更细粒度的量化策略:对激活值采用1x128tile-wise 量化,对权重采用128x128block-wise 量化。这种策略可以更好地适应数据的分布,减少量化误差。(图7a,来自原报告第16页)
- 提高累加精度:为了减少 FP8计算过程中的精度损失,DeepSeek-V3将 MMA (Matrix Multiply-Accumulate) 操作的中间结果累加到 FP32寄存器中。(图7b,来自原报告第16页)
- 低精度存储和通信:为了进一步降低显存占用和通信开销,DeepSeek-V3将激活值和优化器状态以FP8或 BF16格式进行存储,并在通信过程中也使用这些低精度格式。(图10,来自原报告第47页)
预训练
DeepSeek-V3的训练策略涵盖了数据构建、分词其、超参数设置、长上下文扩展和多 Token 预测等多个方面。
数据构建
DeepSeek-V3的预训练语料库规模达到了14.8万亿 Token,这些数据经过了严格的筛选和清洗,以确保其高质量和多样性。相比于前代模型 DeepSeek-V2,新模型的数据构建策略更加精细。首先,大幅提升了数学和编程相关数据在整体数据中的占比,这直接增强了模型在相关领域的推理能力,使其在 MATH500、AIME2024等数学基准测试和 HumanEval、LiveCodeBench 等代码基准测试中表现突出。其次,进一步扩展了多语言数据的覆盖范围,超越了传统的英语和中文,提升了模型的多语言处理能力。
为了保证数据质量,DeepSeek 开发了一套完善的数据处理流程,着重于最小化数据冗余,同时保留数据的多样性。此外,他们还借鉴了近期研究 (https://arxiv.org/abs/2404.10830,Ding et al.,2024) 中提出的文档级打包 (Document Packing)方法,将多个文档拼接成一个训练样本,避免了传统方法中由于截断导致的上下文信息丢失,确保模型能够学习到更完整的语义信息。
针对代码数据,DeepSeek-V3借鉴了 DeepSeekCoder-V2中采用的Fill-in-Middle (FIM)策略,以0.1的比例将代码数据构造成<|fim_begin|> pre<|fim_hole|> suf<|fim_end|> middle<|eos_token|>的形式。这种策略通过“填空”的方式,迫使模型学习代码的上下文关系,从而提升代码生成和补全的准确性。
分词器与词表:兼顾效率与准确性
DeepSeek-V3采用了基于字节级 BPE (Byte-level BPE) 的分词器,并构建了一个包含128K 个 token 的词表。为了优化多语言的压缩效率,DeepSeek 对预分词器 (Pretokenizer) 和训练数据进行了专门的调整。
与 DeepSeek-V2相比,新的预分词器引入了将标点符号和换行符组合成新 token的机制。这种方法可以提高压缩率,但也可能在处理不带换行符的多行输入 (例如 few-shot 学习的 prompt) 时引入 token 边界偏差 (Token Boundary Bias) (Lundberg,2023)。为了减轻这种偏差,DeepSeek-V3在训练过程中以一定概率随机地将这些组合 token 拆分开来,从而让模型能够适应更多样化的输入形式,提升了模型的鲁棒性。 (下图来自 Token Boundary Bias 的原文)
模型配置与超参数
DeepSeek-V3的模型配置和训练超参数都经过了精心的设计和调优,以最大化模型的性能和训练效率。
- 模型配置:
DeepSeek-V3的Transformer 层数设置为61层,隐藏层维度为7168。所有可学习参数均采用标准差为0.006的随机初始化。在MLA 结构中,注意力头的数量(nh) 设置为128,每个注意力头的维度(dh) 为128,KV 压缩维度(dc) 为512,Query 压缩维度(d') 为1536,解耦的 Key 头的维度(dr) 为64。除了前三层之外,其余的 FFN 层均替换为MoE 层。每个MoE 层包含1个共享专家和256个路由专家,每个专家的中间隐藏层维度为2048。每个 Token 会被路由到8个专家,并且最多会被路由到4个节点。多 Token 预测的深度(D) 设置为1,即除了预测当前 Token 之外,还会额外预测下一个 Token。此外,DeepSeek-V3还在压缩的潜变量之后添加了额外的 RMSNorm 层,并在宽度瓶颈处乘以了额外的缩放因子。
- 训练超参数:
DeepSeek-V3采用了 AdamW 优化器,β1设置为0.9,β2设置为0.95,权重衰减系数 (weight_decay) 设置为0.1。最大序列长度设置为4K。学习率方面,采用了组合式的调度策略:在前2K 步,学习率从0线性增加到2.2×10^-4;然后保持2.2×10^-4的学习率直到模型处理完10T 个 Token;接下来,在4.3T 个 Token 的过程中,学习率按照余弦曲线 (Cosine Decay) 逐渐衰减至2.2×10^-5;在最后的500B 个 Token 中,学习率先保持2.2×10^-5不变 (333B 个 Token),然后切换到一个更小的常数学习率7.3×10^-6(167B 个 Token)。梯度裁剪的范数设置为1.0。Batch Size 方面,采用了动态调整的策略,在前469B 个 Token 的训练过程中,Batch Size 从3072逐渐增加到15360,并在之后的训练中保持15360不变。
为了实现 MoE 架构中的负载均衡,DeepSeek-V3采用了无额外损耗的负载均衡策略,并将偏置项的更新速度 (γ) 在预训练的前14.3T 个 Token 中设置为0.001,在剩余的500B 个 Token 中设置为0.0。序列级平衡损失因子 (α) 设置为0.0001,以避免单个序列内的极端不平衡。多 Token 预测 (MTP)损失的权重 (λ) 在前10T 个 Token 中设置为0.3,在剩余的4.8T 个 Token 中设置为0.1。
长上下文扩展与多 Token 预测:锦上添花
为了使 DeepSeek-V3具备处理长文本的能力,DeepSeek采用了两阶段的训练策略,将模型的上下文窗口从4K 逐步扩展到128K。他们采用了YaRN(Peng et al.,2023a) 技术,并将其应用于解耦的共享 Key (k)。在长上下文扩展阶段,DeepSeek-V3的超参数保持不变:scale 设置为40,β 设置为1,ρ 设置为32,缩放因子设置为0.1ln n +1。
- 第一阶段 (4K ->32K):序列长度设置为32K,Batch Size 设置为1920,学习率设置为7.3×10^-6。
- 第二阶段 (32K ->128K):序列长度设置为128K,Batch Size 设置为480,学习率设置为7.3×10^-6。
上图(报告第23页) 的 "Needle In A Haystack" (NIAH) 测试结果清晰地展示了 DeepSeek-V3在处理长文本方面的卓越能力。
此外,DeepSeek-V3还采用了多 Token 预测 (MTP) 策略(2.2节,第10页),要求模型在每个位置预测未来的多个 Token,而不仅仅是下一个 Token。图3(第10页) 详细展示了 MTP 的实现方式。
这种策略增强了模型的预见能力,并提供了更丰富的训练信号,从而提升了训练效率。表4(第26页) 的消融实验结果证明了 MTP 策略的有效性。
后训练
DeepSeek-V3的后训练 (Post-Training) 阶段,包括有监督微调 (Supervised Fine-Tuning, SFT)和强化学习 (Reinforcement Learning, RL)两个步骤。
有监督微调 (SFT)
SFT 阶段,DeepSeek-V3在一个包含1.5M 指令-响应对的高质量数据集上进行了微调。该数据集涵盖了多种任务类型和领域,并采用了不同的数据构建策略,以最大程度地激发模型的潜能。
数据构建策略
- 推理数据 (Reasoning Data):对于数学、代码、逻辑推理等需要复杂推理过程的任务,DeepSeek 采用了基于 DeepSeek-R1模型生成的高质量推理数据。DeepSeek-R1模型在推理任务上表现出色,但其生成的响应往往存在过度推理、格式不规范、长度过长等问题。为了兼顾 R1模型生成数据的高准确性与标准答案的简洁性,SFT 阶段的数据构建采用了以下策略:
- 对于每个问题,生成两种类型的 SFT 样本:
- 在后续的 RL 阶段,模型会利用高温采样 (High-Temperature Sampling) 生成多样化的响应,这些响应会融合 R1生成数据和原始数据中的模式,即使在没有明确系统提示的情况下,也能生成高质量的响应。
- 经过数百步的 RL 训练后,中间的 RL 模型会逐渐学会融入 R1模型的推理模式,从而提升整体性能。
- 最后,利用训练完成的 RL 模型进行拒绝采样 (Rejection Sampling),生成高质量的 SFT 数据,用于最终模型的训练。
- <问题, 原始响应>:将问题与 R1模型生成的原始响应直接配对。
- <系统提示, 问题, R1响应>:将问题与 R1模型的响应配对,并在问题前添加一个精心设计的系统提示 (System Prompt)。该系统提示旨在引导模型生成更符合人类偏好的响应,例如更简洁、更易懂的格式。
- 表9(第34页) 展示了从 DeepSeek-R1蒸馏知识对性能的提升。可以看到,在 LiveCodeBench-CoT 和 MATH-500任务上,经过 R1蒸馏后,模型的 Pass@1指标分别提升了6.3和8.6个百分点,证明了该策略的有效性。
- 非推理数据 (Non-Reasoning Data):对于创意写作、角色扮演、简单问答等非推理类任务,则利用 DeepSeek-V2.5生成响应,并由人工进行标注和校验,以确保数据的准确性和可靠性。
训练细节
- 训练轮数 (Epochs):2
- 学习率调度 (Learning Rate Schedule):Cosine 衰减,从5×10^-6逐步降低至1×10^-6。
- 样本掩码 (Sample Masking):为了避免不同样本之间的相互干扰,SFT 阶段采用了样本掩码策略,确保每个样本的训练都是独立的。
强化学习 (RL)
为了使 DeepSeek-V3更好地对齐人类偏好,DeepSeek 采用了强化学习 (RL) 技术,并构建了基于规则的奖励模型 (Rule-Based RM) 和基于模型的奖励模型 (Model-Based RM) 相结合的奖励机制。
- 基于规则的奖励模型 (Rule-Based RM):对于可以通过明确规则进行判别的任务 (例如数学题、编程题),采用基于规则的奖励模型。例如,对于数学题,可以设定规则检查最终答案是否正确;对于编程题,可以利用编译器进行测试用例验证。这种方式可以提供准确且稳定的奖励信号。
- 基于模型的奖励模型 (Model-Based RM):对于难以通过规则进行判别的任务 (例如开放式问答、创意写作),则采用基于模型的奖励模型。该模型基于 DeepSeek-V3SFT 阶段的检查点进行训练,并采用了一种特殊的训练数据构建方式:
- 偏好数据构建:构建的偏好数据不仅包含最终的奖励值,还包括了得出该奖励值的思维链 (Chain-of-Thought),这有助于提升奖励模型的可靠性,并减少特定任务上的奖励“hack”现象。
- 模型输入:对于有明确答案的任务,模型输入为问题和生成的响应;对于没有明确答案的任务,模型仅输入问题和对应的响应。
- 模型判断:对于有明确答案的任务,模型判断响应是否与正确答案匹配;对于没有明确答案的任务,模型根据问题和响应给出综合评价。
作为奖励模型,在 RewardBench 上的表现上,DeepSeek 多个方面超越或持平 GPT-4o 和 Claude-3.5-sonnet。
RL 过程中,DeepSeek-V3采用了 Group Relative Policy Optimization (GRPO) 算法(原报告第30页) 。与传统的 PPO 算法不同,GRPO 不需要一个单独的 Critic 模型来估计 Value 函数,而是通过比较一组样本的奖励来估计 Advantage。具体流程如下:
- 对于每个问题q,从当前的策略模型 π_old 中采样一组K个响应 {y_1, y_2, ..., y_K}。
- 利用奖励模型对每个响应进行评分,得到对应的奖励 {r_1, r_2, ..., r_K}。
- 计算每个响应的 Advantage 值:A_i = (r_i - mean(r)) / std(r),其中 mean(r) 和 std(r) 分别表示该组奖励的均值和标准差。
- 根据以下目标函数更新策略模型 π_θ:
- [公式26和27(第30页)]
- 其中,π_ref 是参考模型 (通常是 SFT 阶段的模型),β 和 ε 是超参数。
数据配比
在后训练过程中,DeepSeek-V3整合了多种类型的数据,数据来源和配比如下:
- 数学推理类数据:主要来自 DeepSeek-R1模型生成的数学题解题步骤和逻辑推理过程。这类数据在后训练阶段占比约为25%。
- 代码生成类数据:包括了从开源代码库中精选的代码片段,以及利用 DeepSeek-R1模型生成的代码补全和代码解释数据。这类数据占比约为20%。
- 通用领域对话数据:涵盖了开放域问答、创意写作、角色扮演等多种任务类型,主要利用 DeepSeek-V2.5生成,并经过人工校验。这类数据占比约为45%。
- 安全和伦理类数据:包含了用于提升模型安全性和符合伦理规范的指令和响应数据,占比约为10%。