DeepSeek-V3 是怎么训练的|深度拆解

这两天,DeepSeek-V3 低调发布,在国际上狠狠秀了一波肌肉:只用了 500 多万美金的成本,带来了不输 Claude 3.5 的成绩,并开源! 

图片

下面,让我们以更加系统的方式,来看看这次的 DeepSeek-V3,是这么炼成的。本文将从性能架构工程预训练后训练五个度来拆解 V3,所用到的图表、数据源于技术报告:《DeepSeek-V3 Technical Report》。 

 


 

性能

DeepSeek-V3 的性能优势,在各项基准测试中得到了充分验证。 

图片

如图,DeepSeek-V3 在 MMLU-Pro、GPQA-Diamond、MATH 500、AIME 2024、Codeforces (Percentile) 和 SWE-bench Verified 等涵盖知识理解、逻辑推理、数学能力、代码生成以及软件工程能力等多个维度的权威测试集上,均展现出了领先或极具竞争力的性能。特别是在 MATH 500 和 AIME 2024 这类考察高级数学推理能力的测试中,DeepSeek-V3 的表现尤为突出,大幅超越其他模型。 

 

图片

在与 DeepSeek-V2-Base、Qwen2.5 72B Base 和 LLaMA-3.1 405B 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、AIME 2024、MATH-500、CNMO 2024、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 量化,而是采用了更细粒度的量化策略:对激活值采用 1x128 tile-wise 量化,对权重采用 128x128 block-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,新模型的数据构建策略更加精细。首先,大幅提升了数学和编程相关数据在整体数据中的占比,这直接增强了模型在相关领域的推理能力,使其在 MATH 500、AIME 2024 等数学基准测试和 HumanEval、LiveCodeBench 等代码基准测试中表现突出。其次,进一步扩展了多语言数据的覆盖范围,超越了传统的英语和中文,提升了模型的多语言处理能力。 

 

为了保证数据质量,DeepSeek 开发了一套完善的数据处理流程,着重于最小化数据冗余,同时保留数据的多样性。此外,他们还借鉴了近期研究 (https://arxiv.org/abs/2404.10830,Ding et al., 2024) 中提出的文档级打包 (Document Packing) 方法,将多个文档拼接成一个训练样本,避免了传统方法中由于截断导致的上下文信息丢失,确保模型能够学习到更完整的语义信息。