摘要
DeepSeek-V3,一个强大的混合专家 (MoE) 大语言模型,总参数量为 670 亿,每个 Token 激活 370 亿参数。为了实现高效的推理和具有成本效益的训练,DeepSeek-V3 采用了多头潜在注意力 (MLA) 和 DeepSeekMoE 架构,这些架构在 DeepSeek-V2 中得到了充分验证。此外,DeepSeek-V3 首创了一种无辅助损失的负载均衡策略,并为获得更强的性能设定了多 Token 预测训练目标。我们在 14.8 万亿个多样化且高质量的 Token 上预训练 DeepSeek-V3,然后进行监督微调和强化学习阶段,以充分发挥其能力。全面的评估表明,DeepSeek-V3 的性能优于其他开源模型,并达到了与领先的闭源模型相当的性能。尽管 DeepSeek-V3 性能卓越,但其完整训练仅需 278.8 万 H800 GPU 小时。此外,其训练过程非常稳定。在整个训练过程中,我们没有遇到任何不可恢复的损失峰值或执行任何回滚。
图 1 | DeepSeek-V3 及其同类产品的基准性能。
1. 引言
近年来,大语言模型(LLM)经历了快速的迭代和演变(Anthropic 2024 Google 2024 OpenAI 2024),逐步缩小了与通用人工智能(AGI)之间的差距。除了闭源模型之外,开源模型,包括 DeepSeek 系列([DeepSeek-AI] 2024a b c Guo et al. 2024)、LLaMA 系列(AlMeta 2024,Touvron et al. 2023a b)、Owen 系列(Owen 2023 2024a b)和 Mistral 系列(Jiang et al. 2023),也在取得显著进展,努力缩小与闭源模型的差距。为了进一步推动开源模型能力的发展,我们扩大了模型规模,并推出了 DeepSeek-V3,这是一个拥有 6710 亿参数的大型混合专家(MoE)模型,其中每个 Token 激活 370 亿个参数。我们以前瞻性的视角,始终致力于强大的模型性能和经济的成本。
因此,在架构方面,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 Kalmar et al. 2019 Narang et al. 2017 Peng et al. 2023b),其发展与硬件能力的进步密切相关(Luo et al. 2024 Mickevicius et al. 2022 Rouhani et al. 2023a)。在这项工作中,我们引入了一个 FP8 混合精度训练框架,并首次验证了其在超大规模模型上的有效性。通过支持 FP8 计算和存储,我们实现了加速训练和减少 GPU 内存使用。至于训练框架,我们设计了用于高效流水线并行的 DualPipe 算法,该算法具有较少的流水线气泡,并通过计算-通信重叠隐藏了训练期间的大部分通信。这种重叠确保了,随着模型的进一步扩展,只要我们保持恒定的计算与通信比率,我们仍然可以在节点之间采用细粒度的专家,同时实现接近零的全对全通信开销。此外,我们还开发了高效的跨节点全对全通信内核,以充分利用 Infiniband (IB) 和 NVLink 带宽。
此外,我们还精心优化了内存占用,使得在不使用昂贵的张量并行的情况下训练 DeepSeek-V3 成为可能。结合这些努力,我们实现了高训练效率。在预训练期间,我们在 14.87T 高质量和多样化的 Token 上训练 DeepSeek-V3。预训练过程非常稳定。在整个训练过程中,我们没有遇到任何不可恢复的损失尖峰,也没有回滚。接下来,我们对 DeepSeek-V3 进行两阶段的上下文长度扩展。在第一阶段,最大上下文长度扩展到 32K,在第二阶段,进一步扩展到 128K。在此之后,我们对 DeepSeek-V3 的基础模型进行后训练,包括监督微调(SFT)和强化学习(RL),以使其与人类偏好对齐,并进一步释放其潜力。在后训练阶段,我们从 DeepSeek-R1 系列模型中提炼推理能力,同时仔细保持生成长度与模型准确性之间的平衡。
表 1 | DeepSeek-V3 的训练成本,假设 H800 的租用价格为每 GPU 小时 2 美元。
我们在全面的基准测试中评估 DeepSeek-V3。尽管训练成本经济,但全面的评估显示,DeepSeek-V3-Base 已成为目前最强大的开源基础模型,尤其是在代码和数学方面。其聊天版本在一些标准和开放式基准测试中也优于其他开源模型,并达到了与包括 GPT-4 和 Claude-3.5-Sonnet 在内的领先闭源模型相当的性能。
最后,我们再次强调 DeepSeek-V3 的经济训练成本,如表 1 所示,这是通过我们对算法、框架和硬件的优化协同设计实现的。在预训练阶段,在每个万亿 Token 上训练 DeepSeek-V3 仅需 18 万 H800 GPU 小时,即在我们的 2048 个 H800 GPU 集群上需要 3.7 天。因此,我们的预训练阶段在不到两个月的时间内完成,耗费 264.6 万 GPU 小时。加上上下文长度扩展的 11.9 万 GPU 小时和后训练的 5 千 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 小时的经济成本,我们完成了 DeepSeek-V3 在 14.8 万亿 Token 上的预训练,产生了目前最强大的开源基础模型。预训练之后的后续训练阶段仅需 10 万 GPU 小时。
后训练:从 DeepSeek-R1 进行知识蒸馏
我们引入了一种创新的方法,将推理能力从长链思维 (CoT) 模型(特别是来自 DeepSeek R1 系列模型之一)提炼到标准大语言模型中,特别是 DeepSeek-V3。
我们在一系列综合基准上评估 DeepSeek-V3。尽管其训练成本经济,但全面的评估显示,DeepSeek-V3-Base 已成为目前最强大的开源基础模型,尤其是在代码和数学方面。其聊天版本在多个标准和开放式基准测试中也优于其他开源模型,并达到了与领先的闭源模型(包括 GPT-4 和 Claude-3.5-Sonnet)相当的性能。
核心评估结果总结
- 知识: (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 和 Chinese SimpleQA 上都表现出优于开源模型的性能。虽然它在英语事实知识(SimpleQA)方面落后于 GPT-4o 和 Claude-Sonnet-3.5,但在中文事实知识(Chinese SimpleQA)方面超越了这些模型,突显了其在中文事实知识方面的优势。
- 代码、数学和推理: (1) 在所有非长链推理的开源和闭源模型中,DeepSeek-V3 在数学相关基准测试中取得了最先进的性能。值得注意的是,它甚至在某些基准测试(如 MATH-500)上优于 o1-preview,展示了其强大的数学推理能力。(2) 在代码相关任务中,DeepSeek-V3 在 LiveCodeBench 等代码竞赛基准测试中成为表现最佳的模型,巩固了其在该领域领先模型的地位。对于工程相关任务,虽然 DeepSeek-V3 的表现略低于 Claude-Sonnet-3.5,但它仍然以显著的优势超越了所有其他模型,展示了其在各种技术基准测试中的竞争力。
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 相比,一个显著的区别是我们额外引入了无辅助损失的负载均衡机制。
DeepSeek-V3 基本架构的示意图。与 DeepSeek-V2 类似,我们采用 MLA 和 DeepSeekMoE 来实现高效推理和经济的训练。
Wang 等人 [2024a] 提出的策略应用于 DeepSeekMoE,以减轻因确保负载均衡而导致的性能下降。图 2 展示了 DeepSeek-V3 的基本架构,本节将简要回顾 MLA 和 DeepSeekMoE 的细节。
2.1.1. 多头潜在注意力
对于注意力机制,DeepSeek-V3 采用了 MLA 架构。令 表示嵌入维度, 表示注意力头的数量, 表示每个头的维度, 表示给定注意力层中第 个 token 的注意力输入。MLA 的核心是对注意力键和值进行低秩联合压缩,以减少推理过程中的键值 (KV) 缓存:
其中, 是键和值的压缩潜在向量; 表示 KV 压缩维度; 表示下投影矩阵; 分别是键和值的上投影矩阵; 是用于生成携带旋转位置编码 (RoPE)的解耦键的矩阵; 表示应用 RoPE 矩阵的操作;并且 表示连接。请注意,对于 MLA,在生成过程中只需要缓存蓝色框中的向量(即 和 ),这可以显著减少 KV 缓存,同时保持与标准多头注意力 (MHA) 相当的性能。
对于注意力查询,我们也执行低秩压缩,这可以减少训练期间的激活内存:
其中 ( ) 是查询的压缩潜在向量;( ) 表示查询压缩维度;( )、( ) 分别是查询的下投影和上投影矩阵;而 ( ) 是用于生成携带 RoPE(旋转位置编码)的解耦化查询的矩阵。
最终,注意力查询 ( )、键 ( ) 和值 ( ) 被组合以产生最终的注意力输出 ( ):
其中 表示输出投影矩阵。
具有无辅助损失负载均衡的 DeepSeekMoE
DeepSeekMoE 的基本架构 对于前馈网络(Feed-Forward Networks, FFNs),DeepSeek-V3 采用了 DeepSeekMoE 架构(Dai 等人 2024)。与传统的混合专家系统(MoE)架构(如 GShard,Lepikhin 等人 2021)相比,DeepSeekMoE 使用更细粒度的专家并将部分专家隔离为共享专家。设 ( ) 表示第 ( ) 个词元的 FFN 输入,我们按如下方式计算 FFN 输出 ( ):
其中 () 和 () 分别表示共享专家和路由专家的数量;() 分别表示第 () 个共享专家和第 () 个路由专家;() 表示激活的路由专家数量;() 是第 () 个专家的门控值;() 是词元到专家的亲和度;() 是第 () 个路由专家的质心向量;而 () 表示在所有路由专家中为第 () 个词元计算的亲和度分数中最高的 () 个分数组成的集合。与 DeepSeek-V2 略有不同的是,DeepSeek-V3 使用 sigmoid 函数计算亲和度分数,并对所有选定的亲和度分数进行归一化以生成门控值。
无辅助损失的负载均衡策略
对于 MoE 模型来说,专家负载不平衡会导致路由崩溃并降低专家并行场景下的计算效率。传统解决方案通常依靠辅助损失来避免负载不平衡。然而,过大的辅助损失会损害模型性能。
为了在负载均衡和模型性能之间取得更好的平衡,我们开创性地提出了一种无辅助损失的负载均衡策略。具体来说,我们为每个专家引入一个偏置项 ,并将其添加到相应的亲和度分数 中,以确定 top-K 路由:
需要注意的是,偏置项仅用于路由。门控值(将与 FFN 输出相乘)仍然由原始亲和度分数 得出。在训练过程中,我们持续监控每个训练步骤整个批次的专家负载。在每个步骤结束时,如果相应的专家负载过重,我们会将偏置项减少 ;如果相应的专家负载不足,则增加 ,其中 是一个称为偏置更新速度的超参数。通过这种动态调整,DeepSeek-V3 在训练过程中保持专家负载均衡,并实现了比纯粹依靠辅助损失来鼓励负载均衡的模型更好的性能。
互补序列级辅助损失策略
尽管 DeepSeek-V3 主要依靠无辅助损失策略来实现负载均衡,但为了防止任何单个序列内出现极端不平衡,我们还采用了互补序列级平衡损失:
其中平衡因子是一个超参数,在 DeepSeek-V3 中会被赋予一个极小的值;表示指示函数; 表示序列中的 token 数量。序列级平衡损失的目的是确保每个序列上的专家负载保持平衡。
节点限制路由 与 DeepSeek-V2 采用的设备限制路由类似,DeepSeek-V3 同样采用受限制的路由机制来控制训练过程中的通信开销。具体而言,我们确保每个 token 最多只会被发送到 M 个节点,这些节点是根据每个节点上分布的专家的最高 (\frac{K}{M}) 个亲和度分数总和来选择的。在此约束条件下,我们的 MoE 训练框架能够实现近乎完整的计算与通信重叠。
无 Token 丢弃 基于高效的负载均衡策略,DeepSeek-V3 在整个训练过程中都能保持良好的负载平衡状态。因此,DeepSeek-V3 在训练过程中不会丢弃任何 token。此外,我们还实施了专门的部署策略来确保推理时的负载均衡,使得 DeepSeek-V3 在推理阶段同样不会发生 token 丢弃。
多 Token 预测
受到 Gloeckle 等人(2024)研究的启发,我们为 DeepSeek-V3 探索并设置了多 Token 预测(MTP)目标,将预测范围扩展到每个位置的多个未来 token。这种方法具有双重优势:一方面,MTP 目标能够使训练信号更加密集,有望提升数据使用效率;另一方面,MTP 使模型能够预先规划其表示,从而更好地预测未来 token。图 3 展示了我们的 MTP 实现方案。与 Gloeckle 等人(2024)使用独立输出头并行预测 D 个额外 token 的方法不同,我们采用顺序预测额外 token 的方式,并在每个预测深度保持完整的因果链。下面我们将详细介绍 MTP 的具体实现方法。
MTP 模块 具体而言,我们的 MTP 实现使用 D 个顺序模块来预测 D 个额外的 token。每个第 k 个 MTP 模块由以下组件构成:一个与主模型共享的嵌入层 、一个共享的输出头 、一个 Transformer 块 以及一个投影矩阵 。在第 个预测深度处理第 个输入 token 时,我们首先将两个表示向量结合起来:第 深度的第 个 token 表示 和第 个 token 的嵌入表示 。
这种结合通过如下线性投影实现:
其中 表示向量连接操作。需要特别注意的是,当 时, 指代的是主模型输出的表示。每个 MTP 模块的嵌入层都与主模型共享。将组合得到的 输入到第 k 深度的 Transformer 块中,从而生成当前深度的输出表示 :
这里的 代表输入序列的长度,而 表示切片操作(包含左右边界)。最后,系统将 输入到共享输出头中,计算第 k 个额外预测 token 的概率分布 (其中 表示词汇表大小):
输出头 首先将表示向量线性映射为 logits,随后通过 Softmax 函数计算第 k 个额外 token 的预测概率。与此类似,每个 MTP 模块的输出头也与主模型共享。我们维持预测因果链的原则与 EAGLE [Leviathan et al., 2023; Xia et al., 2023] 相似,但我们将 MTP 用于提升训练效果。
MTP 训练目标
在每个预测深度,我们计算如下交叉熵损失 :
其中, 代表输入序列的长度, 表示第 i 个位置的真实 token,而 则表示第 k 个 MTP 模块对 的预测概率。最终,我们通过计算所有深度 MTP 损失的平均值,并与权重因子 相乘,得到总体 MTP 损失 ,这将作为 DeepSeek-V3 的补充训练目标:
推理中的 MTP
我们设计 MTP 策略的主要目的是提升主模型的性能,因此在实际推理阶段,我们可以直接移除 MTP 模块,让主模型独立运行。不仅如此,我们还可以将这些 MTP 模块重新用于推测解码(speculative decoding),从而进一步降低生成延迟。
3. 基础设施
3.1. 计算集群
DeepSeek-V3 是在一个配备 2048 个 NVIDIA H800 GPU 的集群上训练的。H800 集群中的每个节点包含 8 个通过 NVLink 和节点内的 NVSwitch 连接的 GPU。在不同节点之间,使用 InfiniBand (IB) 互连来促进通信。
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 分发、MLP 以及 all-to-all 组合。特别地,对于后向数据块,注意力机制和 MLP 进一步拆分为两部分:输入的反向传播和权重的反向传播,类似于 ZeroBubble (Qi et al. 2023b) 中的做法。此外,我们还包含一个 PP 通信组件。如图 4 所示,对于一对前向和后向数据块,我们重新排列这些组件,并手动调整分配给通信与计算的 GPU SM 的比例。通过这种重叠策略,我们可以确保在执行过程中完全隐藏 all-to-all 通信和 PP 通信。基于这种高效的重叠策略,完整的 DualPipe 调度如图 5 所示。它采用双向流水线调度,同时从流水线的两端馈送微批次,从而可以完全重叠大部分通信。这种重叠还确保,随着模型规模的进一步扩大,只要我们保持恒定的计算与通信比率,我们仍然可以在跨节点使用细粒度的专家,同时实现接近零的 all-to-all 通信开销。
此外,即使在没有繁重通信负担的更一般场景中,DuPipe 仍然展现出效率优势。在表 2 中,我们总结了不同 PP 方法的流水线气泡和内存使用情况。如表所示,与 ZB1P (Qi et al. 2023b) 和 1F1B (Harlap et al. 2018) 相比,DualPipe 显著减少了流水线气泡,同时仅将峰值激活内存增加了 ( PP ) 倍。虽然 DualPipe 需要保留模型参数的两个副本,但这并不会显著增加内存消耗,因为我们在训练期间使用了较大的 EP 大小。与 Chimera (Li and Hoeffler 2021) 相比,DualPipe 仅要求流水线阶段和微批次可以被 2 整除,而不需要微批次可以被流水线阶段整除。此外,对于 DualPipe,随着微批次数量的增加,气泡和激活内存都不会增加。
3.2.2. 跨节点全对全通信的高效实现
为了确保 DualPipe 拥有足够的计算性能,我们定制了高效的跨节点全对全通信内核(包括调度和组合),以节省用于通信的 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
3.2.3. 极低开销的极度内存节省
为了在训练期间减少内存占用,我们采用了以下技术。
RMSNorm 和 MLA 上投影的重计算。 我们在反向传播期间重新计算所有 RMSNorm 操作和 MLA 上投影,从而无需持久存储它们的输出激活。通过少量开销,此策略显著减少了存储激活所需的内存。
CPU 中的指数移动平均。 在训练期间,我们保留模型参数的指数移动平均 (EMA),以便在学习率衰减后尽早估计模型性能。EMA 参数存储在 CPU 内存中,并在每个训练步骤后异步更新。此方法允许我们维护 EMA 参数,而不会产生额外的内存或时间开销。
多 Token 预测的共享嵌入和输出头。 通过 DualPipe 策略,我们将模型的最浅层(包括嵌入层)和最深层(包括输出头)部署在相同的 PP 秩上。这种安排使得 MTP 模块和主模型之间能够物理共享参数和梯度,包括共享的嵌入和输出头。这种物理共享机制进一步提高了我们的内存效率。
3.3. FP8 训练
受近期低精度训练进展的启发 (Dettmers et al. 2022; Nune et al. 2022; Peng et al. 2023b),我们提出了一种细粒度的混合精度框架,该框架利用 FP8 数据格式来训练 DeepSeek-V3。虽然低精度训练前景广阔,但它常常受到激活值、权重和梯度中异常值的限制 (Fishman et al. 2024; He et al. 2024; Sun et al. 2024)。尽管在推理量化方面已取得显著进展 (Frantar et al. 2022; Xiao et al. 2023),但很少有研究表明低精度技术在大规模语言模型中的成功应用预训练。
使用 FP8 数据格式的整体混合精度框架。为清晰起见,仅展示了线性算子的示例。
为了应对这一挑战并有效扩展 FP8 格式的动态范围,我们引入了一种细粒度的量化策略:使用 元素的 tile-wise 分组或使用 元素的 block-wise 分组。在我们的高精度累积过程中,相关的反量化开销得到了显著缓解,这对于实现精确的 FP8 通用矩阵乘法 (GEMM) 至关重要。此外,为了进一步减少 MoE 训练中的内存和通信开销,我们以 FP8 格式缓存和分派激活值,同时以 BF16 格式存储低精度优化器状态。我们在两个与 DeepSeek-V2-Lite 和 DeepSeek-V2 相似的模型规模上验证了所提出的 FP8 混合精度框架,训练了约 1 万亿个 Token(更多细节请参见附录 B.1)。值得注意的是,与 BF16 基线相比,我们的 FP8 训练模型的相对损失误差始终保持在 0.25% 以下,这一水平完全在训练随机性的可接受范围内。
3.3.1. 混合精度框架
在低精度训练的广泛应用技术基础上 \cite{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的稳定训练动态。为了进一步保证数值稳定性,我们以更高的精度存储主权重、权重梯度和优化器状态。
图 7 | (a) 我们提出了一种细粒度的量化方法,以减轻由特征异常值引起的量化误差;为了说明简单起见,仅说明了Fprop。(b) 结合我们的量化策略,我们通过在 ( N_C = 128 ) 个元素的 MMA 间隔内提升到 CUDA 核心进行高精度累积,从而提高了 FP8 GEMM 的精度。
3.3.2. 量化和乘法带来的精度提升
基于我们的混合精度 FP8 框架,我们引入了几种策略来提高低精度训练的准确性,重点关注量化方法和乘法过程。细粒度量化。 在低精度训练框架中,由于 FP8 格式的动态范围有限(受其减少的指数位约束),溢出和下溢是常见的挑战。作为一种标准做法,通过将输入张量的最大绝对值缩放到 FP8 的最大可表示值,使输入分布与 FP8 格式的可表示范围对齐(Narang 等人,2017)。这种方法使得低精度训练对激活异常值高度敏感,这会严重降低量化精度。为了解决这个问题,我们提出了一种细粒度量化方法,该方法在更精细的级别上应用缩放。如图 7 (a) 所示,(1) 对于激活,我们以 1x128 tile 为基础对元素进行分组和缩放(即,每个 token 每 128 个通道);(2) 对于权重,我们以 128x128 块为基础对元素进行分组和缩放(即,每 128 个输入通道每 128 个输出通道)。这种方法通过根据较小的元素组调整比例,确保量化过程可以更好地适应异常值。在附录 B.2 中,我们进一步讨论了当我们以与权重量化相同的方式按块分组和缩放激活时出现的训练不稳定问题。 我们方法中的一个关键改进是在GEMM操作的内部维度引入了每组缩放因子。标准FP8 GEMM并不直接支持此功能。然而,结合我们精确的FP32累积策略,可以高效地实现这一功能。值得注意的是,我们细粒度的量化策略与微缩放格式(Rouhani et al., 2023b)的思想高度一致。此外,NVIDIA下一代GPU(Blackwell系列)的Tensor Cores已宣布支持具有更小量化粒度的微缩放格式(NVIDIA, 2024a)。我们希望我们的设计能为未来的工作提供参考,以便与最新的GPU架构保持同步。
提高累加精度 低精度 GEMM 操作常常会遇到下溢问题,它们的精度很大程度上依赖于高精度累加,而高精度累加通常以 FP32 精度执行(Kalamkar et al. 2019; Narang et al. 2017)。然而,我们观察到,在 NVIDIA H800 GPU 上,FP8 GEMM 的累加精度被限制在保留大约 14 位,这明显低于 FP32 的累加精度。当内部维度 K 很大时(Wortsman et al. 2023),这个问题会变得更加突出,这在大规模模型训练中是很典型的场景,因为批量大小和模型宽度都会增加。例如,以 K = 4096 的两个随机矩阵的 GEMM 操作为例,在我们的初步测试中,Tensor Cores 中有限的累加精度导致最大相对误差接近 2%。尽管存在这些问题,有限的累加精度仍然是一些 FP8 框架中的默认选项(NVIDIA 2024b),严重限制了训练精度。为了解决这个问题,我们采用了提升到 CUDA Cores 以获得更高精度的策略(Thakker et al. 2023)。该过程如图 7 (b) 所示。具体来说,在 Tensor Cores 上执行 MMA(矩阵乘法-累加)时,中间结果使用有限的位宽进行累加。一旦达到 K 的间隔,这些部分结果将被复制到 CUDA Cores 上的 FP32 寄存器,在那里执行全精度 FP32 累加。如前所述,我们的细粒度量化沿内部维度 K 应用每组缩放因子。这些缩放因子可以在 CUDA Cores 上高效地相乘,作为去量化过程,且计算成本极低。 值得注意的是,这种修改降低了单个 warp 组的 WGMMA(Warpgroup-level Matrix Multiply-Accumulate,warp 组级矩阵乘法累加)指令的发出率。然而,在 H800 架构上,通常会有两个 WGMMA 并行存在:当一个 warp 组执行提升操作时,另一个 warp 组能够执行 MMA 操作。这种设计使得两个操作能够重叠进行,从而保持 Tensor Core 的高利用率。根据我们的实验,设置 Nc = 128 个元素,相当于 4 个 WGMAs,代表了可以在不引入大量开销的情况下显著提高精度的最小累积间隔。
尾数优于指数 与先前工作(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)中,采用了延迟量化技术。这种技术会维护先前迭代中最大绝对值的历史记录,以便推断当前值。为了确保尺度准确并简化框架,我们针对每个128x128的激活图块或128x128的权重块,在线计算其最大绝对值。基于此最大绝对值,我们推导出缩放因子,然后在线将激活或权重量化为FP8格式。
3.3.3. 低精度存储与通信
结合我们的 FP8 训练框架,我们通过将缓存的激活值和优化器状态压缩为低精度格式,进一步降低了内存消耗和通信开销。
低精度优化器状态。 我们采用 BF16 数据格式而非 FP32 来跟踪 AdamW (Loshchilov and Hutter, 2017) 优化器中的一阶和二阶矩,且未观察到明显的性能下降。然而,主权重(由优化器存储)和梯度(用于批量大小累积)仍然保留在 FP32 中,以确保整个训练过程中的数值稳定性。
低精度激活。 如图 6 所示,Wgrad 操作在 FP8 中执行。为了减少内存消耗,将激活值以 FP8 格式缓存以用于线性算子的反向传播是一个自然的选择。然而,对于几个算子,为了实现低成本高精度训练,需要特别考虑:
(1) 注意力算子之后线性算子的输入。 这些激活值也用于注意力算子的反向传播,这使得它对精度敏感。我们专门为这些激活值采用了定制的 E5M6 数据格式。此外,这些激活值将在反向传播中从 128x128 量化块转换为 128x1 量化块。为了避免引入额外的量化误差,所有的缩放因子都进行舍入缩放,即 2 的整数次幂。
(2) MoE 中 SwiGLU 算子的输入。 为了进一步降低内存成本,我们缓存 SwiGLU 算子的输入,并在反向传播中重新计算其输出。这些激活值也使用我们的细粒度量化方法以 FP8 格式存储,从而在内存效率和计算精度之间取得平衡。低精度通信。 通信带宽是 MoE 模型训练中的一个关键瓶颈。为了缓解这一挑战,我们在 MoE 上投影层之前将激活值量化为 FP8,然后应用分发组件,这与 MoE 上投影层中的 FP8 前向传播兼容。与注意力算子之后的线性层的输入类似,此激活值的缩放因子是 2 的整数幂。类似的策略应用于 MoE 下投影层之前的激活梯度。对于前向和反向组合组件,我们将其保留在 BF16 中,以在训练管道的关键部分保持训练精度。
3.4. 推理和部署
我们在 H800 集群上部署 DeepSeek-V3。该集群中,每个节点内的 GPU 通过 NVLink 互联,而整个集群的所有 GPU 则通过 IB 完全互联。为了同时确保在线服务的服务级别目标 (SLO) 和高吞吐量,我们采用了以下部署策略,将预填充阶段和解码阶段分离。
3.4.1. 预填充
预填充阶段的最小部署单元由 4 个节点组成,每个节点配备 32 个 GPU。注意力部分采用 4 路张量并行 (TP4) 与序列并行 (SP) 相结合,并结合 8 路数据并行 (DP8)。其较小的 TP 大小为 4 限制了 TP 通信的开销。对于 MoE 部分,我们使用 32 路专家并行 (EP32),这确保了每个专家处理足够大的批次大小,从而提高计算效率。对于 MoE 的 all-to-all 通信,我们使用与训练中相同的方法:首先通过 IB 在节点之间传输 Token,然后通过 NVLink 在节点内的 GPU 之间转发。特别地,我们在浅层中使用 1 路张量并行来节省 TP 通信。为了在 MoE 部分的不同专家之间实现负载均衡,我们需要确保每个 GPU 处理大致相同数量的 Token。为此,我们引入了一种冗余专家的部署策略,该策略复制高负载专家并冗余地部署它们。高负载专家是根据在线部署期间收集的统计数据检测到的,并定期调整(例如,每 10 分钟)。在确定冗余专家集后,我们会根据观察到的负载,仔细地在节点内的 GPU 之间重新排列专家,力求在不增加跨节点 all-to-all 通信开销的情况下,尽可能平衡 GPU 之间的负载。对于 DeepSeek-V3 的部署,我们为预填充阶段设置了 32 个冗余专家。对于每个 GPU,除了它托管的原始 8 个专家外,它还将托管一个额外的冗余专家。 此外,在预填充阶段,为了提高吞吐量并隐藏全对全通信和张量并行(TP)通信的开销,我们同时处理两个具有相似计算负载的微批次,将一个微批次的注意力机制和混合专家模型(MoE)计算与另一个微批次的分发和组合操作重叠进行。最后,我们正在探索一种专家的动态冗余策略,其中每个GPU托管更多的专家(例如,16个专家),但在每个推理步骤中仅激活9个。在每一层开始全对全操作之前,我们会动态计算全局最优路由方案。考虑到预填充阶段涉及的大量计算,计算此路由方案的开销几乎可以忽略不计。
3.4.2. 解码
在解码过程中,我们将共享专家视为一个被路由的专家。从这个角度来看,每个 Token 在路由时会选择 9 个专家,其中共享专家被视为一个高负载专家,它总是会被选中。解码阶段的最小部署单元由 40 个节点组成,共计 320 个 GPU。注意力部分采用 TP4 与 SP 结合,并结合 DP80,而 MoE 部分使用 EP320。对于 MoE 部分,每个 GPU 仅托管一个专家,并且有 64 个 GPU 负责托管冗余专家和共享专家。调度和组合部分的所有到所有通信通过 IB 上的直接点对点传输执行,以实现低延迟。此外,我们利用 IBGDA [NVIDIA 2022] 技术来进一步最小化延迟并提高通信效率。 与预填充类似,我们根据在线服务的统计专家负载,在一定的时间间隔内定期确定冗余专家的集合。但是,我们不需要重新排列专家,因为每个 GPU 仅托管一个专家。我们还在探索用于解码的动态冗余策略。然而,这需要更仔细地优化计算全局最优路由方案的算法,以及与调度内核的融合以减少开销。
3.5. 关于硬件设计的建议
基于我们对全连接通信和FP8训练方案的实现,我们向AI硬件供应商提出以下关于芯片设计的建议。
3.5.1. 通信硬件
在 DeepSeek-V3 中,我们实现了计算与通信的重叠,以隐藏计算过程中的通信延迟。相较于串行计算和通信,这显著降低了对通信带宽的依赖。然而,当前的通信实现依赖于昂贵的 SM(例如,在 H800 GPU 中,我们为此目的分配了 132 个可用 SM 中的 20 个),这会限制计算吞吐量。此外,使用 SM 进行通信会导致显著的效率低下,因为张量核心完全未被利用。目前,SM 主要为全对全通信执行以下任务:
- 在 IB (InfiniBand) 和 NVLink 域之间转发数据,同时将来自单个 GPU 的、目标为同一节点内多个 GPU 的 IB 流量进行聚合。
- 在 RDMA 缓冲区(已注册的 GPU 内存区域)和输入/输出缓冲区之间传输数据。
- 为全对全组合执行规约操作。
- 在跨 IB 和 NVLink 域向多个专家进行分块数据传输期间管理细粒度的内存布局。 我们期望看到未来的供应商开发硬件,将这些通信任务从宝贵的计算单元SM中卸载,使其作为GPU协处理器或像NVIDIA SHARP这样的网络协处理器。此外,为了降低应用程序编程的复杂性,我们的目标是使这种硬件从计算单元的角度统一IB(横向扩展)和NVLink(纵向扩展)网络。通过这种统一的接口,计算单元可以通过提交基于简单原语的通信请求,轻松地在整个IB-NVLink统一域中完成读取、写入、多播和归约等操作。
3.5.2. 计算硬件
Tensor Core 中更高的 FP8 GEMM 累加精度。在 NVIDIA Hopper 架构当前的 Tensor Core 实现中,FP8 GEMM(通用矩阵乘法)采用定点累加方式。在加法运算前,它会根据最大指数对尾数乘积进行右移,以实现对齐。我们的实验表明,在符号填充右移后,它仅使用每个尾数乘积的最高 14 位,并截断超出此范围的位。然而,例如,为了从 32 个 FP8xFP8 乘法的累加中获得精确的 FP32 结果,至少需要 34 位精度。因此,我们建议未来的芯片设计应提高 Tensor Core 中的累加精度,以支持全精度累加,或者根据训练和推理算法的精度要求选择合适的累加位宽。这种方法可以确保误差控制在可接受的范围内,同时保持计算效率。
支持分块量化和分片量化 目前的GPU仅支持按张量量化,缺乏对细粒度量化(如我们的分块量化和分片量化)的原生支持。在当前的实现中,当达到 区间时,部分结果将从 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 操作融合变得很麻烦。在我们的工作流程中,前向传播期间的激活被量化为 1x128 FP8 块 并存储。在反向传播期间,需要读取矩阵,反量化,转置,重新量化为 128x1 块,并存储在 HBM 中。为了减少内存操作,我们建议未来的芯片能够在矩阵乘法累加操作 (MMA) 之前直接从共享内存中读取矩阵的转置,对于训练和推理中所需的精度。结合 FP8 格式转换和 TMA 访问的融合,这种增强将显著简化量化工作流程。
在符号填充右移后,每个尾数乘积的位,并截断超出此范围的位。然而,例如,为了从 32 个 FP8xFP8 乘法的累积中获得精确的 FP32 结果,至少需要 34 位精度。因此,我们建议未来的芯片设计增加 Tensor Core 中的累积精度,以支持全精度累积,或根据训练和推理算法的精度要求选择适当的累积位宽。这种方法确保误差保持在可接受的范围内,同时保持计算效率。
支持分块和分片量化 目前的GPU仅支持按张量量化,缺乏对细粒度量化(如我们的分块和分片量化)的原生支持。在当前的实现中,当达到 (N_c) 区间时,部分结果将从 Tensor Core 复制到 CUDA 核心,乘以缩放因子,并添加到 CUDA 核心上的 FP32 寄存器中。尽管结合我们精确的 FP32 累积策略,反量化开销已显著降低,但 Tensor Core 和 CUDA 核心之间频繁的数据移动仍然限制了计算效率。因此,我们建议未来的芯片通过使 Tensor Core 能够接收缩放因子并实现带有组缩放的 MMA 来支持细粒度量化。这样,整个部分和的累加和反量化可以直接在 Tensor Core 内部完成,直到产生最终结果,从而避免频繁的数据移动。
4 预训练
4.1. 数据构建
与 DeepSeek-V2 相比,我们通过提高数学和编程样本的比例来优化预训练语料库,同时将多语言覆盖范围扩展到英语和中文之外。此外,我们改进了数据处理流程,以最大限度地减少冗余,同时保持语料库的多样性。受 Ding 等人 (2024) 的启发,我们实施了文档打包方法以确保数据完整性,但在训练期间不采用跨样本注意力掩码。最后,DeepSeek-V3 的训练语料库包含我们 tokenizer 中的 14.8T 高质量和多样化的 token。在 DeepSeekCoder-V2 (DeepSeek-AI, 2024a) 的训练过程中,我们观察到中间填充 (Fill-in-Middle, FIM) 策略不会损害下一个 token 的预测能力,同时使模型能够根据上下文线索准确预测中间文本。与 DeepSeekCoder-V2 一致,我们在 DeepSeek-V3 的预训练中也采用了 FIM 策略。具体来说,我们采用前缀-后缀-中间 (Prefix-Suffix-Middle, PSM) 框架来构建数据,如下所示:
<|fim_begin|> 𝑓pre<|fim_hole|> 𝑓suf<|fim_end|> 𝑓middle<|eos_token|>。
此结构在文档级别作为预打包过程的一部分应用。FIM 策略的应用率为 0.1,与 PSM 框架一致。DeepSeek-V3 的 tokenizer 采用字节级 BPE (Shibata et al., 1999),扩展词汇量为 128K 个 token。我们 tokenizer 的预分词器和训练数据经过修改,以优化多语言压缩效率。此外,与 DeepSeek-V2 相比,新的预分词器引入了结合标点符号和换行符的 token。然而,当模型处理没有结尾换行符的多行提示词时,这种技巧可能会引入 token 边界偏差 (Lundberg, 2023),特别是对于少样本学习评估提示词。为了解决这个问题,我们在训练期间随机拆分一定比例的此类组合 token,这使模型接触到更广泛的特殊情况并减轻了这种偏差。
4.2. 超参数
模型超参数。我们将 Transformer 层的数量设置为 61,隐藏层维度设置为 7168。所有可学习参数均以 0.006 的标准差随机初始化。在 MLA 中,我们将注意力头数 𝑛ℎ 设置为 128,每个头的维度 𝑑ℎ 设置为 128。KV 压缩维度 𝑑𝑐 设置为 512,查询压缩维度 𝑑′𝑐 设置为 1536。对于解耦的查询和键,我们将每个头的维度 𝑑𝑅ℎ 设置为 64。我们用 MoE 层替换了除前三层之外的所有 FFN 层。每个 MoE 层由 1 个共享专家和 256 个路由专家组成,其中每个专家的中间隐藏层维度为 2048。在路由专家中,每个 Token 将激活 8 个专家,并确保每个 Token 最多被发送到 4 个节点。多 Token 预测深度 𝐷 设置为 1,即除了预测确切的下一个 Token 之外,每个 Token 还将预测一个额外的 Token。与 DeepSeek-V2 类似,DeepSeek-V3 也在压缩的潜在向量之后采用了额外的 RMSNorm 层,并在宽度瓶颈处乘以额外的缩放因子。在此配置下,DeepSeek-V3 包含 6710 亿个总参数,其中每个 Token 激活 370 亿个参数。
训练超参数。我们采用 AdamW 优化器(Loshchilov 和 Hutter,2017),其超参数设置为 𝛽1 = 0.9,𝛽2 = 0.95,weight_decay = 0.1。我们将预训练期间的最大序列长度设置为 4K,并在 14.8T 个 Token 上预训练 DeepSeek-V3。至于学习率调度,我们首先在前 2K 步中将其从 0 线性增加到 2.2 × 10−4。然后,我们保持 2.2 × 10−4 的恒定学习率,直到模型消耗 10T 个训练 Token。随后,我们在 4.3T 个 Token 中逐渐将学习率衰减到 2.2 × 10−5,遵循余弦衰减曲线。在最后 500B 个 Token 的训练期间,我们在前 333B 个 Token 中保持 2.2 × 10−5 的恒定学习率,并在剩余的 167B 个 Token 中切换到另一个 7.3 × 10−6 的恒定学习率。梯度裁剪范数设置为 1.0。我们采用批量大小调度策略,其中批量大小在前 469B 个 Token 的训练中从 3072 逐渐增加到 15360,然后在剩余的训练中保持 15360。我们利用流水线并行性在不同的 GPU 上部署模型的不同层,并且对于每一层,路由专家将均匀部署在属于 8 个节点的 64 个 GPU 上。至于节点限制路由,每个 Token 最多将被发送到 4 个节点(即 𝑀 = 4)。对于无辅助损失的负载平衡,我们将前 14.3T 个 Token 的偏差更新速度 𝛾 设置为 0.001,其余 500B 个 Token 设置为 0.0。对于平衡损失,我们将 𝛼 设置为 0.0001,只是为了避免任何单个序列内的极端不平衡。MTP 损失权重 𝜆 在前 10T 个 Token 中设置为 0.3,在剩余的 4.8T 个 Token 中设置为 0.1。
4.3. 长上下文扩展
我们采用了与 DeepSeek-V2 (DeepSeek-AI, 2024c) 相似的方法,使 DeepSeek-V3 具备长上下文处理能力。在预训练阶段之后,我们应用 YaRN (Peng et al., 2023a) 进行上下文扩展,并执行两个额外的训练阶段,每个阶段包含 1000 步,以逐步将上下文窗口从 4K 扩展到 32K,然后再扩展到 128K。YaRN 的配置与 DeepSeek-V2 中使用的配置一致,仅应用于解耦的共享键 k 𝑅 𝑡 。两个阶段的超参数保持相同,其中 scale 𝑠 = 40,𝛼 = 1,𝛽 = 32,以及缩放因子 √ 𝑡 = 0.1 ln 𝑠 + 1。在第一阶段,序列长度设置为 32K,批量大小为 1920。在第二阶段,序列长度增加到 128K,批量大小减少到 480。两个阶段的学习率均设置为 7.3 × 10−6,与预训练阶段的最终学习率相匹配。
通过这两个阶段的扩展训练,DeepSeek-V3 能够处理长度高达 128K 的输入,同时保持强大的性能。图 8 说明了 DeepSeek-V3 在经过监督微调后,在“大海捞针”(NIAH)测试中取得了显著的性能,表明在高达 128K 的上下文窗口长度上具有一致的鲁棒性。
4.4.1. 评估基准
DeepSeek-V3 的基础模型是在一个以英语和中文为主的多语言语料库上进行预训练的,因此我们主要在英语和中文以及一个多语言基准上评估其性能。我们的评估基于我们集成在 HAI-LLM 框架中的内部评估框架。考虑的基准被分类并列出如下,其中带下划线的基准是中文的,带双下划线的基准是多语言的:多主题多项选择数据集包括 MMLU (Hendrycks et al., 2020), MMLURedux (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 的数据集采用基于困惑度的评估,对 TriviaQA, NaturalQuestions, DROP, MATH, GSM8K, MGSM, HumanEval, MBPP, LiveCodeBench-Base, CRUXEval, BBH, AGIEval, CLUEWSC, CMRC, 和 CMath 采用基于生成的评估。此外,我们对 Pile-test 进行基于语言建模的评估,并使用每字节比特数 (BPB) 作为指标,以保证在使用不同 Tokenizers 的模型之间进行公平比较。
4.4.2. 评估结果
在表3中,我们将 DeepSeek-V3 的基础模型与最先进的开源基础模型进行了比较,这些模型包括 DeepSeek-V2-Base (DeepSeek-AI 2024c)、Qwen2.5 72B Base (Qwen 2024b) 和 LLaMA-3.1 405B Base (Meta 2024b)。我们使用内部评估框架评估了所有这些模型,并确保它们共享相同的评估设置。请注意,由于过去几个月我们的评估框架发生了变化,DeepSeek-V2-Base 的性能与我们之前报告的结果略有不同。总的来说,DeepSeek-V3 Base 全面优于 DeepSeek-V2-Base 和 Qwen2.5 72B Base,并在大多数基准测试中超越了 LLaMA-3.1 405B Base,基本上成为最强大的开源模型。
在 Pile 测试集中,三个领域上无辅助损失和基于辅助损失的模型的专家负载。无辅助损失模型显示出比基于辅助损失的模型更大的专家专业化模式。相对专家负载表示实际专家负载与理论上平衡的专家负载之间的比率。由于空间限制,我们仅以两个层的结果为例进行展示,所有层的结果都在附录 C 中提供。 此外,尽管批次式负载均衡方法展现出一致的性能优势,但它们在效率方面也面临两个潜在挑战:(1)某些序列或小批量内的负载不均衡,以及(2)推理过程中由领域偏移引起的负载不均衡。第一个挑战可以通过我们使用大规模专家并行和数据并行的训练框架自然解决,该框架保证了每个微批次的大尺寸。对于第二个挑战,我们还设计并实现了一个具有冗余专家部署的高效推理框架,如第3.4节所述,以克服它。
5.1. 监督式微调
我们精心策划了指令微调数据集,其中包含跨多个领域的 150 万个实例,每个领域都采用针对其特定需求量身定制的独特数据创建方法。
推理数据。 对于与推理相关的数据集,包括那些专注于数学、代码竞赛问题和逻辑谜题的数据集,我们通过利用内部的 DeepSeek-R1 模型来生成数据。具体来说,虽然 R1 生成的数据表现出很高的准确性,但它存在诸如过度思考、格式不佳和长度过长等问题。我们的目标是平衡 R1 生成的推理数据的高准确性以及格式规范的推理数据的清晰度和简洁性。
非推理数据 对于非推理数据,例如创意写作、角色扮演和简单问答,我们利用 DeepSeek-V2.5 生成回复,并聘请人工标注员来验证数据的准确性和正确性。
SFT 设置
我们使用 SFT 数据集对 DeepSeek-V3-Base 进行两个 epoch 的微调,采用余弦衰减学习率调度,初始学习率为 ,并逐渐降低至 。在训练过程中,每个单独的序列由多个样本打包而成。然而,我们采用样本掩码策略,以确保这些示例保持隔离且相互不可见。
5.2.1. 奖励模型
在我们的强化学习过程中,我们采用了基于规则的奖励模型(RM)和基于模型的奖励模型。
基于规则的奖励模型。 对于可以使用特定规则验证的问题,我们采用基于规则的奖励系统来确定反馈。例如,某些数学问题具有确定的结果,我们要求模型在指定的格式(例如,在框中)内提供最终答案,从而允许我们应用规则来验证其正确性。同样,对于LeetCode问题,我们可以利用编译器根据测试用例生成反馈。通过尽可能利用基于规则的验证,我们确保了更高水平的可靠性,因为这种方法不易受到操纵或利用。
基于模型的奖励模型。 对于具有自由形式的真实答案的问题,我们依赖奖励模型来确定响应是否与预期的真实答案匹配。相反,对于没有明确的真实答案的问题,例如涉及创意写作的问题,奖励模型则负责根据问题和相应的答案提供反馈。奖励模型以问题和答案作为输入,并从DeepSeek-V3 SFT检查点进行训练。为了提高其可靠性,我们构建了偏好数据,这些数据不仅提供最终奖励,还包括导致奖励的思维链。这种方法有助于降低特定任务中奖励被黑客攻击的风险。
5.2.2. 群组相对策略优化
与 DeepSeek-V2类似,我们采用了群组相对策略优化 (GRPO) ,它放弃了通常与策略模型大小相同的评论家模型,而是从群组得分中估计基线。具体来说,对于每个问题 q,GRPO 从旧的策略模型中采样一组输出 ,然后通过最大化以下目标来优化策略模型 :
其中 和 是超参数; 是参考模型; 是优势,它来自每个组内输出对应的奖励 :
在强化学习(RL)过程中,我们融入了来自不同领域的提示词,例如编码、数学、写作、角色扮演和问答。这种方法不仅使模型更贴近人类偏好,而且还提高了在基准测试中的性能,尤其是在可用的监督微调(SFT)数据有限的情况下。
评估基准。
除了我们用于基础模型测试的基准之外,我们还在 IFEval \cite{Zhou et al. 2023}、FRAMES \cite{Krishna et al. 2024}、LongBench v2 \cite{Bai et al. 2024}、GPQA \cite{Rein et al. 2023}、SimpleQA \cite{OpenAI 2024c}、C-SimpleQA \cite{He et al. 2024}、SWE-Bench Verified \cite{OpenAI 2024d}、Aider \cite{Jain et al. 2024}(2024 年 8 月至 2024 年 11 月的问题)、Codeforces、中国高中数学奥林匹克竞赛 (CNMO 2024)和 2024 年美国邀请数学考试 (AIME 2024)\footnote{MAA 2024} 上进一步评估了指令模型。
对比基线。
我们对我们的聊天模型进行了全面的评估,并与多个强大的基线模型进行了比较,这些模型包括 DeepSeek-V2-0506、DeepSeek-V2.5-0905、Qwen2.5 72B Instruct、LLaMA-3.1 405B Instruct、Claude-Sonnet-3.5-1022 和 GPT-4-0513。对于 DeepSeek-V2 模型系列,我们选择了最具代表性的变体进行比较。对于闭源模型,评估是通过它们各自的 API 进行的。
5.3.2. 标准评估
表 6 呈现了评估结果,显示 DeepSeek-V3 是表现最佳的开源模型。此外,它与 GPT-4o 和 Claude-3.5-Sonnet 等前沿闭源模型相比也具有竞争力。
英文基准测试
MMLU是一个被广泛认可的基准测试,旨在评估大语言模型在不同知识领域和任务中的性能。DeepSeek-V3展现出强大的竞争力,与顶尖模型如LLaMA-3.1-405B、GPT-4o和Claude-Sonnet 3.5并驾齐驱,同时显著优于Qwen2.5 72B。此外,DeepSeek-V3在更具挑战性的教育知识基准测试MMLU-Pro中表现出色,紧随Claude-Sonnet 3.5之后。在MMLU-Redux(MMLU的修正标签版本)上,DeepSeek-V3超越了其同行。此外,在GPQA-Diamond(一个博士级别的评估测试平台)上,DeepSeek-V3取得了显著的成绩,仅次于Claude 3.5 Sonnet,并以显著优势超越了所有其他竞争对手。在长上下文理解基准测试(如DROP、LongBench v2和FRAMES)中,DeepSeek-V3继续展示其作为顶尖模型的地位。在DROP的3-shot设置中,它取得了令人印象深刻的91.6 F1分数,优于该类别中的所有其他模型。在FRAMES(一个需要在10万Token上下文上进行问答的基准测试)中,DeepSeek-V3紧随GPT-4o之后,同时以显著优势超越了所有其他模型。这表明DeepSeek-V3在处理极长上下文任务方面具有强大的能力。DeepSeek-V3的长上下文能力通过其在LongBench v2上的最佳性能得到了进一步验证,LongBench v2是一个在DeepSeek-V3发布前几周才发布的数据集。在事实知识基准测试SimpleQA上,DeepSeek-V3落后于GPT-4o和Claude-Sonnet,这主要是由于其设计重点和资源分配。DeepSeek-V3分配了更多的训练Token来学习中文知识,从而在C-SimpleQA上取得了卓越的性能。在指令遵循基准测试中,DeepSeek-V3显著优于其前身DeepSeek-V2系列,突显了其理解和遵守用户定义格式约束的改进能力。
代码和数学基准测试
对于大语言模型而言,编码是一项具有挑战性和实践性的任务,它涵盖了诸如 SWE-Bench-Verified 和 Aider 等以工程为中心的应用,以及诸如 HumanEval 和 LiveCodeBench 等算法任务。在工程任务方面,DeepSeek-V3 的表现略逊于 Claude-Sonnet-3.5-1022,但显著优于开源模型。开源的 DeepSeek-V3 有望推动编码相关工程任务的进步。通过开放其强大的功能,DeepSeek-V3 可以促进软件工程和算法开发等领域的创新和改进,赋能开发者和研究人员突破开源模型在编码任务中的能力边界。在算法任务方面,DeepSeek-V3 展现出卓越的性能,在 HumanEval-Mul 和 LiveCodeBench 等基准测试中均优于所有基线模型。这一成功可归因于其先进的知识蒸馏技术,该技术有效地提升了其在以算法为中心的任务中的代码生成和问题解决能力。在数学基准测试中,DeepSeek-V3 表现出非凡的性能,显著超越了基线模型,并为非 1 类模型树立了新的技术标杆。具体而言,在 AIME、MATH-500 和 CNMO 2024 上,DeepSeek-V3 的绝对分数比第二名模型 Qwen2.5 72B 高出约 110%,这对于如此具有挑战性的基准测试而言是一个巨大的优势。这种卓越的能力凸显了 DeepSeek-R1 的知识蒸馏技术的有效性,该技术已被证明对非 1 类模型非常有益。
5.4.1. 从 DeepSeek-R1 的知识蒸馏
我们基于 DeepSeek-V2.5 进行了消融实验,以评估来自 DeepSeek-R1 的知识蒸馏的贡献。基线模型在短 CoT 数据上进行训练,而其对比模型则使用上述专家检查点生成的数据。 表 9 展示了知识蒸馏数据的有效性,在 LiveCodeBench 和 MATH-500 基准测试中均显示出显著的改进。我们的实验揭示了一个有趣的权衡:知识蒸馏带来了更好的性能,但也显著增加了平均响应长度。为了在模型准确性和计算效率之间保持平衡,我们在 DeepSeek-V3 的知识蒸馏过程中仔细选择了最优设置。 我们的研究表明,从推理模型中进行知识蒸馏为后训练优化提供了一个有前景的方向。虽然我们目前的工作侧重于从数学和编码领域蒸馏数据,但这种方法在各种任务领域都显示出更广泛的应用潜力。在这些特定领域所展示的有效性表明,长 CoT 蒸馏对于增强其他需要复杂推理的认知任务中的模型性能可能具有重要价值。在不同领域进一步探索这种方法仍然是未来研究的一个重要方向。
5.4.2. 自我奖励
奖励在强化学习(RL)中扮演着关键角色,引导着优化过程。在一些可以通过外部工具直接验证的领域中,如编程或数学场景,强化学习表现出卓越的效果。然而,在更一般的场景中,通过硬编码构建反馈机制是不切实际的。在开发 DeepSeek-V3 过程中,对于这些更广泛的情况,我们采用了Constitutional AI方法(Bai et al., 2022),利用 DeepSeek-V3 自身的投票评估结果作为反馈来源。
这种方法产生了显著的对齐效果,大大提升了 DeepSeek-V3 在主观评估中的表现。通过整合额外的宪法输入,DeepSeek-V3 可以朝着宪法方向优化。我们认为,这种将补充信息与大语言模型作为反馈来源相结合的范式具有重要意义。大语言模型作为一个多功能处理器,能够将来自不同场景的非结构化信息转化为奖励,最终促进大语言模型的自我提升。除了自我奖励外,我们还致力于发掘其他通用且可扩展的奖励方法,以持续提升模型在一般场景中的能力。
5.4.3. 多 Token 预测评估
DeepSeek-V3 不仅预测下一个单独的 token,还通过 MTP 技术预测接下来的 2 个 token。结合推测性解码框架(Leviathan et al., 2023; Xia et al., 2023),它能显著提高模型的解码速度。这自然引发了一个问题:额外预测的 token 的接受率如何?根据我们的评估,第二个 token 预测的接受率在各种生成主题中保持在 85% 到 90% 之间,展现出持续的可靠性。这种高接受率使得 DeepSeek-V3 能够实现显著提升的解码速度,达到 1.8 倍的 TPS(每秒 Token 数)。