# 2024 DeepSeek-AI

DeepSeek-V3 Technical Report

DeepSeek-V3 技术报告 DeepSeek-AI research@deepseek.com --- 摘要 我们推出了 DeepSeek-V3,这是一款强大的混合专家(MoE)语言模型,总参数量为 671B,每个 token 激活 37B 参数。为了实现高效推理和经济的训练,DeepSeek-V3 采用了在 DeepSeek-V2 中经过充分验证的多头潜...

精粹译文

DeepSeek-V3 技术报告

DeepSeek-AI research@deepseek.com


摘要

我们推出了 DeepSeek-V3,这是一款强大的混合专家(MoE)语言模型,总参数量为 671B,每个 token 激活 37B 参数。为了实现高效推理和经济的训练,DeepSeek-V3 采用了在 DeepSeek-V2 中经过充分验证的多头潜在注意力(MLA)和 DeepSeekMoE 架构。此外,DeepSeek-V3 开创了一种无辅助损失(auxiliary-loss-free)的负载均衡策略,并设定了多 token 预测训练目标以获得更强的性能。我们在 14.8 万亿个多样化且高质量的 token 上对 DeepSeek-V3 进行了预训练,随后通过监督微调(SFT)和强化学习(RL)阶段充分挖掘其能力。综合评估显示,DeepSeek-V3 的性能优于其他开源模型,并达到了与领先的闭源模型相当的水平。尽管性能卓越,DeepSeek-V3 的完整训练仅需 278.8 万 H800 GPU 小时。此外,其训练过程非常稳定。在整个训练过程中,我们没有遇到任何不可恢复的损失峰值,也未执行任何回滚。模型检查点可在 https://github.com/deepseek-ai/DeepSeek-V3 获取。

DeepSeek-V3 及其同类模型的基准性能。


目录

  1. 引言 (4)
  2. 架构 (6)
    • 2.1 基本架构 (6)
      • 2.1.1 多头潜在注意力 (7)
      • 2.1.2 带有无辅助损失负载均衡的 DeepSeekMoE (8)
    • 2.2 多 token 预测 (10)
  3. 基础设施 (11)
    • 3.1 计算集群 (11)
    • 3.2 训练框架 (12)
      • 3.2.1 DualPipe 与计算-通信重叠 (12)
      • 3.2.2 跨节点 All-to-All 通信的高效实现 (13)
      • 3.2.3 极小开销下的极致内存节省 (14)
    • 3.3 FP8 训练 (14)
      • 3.3.1 混合精度框架 (15)
      • 3.3.2 量化与乘法带来的精度提升 (16)
      • 3.3.3 低精度存储与通信 (18)
    • 3.4 推理与部署 (18)
      • 3.4.1 预填充 (19)
      • 3.4.2 解码 (19)
    • 3.5 硬件设计建议 (20)
      • 3.5.1 通信硬件 (20)
      • 3.5.2 计算硬件 (20)
  4. 预训练 (21)
    • 4.1 数据构建 (21)
    • 4.2 超参数 (22)
    • 4.3 长上下文扩展 (23)
    • 4.4 评估 (24)
      • 4.4.1 评估基准 (24)
      • 4.4.2 评估结果 (24)
    • 4.5 讨论 (26)
      • 4.5.1 多 token 预测的消融研究 (26)
      • 4.5.2 无辅助损失均衡策略的消融研究 (26)
    • 4.5.3 批次级负载均衡与序列级负载均衡 (27)
  5. 后训练 (28)
    • 5.1 监督微调 (28)
    • 5.2 强化学习 (29)
      • 5.2.1 奖励模型 (29)
      • 5.2.2 组相对策略优化 (30)
    • 5.3 评估 (30)
      • 5.3.1 评估设置 (30)
      • 5.3.2 标准评估 (31)
      • 5.3.3 开放式评估 (33)
      • 5.3.4 作为生成式奖励模型的 DeepSeek-V3 (33)
    • 5.4 讨论 (34)
      • 5.4.1 从 DeepSeek-R1 蒸馏 (34)
      • 5.4.2 自我奖励 (34)
      • 5.4.3 多 token 预测评估 (35)
  6. 结论、局限性与未来方向 (35) A. 贡献与致谢 (45) B. 低精度训练的消融研究 (47)
    • B.1 FP8 与 BF16 训练对比 (47)
    • B.2 关于块级量化的讨论 (47) C. 16B 基于辅助损失模型与无辅助损失模型的专家专业化模式 (48)

1. 引言

近年来,大型语言模型(LLMs)经历了快速的迭代和演进(Anthropic, 2024; Google, 2024; OpenAI, 2024a),逐步缩小了与通用人工智能(AGI)的差距。除了闭源模型外,开源模型系列,包括 DeepSeek 系列(DeepSeek-AI, 2024a,b,c; Guo et al., 2024)、LLaMA 系列(AI@Meta, 2024a,b; Touvron et al., 2023a,b)、Qwen 系列(Qwen, 2023, 2024a,b)和 Mistral 系列(Jiang et al., 2023; Mistral, 2024),也在取得重大进展,努力缩小与闭源同类产品的差距。为了进一步拓展开源模型能力的边界,我们扩大了模型规模,并推出了 DeepSeek-V3,这是一个拥有 671B 参数的大型混合专家(MoE)模型,其中每个 token 激活 37B 参数。

秉持前瞻性的视角,我们始终致力于追求强大的模型性能和经济的成本。因此,在架构方面,DeepSeek-V3 依然采用多头潜在注意力(MLA)(DeepSeek-AI, 2024c)以实现高效推理,并采用 DeepSeekMoE(Dai et al., 2024)以实现经济的训练。这两种架构已在 DeepSeek-V2(DeepSeek-AI, 2024c)中得到验证,证明了它们在实现高效训练和推理的同时,能够保持稳健的模型性能。在基础架构之外,我们实施了两种额外的策略来进一步增强模型能力。首先,DeepSeek-V3 开创了一种用于负载均衡的无辅助损失策略(Wang et al., 2024a),旨在最大限度地减少因鼓励负载均衡而对模型性能产生的不利影响。其次,DeepSeek-V3 采用了多 token 预测训练目标,我们观察到这增强了模型在评估基准上的整体性能。

为了实现高效训练,我们支持 FP8 混合精度训练,并为训练框架实施了全面的优化。低精度训练已成为高效训练的一种有前景的解决方案(Dettmers et al., 2022; Kalamkar et al., 2019; Narang et al., 2017; Peng et al., 2023b),其演进与硬件能力的进步紧密相关(Luo et al., 2024; Micikevicius et al., 2022; Rouhani et al., 2023a)。在这项工作中,我们引入了一个 FP8 混合精度训练框架,并首次在超大规模模型上验证了其有效性。通过对 FP8 计算和存储的支持,我们实现了训练加速和 GPU 内存占用的降低。在训练框架方面,我们设计了 DualPipe 算法以实现高效的流水线并行,该算法具有更少的流水线气泡,并通过计算-通信重叠在训练过程中隐藏了大部分通信。这种重叠确保了随着模型规模的进一步扩大,只要我们保持恒定的计算与通信比率,我们仍然可以跨节点使用细粒度专家,同时实现近乎零的 All-to-All 通信开销。此外,我们还开发了高效的跨节点 All-to-All 通信内核,以充分利用 InfiniBand(IB)和 NVLink 带宽。此外,我们精心优化了内存占用,使得在不使用昂贵的张量并行的情况下训练 DeepSeek-V3 成为可能。结合这些努力,我们实现了高训练效率。

在预训练期间,我们在 14.8T 高质量和多样化的 token 上训练了 DeepSeek-V3。预训练过程非常稳定。在整个训练过程中,我们没有遇到任何不可恢复的损失峰值,也不需要回滚。接下来,我们对 DeepSeek-V3 进行了两阶段的上下文长度扩展。在第一阶段,最大上下文长度扩展到 32K,在第二阶段,进一步扩展到 128K。随后,我们在 DeepSeek-V3 的基础模型上进行了后训练,包括监督微调(SFT)和强化学习(RL),以使其与人类偏好对齐并进一步释放其潜力。在后训练阶段,我们从 DeepSeek-R1 系列模型中蒸馏了推理能力,同时仔细保持了模型准确性和生成长度之间的平衡。

训练成本预训练上下文扩展后训练总计
H800 GPU 小时2664K119K5K2788K
美元 (USD)$5.328M$0.238M$0.01M$5.576M

表 1 | DeepSeek-V3 的训练成本,假设 H800 的租赁价格为每 GPU 小时 2 美元。

我们在一系列全面的基准测试中评估了 DeepSeek-V3。尽管训练成本经济,但综合评估显示,DeepSeek-V3-Base 已成为目前最强大的开源基础模型,特别是在代码和数学方面。其聊天版本也优于其他开源模型,并在一系列标准和开放式基准测试中达到了与领先的闭源模型(包括 GPT-4o 和 Claude-3.5-Sonnet)相当的性能。

最后,我们再次强调 DeepSeek-V3 的经济训练成本(总结于表 1),这是通过我们优化的算法、框架和硬件的协同设计实现的。在预训练阶段,在每万亿个 token 上训练 DeepSeek-V3 仅需 180K H800 GPU 小时,即在我们拥有 2048 个 H800 GPU 的集群上仅需 3.7 天。因此,我们的预训练阶段在不到两个月内完成,成本为 2664K GPU 小时。加上上下文长度扩展所需的 119K GPU 小时和后训练所需的 5K GPU 小时,DeepSeek-V3 的完整训练仅需 278.8 万 GPU 小时。假设 H800 GPU 的租赁价格为每 GPU 小时 2 美元,我们的总训练成本仅为 557.6 万美元。请注意,上述成本仅包括 DeepSeek-V3 的正式训练,不包括与架构、算法或数据的先前研究和消融实验相关的成本。

我们的主要贡献包括:

架构:创新的负载均衡策略和训练目标

  • 在 DeepSeek-V2 高效架构的基础上,我们开创了一种无辅助损失的负载均衡策略,最大限度地减少了因鼓励负载均衡而产生的性能下降。
  • 我们研究了多 token 预测(MTP)目标,并证明其对模型性能有益。它还可以用于推测解码以加速推理。

预训练:迈向极致的训练效率

  • 我们设计了一个 FP8 混合精度训练框架,并首次验证了 FP8 训练在超大规模模型上的可行性和有效性。
  • 通过算法、框架和硬件的协同设计,我们克服了跨节点 MoE 训练中的通信瓶颈,实现了近乎完全的计算-通信重叠。这显著提高了我们的训练效率并降低了训练成本,使我们能够在不增加额外开销的情况下进一步扩大模型规模。
  • 以仅 266.4 万 H800 GPU 小时的经济成本,我们在 14.8T token 上完成了 DeepSeek-V3 的预训练,产生了目前最强大的开源基础模型。预训练后的后续训练阶段仅需 0.1 万 GPU 小时。

后训练:从 DeepSeek-R1 进行知识蒸馏

  • 我们引入了一种创新的方法,将长思维链(CoT)模型的推理能力(具体来自 DeepSeek R1 系列模型之一)蒸馏到标准 LLM(特别是 DeepSeek-V3)中。我们的流水线优雅地将 R1 的验证和反思模式融入到 DeepSeek-V3 中,并显著提高了其推理性能。同时,我们也保持了对 DeepSeek-V3 输出风格和长度的控制。

核心评估结果总结

  • 知识:(1) 在 MMLU、MMLU-Pro 和 GPQA 等教育基准测试中,DeepSeek-V3 优于所有其他开源模型,在 MMLU 上达到 88.5,在 MMLU-Pro 上达到 75.9,在 GPQA 上达到 59.1。其性能与 GPT-4o 和 Claude-Sonnet-3.5 等领先的闭源模型相当,缩小了该领域开源与闭源模型之间的差距。(2) 对于事实性基准测试,DeepSeek-V3 在 SimpleQA 和中文 SimpleQA 上均表现出优于其他开源模型的性能。虽然在英语事实知识(SimpleQA)方面落后于 GPT-4o 和 Claude-Sonnet-3.5,但在中文事实知识(中文 SimpleQA)方面超过了这些模型,突显了其在中文事实知识方面的优势。
  • 代码、数学和推理:(1) DeepSeek-V3 在所有非长 CoT 开源和闭源模型中,在数学相关基准测试上实现了最先进的性能。值得注意的是,它在特定基准测试(如 MATH-500)上甚至优于 o1-preview,展示了其强大的数学推理能力。(2) 在编码相关任务上,DeepSeek-V3 成为编码竞赛基准测试(如 LiveCodeBench)中表现最好的模型,巩固了其在该领域的领先地位。对于工程相关任务,虽然 DeepSeek-V3 的表现略低于 Claude-Sonnet-3.5,但它仍然以显著优势领先于所有其他模型,展示了其在各种技术基准测试中的竞争力。

在本文的其余部分,我们首先详细阐述了我们的 DeepSeek-V3 模型架构(第 2 节)。随后,我们介绍了我们的基础设施,包括计算集群、训练框架、FP8 训练支持、推理部署策略以及我们对未来硬件设计的建议。接下来,我们描述了我们的预训练过程,包括训练数据的构建、超参数设置、长上下文扩展技术、相关评估以及一些讨论(第 4 节)。此后,我们讨论了我们在后训练方面的努力,包括监督微调(SFT)、强化学习(RL)、相应的评估和讨论(第 5 节)。最后,我们总结了这项工作,讨论了 DeepSeek-V3 的现有局限性,并提出了未来研究的潜在方向(第 6 节)。


2. 架构

我们首先介绍 DeepSeek-V3 的基本架构,其特点是用于高效推理的多头潜在注意力(MLA)(DeepSeek-AI, 2024c)和用于经济训练的 DeepSeekMoE(Dai et al., 2024)。然后,我们提出了一个多 token 预测(MTP)训练目标,我们观察到该目标增强了模型在评估基准上的整体性能。对于未明确提及的其他次要细节,DeepSeek-V3 遵循 DeepSeek-V2(DeepSeek-AI, 2024c)的设置。

2.1. 基本架构

DeepSeek-V3 的基本架构仍然在 Transformer(Vaswani et al., 2017)框架内。为了高效推理和经济训练,DeepSeek-V3 也采用了 MLA 和 DeepSeekMoE,这些已在 DeepSeek-V2 中得到充分验证。与 DeepSeek-V2 相比,一个例外是我们额外引入了一种无辅助损失的负载均衡策略(Wang et al., 2024a),用于 DeepSeekMoE,以减轻因确保负载均衡而导致的性能下降。图 2 说明了 DeepSeek-V3 的基本架构,我们将在本节中简要回顾 MLA 和 DeepSeekMoE 的细节。

图 2 | DeepSeek-V3 基本架构示意图。继 DeepSeek-V2 之后,我们采用 MLA 和 DeepSeekMoE 以实现高效推理和经济训练。

2.1.1. 多头潜在注意力

对于注意力机制,DeepSeek-V3 采用 MLA 架构。令 dd 表示嵌入维度,nhn_h 表示注意力头数,dhd_h 表示每个头的维度,htRd\mathbf{h}_t \in \mathbb{R}^d 表示给定注意力层中第 tt 个 token 的注意力输入。MLA 的核心是注意力键和值的低秩联合压缩,以减少推理过程中的键值(KV)缓存:

\mathbf{c}_t^{KV} = \mathbf{W}^{DKV}\mathbf{h}_t, \tag{1} [\mathbf{k}_{t,1}^C; \mathbf{k}_{t,2}^C; ...; \mathbf{k}_{t,n_h}^C] = \mathbf{k}_t^C = \mathbf{W}^{UK}\mathbf{c}_t^{KV}, \tag{2} \mathbf{k}_t^R = \text{RoPE}(\mathbf{W}^{KR}\mathbf{h}_t), \tag{3} \mathbf{k}_{t,i} = [\mathbf{k}_{t,i}^C; \mathbf{k}_t^R], \tag{4} [\mathbf{v}_{t,1}^C; \mathbf{v}_{t,2}^C; ...; \mathbf{v}_{t,n_h}^C] = \mathbf{v}_t^C = \mathbf{W}^{UV}\mathbf{c}_t^{KV}, \tag{5}

其中 ctKVRdc\mathbf{c}_t^{KV} \in \mathbb{R}^{d_c} 是键和值的压缩潜在向量;dc(nhdh)d_c (\ll n_h d_h) 表示 KV 压缩维度;WDKVRdc×d\mathbf{W}^{DKV} \in \mathbb{R}^{d_c \times d} 表示下投影矩阵;WUK,WUVRnhdh×dc\mathbf{W}^{UK}, \mathbf{W}^{UV} \in \mathbb{R}^{n_h d_h \times d_c} 分别是键和值的上投影矩阵;WKRRdh×d\mathbf{W}^{KR} \in \mathbb{R}^{d_h \times d} 是用于产生携带旋转位置嵌入(RoPE)(Su et al., 2024)的解耦键的矩阵;RoPE()\text{RoPE}(\cdot) 表示应用 RoPE 矩阵的操作;[;][\cdot; \cdot] 表示拼接。请注意,对于 MLA,在生成过程中仅需缓存蓝色框中的向量(即 ctKV\mathbf{c}_t^{KV}ktR\mathbf{k}_t^R),这显著减少了 KV 缓存,同时保持了与标准多头注意力(MHA)(Vaswani et al., 2017)相当的性能。

对于注意力查询,我们也执行低秩压缩,这可以减少训练期间的激活内存:

\mathbf{c}_t^Q = \mathbf{W}^{DQ}\mathbf{h}_t, \tag{6} [\mathbf{q}_{t,1}^C; \mathbf{q}_{t,2}^C; ...; \mathbf{q}_{t,n_h}^C] = \mathbf{q}_t^C = \mathbf{W}^{UQ}\mathbf{c}_t^Q, \tag{7} [\mathbf{q}_{t,1}^R; \mathbf{q}_{t,2}^R; ...; \mathbf{q}_{t,n_h}^R] = \mathbf{q}_t^R = \text{RoPE}(\mathbf{W}^{QR}\mathbf{c}_t^Q), \tag{8} \mathbf{q}_{t,i} = [\mathbf{q}_{t,i}^C; \mathbf{q}_{t,i}^R], \tag{9}

其中 ctQRdc\mathbf{c}_t^Q \in \mathbb{R}^{d_c'} 是查询的压缩潜在向量;dc(nhdh)d_c' (\ll n_h d_h) 表示查询压缩维度;WDQRdc×d,WUQRnhdh×dc\mathbf{W}^{DQ} \in \mathbb{R}^{d_c' \times d}, \mathbf{W}^{UQ} \in \mathbb{R}^{n_h d_h \times d_c'} 分别是查询的下投影和上投影矩阵;WQRRnhdh×dc\mathbf{W}^{QR} \in \mathbb{R}^{n_h d_h \times d_c'} 是用于产生携带 RoPE 的解耦查询的矩阵。

最终,注意力查询(qt,i\mathbf{q}_{t,i})、键(kt,i\mathbf{k}_{t,i})和值(vt,iC\mathbf{v}_{t,i}^C)被组合以产生最终的注意力输出 ut\mathbf{u}_t

\mathbf{o}_{t,i} = \sum_{j=1}^t \text{Softmax}_j \left( \frac{\mathbf{q}_{t,i}^T \mathbf{k}_{j,i}}{\sqrt{d_h + d_h^R}} \right) \mathbf{v}_{j,i}^C, \tag{10} \mathbf{u}_t = \mathbf{W}^O [\mathbf{o}_{t,1}; \mathbf{o}_{t,2}; ...; \mathbf{o}_{t,n_h}], \tag{11}

其中 WORd×nhdh\mathbf{W}^O \in \mathbb{R}^{d \times n_h d_h} 表示输出投影矩阵。

2.1.2. 带有无辅助损失负载均衡的 DeepSeekMoE

DeepSeekMoE 的基本架构。对于前馈网络(FFN),DeepSeek-V3 采用 DeepSeekMoE 架构(Dai et al., 2024)。与 GShard(Lepikhin et al., 2021)等传统 MoE 架构相比,DeepSeekMoE 使用更细粒度的专家,并将部分专家隔离为共享专家。令 ut\mathbf{u}_t 表示第 tt 个 token 的 FFN 输入,我们计算 FFN 输出 ht\mathbf{h}_t' 如下:

\mathbf{h}_t' = \mathbf{u}_t + \sum_{i=1}^{N_s} \text{FFN}_i^{(s)}(\mathbf{u}_t) + \sum_{i=1}^{N_r} g_{i,t} \text{FFN}_i^{(r)}(\mathbf{u}_t), \tag{12} g_{i,t} = \frac{s_{i,t}}{\sum_{j=1}^{N_r} s_{j,t}'}, \tag{13} s_{i,t}' = \begin{cases} s_{i,t}, & s_{i,t} \in \text{Topk}(\{s_{j,t} | 1 \leqslant j \leqslant N_r\}, K_r), \\ 0, & \text{otherwise}, \end{cases} \tag{14} s_{i,t} = \text{Sigmoid}(\mathbf{u}_t^T \mathbf{e}_i), \tag{15}

其中 NsN_sNrN_r 分别表示共享专家和路由专家的数量;FFNi(s)()\text{FFN}_i^{(s)}(\cdot)FFNi(r)()\text{FFN}_i^{(r)}(\cdot) 分别表示第 ii 个共享专家和第 ii 个路由专家;KrK_r 表示激活的路由专家数量;gi,tg_{i,t} 是第 ii 个专家的门控值;si,ts_{i,t} 是 token 到专家的亲和度;ei\mathbf{e}_i 是第 ii 个路由专家的质心向量;Topk(,Kr)\text{Topk}(\cdot, K_r) 表示包含为第 tt 个 token 和所有路由专家计算出的亲和度中最高 KrK_r 个分数的集合。与 DeepSeek-V2 略有不同,DeepSeek-V3 使用 Sigmoid 函数计算亲和度分数,并在所有选定的亲和度分数之间应用归一化以产生门控值。

无辅助损失负载均衡。对于 MoE 模型,不平衡的专家负载会导致路由崩溃(Shazeer et al., 2017),并在专家并行场景中降低计算效率。传统的解决方案通常依赖辅助损失(Fedus et al., 2021; Lepikhin et al., 2021)来避免负载不平衡。然而,过大的辅助损失会损害模型性能(Wang et al., 2024a)。为了在负载均衡和模型性能之间取得更好的权衡,我们开创了一种无辅助损失的负载均衡策略(Wang et al., 2024a)来确保负载均衡。具体而言,我们为每个专家引入一个偏置项 bib_i,并将其添加到相应的亲和度分数 si,ts_{i,t} 中以确定 Top-K 路由:

s_{i,t}' = \begin{cases} s_{i,t}, & s_{i,t} + b_i \in \text{Topk}(\{s_{j,t} + b_j | 1 \leqslant j \leqslant N_r\}, K_r), \\ 0, & \text{otherwise}. \end{cases} \tag{16}

请注意,偏置项仅用于路由。将与 FFN 输出相乘的门控值仍然源自原始亲和度分数 si,ts_{i,t}。在训练期间,我们持续监控每个训练步骤中整个批次的专家负载。在每个步骤结束时,如果相应的专家过载,我们将减少其偏置项 bib_i;如果相应的专家负载不足,则增加它,其中 γ\gamma 是一个称为偏置更新速度的超参数。通过动态调整,DeepSeek-V3 在训练期间保持了平衡的专家负载,并实现了比通过纯辅助损失鼓励负载均衡的模型更好的性能。

互补的序列级辅助损失。尽管 DeepSeek-V3 主要依赖无辅助损失策略进行负载均衡,但为了防止任何单个序列内的极端不平衡,我们还采用了互补的序列级平衡损失:

\mathcal{L}_{Bal} = \alpha \sum_{i=1}^{N_r} f_i P_i, \tag{17} f_i = \frac{N_r}{K_r T} \sum_{t=1}^T \mathbb{1}(s_{i,t} \in \text{Topk}(\{s_{j,t} | 1 \leqslant j \leqslant N_r\}, K_r)), \tag{18} s_{i,t}' = \frac{s_{i,t}}{\sum_{j=1}^{N_r} s_{j,t}}, \tag{19} P_i = \frac{1}{T} \sum_{t=1}^T s_{i,t}', \tag{20}

其中平衡因子 α\alpha 是一个超参数,对于 DeepSeek-V3,它被赋予一个极小的值;1()\mathbb{1}(\cdot) 表示指示函数;TT 表示序列中的 token 数量。序列级平衡损失鼓励每个序列上的专家负载保持平衡。


图 3 | 我们的多 token 预测(MTP)实现示意图。我们保持了每个深度处每个 token 预测的完整因果链。

节点受限路由。与 DeepSeek-V2 使用的设备受限路由类似,DeepSeek-V3 也使用受限路由机制来限制训练期间的通信成本。简而言之,我们确保每个 token 最多被发送到 MM 个节点,这些节点是根据分布在每个节点上的专家的最高 Kr/MK_r/M 亲和度分数之和来选择的。在此约束下,我们的 MoE 训练框架几乎可以实现完全的计算-通信重叠。

无 Token 丢弃。由于有效的负载均衡策略,DeepSeek-V3 在其完整训练期间保持了良好的负载均衡。因此,DeepSeek-V3 在训练期间不会丢弃任何 token。此外,我们还实施了特定的部署策略以确保推理负载均衡,因此 DeepSeek-V3 在推理期间也不会丢弃 token。

2.2. 多 token 预测

受 Gloeckle et al. (2024) 的启发,我们研究并为 DeepSeek-V3 设定了多 token 预测(MTP)目标,该目标将预测范围扩展到每个位置的多个未来 token。一方面,MTP 目标使训练信号密集化,并可能提高数据效率。另一方面,MTP 可能使模型能够预先规划其表示,从而更好地预测未来 token。图 3 说明了我们的 MTP 实现。与 Gloeckle et al. (2024) 不同(后者使用独立的输出头并行预测 DD 个额外 token),我们顺序预测额外 token,并在每个预测深度保持完整的因果链。我们将在本节中介绍我们 MTP 实现的细节。

MTP 模块。具体而言,我们的 MTP 实现使用 DD 个顺序模块来预测 DD 个额外 token。第 kk 个 MTP 模块由一个共享嵌入层 Emb()\text{Emb}(\cdot)、一个共享输出头 OutHead()\text{OutHead}(\cdot)、一个 Transformer 块 TRMk()\text{TRM}_k(\cdot) 和一个投影矩阵 MkRd×2d\mathbf{M}_k \in \mathbb{R}^{d \times 2d} 组成。对于第 ii 个输入 token tit_i,在第 kk 个预测深度,我们首先将第 ii 个 token 在 (k1)(k-1) 深度处的表示 hik1Rd\mathbf{h}_{i}^{k-1} \in \mathbb{R}^d 与第 (i+k)(i+k) 个 token 的嵌入 Emb(ti+k)Rd\text{Emb}(t_{i+k}) \in \mathbb{R}^d 结合,并进行线性投影:

\mathbf{h}_i'^k = \mathbf{M}_k [\text{RMSNorm}(\mathbf{h}_i^{k-1}); \text{RMSNorm}(\text{Emb}(t_{i+k}))], \tag{21}

其中 [;][\cdot; \cdot] 表示拼接。特别是,当 k=1k=1 时,hik1\mathbf{h}_i^{k-1} 指的是主模型给出的表示。请注意,对于每个 MTP 模块,其嵌入层与主模型共享。组合后的 hik\mathbf{h}_i'^k 作为第 kk 深度 Transformer 块的输入,以产生当前深度 kk 的输出表示 hik\mathbf{h}_i^k

\mathbf{h}_{1:T-k}^k = \text{TRM}_k(\mathbf{h}_{1:T-k}'^k), \tag{22}

其中 TT 表示输入序列长度,1:Tk1:T-k 表示切片操作(包含左右边界)。最后,以 hik\mathbf{h}_i^k 作为输入,共享输出头将计算第 kk 个额外预测 token Pi+kkRVP_{i+k}^k \in \mathbb{R}^V 的概率分布,其中 VV 是词汇表大小:

P_{i+k+1}^k = \text{OutHead}(\mathbf{h}_i^k). \tag{23}

输出头 OutHead()\text{OutHead}(\cdot) 将表示线性映射到 logits,随后应用 Softmax()\text{Softmax}(\cdot) 函数来计算第 kk 个额外 token 的预测概率。此外,对于每个 MTP 模块,其输出头与主模型共享。我们保持预测因果链的原则类似于 EAGLE(Li et al., 2024b),但其主要目标是推测解码(Leviathan et al., 2023; Xia et al., 2023),而我们利用 MTP 来改进训练。

MTP 训练目标。对于每个预测深度,我们计算交叉熵损失 LMTPk\mathcal{L}_{\text{MTP}}^k

\mathcal{L}_{\text{MTP}}^k = \text{CrossEntropy}(P_{2+k:T+1}^k, t_{2+k:T+1}) = -\frac{1}{T} \sum_{i=2+k}^{T+1} \log P_i^k[t_i], \tag{24}

其中 TT 表示输入序列长度,tit_i 表示第 ii 个位置的真实 token,Pik[ti]P_i^k[t_i] 表示第 kk 个 MTP 模块给出的 tit_i 的相应预测概率。最后,我们计算所有深度上 MTP 损失的平均值,并将其乘以加权因子 λ\lambda 以获得整体 MTP 损失 LMTP\mathcal{L}_{\text{MTP}},这作为 DeepSeek-V3 的额外训练目标:

\mathcal{L}_{\text{MTP}} = \frac{\lambda}{D} \sum_{k=1}^D \mathcal{L}_{\text{MTP}}^k. \tag{25}

推理中的 MTP。我们的 MTP 策略主要旨在提高主模型的性能,因此在推理过程中,我们可以直接丢弃 MTP 模块,主模型可以独立且正常地运行。此外,我们还可以将这些 MTP 模块重新用于推测解码,以进一步改善生成延迟。


3. 基础设施

3.1. 计算集群

DeepSeek-V3 在配备 2048 个 NVIDIA H800 GPU 的集群上进行训练。H800 集群中的每个节点包含 8 个通过节点内 NVLink 和 NVSwitch 连接的 GPU。跨不同节点,利用 InfiniBand(IB)互连来促进通信。


图 4 | 一对单独的前向和后向块的重叠策略(Transformer 块的边界未对齐)。橙色表示前向,绿色表示“输入的后向”,蓝色表示“权重的后向”,紫色表示 PP 通信,红色表示屏障。All-to-All 和 PP 通信都可以被完全隐藏。

3.2. 训练框架

DeepSeek-V3 的训练由 HAI-LLM 框架支持,这是一个由我们的工程师从零开始构建的高效且轻量级的训练框架。总体而言,DeepSeek-V3 应用了 16 路流水线并行(PP)(Qi et al., 2023a)、跨越 8 个节点的 64 路专家并行(EP)(Lepikhin et al., 2021)以及 ZeRO-1 数据并行(DP)(Rajbhandari et al., 2020)。

为了促进 DeepSeek-V3 的高效训练,我们实施了细致的工程优化。首先,我们设计了用于高效流水线并行的 DualPipe 算法。与现有的 PP 方法相比,DualPipe 具有更少的流水线气泡。更重要的是,它在正向和反向过程中重叠了计算和通信阶段,从而解决了跨节点专家并行带来的沉重通信开销挑战。其次,我们开发了高效的跨节点 All-to-All 通信内核,以充分利用 IB 和 NVLink 带宽,并节省专用于通信的流式多处理器(SM)。最后,我们精心优化了训练期间的内存占用,从而使我们能够在不使用昂贵的张量并行(TP)的情况下训练 DeepSeek-V3。

3.2.1. DualPipe 与计算-通信重叠

对于 DeepSeek-V3,跨节点专家并行带来的通信开销导致计算与通信比率约为 1:1,效率低下。为了应对这一挑战,我们设计了一种名为 DualPipe 的创新流水线并行算法,它不仅通过有效地重叠前向和后向计算-通信阶段来加速模型训练,还减少了流水线气泡。

DualPipe 的核心思想是在一对单独的前向和后向块内重叠计算和通信。具体而言,我们将每个块分为四个组件:注意力、All-to-All 分发(dispatch)、MLP 和 All-to-All 合并(combine)。特别地,对于后向块,注意力和 MLP 都被进一步拆分为两部分,即“输入的后向”和“权重的后向”,类似于 ZeroBubble(Qi et al., 2023b)。此外,我们还有一个 PP 通信组件。如图 4 所示,对于一对前向和后向块,我们重新排列这些组件,并手动调整专用于通信与计算的 GPU SM 比例。在这种重叠策略中,我们可以确保在执行期间 All-to-All 和 PP 通信都能被完全隐藏。鉴于这种高效的重叠策略,完整的 DualPipe 调度如图 5 所示。它采用双向流水线调度,同时从流水线的两端输入微批次(micro-batch),大部分通信可以被完全重叠。这种重叠还确保了随着模型规模的进一步扩大,只要我们保持恒定的计算与通信比率,我们仍然可以跨节点使用细粒度专家,同时实现近乎零的 All-to-All 通信开销。

图 5 | 8 个 PP 秩和 20 个微批次在两个方向上的 DualPipe 调度示例。反向的微批次与前向的微批次对称,因此为了简化说明,我们省略了它们的批次 ID。被黑色边框包围的两个单元格具有相互重叠的计算和通信。

方法气泡参数激活
1F1B(PP1)(F+B)(PP-1)(F+B)1×1\timesPPPP
ZB1P(PP1)(F+B2W)(PP-1)(F+B-2W)1×1\timesPPPP
DualPipe (本文)(PP21)(F&B+B3W)(\frac{PP}{2}-1)(F\&B+B-3W)2×2\timesPP+1PP+1

表 2 | 不同流水线并行方法的气泡和内存使用对比。FF 表示前向块的执行时间,BB 表示完整后向块的执行时间,WW 表示“权重的后向”块的执行时间,F&BF\&B 表示两个相互重叠的前向和后向块的执行时间。

此外,即使在没有沉重通信负担的更一般场景中,DualPipe 仍然表现出效率优势。在表 2 中,我们总结了不同 PP 方法的气泡和内存使用情况。如表所示,与 ZB1P(Qi et al., 2023b)和 1F1B(Harlap et al., 2018)相比,DualPipe 显著减少了流水线气泡,同时仅将峰值激活内存增加了 1/PP1/PP 倍。虽然 DualPipe 需要保留两份模型参数,但这并不会显著增加内存消耗,因为我们在训练期间使用了较大的 EP 大小。与 Chimera(Li and Hoefler, 2021)相比,DualPipe 仅要求流水线阶段和微批次能被 2 整除,而不需要微批次能被流水线阶段整除。此外,对于 DualPipe,气泡和激活内存都不会随着微批次数量的增加而增加。

3.2.2. 跨节点 All-to-All 通信的高效实现

为了确保 DualPipe 具有足够的计算性能,我们定制了高效的跨节点 All-to-All 通信内核(包括分发和合并),以节省专用于通信的 SM 数量。内核的实现与 MoE 门控算法和我们集群的网络拓扑协同设计。具体而言,在我们的集群中,跨节点 GPU 通过 IB 完全互连,节点内通信通过 NVLink 处理。NVLink 提供 160 GB/s 的带宽,约为 IB(50 GB/s)的 3.2 倍。为了有效利用 IB 和 NVLink 的不同带宽,我们将每个 token 分发到的节点限制为最多 4 个,从而减少 IB 流量。对于每个 token,当做出路由决策时,它将首先通过 IB 传输到其目标节点上具有相同节点内索引的 GPU。一旦到达目标节点,我们将努力确保它通过 NVLink 瞬时转发到托管其目标专家的特定 GPU,而不会被随后到达的 token 阻塞。通过这种方式,通过 IB 和 NVLink 的通信被完全重叠,并且每个 token 可以有效地选择平均每个节点 3.2 个专家,而不会产生来自 NVLink 的额外开销。这意味着,尽管 DeepSeek-V3 在实践中仅选择 8 个路由专家,但它可以将此数量扩展到最多 13 个专家(4 个节点 ×\times 3.2 个专家/节点),同时保持相同的通信成本。总体而言,在这种通信策略下,仅 20 个 SM 就足以充分利用 IB 和 NVLink 的带宽。

详细来说,我们采用了 warp 专门化技术(Bauer et al., 2014),并将 20 个 SM 分为 10 个通信通道。在分发过程中,(1) IB 发送,(2) IB 到 NVLink 转发,以及 (3) NVLink 接收由各自的 warp 处理。分配给每个通信任务的 warp 数量根据所有 SM 上的实际工作负载动态调整。同样,在合并过程中,(1) NVLink 发送,(2) NVLink 到 IB 转发和累加,以及 (3) IB 接收和累加也由动态调整的 warp 处理。此外,分发和合并内核都与计算流重叠,因此我们也考虑了它们对其他 SM 计算内核的影响。具体而言,我们采用了定制的 PTX(并行线程执行)指令并自动调整通信块大小,这显著减少了 L2 缓存的使用以及对其他 SM 的干扰。

3.2.3. 极小开销下的极致内存节省

为了减少训练期间的内存占用,我们采用了以下技术。

RMSNorm 和 MLA 上投影的重计算。我们在反向传播期间重计算所有 RMSNorm 操作和 MLA 上投影,从而消除了持久存储其输出激活的需要。通过微小的开销,该策略显著降低了存储激活的内存需求。

CPU 中的指数移动平均(EMA)。在训练期间,我们保留模型参数的指数移动平均(EMA),以便在学习率衰减后早期估计模型性能。EMA 参数存储在 CPU 内存中,并在每个训练步骤后异步更新。该方法允许我们维护 EMA 参数,而不会产生额外的内存或时间开销。

多 token 预测的共享嵌入和输出头。利用 DualPipe 策略,我们将模型最浅层(包括嵌入层)和最深层(包括输出头)部署在相同的 PP 秩上。这种安排实现了 MTP 模块和主模型之间共享嵌入和输出头的参数和梯度的物理共享。这种物理共享机制进一步增强了我们的内存效率。

3.3. FP8 训练

受低精度训练最新进展(Dettmers et al., 2022; Noune et al., 2022; Peng et al., 2023b)的启发,我们提出了一种利用 FP8 数据格式训练 DeepSeek-V3 的细粒度混合精度框架。虽然低精度训练前景广阔,但它通常受到激活、权重和梯度中异常值(outliers)存在的限制(Fishman et al., 2024; He et al.; Sun et al., 2024)。尽管在推理量化方面取得了重大进展(Frantar et al., 2022; Xiao et al., 2023),但证明低精度技术在超大规模语言模型预训练中成功应用的案例相对较少(Fishman et al., 2024)。为了应对这一挑战并有效扩展 FP8 格式的动态范围,我们引入了一种细粒度量化策略:具有 1×Nc1 \times N_c 元素的平铺分组(tile-wise grouping)或具有 Nc×NcN_c \times N_c 元素的块级分组(block-wise grouping)。相关的反量化开销在我们增加精度的累加过程中得到了很大程度的缓解,这是实现精确 FP8 通用矩阵乘法(GEMM)的关键方面。此外,为了进一步减少 MoE 训练中的内存和通信开销,我们以 FP8 格式缓存和分发激活,同时以 BF16 格式存储低精度优化器状态。我们在两个类似于 DeepSeek-V2-Lite 和 DeepSeek-V2 的模型规模上验证了所提出的 FP8 混合精度框架,训练了大约 1 万亿个 token(详见附录 B.1)。值得注意的是,与 BF16 基线相比,我们 FP8 训练模型的相对损失误差始终保持在 0.25% 以下,处于训练随机性的可接受范围内。

图 6 | 带有 FP8 数据格式的整体混合精度框架。为清晰起见,仅说明了线性算子。

3.3.1. 混合精度框架

基于低精度训练中广泛采用的技术(Kalamkar et al., 2019; Narang et al., 2017),我们提出了一种用于 FP8 训练的混合精度框架。在该框架中,大多数计算密集型操作在 FP8 中进行,而少数关键操作则策略性地保持在其原始数据格式中,以平衡训练效率和数值稳定性。整体框架如图 6 所示。

首先,为了加速模型训练,大多数核心计算内核(即 GEMM 操作)以 FP8 精度实现。这些 GEMM 操作接受 FP8 张量作为输入,并产生 BF16 或 FP32 的输出。如图 6 所示,与线性算子相关的所有三个 GEMM,即 Fprop(前向传递)、Dgrad(激活反向传递)和 Wgrad(权重反向传递),均在 FP8 中执行。该设计在理论上比原始 BF16 方法的计算速度提高了一倍。此外,FP8 Wgrad GEMM 允许将激活存储在 FP8 中,以供反向传递使用。这显著降低了内存消耗。

尽管 FP8 格式具有效率优势,但某些算子由于对低精度计算的敏感性,仍然需要更高的精度。此外,一些低成本算子也可以利用更高的精度,而对整体训练成本的影响微乎其微。因此,经过仔细研究,我们为以下组件保持了原始精度(例如 BF16 或 FP32):嵌入模块、输出头、MoE 门控模块、归一化算子和注意力算子。这些针对性的高精度保留确保了 DeepSeek-V3 稳定的训练动态。为了进一步保证数值稳定性,我们将主权重、权重梯度和优化器状态存储在更高的精度中。虽然这些高精度组件会产生一些内存开销,但通过我们分布式训练系统中跨多个 DP 秩的高效分片,其影响可以最小化。

3.3.2. 量化与乘法带来的精度提升

基于我们的混合精度 FP8 框架,我们引入了几种策略来提高低精度训练精度,重点关注量化方法和乘法过程。

细粒度量化。在低精度训练框架中,由于 FP8 格式的动态范围有限(受其减少的指数位限制),溢出和下溢是常见的挑战。作为一种标准做法,输入分布通过将输入张量的最大绝对值缩放到 FP8 的最大可表示值来与 FP8 格式的可表示范围对齐(Narang et al., 2017)。这种方法使得低精度训练对激活异常值高度敏感,这会严重降低量化精度。为了解决这个问题,我们提出了一种细粒度量化方法,该方法在更细的粒度上应用缩放。如图 7 (a) 所示,(1) 对于激活,我们在 1×1281 \times 128 平铺基础上(即每个 token 每个 128 通道)对元素进行分组和缩放;(2) 对于权重,我们在 128×128128 \times 128 块基础上(即每个 128 输入通道每个 128 输出通道)对元素进行分组和缩放。这种方法确保了量化过程可以通过根据较小的元素组调整缩放比例来更好地适应异常值。在附录 B.2 中,我们进一步讨论了当我们以与权重量化相同的方式在块基础上对激活进行分组和缩放时的训练不稳定性。

我们方法的一个关键修改是在 GEMM 操作的内部维度上引入每组缩放因子。此功能在标准 FP8 GEMM 中不受直接支持。然而,结合我们精确的 FP32 累加策略,它可以被高效地实现。

图 7 | (a) 我们提出了一种细粒度量化方法来减轻由特征异常值引起的量化误差;为说明简单,仅说明了 Fprop。(b) 结合我们的量化策略,我们通过在 N_c = 128 元素 MMA 的间隔处提升到 CUDA 核心进行高精度累加,从而提高了 FP8 GEMM 精度。

值得注意的是,我们的细粒度量化策略与微缩放格式(microscaling formats)的思想高度一致(Rouhani et al., 2023b),而 NVIDIA 下一代 GPU(Blackwell 系列)的 Tensor Core 已宣布支持具有更小量化粒度的微缩放格式(NVIDIA, 2024a)。我们希望我们的设计能为未来的工作提供参考,以跟上最新的 GPU 架构。

提高累加精度。低精度 GEMM 操作通常会遭受下溢问题,其精度很大程度上取决于高精度累加,这通常在 FP32 精度中执行(Kalamkar et al., 2019; Narang et al., 2017)。然而,我们观察到 NVIDIA H800 GPU 上 FP8 GEMM 的累加精度仅限于保留约 14 位,这显著低于 FP32 累加精度。当内部维度 KK 较大时,这个问题会变得更加明显(Wortsman et al., 2023),这是大型模型训练中的典型场景,其中批次大小和模型宽度都会增加。以 K=4096K=4096 的两个随机矩阵的 GEMM 操作为例,在我们的初步测试中,Tensor Core 中有限的累加精度导致了近 2% 的最大相对误差。尽管存在这些问题,有限的累加精度仍然是少数 FP8 框架中的默认选项(NVIDIA, 2024b),严重限制了训练精度。

为了解决这个问题,我们采用了提升到 CUDA 核心以获得更高精度的策略(Thakkar et al., 2023)。该过程如图 7 (b) 所示。具体而言,在 Tensor Core 上执行 MMA(矩阵乘加)期间,中间结果使用有限的位宽进行累加。一旦达到 NcN_c 的间隔,这些部分结果将被复制到 CUDA 核心上的 FP32 寄存器中,在那里执行全精度 FP32 累加。如前所述,我们的细粒度量化在内部维度 KK 上应用每组缩放因子。这些缩放因子可以作为反量化过程在 CUDA 核心上高效地乘法,且具有极小的额外计算成本。

值得注意的是,此修改降低了单个 warp 组的 WGMMA(warp 组级矩阵乘加)指令发布率。然而,在 H800 架构上,两个 WGMMA 同时持续存在是典型的:当一个 warp 组执行提升操作时,另一个能够执行 MMA 操作。这种设计实现了两个操作的重叠,保持了 Tensor Core 的高利用率。根据我们的实验,设置 Nc=128N_c = 128 元素(相当于 4 个 WGMMA)代表了可以在不引入实质性开销的情况下显著提高精度的最小累加间隔。

尾数优于指数。与先前工作(NVIDIA, 2024b; Peng et al., 2023b; Sun et al., 2019b)采用的混合 FP8 格式(在 Fprop 中使用 E4M3(4 位指数和 3 位尾数),在 Dgrad 和 Wgrad 中使用 E5M2(5 位指数和 2 位尾数))不同,我们对所有张量采用 E4M3 格式以获得更高的精度。我们将此方法的可行性归功于我们的细粒度量化策略,即平铺和块级缩放。通过在较小的元素组上操作,我们的方法有效地在这些分组元素之间共享指数位,减轻了有限动态范围的影响。

在线量化。延迟量化被用于张量级量化框架(NVIDIA, 2024b; Peng et al., 2023b),该框架维护先前迭代的最大绝对值的历史记录以推断当前值。为了确保精确的缩放并简化框架,我们在线计算每个 1×1281 \times 128 激活平铺或 128×128128 \times 128 权重块的最大绝对值。基于此,我们导出缩放因子,然后在线将激活或权重量化为 FP8 格式。

3.3.3. 低精度存储与通信

结合我们的 FP8 训练框架,我们通过将缓存的激活和优化器状态压缩为低精度格式,进一步降低了内存消耗和通信开销。

低精度优化器状态。我们采用 BF16 数据格式而不是 FP32 来跟踪 AdamW(Loshchilov and Hutter, 2017)优化器中的一阶和二阶矩,而不会导致可观察到的性能下降。然而,主权重(由优化器存储)和梯度(用于批次大小累加)仍然保留在 FP32 中,以确保整个训练过程的数值稳定性。

低精度激活。如图 6 所示,Wgrad 操作在 FP8 中执行。为了减少内存消耗,将激活以 FP8 格式缓存用于线性算子的反向传递是一个自然的选择。然而,对于低成本高精度训练,对几个算子采取了特殊考虑:

(1) 注意力算子之后的线性算子输入。这些激活也用于注意力算子的反向传递,这使其对精度敏感。我们专门为这些激活采用了定制的 E5M6 数据格式。此外,这些激活将在反向传递中从 1×1281 \times 128 量化平铺转换为 128×1128 \times 1 平铺。为了避免引入额外的量化误差,所有的缩放因子都是舍入缩放的,即 2 的整数次幂。 (2) MoE 中 SwiGLU 算子的输入。为了进一步降低内存成本,我们缓存 SwiGLU 算子的输入并在反向传递中重计算其输出。这些激活也以我们的细粒度量化方法存储在 FP8 中,在内存效率和计算精度之间取得了平衡。

低精度通信。通信带宽是 MoE 模型训练中的关键瓶颈。为了缓解这一挑战,我们将 MoE 上投影之前的激活量化为 FP8,然后应用分发组件,这与 MoE 上投影中的 FP8 Fprop 兼容。与注意力算子之后的线性算子输入一样,此激活的缩放因子是 2 的整数次幂。类似的策略应用于 MoE 下投影之前的激活梯度。对于前向和后向合并组件,我们将其保留在 BF16 中,以在训练流水线的关键部分保持训练精度。

3.4. 推理与部署

我们将 DeepSeek-V3 部署在 H800 集群上,其中每个节点内的 GPU 使用 NVLink 互连,集群中的所有 GPU 通过 IB 完全互连。为了同时确保在线服务的服务水平目标(SLO)和高吞吐量,我们采用了将预填充(prefilling)和解码(decoding)阶段分离的部署策略。

3.4.1. 预填充

预填充阶段的最小部署单元由 4 个节点和 32 个 GPU 组成。注意力部分采用 4 路张量并行(TP4)和序列并行(SP),结合 8 路数据并行(DP8)。其 4 的小 TP 大小限制了 TP 通信的开销。对于 MoE 部分,我们使用 32 路专家并行(EP32),这确保了每个专家处理足够大的批次大小,从而提高了计算效率。对于 MoE All-to-All 通信,我们使用与训练中相同的方法:首先通过 IB 跨节点传输 token,然后通过 NVLink 在节点内 GPU 之间转发。特别地,我们在浅层密集 MLP 中使用 1 路张量并行,以节省 TP 通信。

为了实现 MoE 部分中不同专家之间的负载均衡,我们需要确保每个 GPU 处理大致相同数量的 token。为此,我们引入了冗余专家(redundant experts)的部署策略,该策略复制高负载专家并冗余部署它们。高负载专家根据在线部署期间收集的统计数据进行检测,并定期(例如每 10 分钟)进行调整。在确定冗余专家集后,我们根据观察到的负载仔细重新排列节点内的专家,力求在不增加跨节点 All-to-All 通信开销的情况下尽可能平衡 GPU 之间的负载。对于 DeepSeek-V3 的部署,我们为预填充阶段设置了 32 个冗余专家。对于每个 GPU,除了它托管的原始 8 个专家外,它还将托管一个额外的冗余专家。

此外,在预填充阶段,为了提高吞吐量并隐藏 All-to-All 和 TP 通信的开销,我们同时处理两个具有相似计算工作负载的微批次,将一个微批次的注意力和 MoE 与另一个的分发和合并重叠。

最后,我们正在探索专家的动态冗余策略,其中每个 GPU 托管更多的专家(例如 16 个专家),但在每个推理步骤中仅激活 9 个。在每一层的 All-to-All 操作开始之前,我们即时计算全局最优路由方案。鉴于预填充阶段涉及的大量计算,计算此路由方案的开销几乎可以忽略不计。

3.4.2. 解码

在解码期间,我们将共享专家视为路由专家。从这个角度来看,每个 token 在路由期间将选择 9 个专家,其中共享专家被视为始终会被选择的高负载专家。解码阶段的最小部署单元由 40 个节点和 320 个 GPU 组成。注意力部分采用 TP4 和 SP,结合 DP80,而 MoE 部分使用 EP320。对于 MoE 部分,每个 GPU 仅托管一个专家,64 个 GPU 负责托管冗余专家和共享专家。分发和合并部分的 All-to-All 通信通过 IB 上的直接点对点传输执行,以实现低延迟。此外,我们利用 IBGDA(NVIDIA, 2022)技术进一步最小化延迟并提高通信效率。

与预填充类似,我们根据在线服务的统计专家负载,在一定间隔内定期确定冗余专家集。然而,我们不需要重新排列专家,因为每个 GPU 仅托管一个专家。我们也在探索解码的动态冗余策略。然而,这需要对计算全局最优路由方案的算法以及与分发内核的融合进行更仔细的优化,以减少开销。

此外,为了提高吞吐量并隐藏 All-to-All 通信的开销,我们也在解码阶段同时处理两个具有相似计算工作负载的微批次。与预填充不同,注意力在解码阶段消耗的时间比例更大。因此,我们将一个微批次的注意力与另一个的分发+MoE+合并重叠。在解码阶段,每个专家的批次大小相对较小(通常在 256 个 token 以内),瓶颈是内存访问而不是计算。由于 MoE 部分仅需要加载一个专家的参数,内存访问开销极小,因此使用较少的 SM 不会显著影响整体性能。因此,为了避免影响注意力部分的计算速度,我们仅能分配一小部分 SM 给分发+MoE+合并。

3.5. 硬件设计建议

基于我们对 All-to-All 通信和 FP8 训练方案的实现,我们向 AI 硬件供应商提出以下芯片设计建议。

3.5.1. 通信硬件

在 DeepSeek-V3 中,我们实现了计算与通信的重叠,以隐藏计算期间的通信延迟。与串行计算和通信相比,这显著降低了对通信带宽的依赖。然而,当前的通信实现依赖于昂贵的 SM(例如,我们为此分配了 H800 GPU 中 132 个 SM 中的 20 个),这将限制计算吞吐量。此外,使用 SM 进行通信会导致显著的低效率,因为 Tensor Core 仍然完全未被利用。

目前,SM 主要执行以下 All-to-All 通信任务:

  • 在 IB(InfiniBand)和 NVLink 域之间转发数据,同时从单个 GPU 聚合注定要发送到同一节点内多个 GPU 的 IB 流量。
  • 在 RDMA 缓冲区(注册的 GPU 内存区域)和输入/输出缓冲区之间传输数据。
  • 为 All-to-All 合并执行归约(reduce)操作。
  • 在跨 IB 和 NVLink 域向多个专家进行分块数据传输期间管理细粒度内存布局。

我们渴望看到未来的供应商开发能够将这些通信任务从宝贵的计算单元 SM 中卸载的硬件,将其作为 GPU 协处理器或网络协处理器,如 NVIDIA SHARP Graham et al. (2016)。此外,为了降低应用程序编程复杂性,我们旨在从计算单元的角度统一 IB(横向扩展)和 NVLink(纵向扩展)网络。通过这种统一的接口,计算单元可以通过提交基于简单原语的通信请求,轻松完成跨整个 IB-NVLink 统一域的读取、写入、多播和归约等操作。

3.5.2. 计算硬件

Tensor Core 中更高的 FP8 GEMM 累加精度。在 NVIDIA Hopper 架构当前的 Tensor Core 实现中,FP8 GEMM 遭受有限累加精度的困扰。在基于最大指数进行右移对齐 32 个尾数乘积后,Tensor Core 仅使用每个尾数乘积的最高 14 位进行加法,并截断超出此范围的位。加法结果到寄存器的累加也采用 14 位精度。我们的实现通过将 128 个 FP8×\timesFP8 乘法的加法结果累加到 CUDA 核心中具有 FP32 精度的寄存器中,部分缓解了这一限制。尽管有助于实现成功的 FP8 训练,但这仅仅是由于 Hopper 架构在 FP8 GEMM 累加精度方面的硬件缺陷而做出的妥协。未来的芯片需要采用更高的精度。

支持平铺和块级量化。当前的 GPU 仅支持张量级量化,缺乏对像我们这种平铺和块级量化那样的细粒度量化的原生支持。在当前的实现中,当达到 NcN_c 间隔时,部分结果将从 Tensor Core 复制到 CUDA 核心,乘以缩放因子,并添加到 CUDA 核心上的 FP32 寄存器中。尽管结合我们精确的 FP32 累加策略,反量化开销得到了显著缓解,但 Tensor Core 和 CUDA 核心之间频繁的数据移动仍然限制了计算效率。因此,我们建议未来的芯片通过使 Tensor Core 能够接收缩放因子并实现具有组缩放的 MMA 来支持细粒度量化。通过这种方式,整个部分和累加和反量化可以直接在 Tensor Core 内部完成,直到产生最终结果,从而避免频繁的数据移动。

支持在线量化。当前的实现难以有效支持在线量化,尽管我们的研究证明了其有效性。在现有过程中,我们需要从 HBM(高带宽内存)读取 128 个 BF16 激活值(先前计算的输出)进行量化,并且量化后的 FP8 值随后被写回 HBM,仅仅是为了再次被读取用于 MMA。为了解决这种低效,我们建议未来的芯片将 FP8 转换和 TMA(张量内存加速器)访问集成到单个融合操作中,以便在激活从全局内存传输到共享内存期间完成量化,从而避免频繁的内存读取和写入。我们还建议支持 warp 级转换指令以实现加速,这进一步促进了层归一化和 FP8 转换的更好融合。或者,可以采用近内存计算方法,将计算逻辑放置在 HBM 附近。在这种情况下,BF16 元素可以在从 HBM 读取到 GPU 时直接转换为 FP8,从而将片外内存访问减少约 50%。

支持转置 GEMM 操作。当前的架构使得将矩阵转置与 GEMM 操作融合变得繁琐。在我们的工作流程中,前向传递期间的激活被量化为 1×1281 \times 128 FP8 平铺并存储。在反向传递期间,矩阵需要被读出、反量化、转置、重新量化为 128×1128 \times 1 平铺,并存储在 HBM 中。为了减少内存操作,我们建议未来的芯片使能够直接从共享内存中转置读取矩阵,然后再进行 MMA 操作,以满足训练和推理中所需的精度。结合 FP8 格式转换和 TMA 访问的融合,这一增强将显著简化量化工作流程。

4. 预训练

4.1. 数据构建

与 DeepSeek-V2 相比,我们通过提高数学和编程样本的比例来优化预训练语料库,同时将多语言覆盖范围扩展到英语和中文之外。此外,我们的数据处理流水线经过精炼,在保持语料库多样性的同时最大限度地减少了冗余。受 Ding et al. (2024) 的启发,我们实施了用于数据完整性的文档打包方法,但在训练期间不包含跨样本注意力掩码。最后,DeepSeek-V3 的训练语料库由我们分词器中的 14.8T 高质量和多样化 token 组成。

在 DeepSeekCoder-V2(DeepSeek-AI, 2024a)的训练过程中,我们观察到中间填充(FIM)策略不会损害下个 token 预测能力,同时使模型能够根据上下文线索准确预测中间文本。与 DeepSeekCoder-V2 一致,我们也将 FIM 策略纳入了 DeepSeek-V3 的预训练中。具体而言,我们采用前缀-后缀-中间(PSM)框架来构建数据如下:

<|fim_begin|> <prefix> <|fim_hole|> <suffix> <|fim_end|> <middle> <|eos_token|>

此结构在文档级别作为预打包过程的一部分应用。FIM 策略以 0.1 的比率应用,与 PSM 框架一致。

DeepSeek-V3 的分词器采用字节级 BPE(Shibata et al., 1999),具有 128K token 的扩展词汇表。我们分词器的预分词器和训练数据经过修改,以优化多语言压缩效率。此外,与 DeepSeek-V2 相比,新的预分词器引入了结合标点符号和换行符的 token。然而,当模型处理没有终端换行符的多行提示时,特别是对于少样本评估提示,这种技巧可能会引入 token 边界偏差(Lundberg, 2023)。为了解决这个问题,我们在训练期间随机拆分一定比例的此类组合 token,这使模型接触到更广泛的特殊情况并减轻了这种偏差。

4.2. 超参数

模型超参数。我们将 Transformer 层数设置为 61,隐藏维度设置为 7168。所有可学习参数均以 0.006 的标准差随机初始化。在 MLA 中,我们将注意力头数 nhn_h 设置为 128,每头维度 dhd_h 设置为 128。KV 压缩维度 dcd_c 设置为 512,查询压缩维度 dcd_c' 设置为 1536。对于解耦查询和键,我们将每头维度 dhRd_h^R 设置为 64。我们用 MoE 层替换了除前三层之外的所有 FFN。每个 MoE 层由 1 个共享专家和 256 个路由专家组成,其中每个专家的中间隐藏维度为 2048。在路由专家中,每个 token 将激活 8 个专家,并确保每个 token 最多被发送到 4 个节点。多 token 预测深度 DD 设置为 1,即除了确切的下个 token 外,每个 token 将预测一个额外的 token。与 DeepSeek-V2 一样,DeepSeek-V3 也在压缩潜在向量之后采用了额外的 RMSNorm 层,并在宽度瓶颈处乘以额外的缩放因子。在此配置下,DeepSeek-V3 总共包含 671B 参数,其中每个 token 激活 37B 参数。

训练超参数。我们采用 AdamW 优化器(Loshchilov and Hutter, 2017),超参数设置为 β1=0.9,β2=0.95\beta_1 = 0.9, \beta_2 = 0.95 和 weight_decay = 0.1。我们在预训练期间将最大序列长度设置为 4K,并在 14.8T token 上对 DeepSeek-V3 进行预训练。关于学习率调度,我们在前 2K 步中将其从 0 线性增加到 2.2×1042.2 \times 10^{-4}。然后,我们保持 2.2×1042.2 \times 10^{-4} 的恒定学习率,直到模型消耗 10T 训练 token。随后,我们按照余弦衰减曲线在 4.3T token 中将学习率逐渐衰减至 2.2×1052.2 \times 10^{-5}。在最后 500B token 的训练期间,我们在前 333B token 中保持 2.2×1052.2 \times 10^{-5} 的恒定学习率,并切换到另一个 7.3×1067.3 \times 10^{-6} 的恒定学习率,用于剩余的 167B token。梯度裁剪范数设置为 1.0。我们采用批次大小调度策略,在训练前 469B token 时,批次大小从 3072 逐渐增加到 15360,然后在剩余的训练中保持 15360。我们利用流水线并行将模型的不同层部署在不同的 GPU 上,对于每一层,路由专家将均匀部署在属于 8 个节点的 64 个 GPU 上。至于节点受限路由,每个 token 最多被发送到 4 个节点(即 M=4M=4)。对于无辅助损失负载均衡,我们将前 14.3T token 的偏置更新速度 γ\gamma 设置为 0.001,剩余 500B token 设置为 0.0。对于平衡损失,我们将 α\alpha 设置为 0.0001,仅为了避免任何单个序列内的极端不平衡。MTP 损失权重 λ\lambda 在前 10T token 设置为 0.3,在剩余 4.8T token 设置为 0.1。

图 8 | “大海捞针”(NIAH)测试的评估结果。DeepSeek-V3 在所有上下文窗口长度(最高 128K)上表现良好。

4.3. 长上下文扩展

我们采用与 DeepSeek-V2(DeepSeek-AI, 2024c)类似的方法,使 DeepSeek-V3 具备长上下文能力。在预训练阶段之后,我们应用 YaRN(Peng et al., 2023a)进行上下文扩展,并执行两个额外的训练阶段,每个阶段包含 1000 步,以逐步将上下文窗口从 4K 扩展到 32K,然后扩展到 128K。YaRN 配置与 DeepSeek-V2 中使用的配置一致,仅应用于解耦共享键 ktR\mathbf{k}_t^R。两个阶段的超参数保持一致,比例 s=40,α=1,β=32s=40, \alpha=1, \beta=32,缩放因子 s=0.1lns+1\sqrt{s} = 0.1 \ln s + 1。在第一阶段,序列长度设置为 32K,批次大小为 1920。在第二阶段,序列长度增加到 128K,批次大小减少到 480。两个阶段的学习率均设置为 7.3×1067.3 \times 10^{-6},与预训练阶段的最终学习率相匹配。

通过这种两阶段扩展训练,DeepSeek-V3 能够处理长度达 128K 的输入,同时保持强大的性能。图 8 说明了 DeepSeek-V3 在监督微调后,在“大海捞针”(NIAH)测试中取得了显著的性能,证明了其在最高 128K 上下文窗口长度上的稳健性。

4.4. 评估

4.4.1. 评估基准

DeepSeek-V3 的基础模型是在以英语和中文为主的多语言语料库上预训练的,因此我们评估其在主要以英语和中文为主的一系列基准测试以及多语言基准测试上的性能。我们的评估基于集成在 HAI-LLM 框架中的内部评估框架。所考虑的基准测试分类并列出如下,其中下划线基准测试为中文,双下划线基准测试为多语言:

多学科多项选择数据集包括 MMLU (Hendrycks et al., 2020)、MMLU-Redux (Gema et al., 2024)、MMLU-Pro (Wang et al., 2024b)、MMMLU (OpenAI, 2024b)、C-Eval (Huang et al., 2023) 和 CMMLU (Li et al., 2023)。

语言理解和推理数据集包括 HellaSwag (Zellers et al., 2019)、PIQA (Bisk et al., 2020)、ARC (Clark et al., 2018) 和 BigBench Hard (BBH) (Suzgun et al., 2022)。

闭卷问答数据集包括 TriviaQA (Joshi et al., 2017) 和 NaturalQuestions (Kwiatkowski et al., 2019)。

阅读理解数据集包括 RACE (Lai et al., 2017)、DROP (Dua et al., 2019)、C3 (Sun et al., 2019a) 和 CMRC (Cui et al., 2019)。

指代消解数据集包括 CLUEWSC (Xu et al., 2020) 和 WinoGrande (Sakaguchi et al., 2019)。

语言建模数据集包括 Pile (Gao et al., 2020)。

中文理解和文化数据集包括 CCPM (Li et al., 2021)。

数学数据集包括 GSM8K (Cobbe et al., 2021)、MATH (Hendrycks et al., 2021)、MGSM (Shi et al., 2023) 和 CMath (Wei et al., 2023)。

代码数据集包括 HumanEval (Chen et al., 2021)、LiveCodeBench-Base (0801-1101) (Jain et al., 2024)、MBPP (Austin et al., 2021) 和 CRUXEval (Gu et al., 2024)。

标准化考试包括 AGIEval (Zhong et al., 2023)。请注意,AGIEval 包含英语和中文子集。

遵循我们之前的工作(DeepSeek-AI, 2024b,c),我们对包括 HellaSwag、PIQA、WinoGrande、RACE-Middle、RACE-High、MMLU、MMLU-Redux、MMLU-Pro、MMMLU、ARC-Easy、ARC-Challenge、C-Eval、CMMLU、C3 和 CCPM 在内的数据集采用基于困惑度(perplexity)的评估,并对 TriviaQA、NaturalQuestions、DROP、MATH、GSM8K、MGSM、HumanEval、MBPP、LiveCodeBench-Base、CRUXEval、BBH、AGIEval、CLUEWSC、CMRC 和 CMath 采用基于生成的评估。此外,我们对 Pile-test 执行基于语言建模的评估,并使用每字节比特数(BPB)作为指标,以确保使用不同分词器的模型之间的公平比较。

4.4.2. 评估结果

在表 3 中,我们将 DeepSeek-V3 的基础模型与最先进的开源基础模型进行了比较,包括 DeepSeek-V2-Base (DeepSeek-AI, 2024c)(我们之前的版本)、Qwen2.5 72B Base (Qwen, 2024b) 和 LLaMA-3.1 405B Base (AI@Meta, 2024b)。我们使用内部评估框架评估所有这些模型,并确保它们共享相同的评估设置。请注意,由于过去几个月我们评估框架的变化,DeepSeek-V2-Base 的性能与我们之前报告的结果略有不同。总体而言,DeepSeek-V3-Base 在大多数基准测试中全面优于 DeepSeek-V2-Base 和 Qwen2.5 72B Base,并在大多数基准测试中超过了 LLaMA-3.1 405B Base,本质上成为了最强大的开源模型。

从更详细的角度来看,我们分别比较了 DeepSeek-V3-Base 与其他开源基础模型。(1) 与 DeepSeek-V2-Base 相比,由于我们模型架构的改进、模型规模和训练 token 的扩大以及数据质量的提升,DeepSeek-V3-Base 如预期般实现了显著更好的性能。(2) 与最先进的中文开源模型 Qwen2.5 72B Base 相比,DeepSeek-V3-Base 仅用一半的激活参数就展现出了显著优势,特别是在英语、多语言、代码和数学基准测试上。对于中文基准测试,除了中文多学科多项选择任务 CMMLU 外,DeepSeek-V3-Base 的表现也优于 Qwen2.5 72B。(3) 与拥有 11 倍激活参数的最大开源模型 LLaMA-3.1 405B Base 相比,DeepSeek-V3-Base 在多语言、代码和数学基准测试上也表现出更好的性能。对于英语和中文语言基准测试,DeepSeek-V3-Base 显示出具有竞争力或更好的性能,并且在 BBH、MMLU 系列、DROP、C-Eval、CMMLU 和 CCPM 上表现尤为出色。

得益于我们高效的架构和全面的工程优化,DeepSeek-V3 实现了极高的训练效率。在我们的训练框架和基础设施下,在每万亿个 token 上训练 DeepSeek-V3 仅需 180K H800 GPU 小时,这比训练 72B 或 405B 密集模型便宜得多。

基准测试 (指标)# ShotsDeepSeek-V2 BaseQwen2.5 72B BaseLLaMA-3.1 405B BaseDeepSeek-V3 Base
架构-MoEDenseDenseMoE
# 激活参数-21B72B405B37B
# 总参数-236B72B405B671B
Pile-test (BPB)-0.6060.6380.5420.548
BBH (EM)3-shot78.879.882.987.5
MMLU (EM)5-shot78.485.084.487.1
MMLU-Redux (EM)5-shot75.683.281.386.2
MMLU-Pro (EM)5-shot51.458.352.864.4
DROP (F1)3-shot80.480.686.089.0
ARC-Easy (EM)25-shot97.698.498.498.9
ARC-Challenge (EM)25-shot92.294.595.395.3
HellaSwag (EM)10-shot87.184.889.288.9
PIQA (EM)0-shot83.982.685.984.7
WinoGrande (EM)5-shot86.382.385.284.9
RACE-Middle (EM)5-shot73.168.174.267.1
RACE-High (EM)5-shot52.650.356.851.3
TriviaQA (EM)5-shot80.071.982.782.9
NaturalQuestions (EM)5-shot38.633.241.540.0
AGIEval (EM)0-shot57.575.860.679.6
HumanEval (Pass@1)0-shot43.353.054.965.2
MBPP (Pass@1)3-shot65.072.668.475.4
LiveCodeBench-Base (Pass@1)3-shot11.612.915.519.4
CRUXEval-I (EM)2-shot52.559.158.567.3
CRUXEval-O (EM)2-shot49.859.959.969.8
GSM8K (EM)8-shot81.688.383.589.3
MATH (EM)4-shot43.454.449.061.6
MGSM (EM)8-shot63.676.269.979.8
CMath (EM)3-shot78.784.577.390.7
CLUEWSC (EM)5-shot82.082.583.082.7
C-Eval (EM)5-shot81.489.272.590.1
CMMLU (EM)5-shot84.089.573.788.8
CMRC (EM)1-shot77.475.876.076.3
C3 (EM)0-shot77.476.779.778.6
CCPM (EM)0-shot93.088.578.692.0
MMMLU-non-English (EM)5-shot64.074.873.879.4

表 3 | DeepSeek-V3-Base 与其他代表性开源基础模型的比较。所有模型均在我们的内部框架中进行评估,并共享相同的评估设置。差距不超过 0.3 的分数被认为处于同一水平。DeepSeek-V3-Base 在大多数基准测试中实现了最佳性能,特别是在数学和代码任务上。


基准测试 (指标)# ShotsSmall MoE BaselineSmall MoE w/ MTPLarge MoE BaselineLarge MoE w/ MTP
# 激活参数 (推理)-2.4B2.4B20.9B20.9B
# 总参数 (推理)-15.7B15.7B228.7B228.7B
# 训练 Token-1.33T1.33T540B540B
Pile-test (BPB)-0.7290.7290.6580.657
BBH (EM)3-shot39.041.470.070.7
MMLU (EM)5-shot50.053.367.566.6
DROP (F1)1-shot39.241.368.570.6
TriviaQA (EM)5-shot56.957.767.067.3
NaturalQuestions (EM)5-shot22.722.327.228.5
HumanEval (Pass@1)0-shot20.726.844.553.7
MBPP (Pass@1)3-shot35.836.861.662.2
GSM8K (EM)8-shot25.431.472.374.0
MATH (EM)4-shot10.712.638.639.8

表 4 | MTP 策略的消融结果。MTP 策略在大多数评估基准上持续增强了模型性能。

4.5. 讨论

4.5.1. 多 token 预测的消融研究

在表 4 中,我们展示了 MTP 策略的消融结果。具体而言,我们在不同规模的两个基线模型之上验证了 MTP 策略。在小规模上,我们在 1.33T token 上训练了一个包含 15.7B 总参数的基线 MoE 模型。在大规模上,我们在 540B token 上训练了一个包含 228.7B 总参数的基线 MoE 模型。在它们之上,保持训练数据和其他架构不变,我们附加了一个 1 深度 MTP 模块,并训练了两个带有 MTP 策略的模型进行比较。请注意,在推理期间,我们直接丢弃了 MTP 模块,因此比较模型的推理成本完全相同。从表中我们可以观察到,MTP 策略在大多数评估基准上持续增强了模型性能。

4.5.2. 无辅助损失平衡策略的消融研究

在表 5 中,我们展示了无辅助损失平衡策略的消融结果。我们在不同规模的两个基线模型之上验证了此策略。在小规模上,我们在 1.33T token 上训练了一个包含 15.7B 总参数的基线 MoE 模型。在大规模上,我们在 578B token 上训练了一个包含 228.7B 总参数的基线 MoE 模型。

基准测试 (指标)# ShotsSmall MoE Aux-Loss-BasedSmall MoE Aux-Loss-FreeLarge MoE Aux-Loss-BasedLarge MoE Aux-Loss-Free
# 激活参数-2.4B2.4B20.9B20.9B
# 总参数-15.7B15.7B228.7B228.7B
# 训练 Token-1.33T1.33T578B578B
Pile-test (BPB)-0.7270.7240.6560.652
BBH (EM)3-shot37.339.366.767.9
MMLU (EM)5-shot51.051.868.367.2
DROP (F1)1-shot38.139.067.167.1
TriviaQA (EM)5-shot58.358.566.767.7
NaturalQuestions (EM)5-shot23.223.427.128.1
HumanEval (Pass@1)0-shot22.022.640.246.3
MBPP (Pass@1)3-shot36.635.859.261.2
GSM8K (EM)8-shot27.129.670.774.5
MATH (EM)4-shot10.911.137.239.6

表 5 | 无辅助损失平衡策略的消融结果。与纯基于辅助损失的方法相比,无辅助损失策略在大多数评估基准上持续实现了更好的模型性能。

两个基线模型都纯粹使用辅助损失来鼓励负载均衡,并使用带有 Top-K 亲和度归一化的 Sigmoid 门控函数。它们控制辅助损失强度的超参数与 DeepSeek-V2-Lite 和 DeepSeek-V2 相同。在这两个基线模型之上,保持训练数据和其他架构不变,我们移除了所有辅助损失,并引入了无辅助损失平衡策略进行比较。从表中我们可以观察到,无辅助损失策略在大多数评估基准上持续实现了更好的模型性能。

4.5.3. 批次级负载均衡与序列级负载均衡

无辅助损失平衡与序列级辅助损失之间的关键区别在于它们的平衡范围:批次级与序列级。与序列级辅助损失相比,批次级平衡施加了更灵活的约束,因为它不强制要求每个序列内的域内平衡。这种灵活性允许专家更好地专门化于不同的领域。为了验证这一点,我们记录并分析了 Pile 测试集中不同领域上 16B 基于辅助损失的基线和 16B 无辅助损失模型的专家负载。如图 9 所示,我们观察到无辅助损失模型如预期般展现出更大的专家专业化模式。

为了进一步研究这种灵活性与模型性能优势之间的相关性,我们额外设计并验证了一种批次级辅助损失,它鼓励每个训练批次而不是每个序列上的负载均衡。实验结果表明,当达到相似水平的批次级负载均衡时,批次级辅助损失也可以实现与无辅助损失方法相似的模型性能。具体而言,在我们对 1B MoE 模型的实验中,验证损失分别为:2.258(使用序列级辅助损失)、2.253(使用无辅助损失方法)和 2.253(使用批次级辅助损失)。我们在 3B MoE 模型上也观察到了类似的结果:使用序列级辅助损失的模型实现了 2.085 的验证损失,而使用无辅助损失方法或批次级辅助损失的模型实现了相同的 2.080 的验证损失。

此外,尽管批次级负载均衡方法显示出一致的性能优势,但它们也面临两个潜在的效率挑战:(1) 某些序列或小批次内的负载不平衡,以及 (2) 推理期间域偏移引起的负载不平衡。第一个挑战通过我们使用大规模专家并行和数据并行的训练框架自然解决,这保证了每个微批次的大规模。对于第二个挑战,我们也设计并实施了具有冗余专家部署的高效推理框架,如第 3.4 节所述,以克服它。

5. 后训练

5.1. 监督微调

我们整理了我们的指令微调数据集,包含 150 万个跨多个领域的实例,每个领域都采用针对其特定要求量身定制的不同数据创建方法。

推理数据。对于推理相关的数据集,包括专注于数学、代码竞赛问题和逻辑谜题的数据集,我们通过利用内部 DeepSeek-R1 模型生成数据。具体而言,虽然 R1 生成的数据表现出很强的准确性,但它存在过度思考、格式不佳和长度过长等问题。我们的目标是平衡 R1 生成的推理数据的高准确性与格式规范的推理数据的清晰度和简洁性。

为了建立我们的方法,我们首先通过结合监督微调(SFT)和强化学习(RL)训练流水线,开发了一个针对特定领域(如代码、数学或通用推理)的专家模型。该专家模型作为最终模型的数据生成器。训练过程涉及为每个实例生成两种不同类型的 SFT 样本:第一种将问题与其原始响应耦合,格式为 <problem, original response>,而第二种结合了系统提示、问题和 R1 响应,格式为 <system prompt, problem, R1 response>

系统提示经过精心设计,包含指导模型产生富含反思和验证机制的响应的指令。在 RL 阶段,模型利用高温采样来生成响应,这些响应集成了来自 R1 生成数据和原始数据的模式,即使在没有明确系统提示的情况下也是如此。经过数百步 RL 后,中间 RL 模型学会了整合 R1 模式,从而战略性地增强了整体性能。

在完成 RL 训练阶段后,我们实施拒绝采样(rejection sampling)来为最终模型整理高质量 SFT 数据,其中专家模型被用作数据生成源。该方法确保了最终训练数据保留了 DeepSeek-R1 的优势,同时产生简洁有效的响应。

非推理数据。对于非推理数据,如创意写作、角色扮演和简单问答,我们利用 DeepSeek-V2.5 生成响应,并聘请人类标注员来验证数据的准确性和正确性。

SFT 设置。我们使用 SFT 数据集对 DeepSeek-V3-Base 进行了两个 epoch 的微调,使用从 5×1065 \times 10^{-6} 开始并逐渐降低到 1×1061 \times 10^{-6} 的余弦衰减学习率调度。在训练期间,每个单序列都由多个样本打包而成。然而,我们采用了样本掩码策略,以确保这些示例保持隔离且互不可见。

5.2. 强化学习

5.2.1. 奖励模型

我们在 RL 过程中采用基于规则的奖励模型(RM)和基于模型的 RM。

基于规则的 RM。对于可以使用特定规则验证的问题,我们采用基于规则的奖励系统来确定反馈。例如,某些数学问题具有确定性的结果,我们要求模型在指定格式(例如,在框中)内提供最终答案,从而允许我们应用规则来验证正确性。同样,对于 LeetCode 问题,我们可以利用编译器根据测试用例生成反馈。通过尽可能利用基于规则的验证,我们确保了更高水平的可靠性,因为这种方法对操纵或利用具有抵抗力。

基于模型的 RM。对于具有自由形式真实答案的问题,我们依赖奖励模型来确定响应是否与预期真实答案匹配。相反,对于没有明确真实答案的问题,例如涉及创意写作的问题,奖励模型被赋予基于问题和相应答案作为输入提供反馈的任务。奖励模型是从 DeepSeek-V3 SFT 检查点训练的。为了提高其可靠性,我们构建了不仅提供最终奖励,还包括导致奖励的思维链的偏好数据。这种方法有助于减轻特定任务中奖励黑客攻击(reward hacking)的风险。

5.2.2. 组相对策略优化

与 DeepSeek-V2(DeepSeek-AI, 2024c)类似,我们采用组相对策略优化(GRPO)(Shao et al., 2024),它放弃了通常与策略模型大小相同的评论家模型(critic model),而是从组分数中估计基线。具体而言,对于每个问题 qq,GRPO 从旧策略模型 πθold\pi_{\theta_{old}} 中采样一组输出 {o1,o2,,oG}\{o_1, o_2, \cdots, o_G\},然后通过最大化以下目标来优化策略模型 πθ\pi_\theta

JGRPO(θ)=E[qP(q),{oi}i=1Gπθold(oq)]\mathcal{J}_{GRPO}(\theta) = \mathbb{E}[q \sim P(q), \{o_i\}_{i=1}^G \sim \pi_{\theta_{old}}(o|q)] \frac{1}{G} \sum_{i=1}^G \left( \min \left( \frac{\pi_\theta(o_i|q)}{\pi_{\theta_{old}}(o_i|q)} A_i, \text{clip} \left( \frac{\pi_\theta(o_i|q)}{\pi_{\theta_{old}}(o_i|q)}, 1-\varepsilon, 1+\varepsilon \right) A_i \right) - \beta \mathbb{D}_{KL}(\pi_\theta || \pi_{ref}) \right), \tag{26} \mathbb{D}_{KL}(\pi_\theta || \pi_{ref}) = \frac{\pi_{ref}(o_i|q)}{\pi_\theta(o_i|q)} - \log \frac{\pi_{ref}(o_i|q)}{\pi_\theta(o_i|q)} - 1, \tag{27}

其中 ε\varepsilonβ\beta 是超参数;πref\pi_{ref} 是参考模型;AiA_i 是优势,源自对应于每组内输出的奖励 {r1,r2,,rG}\{r_1, r_2, \dots, r_G\}

A_i = \frac{r_i - \text{mean}(\{r_1, r_2, \cdots, r_G\})}{\text{std}(\{r_1, r_2, \cdots, r_G\})}. \tag{28}

我们在 RL 过程中纳入了来自不同领域(如编码、数学、写作、角色扮演和问答)的提示。这种方法不仅使模型更紧密地与人类偏好对齐,而且还增强了在基准测试上的性能,特别是在可用 SFT 数据有限的场景中。

5.3. 评估

5.3.1. 评估设置

评估基准。除了我们用于基础模型测试的基准测试外,我们还进一步评估了指令模型在 IFEval (Zhou et al., 2023)、FRAMES (Krishna et al., 2024)、LongBench v2 (Bai et al., 2024)、GPQA (Rein et al., 2023)、SimpleQA (OpenAI, 2024c)、C-SimpleQA (He et al., 2024)、SWE-Bench Verified (OpenAI, 2024d)、Aider、LiveCodeBench (Jain et al., 2024)(2024 年 8 月至 2024 年 11 月的问题)、Codeforces、中国全国高中数学联赛(CNMO 2024)和 2024 年美国数学邀请赛(AIME 2024)(MAA, 2024)上的性能。

比较基线。我们针对几个强基线对我们的聊天模型进行了全面评估,包括 DeepSeek-V2-0506、DeepSeek-V2.5-0905、Qwen2.5 72B Instruct、LLaMA-3.1 405B Instruct、Claude-Sonnet-3.5-1022 和 GPT-4o-0513。对于 DeepSeek-V2 模型系列,我们选择了最具代表性的变体进行比较。对于闭源模型,评估通过它们各自的 API 进行。

详细评估配置。对于包括 MMLU、DROP、GPQA 和 SimpleQA 在内的标准基准测试,我们采用 simple-evals 框架中的评估提示。我们利用 Zero-Eval 提示格式(Lin, 2024)在零样本设置下进行 MMLU-Redux 评估。对于其他数据集,我们遵循数据集创建者提供的默认提示的原始评估协议。对于代码和数学基准测试,HumanEval-Mul 数据集总共包含 8 种主流编程语言(Python、Java、Cpp、C#、JavaScript、TypeScript、PHP 和 Bash)。我们使用 CoT 和非 CoT 方法来评估模型在 LiveCodeBench 上的性能,其中数据收集自 2024 年 8 月至 2024 年 11 月。Codeforces 数据集使用参赛者百分比进行衡量。SWE-Bench verified 使用 agentless 框架(Xia et al., 2024)进行评估。我们使用“diff”格式来评估与 Aider 相关的基准测试。对于数学评估,AIME 和 CNMO 2024 在 0.7 的温度下进行评估,结果取 16 次运行的平均值,而 MATH-500 采用贪婪解码。我们允许所有模型为每个基准测试输出最多 8192 个 token。

基准测试 (指标)DeepSeek V2-0506DeepSeek V2.5-0905Qwen2.5 72B-Inst.LLaMA-3.1 405B-Inst.Claude-3.5- Sonnet-1022GPT-4o 0513DeepSeek V3
架构MoEMoEDenseDense--MoE
# 激活参数21B21B72B405B--37B
# 总参数236B236B72B405B--671B
MMLU (EM)78.280.685.388.688.387.288.5
MMLU-Redux (EM)77.980.385.686.288.988.089.1
MMLU-Pro (EM)58.566.271.673.378.072.675.9
DROP (3-shot F1)83.087.876.788.788.383.791.6
IF-Eval (Prompt Strict)57.780.684.186.086.584.386.1
GPQA-Diamond (Pass@1)35.341.349.051.165.049.959.1
SimpleQA (Correct)9.010.29.117.128.438.224.9
FRAMES (Acc.)66.965.469.870.072.580.573.3
LongBench v2 (Acc.)31.635.439.436.141.048.148.7
HumanEval-Mul (Pass@1)69.377.477.377.281.780.582.6
LiveCodeBench (Pass@1-COT)18.829.231.128.436.333.440.5
LiveCodeBench (Pass@1)20.328.428.730.132.834.237.6
Codeforces (Percentile)17.535.624.825.320.323.651.6
SWE Verified (Resolved)-22.623.824.5

硬核测试

正确率:0 / 5
1

DeepSeek-V3 模型采用了哪种架构来实现高效推理和经济训练?

2

DeepSeek-V3 在训练过程中采用了哪种创新的负载均衡策略?

3

关于 DeepSeek-V3 的训练过程,以下描述正确的是:

4

DeepSeek-V3 训练中引入的 DualPipe 算法的主要作用是什么?

5

DeepSeek-V3 在后训练阶段采用了什么特殊方法来提升推理性能?