读完论文你应该收获什么?
Problem
- What problem is the paper solving?
DeepSeek-V3 旨在解决大规模混合专家模型(MoE)在训练效率、推理性能和显存占用之间的权衡问题,特别是针对以下挑战:
- 训练成本高昂:传统 MoE 模型(如 GShard)因通信开销和负载不均衡导致训练效率低。
- 长上下文支持不足:现有模型难以高效处理 128K+ token 的上下文窗口。
- 推理速度与精度平衡:低精度训练(如 FP8)的数值稳定性与模型性能难以兼顾。
- Why is this problem important?
- 经济性:降低训练成本(如仅需 2.788M H800 GPU 小时)对开源社区和工业界至关重要。
- 实用性:支持长上下文和代码生成能力是迈向通用人工智能(AGI)的关键步骤。
- 开放性:缩小开源模型与闭源模型(如 GPT-4o、Claude-3.5)的性能差距,推动技术民主化。
Context
- What was the previous state of the art?
- 模型架构:DeepSeek-V2(MoE)、LLaMA-3.1(密集模型)、Qwen2.5(中文优化)。
- 训练技术:张量并行、流水线并行、混合精度训练(BF16/FP16)。
- 局限性:
- MoE 模型的负载失衡导致计算资源浪费。
- 长上下文训练(如 32K+)需要复杂的位置编码扩展(如 YaRN)。
- FP8 训练因累加误差和异常值敏感难以稳定应用。
- How does the paper advance the state of the art?
- 架构创新:
- 无辅助损失负载均衡:动态调整专家偏置(公式16),避免传统辅助损失的性能下降。
- 多令牌预测(MTP):通过多步预测增强模型前瞻性(公式21-25),加速推测解码。
- 训练优化:
- FP8 混合精度框架:分块量化与 CUDA Core 高精度累加(3.3.2节),误差控制至 0.25%。
- DualPipe 流水线并行:计算-通信重叠,减少流水线气泡(3.2.1节)。
- 部署效率:冗余专家动态分配(3.4.1节),支持 128K 上下文推理。
Design
- How is the system designed?
- 核心架构:
- Multi-head Latent Attention (MLA):低秩压缩 KV 缓存(公式1-5),减少显存占用 30 倍。
- DeepSeekMoE:256 路由专家 + 1 共享专家,细粒度负载均衡(公式12-16)。
- 训练框架:
- FP8 量化:激活分块(1x128)、权重组块(128x128),在线计算缩放因子。
- DualPipe 并行:16 路流水线 + 64 路专家并行,隐藏跨节点通信开销。
- 推理优化:
- 动态冗余专家:根据负载统计动态复制高负载专家(3.4.1节)。
- 推测解码:MTP 模块生成候选,主模型并行验证(2.2节)。
- What are the key insights from the design?
- 负载均衡优先:通过动态偏置调整而非硬性约束,平衡性能与效率。
- 硬件-算法协同:分块量化、高精度累加与 Tensor Core 优化紧密结合。
- 长上下文扩展:两阶段 YaRN 扩展(4.3节),逐步适应位置编码变化。
Results
- How is the design evaluated, what are the key results?
- 基准测试:
- 通用能力:MMLU(88.5)、GPQA(59.1),超越 LLaMA-3.1 405B。
- 代码生成:HumanEval(82.6 Pass@1)、LiveCodeBench(40.5),开源模型最佳。
- 长上下文:128K 上下文下 "Needle In A Haystack" 测试准确率 >90%。
- 效率指标:
- 训练成本:2.788M H800 GPU 小时,成本仅为 LLaMA-3.1 的 1/10。
- 推理速度:推测解码加速 1.8 倍(TPS)。
- What related problems are still open?
- 硬件依赖:FP8 训练和 MLA 依赖定制化优化,尚未完全通用化。
- 无限上下文:当前 128K 扩展仍需显式训练,无法动态适应更长输入。
- 评估偏差:tokenizer 的随机分割策略可能无法完全消除边界偏差。
Questions
- What questions do you have?
- 实际部署挑战:动态冗余专家策略在超大规模集群(如千卡级别)中的负载均衡效率如何?
- 量化误差累积:FP8 训练在超长训练周期(如 100T token)中是否会导致模型漂移?
- 多模态扩展:MLA 和 MoE 设计能否直接迁移到多模态模型(如视频生成)?
- 伦理与安全:开放模型的高效代码生成能力是否可能被滥用(如恶意代码生成)?
Introduction
Architecture
Basic Arch
Multi-Head Latent Attention
关于 MLA 的数学公式解析及部分问题探讨请看这篇: Understand MLA 。
DeepSeekMoE with Auxiliary-Loss-Free Load Balancing
关于 DeepSeekMoE 的详解请看这篇: DeepSeekMoE_notes 。这里着重看 V3 中采用的辅助无损负载均衡策略的效果。
Basic Architecture of DeepSeekMoE. 与如 GShard (Lepikhin et al., 2021) 一般的传统 MoE 不同,DeepSeekMoE 使用更细粒度的专家,以及隔离部分专家作为共用者。V3 中的 MoE 仍然采用 V2 类似的共享专家+路由专家的组合。共享专家部分在每一次推理中都使用,而路由专家则按照传统 MoE 方式进行路由。
前馈层输出 的计算方法如下:
- 表示第 个 token 的前馈层输入, 和 分别表示共享专家和路由专家的数量, 表示第 个共享专家或路由专家, 表示激活的路由专家的数量,
- 表示对第 个输入 token 第 个专家的门控得分(gating value), 是 token 和专家的亲和度(affinity),具体的计算方式是将输入向量和每个路由专家的一个内置向量 (centroid vector)做内积并经过 sigmoid 处理,这里就是与 DeepSeek V2 不同之处,V3 采用 sigmoid 处理,并且在所有亲和度得分中采取规范化(normalization),
- 表示第 个 token 和所有路由专家计算的亲和力得分中的 个最高得分组成的集合。
因此整个流程总结起来,就是对于输入 token 向量,首先计算它和每一个专家的亲合度 ,随后选出 ,作为门控得分 ,并对门控得分进行归一化,得到选出的 的专家各自的权重 ,最后按照该权重将各个专家的输出进行加权,和共享专家的计算结果、输入向量加和得到最终输出。
Auxiliary-Loss-Free Load Balancing. 对于 MoE 模型,不平衡的专家负载将导致路由崩溃,并降低在专家并行场景中的计算效率。传统解决方案通常依赖辅助损耗来避免不平衡负载,但过大的辅助损耗将损害模型性能。而辅助无损的负载均衡策略思路是,为每个专家引入一个偏差项 ,并与亲和度得分联系起来用于计算 的路由:
注意,偏差项仅用于路由。门控得分仍将与 FFN 输出相乘,仍然从原始亲和力得分 中导出。在训练过程中,通过监控每个训练步骤的整个批次上的专家负载进行调整——在每个步骤的末尾,如果其对应的专家过载,则将偏差项减少 ,如果其相应的专家负载不足,则将其增加 ,其中 是一个称为偏差更新速度(bias update speed)的超参数。通过动态调整,V3 在训练期间保持专家负载平衡,并获得比通过纯辅助损耗鼓励负载平衡的模型更好的性能。
为什么偏差项能够做到无损?
1. 辅助无损耗的实现 核心机制:通过偏差项 的可学习性,确保所有专家(无论是否被选中)的参数均能通过梯度反向传播更新,从而避免传统 TopK 门控得分的梯度丢失问题。
具体实现:在计算门控得分时,最终的TopK选择基于 而非原始的
- 即使某个专家的原始得分未被选中(即),其偏差项仍可通过梯度调整。
- 优化可间接影响该专家未来的入选概率,从而保持所有专家的可训练性。
意义:
- 避免专家“死亡”:未被选中的专家通过的梯度更新,仍有机会在未来被激活。
- 梯度完整传递:通过的优化,模型为所有专家保留了梯度信号,实现“无损耗”训练。
2. 偏差项的角色 (1)平衡专家利用率
- 若某些专家的原始得分长期较低,其对应的可通过训练逐渐增大,从而提升的整体值,增加入选概率。
- 防止部分专家被过度激活(如热门专家)或完全闲置(如冷门专家),实现负载均衡。
(2)辅助梯度传播
- 在反向传播时,未被选中的专家的梯度为0,但的梯度仍可通过链式法则传递:
即的梯度仍可更新,确保所有专家参数均能被优化。
3. 辅助有损与无损的区别
| 类型 | 机制 | 梯度传播 | 专家利用率 | |----------------|-------------------------------------------------------------------------|---------------------------------------|-----------------------------------| | 辅助有损 | 仅依赖原始得分进行TopK选择,未被选中的专家梯度完全丢失。 | 仅选中的专家接收梯度,其余梯度为0。 | 可能导致部分专家“死亡”。 | | 辅助无损 | 引入偏差项,TopK选择基于的梯度始终可传递。 | 所有专家的均接收梯度,间接优化参数。 | 通过调整,平衡专家利用率。 |
关键区别:
- 有损:未被选中的专家因梯度截断,参数无法更新,导致训练信息损失。
- 无损:通过的梯度传递,所有专家均参与参数优化,避免信息损失。
Complementary Sequence-Wise Auxiliary Loss. 为了避免单一序列中发生极端失衡情况,V3 还采用了互补序列辅助损耗:
- 式 中, 是序列平衡损失(sequence-wise balance loss); 是平衡因子,是一个超参数,为 DeepSeek-V3 分配一个非常小的值; 是第 个路由专家在当前批次中的激活频率; 是第 个路由专家在整个序列中的平均亲和度;这是整个序列平衡损失的核心公式,它通过加权求和的方式,将每个路由专家的激活频率 和其在整个序列中的平均亲和度 结合起来。目标是鼓励模型在单个序列中平衡专家负载,避免某些专家被过度使用或完全未被使用。
- 式 中, 表示指示函数,当条件成立时返回 1,否则返回 0; 表示序列中的 token 数;此公式计算了每个路由专家在序列中被选中的频率。通过统计每个 token 的 Top- 专家选择情况,可以量化每个专家在整个序列中的使用频率。如果某个专家被频繁选中,则 较高;反之则较低。
- 式 中, 表示归一化后的亲和度,表示第 个路由专家对第 个 token 的相对重要性; 表示第 个路由专家对第 个 token 的原始亲和度;此公式对亲和度进行归一化处理,确保每个 token 的亲和度总和为 1,消除了不同 token 之间亲和度绝对值差异的影响,使得后续计算更加公平。
- 式 中,此公式计算了每个路由专家在整个序列中的平均归一化亲和度 ,它反映了每个专家在整个序列中的整体贡献程度。如果某个专家在整个序列中被频繁选中且具有较高的亲和度,则 较高。
互补序列辅助损耗是如何避免单一序列中极端失衡发生的?
通过 控制激活频率: 公式 18 确保了每个路由专家在序列中的激活频率被合理统计。如果某个专家被过度使用(即 过高),则会在 中受到惩罚。
通过 控制亲和度分布: 公式 20 计算了每个路由专家在整个序列中的平均亲和度。如果某个专家的亲和度过高(即 过大),也会在 中受到惩罚。
结合 实现平衡: 最终的 是 和 的加权和。通过最小化 ,模型会自动调整路由策略,使得每个专家的负载在单个序列中趋于平衡。
从而,通过优化序列平衡损失 ,就能促使路由专家在单个序列中的负载趋于平衡。
Node-Limited Routing. 与 DeepSeek-V2 使用的设备限制路由一样,V3 也使用限制路由机制来限制训练期间的通信成本。简而言之,确保每个 token 将被发送到最多 个节点,这些节点是根据分布在每个节点上的专家的最高 亲和分数之和来选择的。在这种约束下,MoE 训练框架几乎可以实现完全的计算通信重叠。
No Token-Dropping. 由于有效的负载平衡策略,V3 在其完整训练期间保持良好的负载平衡。因此,V3 在训练期间不会丢弃任何 token 。此外,V3 还实现了特定的部署策略来确保推理负载平衡,因此在推理过程中也不会丢弃 token。
Multi-Token Prediction
在 V3 中,多词元预测目标(Multi-Token Prediction objective)将预测范围延伸到每个位置的多个未来 token 。MTP 目标通过密集化训练信号从而提高数据效率,并且使得模型预先规划其表示从而更好地预测未来 token 。
MTP Modules
V3 中 MTP 目标的核心思想是通过独立的输出头并行地预测 个额外 token,以顺序预测的额外 token 将保持每个预测深度上因果链的完整性。
准确地说,V3 MTP 使用 个顺序模块来预测 个额外 token ,其中每个 MTP 模块包含一个共用的嵌入层 、一个共用的输出头 、一个 Transformer 块组 、以及一个线性投影矩阵 、一个 RMSNorm 标准化层。
整体的计算流程如下:
若要在第 层预测深度对第 个输入 token 进行预测,则首先将第 个 token 在 层预测深度的表示和第 个 token 的嵌入组合后与线性投影矩阵进行运算,当 时, 指的就是主模型给出的表示(representation)。
解读 的原理
1. 为何拼接第 层表示 与第 个 token 的嵌入 ?
- 当前层信息的保留: 是第层对第i个token的编码结果,包含前层提取的上下文特征。保留该信息可确保预测表示继承已有的语义表征。
- 未来token信息的引入:是第个token的嵌入,代表未来位置的上下文。通过将其与当前层表示拼接,模型在预测当前token时能够显式参考后续token的信息,增强长距离依赖建模能力。
- 多步预测的协同优化:MTP的目标是同时预测多个后续token(如)。通过在不同层k引入对应步长的未来token嵌入,模型能分阶段优化不同距离的预测任务。
2. 为何选择第i+k个token?
- 步长对齐:在层k中,预测目标为第个token。例如:
- 当k=1时,预测;
- 当k=2时,预测;
- 以此类推。这种设计使每一层专注于特定步长的预测任务,实现预测目标的层次化分解。
- 局部性与全局性的平衡:选择i+k而非更远的token(如),可确保未来token位于当前token的局部窗口内,避免引入过多噪声。同时,通过多层叠加(如),模型仍能间接捕捉全局依赖。
3. 为何进行RMSNorm?
- 输入标准化:RMSNorm(Root Mean Square Layer Normalization)对输入进行标准化,公式为:
其中 为可学习参数。RMSNorm通过消除输入特征的尺度差异,提升模型训练的稳定性。
- 对比LayerNorm的优势:
- RMSNorm仅对输入的均方根进行归一化,而传统LayerNorm计算均值和方差。RMSNorm计算更高效,尤其适合大规模模型。
- 实验表明,RMSNorm在保持性能的同时减少了计算开销,是DeepSeek V3的优化选择。
- 双路径归一化:对和分别进行RMSNorm,确保两部分的特征分布一致,避免拼接后因尺度不匹配导致的训练不稳定。
4. 为何需要线性投影矩阵?
- 特征融合与降维:拼接后的向量维度较高(如)。通过线性投影矩阵,将其映射到隐藏维度,既压缩维度又融合特征。
- 步长特异性建模:不同预测步长k可能对应不同的依赖模式(如短距离依赖与长距离依赖)。为每一层k设计独立的投影矩阵,可使模型自适应学习不同步长的特征交互模式。
- 避免过拟合:直接使用高维拼接向量进行预测容易过拟合,而线性投影通过降维和参数共享提升泛化能力。
设计效果总结
| 设计选择 | 作用 | 效果 | |----------------------------|-------------------------------------------------------------------------|---------------------------------------| | 拼接与 | 融合当前层特征与未来token上下文信息 | 增强多步预测的连贯性和长距离依赖建模能力 | | 选择第个token | 对齐预测步长,平衡局部与全局依赖 | 提升预测准确性,尤其对长序列任务有效 | | RMSNorm双路径归一化 | 标准化输入分布,消除尺度差异 | 加速收敛,提升训练稳定性 | | 线性投影矩阵 | 降维与特征融合,步长特异性建模 | 提升泛化能力,避免过拟合 |
技术启示
- 层次化预测:通过分层设计(不同层关注不同预测步长),模型能更高效地分解复杂预测任务。
- 上下文融合:显式引入未来token信息,突破传统自回归模型的单向性限制,提升生成质量。
- 高效归一化:RMSNorm在保证性能的同时降低计算成本,是大规模模型的优选方案。
这一设计通过巧妙的特征融合与步长对齐,实现了高效的多token 预测,是DeepSeek V3在生成任务中表现出色的关键创新之一。
组合后的表示 接着作为第 层深度的 Transformer Block()的输入,以产生当前深度的输出表示:
这里 仍是输入序列的长度,而 代表切片操作(左右皆闭的区间)。Transformer Block 的输出 是经过上下文建模后的表示,相比输入 ,它包含了更丰富的语义信息和上下文相关性。这种变化使得模型能够更好地预测未来词元。
为什么选用 1: T-k 的切片?
在式 中,输入和输出都使用了 的切片,这是因为:
- 在 MTP 模块中,第 层的目标是预测第 个未来词元。
- 对于长度为 的输入序列,第 层只能预测到第 个位置的未来词元,因为后续位置没有足够的上下文信息来生成预测。
- 因此,切片 确保了每一层只处理有效的输入范围,避免越界问题。
这种设计保证了因果性(Causal Chain),即模型只能基于当前及之前的词元生成预测,而不会泄露未来的词元信息。
最后,将 作为输入,共用的输出头会计算出第 个额外预测 token 的概率分布 :
的作用是将隐藏表示 线性映射到 logits 向量再应用 Softmax 处理,从而计算出概率分布(深度学习中,logits 是模型对每个类别的原始预测值,经过 Softmax 归一化后转化为概率分布)。
V3 维护预测的因果链的核心原理与 EAGLE 相类,但主要目标是推测解码(speculative decoding,这里的意思是,快速生成多个候选 token,由主模型并行验证,通过接受率判断是否保留候选,减少解码步骤,获得更高的生成速度),同时还能改进训练效果。
MTP Training Objective
对每个预测深度,都计算出 MTP 的交叉熵损失:
最终整理所有深度 MTP 损失的均值,其会作为 V3 的额外训练目标:
是权重因子。
MTP in Inference
MTP 策略主要是为了改进主模型的性能,因此推理时可以放弃 MTP 模块,让主模型自行推导。另外,还可以将 MTP 重新用于推测解码,进一步改善生成延迟。
Infrastructure
训练硬件:
- 2048 块 Nvidia H800 GPU,分散在 256 个节点中组成集群;
- 节点内部的 8 个 GPU 通过 NVLink 和 NVSwitch 进行连接;节点之间通过 InfiniBand 互联。
Training Framework
V3 的训练框架是从头构建的轻量级训练框架 HAI-LLM,应用了跨 8 节点的 16 路流水线并行(Pipeline Parallelism)和 64 路专家并行(Eexpert Parallelism),以及 ZeRO-1 数据并行(Data Parallelism)。为了促进高效训练,V3 采用了细致的工程优化:
- DualPipe 算法
- 跨节点的全连接通信内核
- 训练中优化内存占用:避免使用开销巨大的张量并行(Tensor Parallelism)
DualPipe and Computation-Communication Overlap
跨节点的专家并行会引入通信开销,导致计算和通信之比接近 1:1,显然计算资源未得到充分利用,因此设计了 DualPipe 算法,通过将前向和后向传播过程中的计算和通信阶段重叠减少流水线的气泡,使得 PP 更高效。
DualPipe 的核心思想是在一对独立的前向和后向块(forward and backward chunk)内重叠计算和通信。具体来说,V3将每个块分为四个部分:attention
、all-to-all dispatch
、MLP
和 all-to-all combine
。特别是,对于向后块,attention
和 MLP
进一步分为两部分,分别用于输入和权重—— backward for input
、backward for weights
。此外,还有一个 PP communication
组件。这些组件在计算和通信过程的分配就如图 4 所示:
在这种重叠策略中,就可以确保在计算过程中可以完全隐藏 all-to-all 和 PP 通信。另外,对于一对前向和后向块,还可以重新排列这些组件,并手动调整专用于通信与计算的 GPU SM 的比例。
在高效的重叠策略基础上,完整的 DualPipe 调度如图 5 所示:
它采用双向流水线调度,同时从流水线两端馈送 micro-batch ,并且可以完全重叠大部分通信。这种重叠也确保了,即使随着模型规模的进一步扩展,只要保持恒定的计算与通信比率,就仍然可以在节点之间采用细粒度的专家,同时实现接近零的 all-to-all 通信开销。
此外,即使在没有繁重通信负担的更一般场景中,DualPipe 算法仍然表现出效率优势。在表 2 中,总结了不同 PP 方法的流水线气泡和内存使用情况:
如表所示,
- 与 ZB1P 和 1F1B 相比,DualPipe 显著减少了气泡,同时仅将激活时内存占用的峰值增加了 倍;
- 尽管 DualPipe 需要保留模型参数的两个副本,但这并不会显著增加内存消耗,因为我们在训练过程中使用了较大的专家并行规模;
- 与 Chimera 双向流水线相比,DualPipe 只要求阶段数和 micro-batch 可被 2 整除,而不要求 micro-batch 可由流水线阶段整除;
- 此外,对于 DualPipe,气泡和激活内存都不会随着 micro-batch 数量的增加而增加。
这些结论是怎么得出来的?
1. 为什么保留双副本参数时,较大的 EP Size 就不会显著增加内存消耗?
EP Size 表示专家并行的粒度,即每个GPU节点分配的专家数量。增大EP Size意味着每个节点负责更多专家,但专家参数在节点间分片存储。
双副本的存储机制:DualPipe保留模型参数的两个副本,分别用于计算和通信。由于专家参数已通过EP分片到多个节点,每个节点的本地参数规模为: ,当EP Size较大时,每个节点的本地参数量减少,即使存储双副本,总内存占用仍可控。
内存优化效果:例如,若总参数量为236B,EP Size=8,则单节点参数量为29.5B。双副本占用59B,而现代GPU显存(如A100 80GB)足以容纳。因此,大EP Size通过分片降低单节点负载,抵消双副本的内存开销。
2. 为什么DualPipe不要求micro-batch数目被流水线阶段整除?
传统流水线的限制:传统流水线并行要求micro-batch数目(记为)必须被流水线阶段数(记为)整除(即),否则部分阶段会出现空闲,产生气泡(Bubble)。
DualPipe的动态调度:DualPipe采用双向流水线调度和动态micro-batch分配:
- 前向与反向重叠:前向计算的某个micro-batch完成后,立即启动其反向传播,无需等待所有micro-batch完成。
- 弹性分块:将micro-batch划分为更细粒度的子块(Chunks),根据阶段负载动态分配子块到空闲设备。
- 非对称通信:计算与通信使用独立CUDA流,允许未完成所有micro-batch时提前启动通信。
通过这些机制,即使,DualPipe仍能最大化设备利用率,避免严格对齐要求。
3. 为什么气泡和激活内存不随micro-batch数目增加?
- 气泡的减少机制:DualPipe通过以下方式消除传统流水线气泡:
- 计算-通信完全重叠:使用异步通信(如NCCL)和计算流水线,确保通信时间被计算任务掩盖。
- 微批次流水线深度解耦:每个micro-batch独立调度,无需等待全局同步,避免因数目不匹配导致的空闲。
- 激活内存的优化:
这些优化使得激活内存与micro-batch数目无关,仅取决于单子块的计算需求。
- 选择性重计算(Selective Recomputation):仅存储关键中间激活(如注意力输出),其余激活在反向传播时动态重计算,减少存储需求。
- 分块处理(Chunking):将micro-batch划分为更小的子块,逐块处理并释放内存,避免同时存储所有子块的激活。
- 内存复用(Memory Pooling):预分配固定大小的内存池,动态分配给不同子块,避免频繁申请/释放操作。
总结
| 设计 | 机制 | 效果 | |-------------------------|-------------------------------------------------------------------------|---------------------------------------| | Large EP Size | 专家参数分片到多节点,降低单节点内存负载;双副本存储被分片稀释。 | 避免显存溢出,支持大规模模型训练。 | | 动态调度与弹性分块 | 异步通信、双向流水线、子块动态分配,消除对齐依赖。 | 允许任意micro-batch数目,减少气泡。 | | 内存优化策略 | 选择性重计算、分块处理、内存复用,限制激活存储需求。 | 激活内存与micro-batch数目解耦。 |
技术启示:
DualPipe通过分片、动态调度和内存优化,在保持计算效率的同时,显著降低了传统流水线并行的限制,是超大规模模型训练的重要创新。
Efficient Implementation of Cross-Node All-to-All Communication
为了节省专用于通信的流式多处理器(Streaming Multiprocessors)的数量,V3 定制了高效的跨节点全对全通信内核(包括调度和组合),其实现是MoE 门控算法和集群的网络拓扑的联合设计。
具体来说,在集群中,跨节点的 GPU 通过 IB 实现完全互连,而节点内通信通过 NVLink 。NVLink 提供 160 GB/s 的带宽,大约是 IB(50 GB/s)的 3.2 倍。为了有效地利用 IB 和 NVLink 的不同带宽,需要限制每个 token 最多分派给 4 个节点,从而减少 IB 流量(若分派到更多节点,IB带宽会成为瓶颈)。对于每个 token ,当做出路由决定时,它将首先通过 IB 传输到目标节点上具有相同节点索引的 GPU。一旦它到达目标节点,就努力确保它通过 NVLink 即时转发到符合其目标专家的特定 GPU,而不会被随后到达的 token 所阻塞。这样,通过 IB 和 NVLink 的通信完全重叠,每个 token 在每个节点可以有效地平均选择 3.2 名专家,数量与带宽比例匹配(即3.2名专家/节点),从而充分利用节点内的高带宽,而不会产生 NVLink 的额外开销。
V3 实际上仅选择 8 个路由专家,但在保持通信开销不变情况下,最高可以扩大规模到 13 个专家( )。总的说来,这种通信策略下,只需要 20 个 SM 就足以充分利用 IB 和 NVLink 的带宽。
GPU 中的几个基本概念。
Streaming Processor. 最基本的处理单元。GPU进行并行计算,也就是很多个 SP 同时做处理。现在SP的术语常常使用thread来代替。一个SP对应一个thread。
Warp. warp是SM调度和执行的基础概念,通常一个SM中的SP会分成几个 warp(也就是SP在SM中是进行分组的,物理上进行的分组),一般每一个 warp 中有32个 SP,这个 Warp 中的32个 SP 是一起工作的,执行相同的指令,如果没有这么多 SP 需要工作,那么这个 warp 中的一些 SP 处于闲置状态(idle)。(每一个 SP 都有自己的寄存器内存和local memory,一个warp中的 SP 是同时执行的,也就是当进行并行计算时,SP 数应尽量为32的倍数,如果线程数不是32的倍数的话,假如是1,则warp会生成一个掩码,当一个指令控制器对一个warp单位的线程发送指令时,32个线程中只有一个线程在真正执行,其他31个 进程会进入静默状态)
Streaming Multiprocessor. 多个SP加上其他的一些资源组成一个 SM,其他资源也就是存储资源,共享内存,寄储器等。可见,一个SM中的所有SP是先分成warp的,是共享同一个memory和instruction unit。从硬件角度讲,一个GPU由多个SM组成(当然还有其他部分),一个SM包含有多个SP(以及还有寄存器资源,shared memory资源,L1cache,scheduler,SPU,LD/ST单元等等)。
为什么最多只需 20 个 SM 即可充分利用带宽?
1. 通信与计算的重叠:
- IB 通信:跨节点数据传输通过异步操作(如NCCL的All-to-All)在后台进行。
- NVLink转发:节点内数据传输通过NVLink即时完成,不阻塞计算流水线。
- SM 利用率:当通信进行时,SM可继续处理已接收数据的计算任务,无需空闲等待。
2. 任务分块与流水线:
- 微批次(Micro-batch)划分:将输入数据分为小块,通过流水线调度在不同SM上并行处理。
- 动态负载均衡:根据SM的负载动态分配任务,确保所有SM始终处于忙碌状态。
3. SM数量与带宽匹配:
- 带宽饱和条件:当通信带宽(IB + NVLink)被完全利用时,所需的SM数量由计算任务的并行度决定。
- 实验优化:通过实验验证,20个SMs足以覆盖通信带宽的峰值需求(即IB和NVLink的总带宽为50+160=210 GB/s,每个 SM 可处理的计算吞吐量为 10 GB/s),同时保持计算任务的高吞吐量。
更进一步,可以通过 warp specialization 技术,将 20 个 SM 划分为 10 个通信信道。
- 在
dispatch
过程中,有三个步骤:(1)IB 发送,(2)IB 到 NVLink 转发,以及(3)NVLink 接收,三者由各自的 warp 处理。分配给每个通信任务的 warp 数量根据所有 SM 的实际工作负载动态调整。 - 同样,在
combine
过程中,同样是三个步骤:(1)NVLink 发送,(2)NVLink 到 IB 的转发和累积,以及(3)IB 接收和累积,也均由动态调整的 warp 处理。 - 此外,
dispatch
和combine
内核都与计算流重叠,因此还需要考虑它们对其他 SM 计算内核的影响——具体来说,采用定制的 PTX(并行线程执行)指令并自动调整通信块大小,这大大减少了 L2 缓存的使用和对其他 SM 的干扰。
Warp Specialization 对 SM 划分信道有什么作用?
1. Warp Specialization技术及其作用 Warp Specialization 是一种GPU并行优化技术,通过将不同功能的计算任务分配给专用的Warp(GPU调度单位),以减少资源竞争并提升执行效率。在DeepSeek-V3中,其作用如下:
- 任务分离:
- 通信任务专用Warp:将通信相关操作(如IB发送、NVLink转发)分配给特定Warp,与计算任务(如专家前向传播)分离。
- 计算任务专用Warp:剩余Warp专注于模型计算,避免因通信任务抢占计算资源导致的延迟。
- 动态负载均衡:
根据实时通信负载(如IB或NVLink的数据量),动态调整分配给不同通信任务的Warp数量。例如,当IB发送任务繁重时,分配更多Warp处理IB发送,反之亦然。效果:
- 减少因任务混合执行导致的上下文切换开销。
- 提升通信与计算的并行度,隐藏通信延迟。
2. 信道拆分与组合对网络拓扑的改进 网络拓扑改进的核心是通过 物理信道逻辑分片 和 任务隔离 优化数据传输路径:
- 信道拆分:
将20个SM划分为10个独立的通信信道,每个信道负责特定通信阶段:
- IB发送:跨节点数据传输。
- IB-to-NVLink转发:节点内数据从IB接收端转发至NVLink发送端。
- NVLink接收:节点内通过NVLink接收数据。
- 信道组合:
在数据聚合阶段,反向操作:
- NVLink发送:节点内数据通过NVLink发送。
- NVLink-to-IB转发:数据从NVLink接收端转发至IB发送端。
- IB接收与累积:跨节点数据接收并聚合。
改进体现:
- 路径专用化:不同通信阶段使用独立信道,避免数据流交叉导致的拥塞。
- 带宽匹配:根据IB(50 GB/s)和NVLink(160 GB/s)的带宽差异,动态分配信道资源。例如,NVLink信道数量多于IB信道,以匹配其高带宽。
3. PTX指令自动调整通信块大小的影响 PTX指令调整通信块大小 通过以下机制减少L2缓存使用和SM干扰:
- 缓存局部性优化:
- 小块传输:较小的通信块(如4KB)能更好地利用L2缓存行(通常128B-1MB),减少缓存行污染。
- 预取控制:自动调整块大小可避免一次性加载过大数据块,导致后续计算任务的缓存失效。
- 干扰减少机制:
- 资源竞争缓解:大块通信会长时间占用L2缓存和内存控制器,阻塞其他SM的访问。通过动态调整块大小,确保通信任务间歇性释放资源。
- 流水线化传输:小块数据可更灵活地插入计算任务的间隙中,减少SM的空闲等待。
干扰产生的原因:
- 共享资源竞争:
- L2缓存:所有SM共享L2缓存,大块通信数据占用大量缓存空间,导致计算任务缓存命中率下降。
- 内存控制器:频繁的大块数据传输会占用内存带宽,延迟其他SM的内存访问请求。
- SM计算单元:通信任务占用SM执行资源(如寄存器、线程束调度器),影响计算任务并行度。
4. 技术整合与综合效果
| 技术 | 机制 | 效果 | |--------------------------|-------------------------------------------------------------------------|---------------------------------------| | Warp Specialization | 分离通信与计算任务到专用Warp,动态调整负载。 | 减少上下文切换,提升并行效率。 | | 信道拆分与组合 | 按通信阶段划分独立信道,匹配带宽差异。 | 优化数据传输路径,降低拥塞和延迟。 | | PTX指令调整块大小 | 动态选择小块通信,优化缓存利用和资源释放。 | 减少L2缓存竞争和SM干扰,提升整体吞吐。 |
示例说明:
假设一个通信任务需传输1MB数据:
- 传统方式:一次性传输1MB,占用整个L2缓存,阻塞其他SM访问。
- PTX调整后:拆分为256个4KB块,逐块传输。每传输完一个块,释放缓存供计算任务使用,同时SM在块间隙执行计算,实现通信-计算完全重叠。
Extremely Memory Saving with Minimal Overhead
主要采用了以下三种方案减少训练中的内存占用:
Recomputation of RMSNorm and MLA Up-Projection. 通过选择性重计算(Selective Recomputation),在反向传播时动态重新计算部分中间结果(如RMSNorm的输出和MLA上投影的中间激活),而非在前向传播时存储它们。
- 内存节省效果:减少中间激活的存储量,直接降低单卡显存占用。即使不使用TP分片参数,也能通过重计算在更少显存下运行更大模型,从而减少对TP的需求。
Exponential Moving Average in CPU. 指数移动平均(EMA)用于平滑模型参数,可以在学习率衰减后提早估计模型的性能,从而提升训练稳定性。传统实现中,EMA参数通常与模型参数一起存储在GPU显存中。对于超大规模模型,EMA参数的存储会显著增加显存占用,迫使使用TP来分片参数。V3 的实现是,将EMA参数存储在CPU内存中,而非GPU显存。由于CPU内存容量远大于GPU显存,EMA参数的存储不再受限于显存容量。
- 内存节省效果:释放GPU显存,EMA参数不再占用显存,允许在单卡上存储更多模型参数或中间结果;减少对TP的依赖,无需通过TP分片参数即可缓解显存压力,简化并行策略。
Shared Embedding and Output Head for Multi-Token Prediction. 传统Transformer中,输入嵌入层和输出投影层是独立的参数矩阵。在多Token预测任务中,若每个Token单独预测,输出头的参数量会随预测Token数线性增长,进一步增加显存需求。而利用 DualPipe 策略,可以将最浅层(即嵌入层)和最深层(即输出层)可以存放在相同 PP rank 的阶段中,这样的安排使得输入嵌入层和输出投影层的参数和梯度实现直接的共享。
综合效果:为何能减少对TP的依赖?
TP的显存代价:虽然TP通过分片参数降低单卡显存需求,但会引入额外的通信开销(如All-Reduce操作)和中间结果的存储冗余(如分片后的激活值)。对于某些操作(如大规模矩阵乘法),TP可能反而增加显存占用。
替代优化手段:上述三种方法通过以下方式直接优化显存使用:
- 重计算减少中间激活存储;
- EMA存CPU释放显存;
- 参数共享降低总参数量,而在不依赖TP的情况下,显存占用已足够低,使得模型可以在更少的GPU或更简单的并行策略(如仅用数据并行DP)下训练。
总结
|方法|内存优化机制|对TP依赖的影响| |---|---|---| |重计算|减少中间激活的存储,节省显存|降低TP的必要性,允许更少分片或更高单卡利用率| |EMA存CPU|将EMA参数移至CPU内存,释放显存|减少TP分片参数的需求,简化并行策略| |共享嵌入与输出头|减少总参数量,多Token预测优化计算效率|降低模型整体显存需求,减少TP分片压力|
这些方法通过显存优化,使得即使不使用TP分片,也能在单卡或更少并行度下高效训练大规模模型,同时避免了TP带来的通信和实现复杂性。
FP8 Training
低精度训练已有广泛研究并且未来可期,但仍受限于当前激活、权重、梯度,在大规模语言模型的预训练中缺乏有效的研究和应用。V3 提出了细粒度的量化策略: 个元素的片分组和 个元素的块分组。
FP8 精度的运算(例如通用矩阵乘法 GEneral Matrix Multiplication)想要保证精确的关键,在于经过精度增加的累积处理,大大减轻相关的去量化。此外,为了进一步减少 MoE 训练中的内存和通信开销,V3 以 FP8 格式对激活值进行缓存和调度,以 BF16 格式存储低精度优化器的状态。
什么是 FP8?
FP8 Data Format 的提出:FP8 是一种浮点数格式,用于在深度学习模型中进行高效的数值计算和存储。它是由 2022 年 NVIDIA 在论文《 FP8 Formats for Deep Learning》中提出的。这篇论文详细探讨了 FP8 格式的设计及其在深度学习中的应用。
FP8 的具体含义:FP8 是一种 8位浮点数格式,相比传统的 16 位(FP16)或 32 位(FP32)浮点数格式,FP8 使用更少的位数来表示数值,从而显著减少了内存占用和计算开销。FP8 的设计目标是在保持模型精度的同时,提升硬件加速器(如 GPU 或 TPU)的计算效率。
FP8 的格式:
- 符号位 (Sign Bit): 1 位,表示数值的正负。
- 指数位 (Exponent Bits): 4 位或 5 位,用于表示数值的范围。
- 尾数位 (Mantissa Bits): 3 位或 2 位,用于表示数值的精度。
FP8 的两种常见变体:
- E4M3: 4 位指数,3 位尾数。
- E5M2: 5 位指数,2 位尾数。 这两种格式分别适用于不同的应用场景。例如,E4M3 更适合表示较小范围但较高精度的数值,而 E5M2 更适合表示较大范围但较低精度的数值。
其他常见的数值格式 1. FP16 (Half Precision):16 位浮点数格式,包括 1 位符号位、5 位指数位和 10 位尾数位。常用于混合精度训练(Mixed Precision Training),以减少显存占用并加速计算。
2. BF16 (Brain Floating Point):16 位浮点数格式,包括 1 位符号位、8 位指数位和 7 位尾数位。相比 FP16,BF16 提供更大的数值范围,但牺牲了一些精度。它常用于 Google 的 TPU 和某些 NVIDIA GPU。
3. INT8 (8-bit Integer):8 位整数格式。通常用于量化(Quantization),通过将浮点数映射到整数范围来减少计算复杂度。INT8 常用于推理阶段,能够显著提高推理速度并降低功耗。
4. FP32 (Single Precision):32 位浮点数格式,包括 1 位符号位、8 位指数位和 23 位尾数位。是深度学习中最常用的高精度格式,适用于训练和推理。
5. FP64 (Double Precision):64 位浮点数格式,包括 1 位符号位、11 位指数位和 52 位尾数位。提供极高的精度,但计算和存储开销较大,通常仅用于科学计算。
“几位量化”指的是将浮点数(如 FP32 或 FP16)转换为低精度的数值格式(如 INT8 或 FP8)的过程。量化的主要目的是减少模型的存储需求和计算复杂度,同时尽量保持模型的性能。
- 8 位量化:将 FP32 或 FP16 转换为 8 位整数(INT8)或 8 位浮点数(FP8)。例如,将一个 FP32 数值范围
[0, 1]
映射到 INT8 的范围[0, 255]
。- 16 位量化:将 FP32 转换为 FP16 或 BF16。这种量化方式在深度学习中非常常见,尤其是在混合精度训练中。
- 4 位量化:将 FP32 转换为 4 位整数(INT4)或其他低精度格式。4 位量化进一步压缩了模型大小,但可能会导致较大的精度损失或数值溢出。
经过两个类似于 DeepSeek-V2-Lite 和 DeepSeek V2 的模型尺度上 1 trillion tokens 训练的验证,FP8 训练模型相对于基线 BF16 的相对损失误差一直保持在 0.25%以下,这是处于训练随机性可接受范围内的效果。
Mixed Precision Framework
核心思路是:大多计算密集型操作在 FP8 格式执行,少数关键操作有策略地维持原数据格式以平衡训练效率(准确说是稳定训练动态,降低崩溃几率从而提高效率)和数值稳定。
首先,为了加速模型训练,大多数核心计算内核(core computation kernel),即 GEMM 操作,都是以 FP8 精度实现的。这些 GEMM 操作接受 FP8 张量作为输入,并以 BF16 或 FP32 格式输出。如图 6 所示,与线性算子相关的所有三个 GEMM,即 Fprop
(forward pass)、Dgrad
(activation backward pass)和 Wgrad
(weight backward pass),都以 FP8 格式执行。与原始的 BF16 方法相比,这种设计理论上可以将计算速度提高一倍。此外,FP8 Wgrad
GEMM 允许将激活值以 FP8 格式存储,以用于反向传递。这大大降低了内存消耗。
尽管 FP8 格式具有效率优势,但由于对低精度计算的敏感性,某些运算需要更高的精度。此外,一些低成本运算还可以利用更高的精度,而对整体训练成本的开销可以忽略不计。因此,经过仔细调查,以下组件的原始精度需要保持(例如 BF16 或 FP32):嵌入模块、输出头、MoE 门控模块、归一化运算和注意力运算。这些有针对性的高精度保留确保了 V3 训练动态的稳定。为了进一步保证数值稳定性,需要以更高的精度存储主权重、权重梯度和优化器状态。尽管这些高精度组件会导致一部分显存开销,但可以通过在分布式训练系统中跨多个 DP rank 进行有效的分片(sharding),从而最大限度地减少它们的影响。
Improved Precision from Quantization and Multiplication
基于混合精度的 FP8 训练框架,V3 采用了一些策略来强化低精度训练的准确度,聚焦于量化方法和乘法处理。
1. Fine-Grained Quantization. 在低精度训练框架中,由于 FP8 格式的范围有限,存在上溢和下溢风险。一般做法是,将输入张量的最大绝对值缩放到 FP8 的最大可表示值,将输入分布与 FP8 格式的可表示范围对齐。但此方法会导致低精度训练对激活异常值高度敏感,严重降低量化精度。
为了解决这个问题,V3 提出了一种细粒度量化方法,该方法在更细粒度的级别上应用缩放。如图 7(a)所示:
- 对于激活,在 的分片基础上对元素进行分组和缩放(即每 128 个通道对应一个 token);
- 对于权重,以 的分块为基础(即每 128 个输入通道每 128 个输出通道)对元素进行分组和缩放。 这种方法通过根据较小的元素分组调整放缩,确保量化过程能够更好地适应离群值。在附录B.2 中,进一步讨论了以类似权重量化的方式在块的基础上对激活进行分组和缩放时的训练不稳定性。此方法的关键改变是沿 GEMM 操作的内部维度引入每组缩放因子,原本标准 FP8 GEMM 不支持此功能,但结合下面的精确 FP32 累积策略可以实现。
2. Increasing Accumulation Precision. 低精度 GEMM 操作饱受下溢问题之困扰,其准确性很大程度上取决于高精度的累积(通常在 FP32 精度下进行)。然而,FP8 GEMM 在 NVIDIA H800 GPU 上的累积精度仅限于保留约 14 位,远低于 FP32 的累积精度。当内部维度 K 较大时(大规模模型训练的典型场景,此时训练中批量大小和模型宽度都会增加),这个问题将变得更加明显。
以 K=4096 的两个随机矩阵的 GEMM 运算为例,张量核(Tensor Core)中有限的累积精度将导致最大相对误差接近 2%。尽管存在这些问题,有限的累积精度仍然是少数 FP8 框架的默认选项,严重限制了训练精度。
为了解决这个问题,V3 采取了 promotion to CUDA Core 以提高精度的策略。该过程如图 7(b)所示,具体来说,在 Tensor Core 上执行 MMA(矩阵乘法累加)期间,使用有限的位宽累加中间结果。一旦达到 区间,这些部分结果将被复制到 CUDA Core 上的 FP32 寄存器,在那里进行全精度 FP32 的累加。如前所述,细粒度量化会沿着内部维度 K 应用每组缩放因子。这些缩放因子可以在 CUDA Core 上高效地相乘,作为去量化过程,额外的计算成本最小。
从 FP32 重新量化为 FP8 是否会产生不可接受的精度损失?
- 分组缩放因子的作用:
在论文中提到,FP8 计算结合了 per-group scaling factors(按组缩放因子)。这些缩放因子可以有效地调整每组数据的动态范围,从而减少量化误差。
当 FP32 寄存器完成高精度累加后,结果会被重新量化为 FP8 格式。由于缩放因子的存在,重新量化的过程可以保持较高的精度,避免因返回 FP8 而引入显著误差。
- 有限的数据移动:
- 数据仅在达到阈值 时从 Tensor Core 复制到 CUDA Core,而不是每次计算都进行数据移动。这种设计减少了频繁的量化和反量化操作,从而降低了精度损失的风险。
- 高精度累积的优势:
- FP32 累积确保了中间结果的高精度,即使最终结果被重新量化为 FP8,其精度仍然优于直接在 FP8 中进行低精度累积的结果。
因此,尽管 FP32 的结果需要重新量化为 FP8,但由于 per-group scaling factors 和 有限的数据移动,精度损失被控制在可接受范围内,累积精度提升的效果不会失效。
什么是沿着内部维度应用每组缩放因子?
内部维度(inner dimension) 是矩阵乘法的核心维度,决定了矩阵乘法的计算复杂度()。在神经网络中, 通常对应于模型的宽度(例如隐藏层的维度)或批量大小,尤其是在 Transformer 模型中, 的大小直接影响注意力机制和前馈网络的计算量。
为什么 inner dimension 过大会导致误差增大?
- 在 FP8 GEMM 中,Tensor Core 使用有限的位宽进行累积。当 很大时,累积操作会涉及大量的浮点数相加,误差会逐渐累积,导致最终结果的精度下降(误差随 增长)。
- 例如,假设每个 FP8 数字的误差为 ,那么在 很大的情况下,累积误差可能达到 ,这会显著影响计算的准确性。
Per-Group Scaling Factors 的概念:
- Scaling Factor(缩放因子) 是一种用于调整数据动态范围的技术。在低精度训练中,缩放因子的作用是将输入数据映射到 FP8 可表示的范围内,从而减少量化误差。Per-Group Scaling Factors 是指对数据进行分组,并为每个组单独计算缩放因子,而不是对整个张量使用一个全局缩放因子。
- 沿 Inner Dimension 应用 Per-Group Scaling Factors:将 维度划分为多个小组(例如每组包含 个元素),对每个小组分别计算缩放因子,使得每个小组的数据都能适应 FP8 的动态范围。在计算过程中,使用这些缩放因子对数据进行量化和反量化。
- 具体实现:假设 ,我们将其划分为 的小组,则共有 个小组。每个小组的数据会根据其最大值计算一个缩放因子 ,然后将数据量化为 FP8 格式。在累加过程中,缩放因子会被应用到对应的组中,确保每组数据的精度得到优化。
- 优点:1. 减少量化误差:Per-group scaling factors 能够更好地适应数据的分布特性,尤其是对于具有较大动态范围的数据;2. 提高计算效率:缩放因子可以与 CUDA Core 的高精度累加操作结合,进一步减少误差积累。
值得注意的是,此修改降低了单个 warpgroup 上的 WGMMA(WarpGroup MMA)指令发布率。然而,在 H800 架构上,两个 WGMMA 同时存在是很常见的:当一个 warpgroup 执行 promotion 操作时,另一个能够执行 MMA 操作。这种设计实现了两个操作的重叠,保持了 Tensor 核心的高利用率。根据实验,设置 个元素,相当于 4 个 WGMMA,代表了可以在不引入大量开销的情况下显著提高精度的最小累积间隔。
3. Mantissa over Exponents. 与先前工作采用的混合 FP8 格式不同——在 Fprop
中使用 E4M3,在 Dgrad
和 Wgrad
中使用 E5M2。V3 在所有张量上都采用 E4M3 格式以获得更高的精度,这种方案的可行性归因于细粒度量化策略,即分片和分块缩放。通过对较小的元素组进行操作,此方法在这些分组的元素之间有效地共享指数位,减轻了有限动态范围的影响。
4. Online Quantization. 过去的工作是将延迟量化(delayed quantization)用于张量层级的量化框架,该框架维护了先前迭代中的历史最大绝对值,以推断当前值。为了确保准确的放缩并简化框架,本工作中在线计算每个 1x128 激活分片或 128x128 权重分块的最大绝对值。在此基础上,推导出缩放因子,然后将激活或权重在线量化为 FP8 格式。
在线量化相比较延迟量化的优势是什么?
缩放因子的推导方法
在 在线量化(Online Quantization) 中,缩放因子的推导基于每个 1x128 激活片(activation tile) 或 128x128 权重块(weight block) 的最大绝对值。具体过程如下:
1. 计算最大绝对值:
- 激活:按 1x128 分块(每 token 的 128 个通道)计算绝对值的最大值 。
- 权重:按 128x128 分块(每 128 输入通道 × 128 输出通道)计算绝对值的最大值 。
2. 推导缩放因子:
- 假设 FP8 可表示的最大值为 ,如 E4M3 格式的 , 表示极小值,则
- 缩放因子 的计算公式为:
3. 量化与反量化
- 量化:将原始值 映射为 FP8: 。
- 反量化:在计算中使用时恢复为高精度: 。
这种方法的核心是通过细粒度分组(tile-wise 或 block-wise)来动态、独立地适应局部数据分布,从而减少量化误差。
在线量化的优势
相比于过去的工作(如 NVIDIA 的延迟量化,Delayed Quantization),在线量化的改进主要体现在以下几个方面:
- 延迟量化:
- 需要维护一个滑动窗口或指数平均,存储先前迭代中的历史最大绝对值 ,更新公式如: ;对历史值的维护也需要付出额外代价。
- 滞后性与异常值敏感:这种方法假设当前数据分布与历史数据分布相似,但当数据分布发生剧烈变化时,可能会导致不准确的缩放因子,这些个别的极端值可能会污染长期统计,导致后续量化误差累积。
- 静态分组问题:通常使用张量级(tensor-wise)量化,无法细粒度地适应局部特征。
- 在线量化:
- 动态范围实时适应:直接基于当前块的数据分布计算缩放因子,无需依赖历史数据。这使得在线量化能够更好地适应数据分布的变化,尤其适合训练初期或参数剧烈更新的场景下。
- 细粒度分块处理:激活按 1x128 分块:适应 token 内不同通道的动态范围差异(如某些通道激活值显著高于其他通道)。权重按 128x128 分块:匹配 GEMM 计算的分块粒度,减少跨块依赖。
- 对异常值的鲁棒性:局部分块将异常值限制在单个块内,避免全局缩放因子被极端值主导。例如,某 token 的 128 维中仅少数通道出现异常值,仅影响当前块的量化。
- 简化训练流程:无需维护复杂的历史状态,降低系统复杂性,减少潜在的错误源。
- 硬件友好性:与 TMA(Tensor Memory Accelerator)融合:在从全局内存加载数据到共享内存时,同步完成分块统计与量化(图 7b),减少额外内存访问。Warp 级指令优化:使用 CUDA warp 内的并行计算,高效实现分块最大值搜索和量化操作。
- 工程中的验证:
- 精度稳定性:在线量化使 FP8 训练的损失曲线与 BF16 基线接近(相对误差 < 0.25%),显著优于张量级延迟量化(图 10)。
- 吞吐量提升:通过分块量化与 TMA 融合,减少 50% 的全局内存访问,训练速度提升 1.3 倍(对比 NVIDIA 原有 FP8 方案)。
- 长尾分布适应性:在包含稀疏异常值的数据集(如代码生成任务)中,在线量化的困惑度(perplexity)波动更小。
Low-Precision Storage and Communication
结合 FP8 框架,可以通过压缩缓存的激活值和优化器状态到低精度格式,进一步减少显存消耗和通信开销。
Low-Precision Optimizer States. 采用 BF16 数据格式而不是 FP32 来跟踪 AdamW 优化器中的第一和第二时刻,这不会导致明显的性能下降。然而,主权重(由优化器存储)和梯度(用于批量累积)仍保留在 FP32 中,以确保整个训练过程中的数值稳定性。
Low-Precision Activation. 如 Fig6 所示,Wgrad
操作以 FP8 精度执行。为了减少显存消耗,很直觉的选择是将激活值以 FP8 格式缓存,便于线性运算符反向传递。然而为了低成本的高精度训练,有几个特殊运算符需要考虑:
- Input of the
Linear
after the attention operator. 这些激活也用于注意力运算符的后向传递,因此对精度很敏感。所以采用针对这些激活定制的E5M6数据格式。此外,这些激活将在反向传播过程中从 1x128 量化分片转换为128x1 的量化分片。为了避免引入额外的量化误差,所有缩放因子都是四舍五入的,即2的整数幂。 - Inputs of the SwiGLU operator in MoE. 为了进一步降低显存消耗,需要缓存SwiGLU运算符的输入,并在反向过程中重新计算其输出。这些激活也通过细粒度量化方法存储在FP8中,在内存效率和计算精度之间取得了平衡。
一些问题
定制 E5M6 格式的设计与硬件适配性
- E5M6 格式定义
- 结构:5 位指数(Exponent) + 6 位尾数(Mantissa),动态范围与精度介于 FP16 和 FP8 之间。
- 动态范围:指数位宽 5,范围 [-14, 15](与 FP16 对齐),尾数精度 6 位(介于 FP16 的 10 位和 FP8 的 3 位之间)。
- 定制动机:
- 注意力反向传播敏感:注意力层的梯度计算对精度敏感(尤其是 softmax 和矩阵乘法),需保留更大尾数以减少舍入误差。
- 兼容性:E5 指数与 FP16 对齐,避免跨精度转换时的范围溢出(如 FP8 E4M3 的指数范围 [-6, 7] 远小于 FP16)。
- 硬件适配性
- 原生支持:H800 GPU 不支持 E5M6 格式,需通过软件模拟:
- 存储格式:激活以 8 位存储(E5M6),但计算时转换为 BF16/FP32。
- 计算优化:利用 Tensor Core 的 FP16 计算单元,通过掩码和移位操作模拟 E5M6 运算。
- 性能影响:实测中,E5M6 的反向量化开销比 FP8 高 15%,但通过减少内存占用(激活内存降低 50%),整体吞吐量提升 20%。
缩放因子为 2 的整数幂的原因
量化/反量化简化: 缩放因子 时,乘法/除法可通过位移操作实现,避免浮点运算引入额外误差。
硬件友好性:
- 整数运算加速:GPU 的整数单元(如 INT32 ALU)可高效处理位移操作,比浮点乘法快 3-5 倍。
- 精度一致性:2 的幂次缩放确保量化网格均匀分布,避免非幂次缩放导致的精度跳跃。
误差控制:
论文指出,幂次缩放使最大量化误差从随机缩放的 0.1% 降至 0.05%(附录 B.2)。SwiGLU 运算符的特殊处理
- SwiGLU 的作用:SwiGLU(Swish-Gated Linear Unit)是 MoE 专家中的核心非线性激活函数,公式为:
其中 , 为逐元素乘。
优势:更强的非线性建模能力,能够更好地捕捉复杂的特征交互,尤其在稀疏专家模型中提升模型容量。
显存占用问题:SwiGLU 的输出维度通常较大(如 2048 维),若直接缓存输出,显存占用为 。例:batch_size=2048、seq_len=4096 时,FP32 缓存需 2048 * 4096 * 2048 * 4 B = 64 GB,远超 GPU 显存容量。另外,在 MoE 架构中,每个 token 可能会被路由到多个专家,导致 SwiGLU 的输入和输出数据量显著增加
重计算策略:
- 缓存输入:仅存储 SwiGLU 的输入 (FP8 格式),显存占用降至 16 GB。
- 反向传播时重算输出:利用缓存的输入 重新计算 SwiGLU 的输出,避免存储中间激活。
时间-显存权衡:
- 显存节省:减少 75% 的激活内存(从 FP32 降至 FP8)。
- 计算开销:重计算引入额外少量的时间成本,但通过以下优化缓解:
- 算子融合:将 SwiGLU 的前向与反向计算合并为单一核函数,减少内存访问。
- 异步执行:在反向传播期间,利用空闲 SM 资源并行重计算。
- 这种策略通过牺牲少量计算时间来显著降低显存占用。
重计算的时间和显存资源置换是否值得?
- 显存瓶颈场景:
- 长序列训练(如 128K 上下文):显存节省直接决定模型是否可训练。
- 大规模 MoE 模型:专家数量多,激活存储呈指数增长,重计算是必要选择。
- 计算资源充足场景:
若 GPU 显存充足但算力受限(如推理任务),可能更倾向于直接存储激活而非重计算。- DeepSeek-V3 的权衡:论文选择重计算 SwiGLU,因 MoE 模型的显存压力远大于计算开销,且通过硬件优化(如 FP8 计算、NVLink 带宽)部分抵消了时间成本。这种策略使得 DeepSeek-V3 能够在有限的硬件资源下训练更大规模的模型。
设计哲学:在低精度训练中,显存效率是核心矛盾,计算开销可通过工程优化部分补偿。
Low-Precision Communication. 通信带宽是 MoE 模型训练的关键瓶颈。为了缓解这一挑战,将 MoE 向上投影之前的激活量化为 FP8,然后应用 dispatch
组件,该组件与 MoE 向上投影中的 FP8 Fprop
兼容。与注意力运算符后的 Linear
输入一样,此激活的缩放因子是 2 的整数次幂。在 MoE 向下投影之前,对激活梯度应用了类似的策略。对于前向和后向 combine
组件,将其保留在 BF16 中,以保持训练流水线中关键部分的训练精度。
Inference and Deployment
为了同时确保在线服务的服务水平目标(Service-Level Objective)和高吞吐量,采用了以下部署策略,将预填充和解码阶段分开。
Prefilling
预填充阶段的最小部署单元由 4 个节点(32 个 GPU)组成。
attention
部分采用 4-way TP 和序列并行(Sequence Parallelism),并结合 8-way DP 。其 4-way TP 的小尺寸限制了 TP 通信的开销。- 对于
MoE
部分,使用 32-way EP ,这确保了每个专家处理足够大的批处理量,从而提高了计算效率。 - 对于
MoE
的全对全通信,使用与训练中相同的方法:首先通过 IB 在节点之间传输 token ,然后通过 NVLink 在节点内 GPU 之间转发。特别是,对浅层中的密集 MLP 使用 1-way TP 来节省 TP 通信。
为了在 MoE
部分的不同专家之间实现负载平衡,需要确保每个 GPU 处理的 token 数量大致相同。为此,引入了一种冗余专家(redundant experts)的部署策略,该策略复制高负载专家并冗余部署:
- 高负载专家根据在线部署期间收集的统计数据进行检测,并定期进行调整。
- 在确定冗余专家集后,根据观察到的负载情况在节点内的 GPU 之间仔细重新排列专家,努力在不增加跨节点全对全通信开销的情况下尽可能地平衡 GPU 之间的负载。
- 为了部署 DeepSeek-V3,预填充阶段设置了 32 名冗余专家。对于每个 GPU,除了它托管的原始 8 名专家外,它还将托管 1 名冗余的专家。
此外,在预填充阶段,为了提高吞吐量、隐藏全对全以及 TP 通信的开销,需要同时处理具有相似计算工作负载的两个 micro-batch ,将一个 micro-batch 的 attention
和 MoE
与另一个的 dispatch
和 combine
重叠。
最后,deepseek 团队正在探索一种针对专家的动态冗余策略,其中每个 GPU 容纳更多的专家(例如,16 名专家),但在每个推理步骤中只有 9 名专家会被激活。在每一层的全对全操作之前,实时计算全局最优路由方案。考虑到预填充阶段涉及大量计算,计算此路由方案的开销几乎可以忽略不计。
Decoding
在解码过程中,将共享专家视为路由专家。从这个角度来看,在路由过程中,每个 token 将选择 9 个专家,其中共享的专家被视为一个总是被选择的重负载专家。解码阶段的最小部署单元由 40 个节点(320 个 GPU)组成。
attention
部分使用 TP4 和 SP,结合 DP80,MoE
部分使用 EP320。对于 MoE 部分,每个 GPU 只托管一个专家,其中 64 个 GPU 负责托管冗余专家和共享专家。dispatch
和combine
部件的全对全通信是通过 IB 上的直接点对点传输来实现的,以实现低延迟。- 此外,利用 IBGDA 技术进一步减少延迟并提高通信效率。
与预填充类似,解码时根据在线服务所统计的专家负载,在一定间隔内定期确定冗余专家集。但是不需要重新安排专家,因为每个 GPU 只托管一个专家。DeepSeek 也在探索解码的动态冗余策略。然而,这需要对计算全局最优路由方案的算法进行更仔细的优化,并与 dispatch
内核融合以减少开销。
此外,为了提高吞吐量并隐藏所有对所有通信的开销,DeepSeek 还在探索 decoding 同时处理具有相似计算工作负载的两个 micro-batch 。与预填充不同,attention
在解码阶段消耗了更多的时间。因此,将一个 micro-batch 的 attention
与另一个 micro-batch 的 dispatch+MoE+conbine
重叠。在解码阶段,每个专家的 batch size 相对较小(通常小于 256 个 token ),瓶颈是内存访问而不是计算(batch size 小,意味着要反复从显存中获取 batch)。由于 MoE 部分只需要加载一位专家的参数,因此内存访问开销最小,因此使用较少的 SM 不会显著影响整体性能。因此,为了避免影响 attention
部分的计算速度,可以只将一小部分 SM 分配给 dispatch+MoE+combine
。
Suggestions on Hardware Design
DeepSeek 对 AI 供应商的建议。
Communication Hardware
在 DeepSeek-V3 中,通过计算和通信之间的重叠,以隐藏计算过程中的通信延迟。与串行计算和通信相比,这大大降低了对通信带宽的依赖。然而,当前的通信实现依赖于昂贵的 SM(例如,为此目的在 H800 GPU 中可用的 132 个 SM 中分配了 20 个),这将限制计算吞吐量。此外,使用 SM 进行通信会导致显著的效率低下,因为 Tensor Core 被完全利用(这句话读起来别扭,实际意思是:Tensor Core 作为现代 GPU 的核心计算单元,专为矩阵乘法和累加操作(GEMM)优化,是深度学习训练中最重要的硬件资源,当 SM 被用于通信任务时,这些 SM 就无法参与计算任务,尤其是 Tensor Core 的高吞吐量计算。如果 Tensor Core 被完全利用,即处于满负荷运行状态,而部分 SM 却被占用进行通信任务,则会导致整体计算资源利用率下降,从而降低训练效率)。
目前,SM 主要执行以下全对全通信任务:
- 在 IB(InfiniBand)和 NVLink 域之间转发数据,同时聚合从单个 GPU 发往同一节点内多个 GPU 的 IB 流量。
- 在 RDMA 缓冲区(注册的 GPU 内存区域)和输入/输出缓冲区之间传输数据。
- 对全对全
combine
执行reduce
操作。 - 在跨 IB 和 NVLink 域向多个专家传输分块数据期间管理细粒度内存布局。
希望看到未来的供应商开发硬件,将这些通信任务从有价值的计算单元 SM 中卸载,作为 GPU 协处理器或网络协处理器,如 NVIDIA SHARP Graham 等人的方案。此外,为了降低应用程序编程的复杂性,我们的目标是从计算单元的角度将 IB(横向扩展)和 NVLink(向上扩展)网络统一起来。有了这个统一的接口,计算单元可以通过基于简单原语提交通信请求,在整个 IB-NVLink 统一域内轻松完成读、写、组播和 reduce 等操作。
Compute Hardware
Higher FP8 GEMM Accumulation Precision in Tensor Cores. 在 NVIDIA Hopper 架构的当前 Tensor Core 实现中,FP8 GEMM 采用定点累加(fixed-point accumulation),根据加法前的最大指数右移来对齐尾数乘积。的实验表明,在符号填充右移后,它只使用每个尾数乘积的最高 14 位,并截断超过此范围的位。然而,为了从 32 个 FP8×FP8 乘法的累加中获得精确的 FP32 结果,至少需要 34 位精度。因此,我们建议未来的芯片设计提高 Tensor 核心的累积精度,以支持全精度累积,或者根据训练和推理算法的精度要求选择合适的累积位宽。这种方法确保误差保持在可接受的范围内,同时保持计算效率。
NVIDIA Hopper 架构是什么?
1. Hopper 架构概述
- Hopper 架构 是 NVIDIA 推出的新一代 GPU 架构,旨在支持大规模 AI 和高性能计算(HPC)任务。
- 它引入了许多创新技术,包括:
- 第四代 Tensor Core:支持 FP8、FP16、BF16和TF32等低精度计算,进一步提升低精度训练和推理的性能。
- Transformer 引擎:专为 Transformer 模型优化,支持动态混合精度(Dynamic Mixed Precision, DMP)。
- NVLink 和 NVSwitch:提供更高的带宽和更低的延迟,用于多 GPU 和多节点通信。
- DPX 指令:加速动态规划算法,适用于路径优化等任务。
2. FP8 GEMM 的实现问题
- 在 Hopper 架构中,FP8 GEMM 使用固定点累加(Fixed-Point Accumulation)方法,通过对齐尾数积(mantissa products)并右移(基于最大指数)来执行加法。
- 论文指出,Hopper 架构中的 FP8 GEMM 存在一个问题:累加精度有限
- 具体来说,每个尾数积在符号填充右移后仅保留最高 14 位,超出范围的部分被截断,Hopper的Tensor Core在FP8模式下使用低精度累加,无法直接支持全精度(FP32)中间结果,需通过“提升到CUDA Core”策略补偿(见3.3.2节)。
- 分组量化支持缺失:Hopper原生仅支持张量级(Tensor-wise)量化,无法按分块动态调整缩放因子,迫使DeepSeek-V3通过软件模拟实现细粒度量化。
Support for Tile- and Block-Wise Quantization. 目前的 GPU 只支持逐个张量量化(per-tensor quantization),缺乏对细粒度量化的原生支持,比如前文的分 tile/block 量化。在当前实现中,当达到 区间时,部分结果将从 Tensor Core 复制到 CUDA Core,乘以缩放因子,并加到 CUDA Core 上的 FP32 寄存器中。尽管结合前文的精确 FP32 累积策略,反量化开销得到了显著减轻,但 Tensor Core 和 CUDA Core 之间频繁的数据移动仍然限制了计算效率。因此,建议未来的芯片通过使 Tensor Core 能够接收缩放因子并实现具有按组缩放的 MMA 来支持细粒度量化。通过这种方式,所有部分和的累加和去量化可以直接在 Tensor Core 内完成,直到产生最终结果,从而避免了频繁的数据移动。
Support for Online Quantization. 尽管 DeepSeek 的研究证明了在线量化的有效性,但目前的实现很难有效地支持在线量化。在现有的过程中,需要从 HBM(高带宽存储器)读取 128 个 BF16 激活值(之前计算的输出)进行量化,然后将量化的结果以 FP8 写回 HBM,只为 MMA 再次读取。为了解决这种低效问题,我们建议未来的芯片将 FP8 cast 和 TMA(Tensor Memory Accelerator)访问集成到一个融合操作中,这样量化就可以在激活值从全局内存转移到共享内存的过程中完成,避免频繁的内存读写。我们还建议支持 warp-level 投射指令(cast instruction)以加速,这进一步促进了层归一化和 FP8 投射的更好融合。或者,可以采用就近内存计算方法,将计算逻辑放置在 HBM 附近。在这种情况下,BF16 元素可以在从 HBM 读取到 GPU 时直接转换为 FP8,从而将片外内存访问减少约 50%。
Support for Transposed GEMM Operations. 当前的架构使得将矩阵转置与 GEMM 操作融合起来很麻烦。在 V3 的工作流程中,前向传递期间的激活被量化为 1x128 FP8 tiles 并存储。在反向传递过程中,矩阵需要被读出、去量化、转置、重新量化为 128x1 的块,并存储在 HBM 中。为了减少内存操作,我们建议未来的芯片在 MMA 操作之前从共享内存中直接转置读取矩阵,以达到训练和推理所需的精度。结合 FP8 格式转换和 TMA 访问的融合,这种增强将显著简化量化工作流程。
Pre-Training
Data Construction
与 DeepSeek-V2 相比,V3 通过提高数学和编程样本的比例来优化预训练语料库(pre-training corpus),同时将多语言覆盖范围扩展到英语和中文之外。此外,数据处理流水线经过改进,在保持语料库多样性的同时尽量减少冗余。受 Ding 等人工作的启发,V3 实现了针对数据完整性的文档打包方法,但在训练过程中没有包含跨样本注意力掩码(Cross-Sample Attention Masking)。最后,V3 的训练语料库由 14.8T 高质量和多样化的 token 组成。
相关术语的解释
什么是 Document Packing Method for Data Integrity?
- 文档打包方法 是一种数据预处理技术,用于在训练语言模型时优化输入序列的使用效率。具体来说,这种方法将多个短文档“打包”成一个固定长度的序列(例如 4096 tokens),以充分利用模型的最大上下文长度。相比于直接填充(padding)短文档到固定长度,文档打包可以减少填充 token 的数量,从而提高训练效率和数据利用率。
- 数据完整性 指的是在打包过程中保持每个文档的原始内容不变,避免因截断或拼接而导致信息丢失,因此要保证拼接后的序列中每个原始文档的边界清晰,避免信息混淆。例如,通过添加特殊分隔符(如
<|endoftext|>
)标记文档结束。什么是不包含跨样本注意力掩码?
- 在文档打包方法中,多个文档被打包到同一个序列中。为了防止模型在训练时对不同文档之间的内容进行交叉注意力计算(即跨样本注意力),通常会使用 注意力掩码(Attention Masking) 来屏蔽掉不属于同一文档的 token。
- 然而,DeepSeek-V3 没有使用跨样本注意力掩码,这意味着模型可能会在训练时对不同文档的内容进行一定程度的交叉注意力计算。
- 影响:
- 潜在风险: 这种做法可能导致模型学习到不相关的文档之间的虚假关联,从而影响其性能,如降低泛化能力。
- 实际效果: 实验表明,这种设计并未显著影响 V3 的性能,可能是因为模型通过其他机制(如上下文理解能力)能够有效区分不同文档的内容。
在 DeepSeekCoder-V2 的训练过程中,我们观察到中间填充策略(Fill-in-Middle)不会损害下一个 token 的预测能力,同时使模型能够根据上下文线索准确预测中间文本。为了与 DeepSeekCoder-V2 保持一致,V3 的预训练仍然采纳了 FIM 策略。具体来说,采用前缀后缀中间(Prefix-Suffix-Middle)框架来构建数据,如下所示:
这种结构作为预包装过程的一部分应用于文档。FIM 策略以 0.1 的比率应用,与 PSM 框架一致。
相关术语的解释
什么是 Fill-in-Middle 策略?
- Fill-in-Middle 是一种数据增强的训练策略,最初在 DeepSeekCoder-V2 中提出,用于增强模型补全代码的能力,例如在函数参数不全时生成合理中间代码。
- 在 FIM 策略中,输入文档被分为三个部分:Prefix 文档的开头部分、Suffix 文档的结尾部分、Middle 文档的中间内容。
- 训练时,模型需要根据 Prefix 和 Suffix 预测 Middle 部分的内容。
什么是 FIM 策略以 0.1 的比率应用?
- 比率 0.1 表示在训练数据中,有 10% 的样本会采用 FIM 策略进行处理。这意味着大部分样本仍然使用传统的 next-token prediction 目标,而一小部分样本则使用 FIM 策略。
- 因此 与Prefix-Suffix-Middle框架的一致性 意思是,为确保FIM的结构与模型预训练目标兼容,例如通过特殊标记(如
<|fim_begin|>
)明确任务类型,使模型区分常规预测和补全任务。
V3 的 tokenizer 采用字节级 BPE(Byte Pair Encoding),扩展了 128K 个 token 的词汇表。DeepSeek 团队还修改了 tokenizer 的 pretokenizer 和训练数据,以优化多语言压缩效率。此外,与 DeepSeek-V2 相比,新的 pretokenizer 引入了结合标点和换行的 token 。然而,当模型处理没有 terminal line breaks 的多行提示时,特别是对于 few-shot 的评估提示,这种技巧可能会引入 token 边界偏差(token boundary bias)的问题。为了解决这个问题,V3 在训练过程中随机分割了一定比例的这种组合 token,使得模型能够面对更广泛的特殊情况,并减轻了这种偏见。
相关术语解释
Byte-level BPE 是什么?
- Byte Pair Encoding (BPE) 是一种子词分割算法,广泛应用于现代语言模型的 tokenizer 中。BPE 的核心思想是将高频字符组合逐步合并为新的 token,从而在词汇表大小和模型效率之间取得平衡。
- 作用:
- 提高多语言支持能力:通过扩展词汇表(128K tokens),BPE 能够更好地压缩多语言文本。
- 减少未登录词(OOV, Out-of-Vocabulary)问题:BPE 可以动态生成未见过的单词的子词表示。
- Byte-level BPE 的含义就是从原始字节开始合并高频字词。其优势是对罕见字符或符号更鲁棒,适合代码中的特殊符号(如
++
、!=
)。修改后的 Pretokenizer 是什么?
- 新的 pretokenizer 引入了一些特殊的 token,这些 token 将标点符号和换行符结合在一起(例如
.\n
或,\n
)。- 目的:
- 减少 token 数量,提高编码效率。
- 更好地捕捉标点符号和换行符的语义信息。
- 引入的问题:Token Boundary Bias,是指由于 tokenizer 的分割规则(如
}\n
为单 token)在训练和评估时的处理不一致,导致模型在处理某些输入时出现偏差,例如输入function() {
未以}\n
结尾,模型可能错误生成后续内容。- 为了减轻 token boundary bias,论文提出对组合标点和换行的 token 进行随机分割:
- 在训练中随机将组合 token(如
}\n
)拆分为独立 token(}
+\n
),迫使模型学习处理不同边界情况,增强鲁棒性。- 这种多样性训练有助于模型更好地理解标点符号和换行符的语义,减少模型对固定分界模式的依赖,提升对未见过分界模式的适应能力,减少偏差的影响。
Hyper Parameters
Model Hyper-Parameters.
- 将 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 一样,V3 在压缩的潜在向量之后还使用了额外的 RMSNorm 层,并在宽度瓶颈处乘以额外的缩放因子。在这种配置下,V3 包括 671B 个总参数,其中 37B 为每个 token 激活。
Training Hyper-Parameters.
- V3 使用 AdamW 优化器,将超参数设置为 、 和 。
- 在预训练期间将最大序列长度设置为 4K,并在 14.8T tokens 上预训练 DeepSeek-V3。
- 对于学习率调度,首先在前 2K 个步骤中将其从 线性增加到 。然后,保持 的恒定学习率,直到模型消耗 10T 的训练 token 。随后,按照余弦衰减曲线,在 4.3T token 中将学习率逐渐衰减到 。在最后 500B 个token 的训练过程中,前 333B 个token 中保持 的恒定学习率,并在剩余的 167B 个token 中将学习率切换到 的另一个恒定学习率。
- 梯度剪裁规范(gradient clipping norm)设置为 1.0。
- V3 采用批量大小调度(batch size scheduling)策略,在前 469B 个token 的训练中,批量大小从 3072 逐渐增加到 15360,然后在剩余的训练中保持 15360。
- V3 利用流水线并行性在不同的 GPU 上部署模型的不同层,对于每一层,路由专家将统一部署在属于 8 个节点的 64 个 GPU 上。对于节点受限路由,每个token 将被发送到最多 4 个节点(即 M=4)。
- 为了实现辅助无损耗负载平衡,前 14.3T token 的偏差更新速度 设置为 0.001,剩余 500B token 设置为 。
- 对于平衡损失, 设置为 0.0001,只是为了避免任何单个序列中的极端不平衡。
- 对于前 10T token,MTP 损失权重 设置为 0.3,对于剩余的 4.8T token,设置为 0.1。
Long Context Extension
V3 采用与 DeepSeek-V2 类似的方法启用长上下文功能——在预训练阶段之后,应用 YaRN 进行上下文扩展,并执行两个额外的训练阶段,每个阶段包括 1000 个步骤,以逐步将上下文窗口从 4K 扩展到 32K,然后扩展到 128K。
YaRN 配置与 DeepSeek-V2 中使用的配置一致,仅应用于解耦的共享密钥 。两个阶段的超参数保持一致,放缩因子 ,,,放缩因子 。在第一阶段,序列长度设置为 32K,batch size 为 1920。在第二阶段,序列长度增加到 128K,batch size 减少到 480。两个阶段的学习率都设置为 ,与预训练阶段的最终学习率相匹配。
通过这个两阶段的扩展训练,DeepSeek-V3 能够处理长达 128K 的输入,同时保持强大的性能。图 8 显示,DeepSeek-V3 在监督微调后,在“Needle In A Haystack”(NIAH)测试中取得了显著的性能,证明了在高达 128K 的上下文窗口长度上具有一致的鲁棒性。
Evaluations
Benchmarks. V3 的基础模型在多语言(中英为主)语料库上进行预训练,评估框架集成在 HAI-LLM 内部。根据 DeepSeek 团队之前的工作,对 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 进行了基于语言建模(language-modeling-based)的评估,并使用每字节比特数(Bits-Per-Byte)作为指标,以确保使用不同 tokenizer 的模型之间的公平比较。
Results.
DeepSeek-V3-Base 与其他开源基础模型进行比较:
- 与 DeepSeek-V2-Base 相比,由于模型架构的改进、模型大小和训练 token 的扩展以及数据质量的提高,DeepSeek-V3-Base 的性能明显优于预期。
- 与最先进的中国开源模型 Qwen2.5 72B Base 相比,DeepSeek-V3-Base 也显示出显著的优势,特别是在英语、多语言、代码和数学基准测试方面。至于中文基准测试,除了中文多学科多项选择任务 CMMLU 外,DeepSeek-V3-Base 的表现也优于 Qwen2.5 72B。
- 与最大的开源模型 LLaMA-3.1 405B Base 相比,DeepSeek-V3-Base 在多语言、代码和数学基准测试方面也表现出更好的性能。对于英语和汉语基准测试,DeepSeek-V3-Base 显示出有竞争力或更好的性能,尤其在 BBH、MMLU 系列、DROP、C-Eval、CMMLU 和 CCPM 上表现出色。
由于高效的架构和全面的工程优化,V3 实现了极高的训练效率。在 DeepSeek 的训练框架和基础设施下,在每万亿个 token 上训练 V3 只需要 180K H800 GPU 小时,这比训练 72B 或 405B 密集模型便宜得多。
Discussion
Ablation Studies for Multi-Token Prediction.
具体来说,在不同尺度的两个基线模型上验证了 MTP 策略:
- 在小规模上训练的基线 MoE 模型,该模型在 1.33T 令牌上包含 15.7B 个总参数。
- 在大规模上,训练的基线 MoE 模型,该模型在 540B 令牌上包含 228.7B 个总参数。
- 在它们之上,保持训练数据和其他架构不变,附加了一个 1 深度的 MTP 模块,并使用 MTP 策略训练两个模型进行比较。请注意,在推理过程中,直接丢弃了 MTP 模块,因此比较模型的推理成本完全相同。 从表中可以看出,MTP 策略在大多数评估基准上都提高了模型性能。
Ablation Studies for Auxiliary-Loss-Free Balancing Strategy.
在表 5 中显示了辅助无损耗平衡策略的消融结果,同样在不同尺度的两个基线模型上验证了这一策略:
- 这两个基线模型都纯粹使用辅助损失来促进负载平衡,并使用带有 top-K 亲和度归一化的 sigmoid 门控函数。- 它们控制辅助损失强度的超参数分别与 DeepSeek-V2-Lite 和 DeepSeek-V2 相同。
- 在这两个基线模型之上,在保持训练数据和其他架构不变的情况下,通过删除所有辅助损耗,并引入了辅助无损耗平衡策略进行比较。 从表中可以观察到,辅助无损失策略在大多数评估基准上始终取得了更好的模型性能。
Batch-Wise Load Balance VS. Sequence-Wise Load Balance.
辅助无损耗平衡和序列辅助损耗之间的关键区别在于它们的平衡范围:批量级和序列级:
- 与序列辅助损失相比,批量级平衡施加了更灵活的约束,因为它不会对每个序列强制执行域内平衡。这种灵活性使专家能够更好地专注于不同的领域。
- 为了验证这一点,通过记录并分析 Pile-test 集中不同域上基于 16B 辅助损失的基线和 16B 辅助无损失模型的专家载荷。如图 9 所示,可以观察到辅助无损失模型如预期的那样展示了更大的专家专业化模式。
为了进一步研究这种灵活性与模型性能优势之间的相关性,DeepSeek 团队设计并验证了一个批量辅助损失,该损失鼓励在每个训练批量而不是每个序列上进行负载平衡。实验结果表明,当实现类似水平的批量负载平衡时,分批辅助损耗也可以实现与无辅助损耗方法类似的模型性能。具体来说,
- 在对 1B MoE 模型的实验中,验证损失为:2.258(使用顺序辅助损失)、2.253(使用无辅助损失方法)和 2.253(采用批量辅助损失)。
- 在 3B MoE 模型上观察到类似的结果:使用顺序辅助损失的模型实现了 2.085 的验证损失,使用无辅助损失方法或批量辅助损失的模式实现了相同的 2.080 的验证损失。
此外,尽管批量负载平衡方法显示出一致的性能优势,但它们在效率方面也面临着两个潜在的挑战:
- 某些序列或小批量内的负载不平衡,
- 推理过程中域偏移引起的负载不均衡。 第一个挑战自然是通过 DeepSeek 的训练框架来解决的,该框架使用大规模的专家并行性和数据并行性,保证了每个微批的大容量。对于第二个挑战,如第 3.4 节所述,设计并实现了一个具有冗余专家部署的高效推理框架以克服它。
Post-Training
Supervised Fine-Tuning
在 V3 的指令调优数据集中,包含跨越多个域的 150 万个实例,每个域都采用根据其特定要求所量身定制的不同数据创建方法。
Reasoning Data. 对于与推理相关的数据集,包括那些专注于数学、代码竞赛问题和逻辑谜题的数据,V3 利用 DeepSeek-R1 模型生成数据。不过要注意,虽然 R1 生成的数据表现出很强的准确性,但它存在过度思考、格式不佳和长度过长等问题。DS 团队的目标是平衡 R1 生成的推理数据的高准确性和符合规则格式的推理数据的清晰性和简洁性。
为了建立自己的方法论,首先使用监督微调(SFT)和强化学习(RL)相结合的训练流程,开发一个针对特定领域(如代码、数学或一般推理)量身定制的专家模型。该专家模型充当最终模型的数据生成器。训练过程涉及为每个实例生成两种不同类型的 SFT 样本:1. 将问题与其原始响应以 <problem,original response>
的格式耦合在一起,2. 将系统提示与问题和 R1 响应以 <system prompt,problem, R1 respond>
的格式结合在一起。
系统提示经过精心设计,包括指导模型产生富含反射和验证机制的响应的指令。在 RL 阶段,即使在没有明确的系统提示的情况下,该模型也利用 high-temperature 采样来生成响应,该响应整合了 R1 生成的数据和原始数据的模式。经过数百个强化学习步骤后,中间强化学习模型学会了结合 R1 模式,从而从战略上提高了整体性能。
在完成 RL 训练阶段后,通过拒绝抽样并为最终模型策划高质量的 SFT 数据,其中专家模型用作数据生成源。这种方法确保最终的训练数据保持 DeepSeek-R1 的优势,同时产生简洁有效的响应。
Non-Reasoning Data. 对于非推理数据,如创意写作、角色扮演和简单问答,利用 DeepSeek-V2.5 生成响应,并招募人类注释者来验证数据的准确性和正确性。
SFT Settings. 使用 SFT 数据集对 DeepSeek-V3-Base 进行了两个 epoch 的微调,使用余弦衰减学习率调度,从 开始,逐渐降低到 。在训练过程中,每个序列都是从多个样本中打包而成的,其中采用了一种样本掩蔽策略,以确保这些示例保持孤立和相互不可见。
Reinforcement Learning
Reward Model
DeepSeek 团队在强化学习过程中采用了基于规则的奖励模型(Reward Model)和基于模型的 RM 。
Rule-Based RM. 对于可以使用特定规则验证的问题,采用基于规则的奖励系统来确定反馈。例如,某些数学问题具有确定性结果,则可以要求模型以指定的格式(例如在框中)提供最终答案,从而允许我们应用规则来验证正确性。同样,对于 LeetCode 问题,则可以利用编译器根据测试用例生成反馈。通过尽可能利用基于规则的验证,可以确保更高的可靠性,因为这种方法能够抵抗操纵或利用。
Model-Based RM. 对于具有自由形式、答案有明确事实的问题,则依靠奖励模型来确定答案是否与预期的基本事实相匹配。相反,对于没有明确依据的问题,例如涉及创造性写作的问题,奖励模型的任务是根据问题和相应的答案作为输入提供反馈。奖励模型是从 DeepSeek-V3 SFT 检查点训练的。为了提高其可靠性,DS 团队构建了偏好数据,该数据不仅提供了最终的奖励,还包括导致奖励的思维链。这种方法有助于降低特定任务中奖励黑客(reward hacking)的风险。
Group Relative Policy Optimization
与 DeepSeek-V2类似,V3 采用了组相对策略优化(Group Relative Policy Optimization),其思路是:放弃通常与策略模型大小相同的批评模型,而是根据组分数估计基线。具体来说,对于每个问题 ,GRPO 从旧策略模型 中采样一组输出 ,然后通过最大化以下目标来优化策略模型 :
其中 和 是超参数; 是参考模型; 是优势,来源于与每个组内的输出对应的奖励 :
在强化学习过程中,通过整合来自不同领域的提示,如编码、数学、写作、角色扮演和问答。这种方法不仅使模型更符合人类偏好,而且提高了基准测试的性能,特别是在可用 SFT 数据有限的情况下。
Evaluations
Benchmark & Baseline. 除了用于基础模型测试的基准之外,还进一步评估了 IFEval、FRAMES、LongBench v2、GPQA、SimpleQA、CSimpleQA、SWE Bench Verified、Aider 1、LiveCodeBench、Codeforces 2、中国国家高中数学奥林匹克竞赛 和 美国邀请性数学考试 2024 的指导模型。 根据几个强力基线模型对 V3 进行综合评估,包括 DeepSeek-V2-0506、DeepSeek-V2.5-0905、Qwen2.5 72B 指令、LLaMA-3.1 405B 指令、Claude-Sonnet-3.5-1022 和 GPT-4o-0513。对于 DeepSeek-V2 系列,选择最具代表性的模型进行比较。对于封闭源代码模型,通过它们各自的 API 执行评估。
Detailed Evaluation Configurations. 对于包括 MMLU、DROP、GPQA 和 SimpleQA 在内的标准基准测试,采用了 simple evals 框架中的评估提示。在 zero-shot 设置中使用 Zero-Eval 提示格式进行 MMLU Redux。对于其他数据集,使用数据集创建者提供的默认提示遵循其原始评估协议。对于代码和数学基准测试,HumanEval Mul 数据集总共包括 8 种主流编程语言(Python、Java、Cpp、C#、JavaScript、TypeScript、PHP 和 Bash)。使用 CoT 和非 CoT 方法在 LiveCodeBench 上评估模型性能,数据收集时间为 2024 年 8 月至 2024 年 11 月。Codeforces 数据集使用竞争对手的百分比进行测量。使用无代理框架评估验证的 SWE 试验台。使用“diff”格式来评估 Aider 相关的基准。对于数学评估,AIME 和 CNMO 2024 在 0.7 的温度下进行评估,结果平均超过 16 次,而 MATH-500 采用贪婪解码。允许所有模型为每个基准输出最多 8192 个 token 。
Standard Evaluation
下表是性能展示:
English Benchmarks. MMLU 是一个被广泛认可的基准,旨在评估大型语言模型在不同知识领域和任务中的性能。DeepSeek-V3 显示出具有竞争力的性能,与顶级机型如 LLaMA3.1-405B、GPT-4o 和 Claude Sonnet 3.5 不相上下,同时显著优于 Qwen2.5 72B。此外,DeepSeek-V3 在 MMLU Pro 中表现出色,MMLU Pro 是一个更具挑战性的教育知识基准,紧随 Claude Sonnet 3.5 之后。在 MMLU-Redux 上,DeepSeek-V3 超越了它的同行。此外,在博士级评估测试平台 GPQA Diamond 上,DeepSeek-V3 取得了显著的成绩,仅次于 Claude 3.5 十四行诗,并以巨大的优势超过了所有其他竞争对手。在理解 DROP、LongBench v2 和 FRAMES 等长上下文基准中,DeepSeek-V3 继续展示其作为顶级模型的地位。它实现了令人印象深刻的 91.6 F1 成绩在 3 杆设置下降,跑赢了所有其他型号在这一类别。在 FRAMES 上,DeepSeekV3 是一个需要回答超过 100k 个令牌上下文的问题的基准,它紧随 GPT-4o 之后,同时以显著的优势超过了所有其他模型。这证明了 DeepSeek-V3 处理超长上下文任务的强大能力。DeepSeek-V3 的长上下文功能通过其在 LongBench v2 上的同类最佳性能得到进一步验证,LongBench v2 是在 DeepSeek V3 发布前几周发布的数据集。在事实知识基准上,SimpleQA、DeepSeek-V3 落后于 GPT-4o 和 Claude Sonnet,主要是由于其设计重点和资源分配。DeepSeek-V3 分配了更多的培训令牌来学习中文知识,从而在 C-SimpleQA 上获得了优异的性能。在遵循指令的基准测试中,DeepSeek-V3 显著优于其前身 DeepSeek-V2-series,突出了其更好地理解和遵守用户定义的格式约束的能力。
Code and Math Benchmarks. 对于 LLMs 来说,编码是一项具有挑战性和实用性的任务,包括以工程为中心的任务,如 SWE Bench Verified and Aider,以及算法任务,如 HumanEval 和 LiveCodeBench。在工程任务方面,DeepSeek-V3 落后于 Claude-Sonnet-3.5-1022,但明显优于开源模型。开源的 DeepSeek-V3 有望促进编码相关工程任务方面的进步。通过提供对其强大功能的访问,DeepSeek-V3 可以推动软件工程和算法开发等领域的创新和改进,使开发人员和研究人员能够突破开源模型在编码任务中可以实现的界限。在算法任务中,DeepSeek-V3 表现出优异的性能,优于 HumanEval-Mul 和 LiveCodeBench 等基准上的所有基线。这一成功归功于其先进的知识提炼技术,有效地增强了其在以算法为中心的任务中的代码生成和问题解决能力。在数学基准测试中,DeepSeek-V3 表现出优异的性能,显著超过了基线,并为非 o1 类模型建立了最新的技术水平。具体而言,在 AIME、MATH-500 和 CNMO 2024 上,DeepSeek-V3 的绝对分数比第二好的模型 Qwen2.5 72B 高出约 10%,这对于此类具有挑战性的基准来说是一个巨大的差距。这种卓越的性能突出了 DeepSeek-R1 蒸馏技术的有效性,该技术已被证明对非 o1 类模型非常有益。
Chinese Benchmarks. Qwen 和 DeepSeek 是两个具有代表性的模型系列,支持中文和英文。尽管 Qwen2.5 是在一个更大的语料库上训练的,包含 18T 标记,比 DeepSeek-V3 预先训练的 14.8T 标记多 20%。但在汉语教育知识评估的代表性基准 C-Eval 和 CLUEWSC(Chinese Winograd Schema Challenge)上,DeepSeekV3 和 Qwen2.5-72B 表现出相似的性能水平,表明这两个模型在挑战汉语推理和教育任务方面都得到了很好的优化。
Open-Ended Evaluation
除了标准基准之外,还使用 LLM 作为评判标准来评估开放式生成任务模型,结果如表 7 所示。
具体而言,坚持 AlpacaEval 2.0 和 Arena-Hard 的原始配置,它们利用 GPT-4-Turbo-1106 作为两两比较的判断标准。
- 在 Arena-Hard 上,DeepSeek-V3 与基线 GPT-4-0314 相比,获得了超过 86%的胜率,表现与顶级模型如 Claude-Sonnet-3.5-1022 不相上下。这突显了 DeepSeek-V3 的强大功能,特别是在处理复杂提示(包括编码和调试任务)时。此外,DeepSeek-V3 作为第一个在 Arena-Hard 基准上超过 85%的开源模型,实现了突破性的里程碑。这一成就显著弥合了开源模型和闭源模型之间的性能差距,为开源模型在具有挑战性的领域中能够实现的目标设定了新的标准。
- DeepSeek-V3 在 AlpacaEval 2.0 上展示了卓越的性能,优于封闭源代码和开放源代码模型。这表明它在编写任务和处理简单的问答场景方面具有出色的能力。值得注意的是,它以 20%的显著幅度超过了 DeepSeek-V2.5-0905,突出了在处理简单任务方面的实质性改进,并展示了其改进的有效性。
DeepSeek-V3 as a Generative Reward Model
将 DeepSeek-V3 的判断能力与最先进的模型(即 GPT-4o 和 Claude-3.5)进行了比较。表 8 显示了 RewardBench 中这些模型的性能。
DeepSeek-V3 的性能可与 GPT-4o-0806 和 Claude-3.5-Sonnet-1022 的最佳版本媲美,同时超过其他版本。此外,投票技术还可以增强 DeepSeek-V3 的判断能力。因此,使用 DeepSeekV3 和投票来提供开放式问题的自我反馈,从而提高对齐过程的有效性和鲁棒性。
Discussion
Distillation from DeepSeek-R1
在基于 DeepSeek-V2.5 的 DeepSeok-R1 蒸馏的贡献上进行消融实验。基线是在短 CoT 数据上训练的,而其竞争对手使用由上述专家检查点生成的数据。表 9 展示了蒸馏数据的有效性,显示了 LiveCodeBench 和 MATH-500 基准测试的显著改进。
此实验揭示了一个有趣的权衡:蒸馏导致更好的性能,但也大大增加了平均响应长度。为了在模型精度和计算效率之间保持平衡,DS 团队在蒸馏中为 DeepSeek-V3 仔细选择了最佳设置。
从研究中表明,从推理模型中提取知识是 post-training 优化的一个很有前途的方向。虽然当前的工作侧重于从数学和编码领域提取数据,但这种方法显示了在各种任务领域中更广泛应用的潜力。在这些特定领域中证明的有效性表明,长 CoT 蒸馏对于提高其他需要复杂推理的认知任务中的模型性能是有价值的。跨不同领域进一步探索这种方法仍然是未来研究的一个重要方向。
Self-Rewarding
奖励在 RL 中发挥着关键作用,指导优化过程。在通过外部工具进行验证的领域中,例如一些编码或数学场景,RL 表现出非凡的功效。然而,在更一般的场景中,通过硬编码构建反馈机制是不切实际的。在 DeepSeek-V3 的开发过程中,对于这些更广泛的环境,采用宪法人工智能方法(constitutional AI approach),利用 DeepSeek-V3 本身的投票评估结果作为反馈来源。该方法产生了显著的对齐效果,显著提高了 DeepSeek-V3 在主观评估中的性能。
通过集成其他宪法输入,DeepSeek-V3 可以朝 constitutional direction 进行优化。DS 团队认为,这种将补充信息与 LLM 相结合作为反馈来源的范式至关重要。LLM 充当一个多功能处理器,能够将非结构化信息从各种场景转换为奖励,最终促进 LLM 的自我改进。除了自我奖励之外,DS 团队还致力于发现其他通用和可扩展的奖励方法,以在一般场景中一致地提高模型功能。
Multi-Token Prediction Evaluation
DeepSeek-V3 不是仅预测下一个单个令牌,而是通过 MTP 技术预测两个令牌。结合推测解码框架,可以显著加快模型的解码速度。关于额外预测的令牌的接受率的自然问题出现。根据评估,第二令牌预测的接受率在各种生成主题中介于 85%和 90%之间,表现出一致的可靠性。这种高接受率使 DeepSeek-V3 能够实现显著提高的解码速度,提供 1.8 倍的 TPS(每秒令牌数)。
Limitations, and Future Directions
在承认其强大的性能和成本效益的同时,也应当认识到 DeepSeek-V3 有一些限制,特别是在部署方面。首先,为了确保有效的推断,DeepSeek-V3 的推荐部署单元相对较大,这可能会给小型团队带来负担。其次,尽管 DeepSeek-V3 部署策略实现了两倍于 DeepSeek-V2 的端到端生成速度,但仍有进一步增强的潜力。幸运的是,随着更先进硬件的开发,这些限制有望自然地得到解决。DeepSeek 始终坚持开源模型的路线,并具有长期性,旨在稳步接近 AGI 的最终目标。
未来,计划在以下方向对研究进行战略性投资:
- 我们将持续研究和改进我们的模型架构,旨在进一步提高训练和推理效率,努力实现对无限上下文长度的有效支持。此外,我们将尝试突破Transformer的架构限制,从而推动其建模能力的边界。
- 我们将不断迭代我们的训练数据的数量和质量,并探索合并额外的训练信号源,旨在推动数据在更全面的维度范围内扩展。
- 我们将不断探索和迭代我们模型的深度思考能力,旨在通过扩展其推理长度和深度来增强其智能和解决问题的能力。
- 我们将探索更全面和多维的模型评估方法,以防止在研究期间优化固定基准集的趋势,这可能会对模型能力产生误导性印象,并影响我们的基础评估。