文章目录
摘要
我们介绍了DccpScck V3,一个强大的专家混合(MoE)语言模型,总参数量为671B,每个token激活37B。为了实现高效的推理和成本效益的训练,DeepSeek-V3采用了多头潜在注意力(MLA)和DeepSeekMoE架构,这些在DeepSeek-V2中得到了充分验证。此外,DeepSeek-V3开创了一种无辅助损失的负载平衡策略,并设置了多token预测训练目标以获得更强的性能。我们在14.8万亿个多样化和高质量的token上预训练DeepSeek-V3,然后通过监督微调和强化学习阶段来充分发挥其能力。全面的评估显示,DeepSeek-V3的表现优于其他开源模型,并达到了与领先的闭源模型相当的性能。尽管性能出色,DeepSeek-V3的完整训练仅需要2.788M H800 GPU小时。此外,其训练过程非常稳定。在整个训练过程中,我们没有遇到任何不可恢复的损失峰值或进行任何回滚。模型检查点可在github获取。
图1 | DeepSeek-V3及其同类产品的基准性能对比。
1. 引言
-
近年来,大型语言模型(LLMs)快速发展,缩小了与通用人工智能(AGI)的差距。开源模型如DeepSeek系列、LLaMA系列、Qwen系列和Mistral系列正努力追赶闭源模型。我们推出了DeepSeek-V3,一个具有671B参数的专家混合(MoE)模型,每个token激活37B参数,以推动开源模型能力的新高度。DeepSeek-V3采用多头潜在注意力(MLA)和DeepSeekMoE架构,这些在DeepSeek-V2中已验证能保持模型性能稳健同时实现高效训练和推理。我们还实施了无辅助损失的负载平衡策略和多token预测训练目标,以增强模型性能。
-
为了高效训练,我们支持FP8混合精度训练,并通过DualPipe算法优化训练框架,实现高效的流水线并行性,减少通信开销,优化内存占用,无需昂贵的张量并行即可训练DeepSeek-V3。在预训练中,DeepSeek-V3在14.8万亿token上训练,过程稳定,无不可恢复损失。我们进行了两阶段上下文长度扩展,从32K到128K。后训练包括监督微调和强化学习,以提升模型性能。
-
DeepSeek-V3在基准测试中表现优异,成为最强的开源基础模型之一,尤其在代码和数学方面。其聊天版本也优于其他开源模型,与领先的闭源模型相当。
-
DeepSeek-V3的训练成本经济,预训练阶段每万亿token需180K H800 GPU小时,总成本为2664K GPU小时,加上上下文长度扩展和后训练,总成本为2.788M GPU小时,租赁成本为5576万美元。这些成本仅包括官方训练,不包括先前研究和消融实验的成本。
我们的主要贡献包括:
(1)架构:创新的负载均衡策略和训练目标
在DeepSeek-V2高效架构的基础上,我们开创了一种无辅助损失的负载均衡策略,最小化因鼓励负载均衡而产生的性能下降。
我们研究了多token预测(MTP)目标,并证明其对模型性能有益。它还可以用于推测性解码以加速推理。
(2)预训练:追求终极训练效率
我们设计了一个FP8混合精度训练框架,并首次验证了FP8训练在极大规模模型上的可行性和有效性。
通过算法、框架和硬件的协同设计,我们克服了跨节点MoE训练中的通信瓶颈,实现了接近完全的计算-通信重叠。这显著提高了我们的训练效率并降低了训练成本,使我们能够在没有额外开销的情况下进一步扩大模型规模。
以仅2664万H800 GPU小时的经济成本,我们完成了DeepSeek-V3在14.8万亿个token上的预训练,产生了目前最强的开源基础模型。预训练后的后续训练阶段仅需要0.1百万GPU小时。
(3)后训练:从DeepSeek-R1中进行知识蒸馏
我们引入了一种创新的方法,从长链思考(CoT)模型中提取推理能力,特别是从一个DeepSeek R1系列模型中,到标准的大型语言模型(LLMs),特别是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,但它仍然以显著的优势超过所有其他模型,展示了其在多样化技术基准上的竞争力。
2. 架构
我们首先介绍DeepSeek-V3的基本架构,它以多头潜在注意力(MLA)(DeepSeek-AI, 2024c)为特色,用于高效推理,以及DeepSeekMoE(Dai et al., 2024)用于经济训练。然后,我们提出了一个多token预测(MTP)训练目标,我们观察到这增强了评估基准上的总体性能。对于其他未明确提及的次要细节,DeepSeek-V3遵循DeepSeek-V2(DeepSeek-AI, 2024c)的设置。
图2 | DeepSeek-V3基本架构的示意图。继DeepSeek-V2之后,我们采用MLA和DeepSeekMoE以实现高效推理和经济训练。
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.1.1 多头潜在注意力
对于注意力机制,DeepSeek-V3 采用了 MLA 架构。设 d d d 表示嵌入维度, n h n_h nh 表示注意力头的数量, d h d_h dh 表示每个头的维度, h t ∈ R d \mathbf{h}_t \in \mathbb{R}^d ht∈Rd 表示在给定注意力层中第 t t t 个token的注意力输入。MLA 的核心是注意力键和值的低秩联合压缩,以减少推理过程中的键值(KV)缓存:
c t K V = W D K V h t , [ k t , 1 C ; k t , 2 C ; … ; k t , n h C ] = k t C = W U K c t K V , k t R = RoPE ( W K R h t ) , k t , i = [ k t , i C ; k t R ] , [ v t , 1 C ; v t , 2 C ; … ; v t , n h C ] = v t C = W U V c t K V , \begin{align*} c_{t}^{K V} &= W^{D K V} h_{t}, \tag{1} \\ \left[k_{t, 1}^{C}; k_{t, 2}^{C};\ldots; k_{t, n_{h}}^{C}\right] &= k_{t}^{C} = W^{U K} c_{t}^{K V}, \tag{2} \\ k_{t}^{R} &= \text{RoPE}\left(W^{K R} h_{t}\right), \tag{3} \\ k_{t, i} &= \left[k_{t, i}^{C}; k_{t}^{R}\right], \tag{4}\\ \left[v_{t, 1}^{C}; v_{t, 2}^{C};\ldots; v_{t, n_{h}}^{C}\right] &= v_{t}^{C} = W^{U V} c_{t}^{K V}, \tag{5} \end{align*} ctKV[kt,1C;kt,2C;…;kt,nhC]ktRkt,i[vt,1C;vt,2C;…;vt,nhC]=WDKVht,=ktC=WUKctKV,=RoPE(WKRht),=[kt,iC;ktR],=vtC=WUVctKV,(1)(2)(3)(4)(5)
其中 c t K V ∈ R d c \mathbf{c}_t^{KV} \in \mathbb{R}^{d_c} ctKV∈Rdc 是键和值的压缩潜在向量; d c ( ≪ d h n h ) d_c (\ll d_h n_h) dc(≪dhnh) 表示KV压缩维度; W D K V ∈ R d c × d \mathbf{W}^{DKV} \in \mathbb{R}^{d_c \times d} WDKV∈Rdc×d 表示降维投影矩阵; W U K , W U V ∈ R d h n h × d c \mathbf{W}^{UK}, \mathbf{W}^{UV} \in \mathbb{R}^{d_h n_h \times d_c} WUK,WUV∈Rdhnh×dc 分别是键和值的升维投影矩阵; W K R ∈ R d h R × d \mathbf{W}^{KR} \in \mathbb{R}^{d_h^R \times d} WKR∈RdhR×d 是用于产生携带旋转位置嵌入(RoPE)(Su et al., 2024)的解耦键的矩阵;RoPE(·) 表示应用RoPE矩阵的操作;和 [·;·] 表示连接。请注意,对于MLA,仅需要在生成期间缓存蓝色方框向量(即, c t K V \mathbf{c}_t^{KV} ctKV 和 k t R \mathbf{k}_t^R ktR),这显著减少了KV缓存,同时保持了与标准多头注意力(MHA)(Vaswani et al., 2017)相当的性能。
对于注意力查询,我们还执行了低秩压缩,这可以在训练期间减少激活内存:
c t Q = W D Q h t , [ q t , 1 C ; q t , 2 C ; … ; q t , n h C ] = q t C = W U Q c t Q , [ q t , 1 R ; q t , 2 R ; … ; q t , n h R ] = q t R = RoPE ( W Q R c t Q ) , q t , i = [ q t , i C ; q t , i R ] , \begin{align*} \mathbf{c}_t^Q = \mathbf{W}^{DQ} \mathbf{h}_t, \tag{6} \\ \left[ \mathbf{q}_{t,1}^C; \mathbf{q}_{t,2}^C; \ldots; \mathbf{q}_{t,n_h}^C \right] = \mathbf{q}_t^C = \mathbf{W}^{UQ} \mathbf{c}_t^Q, \tag{7}\\ \left[ \mathbf{q}_{t,1}^R; \mathbf{q}_{t,2}^R; \ldots; \mathbf{q}_{t,n_h}^R \right] = \mathbf{q}_t^R = \text{RoPE}\left( \mathbf{W}^{QR} \mathbf{c}_t^Q \right), \tag{8}\\ \mathbf{q}_{t,i} = \left[ \mathbf{q}_{t,i}^C; \mathbf{q}_{t,i}^R \right], \tag{9} \end{align*} ctQ=WDQht,[qt,1C;qt,2C;…;qt,nhC]=qtC=WUQctQ,[qt,1R;qt,2R;…;qt,nhR]=qtR=RoPE(WQRctQ),qt,i=[qt,iC;qt,iR],(6)(7)(8)(9)
其中 c t Q ∈ R d c ′ \mathbf{c}_t^Q \in \mathbb{R}^{d_c'} ctQ∈Rdc′ 是查询的压缩潜在向量; d c ′ ( ≪ d h n h ) d_c' (\ll d_h n_h) dc′(≪dhnh) 表示查询压缩维度; W D Q ∈ R d c ′ × d , W U Q ∈ R d h n h × d c ′ \mathbf{W}^{DQ} \in \mathbb{R}^{d_c' \times d}, \mathbf{W}^{UQ} \in \mathbb{R}^{d_h n_h \times d_c'} WDQ∈Rdc′×d,WUQ∈Rdhnh×dc′ 分别是查询的降维和升维投影矩阵; W Q R ∈ R d h R n h × d c ′ \mathbf{W}^{QR} \in \mathbb{R}^{d_h^R n_h \times d_c'} WQR∈RdhRnh×dc′ 是用于产生携带RoPE的解耦查询的矩阵。最终,注意力查询 ( q t , i ) \left( \mathbf{q}_{t,i} \right) (qt,i),键 ( k j , i ) \left( \mathbf{k}_{j,i} \right) (kj,i) 和值 ( v j , i C ) \left( \mathbf{v}_{j,i}^C \right) (vj,iC) 结合产生最终的注意力输出 u t \mathbf{u}_t ut:
o t , i = ∑ j = 1 t Softmax j ( q t , i T k j , i d h + d h R ) v j , i C , u t = W O [ o t , 1 ; o t , 2 ; … ; o t , n h ] , \begin{align*} \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, \\ \mathbf{u}_t &= \mathbf{W}^O \left[ \mathbf{o}_{t,1}; \mathbf{o}_{t,2}; \ldots; \mathbf{o}_{t,n_h} \right], \tag{11} \end{align*} ot,iut=j=1∑tSoftmaxj dh+dhRqt,iTkj,i vj,iC,=WO[ot,1;ot,2;…;ot,nh],(11)
其中 W O ∈ R d × d h n h \mathbf{W}^O \in \mathbb{R}^{d \times d_h n_h} WO∈Rd×dhnh 表示输出投影矩阵。
2.1.2. 带有无辅助损失负载均衡的DeepSeekMoE
DeepSeekMoE的基本架构。对于前馈网络(FFNs),DeepSeek-V3采用了DeepSeekMoE架构(Dai et al., 2024)。与传统的MoE架构如GShard(Lepikhin et al., 2021)相比,DeepSeekMoE使用更细粒度的专家,并将一些专家隔离为共享专家。设 u t u_{t} ut 表示第 t t t 个token的FFN输入,我们计算FFN输出 h t ′ h_{t}' ht′ 如下:
h t ′ = u t + ∑ i = 1 N s FFN i ( s ) ( u t ) + ∑ i = 1 N r g i , t FFN i ( r ) ( u t ) , g i , t = g i , t ′ ∑ j = 1 N r g j , t ′ , g i , t ′ = { s i , t , s i , t ∈ Topk ( { s j , t ∣ 1 ≤ j ≤ N r } , K r ) , 0 , 否则 , s i , t = Sigmoid ( u t T e i ) , \begin{align*} h_{t}' = u_{t} + \sum_{i=1}^{N_{s}} \text{FFN}_{i}^{(s)}(u_{t}) + \sum_{i=1}^{N_{r}} g_{i,t} \text{FFN}_{i}^{(r)}(u_{t}), \tag{12}\\ g_{i, t} = \frac{g_{i, t}'}{\sum_{j=1}^{N_{r}} g_{j, t}'}, \tag{13}\\ g_{i, t}' = \begin{cases} s_{i, t}, & s_{i, t} \in \text{Topk}(\{s_{j, t} | 1 \leq j \leq N_r\}, K_r), \\ 0, & \text{否则}, \end{cases} \tag{14}\\ s_{i, t} = \text{Sigmoid}(u_{t}^T e_{i}), \tag{15} \end{align*} ht′=ut+i=1∑NsFFNi(s)(ut)+i=1∑Nrgi,tFFNi(r)(ut),gi,t=∑j=1Nrgj,t′gi,t′,gi,t′={
si,t,0,si,t∈Topk({
sj,t∣1≤j≤Nr},Kr),否则,si,t=Sigmoid(utTei),(12)(13)(14)(15)
其中 N s N_s Ns 和 N r N_r Nr 分别表示共享专家和路由专家的数量; FFN i ( s ) ( ⋅ ) \text{FFN}_i^{(s)}(\cdot) FFNi(s)(⋅) 和 FFN i ( r ) ( ⋅ ) \text{FFN}_i^{(r)}(\cdot) FFNi(r)(⋅) 分别表示第 i i i 个共享专家和第 i i i 个路由专家; K r K_r Kr 表示激活的路由专家的数量; g i , t g_{i,t} gi,t 是第 i i i 个专家的门控值; s i , t s_{i,t} si,t 是token到专家的亲和度; e i \mathbf{e}_i ei 是第 i i i 个路由专家的质心向量; Topk ( ⋅ , K ) \text{Topk}(\cdot, K) Topk(⋅,K) 表示在为第 t t t 个token计算的所有路由专家的亲和度分数中包含 K K K 个最高分数的集合。与 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)以确保负载平衡。具体来说,我们为每个专家引入一个偏置项 b i b_i bi 并将其添加到相应的亲和度分数 s i , t s_{i,t} si,t 中以确定前 K K K 路由:
{ g i , t ′ = s i , t , s i , t + b i ∈ Topk ( { s j , t + b j ∣ 1 ≤ j ≤ N r } , K r ) , 0 , 否则。 (16) \begin{cases} g_{i,t}' = s_{i,t}, & s_{i,t} + b_i \in \text{Topk}(\{s_{j,t} + b_j | 1 \leq j \leq N_r\}, K_r), \\ 0, & \text{否则。} \tag{16} \end{cases} {
gi,t′=si,t,0,si,t+bi∈Topk({
sj,t+bj∣1≤j≤Nr},Kr),否则。(16)
请注意,偏置项仅用于路由。将与FFN输出相乘的门控值仍然源自原始的亲和度分数 s i , t s_{i, t} si,t。在训练过程中,我们持续监控每个训练步骤中整个批次的专家负载。在每个步骤结束时,如果相应的专家过载,我们将通过 y y y 减少偏置项,如果相应的专家未加载,则增加 y y y,其中 y y y 是一个称为偏置更新速度的超参数。通过动态调整,DeepSeek-V3 在训练期间保持专家负载平衡,并比通过纯辅助损失鼓励负载平衡的模型实现更好的性能。互补序列级辅助损失。尽管DeepSeek-V3 主要依赖于无辅助损失策略来实现负载平衡,为了防止任何单个序列内的极端不平衡,我们还采用了互补的序列级平衡损失:
L B a l = α ∑ i = 1 N r f i P i , (17) \mathcal{L}_{Bal} = \alpha \sum_{i=1}^{N_r} f_i P_i, \tag{17} LBal=αi=1∑NrfiPi,(17)
f i = N r K r T ∑ t = 1 T 1 ( s i , t ∈ Topk ( { s j , t ∣ 1 ≤ j ≤ N r } , K r ) ) , (18) f_i = \frac{N_r}{K_r T} \sum_{t=1}^{T} \mathbb{1} \left( s_{i, t} \in \text{Topk} \left( \{ s_{j, t} \mid 1 \leq j \leq N_r \}, K_r \right) \right),\tag{18} fi=KrTNrt=1∑T1(si,t∈Topk({ sj,t∣1≤j≤Nr},Kr)),(18)
s i , t ′ = s i , t ∑ j = 1 N r s j , t , (19) s_{i, t}' = \frac{s_{i, t}}{\sum_{j=1}^{N_r} s_{j, t}}, \tag{19} si,t′=∑j=1Nrsj,tsi,t,(19)
P i = 1 T ∑ t = 1 T s i , t ′ , (20) P_i = \frac{1}{T} \sum_{t=1}^T s_{i,t}', \tag{20} Pi=T1t=1∑Tsi,t′,(20)
其中平衡因子 α \alpha α 是一个超参数,对于DeepSeek-V3 将被赋予一个极小的值; 1 ( ⋅ ) \mathbb{1}(\cdot) 1(⋅) 表示指示函数; T T T 表示序列中的token数量。序列级平衡损失鼓励每个序列上的专家负载保持平衡。
图3 | 我们的多token预测(MTP)实现的示意图。我们在每个深度上为每个token的预测保持完整的因果链。
节点限制路由
与DeepSeek-V2使用的设备限制路由类似,DeepSeek-V3也使用受限路由机制来限制训练期间的通信成本。简而言之,我们确保每个token最多被发送到 M M M 个节点,这些节点是根据每个节点上分布的专家的最高亲和度分数之和来选择的。在这一约束下,我们的MoE训练框架几乎可以实现完整的计算-通信重叠。
无Token丢弃
由于有效的负载均衡策略,DeepSeek-V3在完整训练期间保持了良好的负载平衡。因此,DeepSeek-V3在训练期间不会丢弃任何token。此外,我们还实施了特定的部署策略以确保推理负载平衡,因此DeepSeek-V3在推理期间也不会丢弃token。
2.2 多Token预测
受Gloeckle等人(2024)的启发,我们研究并为DeepSeek-V3设定了一个多Token预测(MTP)目标,该目标将预测范围扩展到每个位置的多个未来token。一方面,MTP目标可以密集化训练信号并可能提高数据效率。另一方面,MTP可能使模型能够预先规划其表示,以更好地预测未来的token。图3展示了我们实现MTP的方式。与Gloeckle等人(2024)不同,他们使用独立的输出头并行预测 D D D 个额外的token,我们顺序预测额外的token,并在每个预测深度保持完整的因果链。我们将在本节中介绍我们的MTP实现的详细信息。
MTP模块
具体来说,我们的MTP实现使用 D D D 个顺序模块来预测 D D D 个额外的token。第 k k k 个MTP模块由一个共享嵌入层 Emb ( ⋅ ) \text{Emb}(\cdot) Emb(⋅)、一个共享输出头 OutHead ( ⋅ ) \text{OutHead}(\cdot) OutHead(⋅)、一个Transformer块 TRM k ( ⋅ ) \text{TRM}_k(\cdot) TRMk(⋅) 和一个投影矩阵 M k ∈ R d × 2 d \mathbf{M}_k \in \mathbb{R}^{d \times 2d} Mk∈Rd×2d 组成。对于第 i i i 个输入token t i t_i ti,在第 k k k 个预测深度,我们首先结合第 i i i 个token在 ( k − 1 ) (k-1) (k−1) 深度的表示 h i k − 1 ∈ R d \mathbf{h}_i^{k-1} \in \mathbb{R}^d hik−1∈Rd 和 ( i + k ) (i+k) (i+k) 个token的嵌入 Emb ( t i + k ) ∈ R d \text{Emb}(t_{i+k}) \in \mathbb{R}^d Emb(ti+k)∈Rd。
通过线性投影:
h i k = M k [ RMSNorm ( h i k − 1 ) ; RMSNorm ( Emb ( t i + k ) ) ] , (21) \mathbf{h}_i^{k} = \mathbf{M}_k[\text{RMSNorm}(\mathbf{h}_i^{k-1}); \text{RMSNorm}(\text{Emb}(t_{i+k}))], \tag{21} hik=Mk[RMSNorm(hik−1);RMSNorm(Emb(ti+k))],(21)
其中 [ ⋅ ; ⋅ ] [\cdot; \cdot] [⋅;⋅] 表示连接。特别地,当 k = 1 k = 1 k=1 时, h i k − 1 \mathbf{h}_i^{k-1} hik−1 指的是主模型给出的表示。请注意,对于每个MTP模块,其嵌入层与主模型共享。组合后的 h i k \mathbf{h}_i^{k} hik 作为第 k k k 层Transformer块的输入,以产生当前深度 h i k \mathbf{h}_i^{k} hik 的输出表示:
h 1 : T − k k = TRM k ( h 1 : T − k ′ k ) , (22) \mathbf{h}_{1:T-k}^{k} = \text{TRM}_k(\mathbf{h}_{1:T-k}^{\prime k}), \tag{22} h1:T−kk=TRMk(h1:T−k′k),(22)
其中 T T T 表示输入序列长度, i : j i:j i:j 表示切片操作(包括左右边界)。最后,以 h i k \mathbf{h}_i^{k} hik 作为输入,共享输出头将计算第 k k k 个额外预测token P i + 1 + k k ∈ R V P_{i+1+k}^{k} \in \mathbb{R}^V Pi+1+kk∈RV 的概率分布,其中 V V V 是词汇表大小:
P i + k + 1 k = OutHead ( h i k ) . (23) P_{i+k+1}^k = \text{OutHead}(\mathbf{h}_i^k). \tag{23} Pi+k+1k=OutHead(hik).(23)
输出头 OutHead ( ⋅ ) \text{OutHead}(\cdot) OutHead(⋅) 将表示线性映射到logits,并随后应用 S o f t m a x ( ⋅ ) Softmax(·) Softmax(⋅)函数计算第 k k k 个额外token的预测概率。此外,对于每个MTP模块,其输出头与主模型共享。我们保持预测因果链的原则类似于EAGLE(Li et al., 2024b),但其主要目标是推测性解码(Leviathan et al., 2023; Xia et al., 2023),而我们利用MTP来改进训练。
MTP 训练目标
对于每个预测深度,我们计算交叉熵损失 L M T P k \mathcal{L}_{MTP}^{k} LMTPk:
L M T P k = CrossEntropy ( P 2 + k : T + 1 k , t 2 + k : T + 1 ) = − 1 T ∑ i = 2 + k T + 1 log p i k [ t i ] , (24) \mathcal{L}_{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} LMTPk=CrossEntropy(P2+k:T+1k,t2+k:T+1)=−T1i=2+k∑T+1logpik[ti],(24)
其中 T T T 表示输入序列长度, t i t_{i} ti 表示第 i i i 个位置的真实token, P i k [ t i ] P_{i}^{k}[t_{i}] Pik[ti] 表示由第 k k k 个MTP模块给出的 t i t_{i} ti 的相应预测概率。最后,我们计算所有深度的MTP损失的平均值,并乘以权重因子 λ \lambda λ 以获得整体MTP损失 L M T P \mathcal{L}_{MTP} LMTP,这作为DeepSeek-V3的额外训练目标:
L M T P = λ D ∑ k = 1 D L M T P k . (25) \mathcal{L}_{MTP} = \frac{\lambda}{D} \sum_{k=1}^{D} \mathcal{L}_{MTP}^{k}. \tag{25} LMTP=Dλk=1∑DLMTPk.(25)
MTP 在推理中的应用
我们的MTP策略主要旨在提高主模型的性能,因此在推理过程中,我们可以直接丢弃MTP模块,主模型可以独立且正常运行。此外,我们还可以重新利用这些MTP模块进行推测性解码,以进一步改善生成延迟。
3. 基础设施
3.1 计算集群
DeepSeek-V3 在一个配备了 2048 个 NVIDIA H800 GPU 的集群上进行训练。H800 集群中的每个节点包含 8 个通过 NVLink 和 NVSwitch 在节点内连接的 GPU。在不同节点之间,使用 InfiniBand (IB) 互连来促进通信。
图 4 | 一对单独前向和后向块的重叠策略(Transformer 块的边界未对齐)。橙色表示前向,绿色表示“后向输入”,蓝色表示“后向权重”,紫色表示 PP 通信,红色表示屏障。全对全和 PP 通信都可以完全隐藏。
3.2 训练框架
DeepSeek-V3 的训练由我们的工程师从头开始精心打造的高效轻量级训练框架 HAI-LLM 支持。总体而言,DeepSeek-V3 应用了 16 路流水线并行(PP)(Qi et al., 2023a)、64 路专家并行(EP)(Lepikhin et al., 2021 跨越 8 个节点)和 ZeRO-1 数据并行(DP)(Rajbhandari et al., 2020)。
为了促进 DeepSeek-V3 的高效训练,我们实施了精心的工程优化。首先,我们设计了 DualPipe 算法以实现高效的流水线并行。与现有的 PP 方法相比,DualPipe 具有更少的流水线气泡。更重要的是,它在前向和后向过程中重叠计算和通信阶段,从而解决了由跨节点专家并行引入的大量通信开销的挑战。其次,我们开发了高效的跨节点全对全通信内核,以充分利用 IB 和 NVLink 带宽,并节省专用于通信的流式多处理器(SM)。最后,我们在训练期间精心优化内存占用,从而能够在不使用昂贵的张量并行(TP)的情况下训练 DeepSeek-V3。
3.2.1 DualPipe 和计算-通信重叠
对于 DeepSeek-V3,由跨节点专家并行引入的通信开销导致计算与通信比率约为 1:1 的效率低下。为了解决这一挑战,我们设计了一种创新的流水线并行算法,称为 DualPipe,它不仅通过有效重叠前向和后向计算-通信阶段来加速模型训练,还减少了流水线气泡。
DualPipe 的关键思想是在一对单独的前向和后向块内重叠计算和通信。具体来说,我们将每个块分成四个组件:注意力、全对全分发、MLP 和全对全合并。特别地,对于后向块,注意力和 MLP 进一步分成两部分,输入后向和权重后向,如在 ZeroBubble(Qi et al., 2023b)中。此外,我们有一个 PP 通信组件。如图 4 所示,对于一对前向和后向块,我们重新排列这些组件并手动调整专用于通信与计算的 GPU SM 比率。在这种重叠策略中,我们可以确保在执行期间全对全和 PP 通信可以完全隐藏。鉴于高效的重叠策略,完整的 DualPipe 调度如图 5 所示。它采用双向流水线调度,同时从流水线的两端馈送微批次,并且可以完全重叠大量通信。这种重叠还确保了,随着模型的进一步扩展,只要我们保持恒定的计算与通信比率,我们仍然可以在节点间使用细粒度专家,同时实现接近零的全对全通信开销。
图 5 | 8 个 PP 等级和两个方向上的 20 个微批次的示例 DualPipe 调度。
反向的微批次与前向的微批次对称,因此为了简化说明,我们省略了它们的批次 ID。两个由共享黑色边界包围的单元格具有相互重叠的计算和通信。
表 2 | 不同流水线并行方法的流水线气泡和内存使用情况比较。 F F F 表示前向块的执行时间, B B B 表示完整后向块的执行时间, W W W 表示“权重后向”块的执行时间, F & B F\&B F&B 表示两个相互重叠的前向和后向块的执行时间。
此外,即使在没有繁重通信负担的更一般场景中,DualPipe 仍然表现出效率优势。在表 2 中,我们总结了不同 PP 方法的流水线气泡和内存使用情况。如表中所示,与 ZB1P (Qi et al., 2023b) 和 1F1B (Harlap et al., 2018) 相比,DualPipe 显著减少了流水线气泡,同时仅将峰值激活内存增加 1 p p \frac{1}{pp} pp1 倍。尽管 DualPipe 需要保留两份模型参数,但由于我们在训练期间使用较大的 EP 大小,这并不会显著增加内存消耗。与 Chimera (Li and Hoefler, 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 可以高效地通过 IB 和 NVLink 选择平均 3.2 个专家,而无需从 NVLink 产生额外开销。这意味着,尽管 DeepSeek-V3
为了确保 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 可以高效地通过 IB 和 NVLink 选择平均 3.2 个专家,而无需从 NVLink 产生额外开销。这意味着,尽管 DeepSeek-V3 选择了仅 8 个路由专家,但实际上可以将这个数字扩展到最多 13 个专家(4 个节点 x 每个节点 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 参数存储在 CPU 内存中,并在每个训练步骤后异步更新。这种方法允许我们在不产生额外内存或时间开销的情况下维护 EMA 参数。
多 token 预测的共享嵌入和输出头。通过 DualPipe 策略,我们在相同的 PP 等级上部署模型的最浅层(包括嵌入层)和最深层(包括输出头)。这种安排使得 MTP 模块和主模型之间共享嵌入和输出头的参数和梯度之间的物理共享。这种物理共享机制进一步增强了我们的内存效率。
图 6 | 整体混合精度框架,采用 FP8 数据格式。为了说明,仅展示了线性运算符操作符。
3.3 FP8 训练
受到低精度训练最新进展(Dettmers et al., 2022; Noune et al., 2022; Peng et al., 2023b)的启发,我们提出了一个细粒度混合精度框架,利用 FP8 数据格式训练 DeepSeek-V3。虽然低精度训练具有很大的潜力,但通常受限于激活、权重和梯度中的异常值(Fishman et al., 2024; He et al., 2024)。尽管在推理量化(Frantar et al., 2022; Xiao et al. 2023)方面取得了显著进展,但在大规模语言模型中成功应用低精度技术的研究相对较少。
为了解决这一挑战并有效扩展 FP8 格式的动态范围,我们引入了一种细粒度量化策略:平铺分组,具有 1 × N c 1 \times N_c 1×Nc 元素或块状分组,具有 N c × N c N_c \times N_c Nc×Nc 元素。在增加精度累积过程中,相关的去量化开销在很大程度上得到了缓解,这是实现精确 FP8 通用矩阵乘法(GEMM)的关键方面。此外,为了进一步减少 MoE 训练中的内存和通信开销,我们在 FP8 中缓存和分发激活,同时在 BF16 中存储低精度优化器状态。我们在两个模型规模上验证了所提出的 FP8 混合精度框架,这两个模型规模与 DeepSeek-V2-Lite 和 DeepSeek-V2 类似,训练大约 1 万亿个 token(更多细节见附录 B.1)。值得注意的是,与 BF16 基线相比,我们的 FP8 训练模型的相对损失误差始终保持在 0.25% 以下,这是一个在训练随机性可接受范围内的良好水平。
图 7 | (a) 我们提出了一种细粒度量化方法来减轻由特征异常值引起的量化误差;为了简化说明,仅展示了 Fprop。(b) 结合我们的量化策略,我们通过在 N C = 128 N_C = 128 NC=128 元素 MMA 间隔提升到 CUDA 核心来提高 FP8 GEMM 精度,以实现高精度累积。
3.3.1 混合精度框架
基于在低精度训练中广泛采用的技术(Kalamar 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) 对于激活,我们在 1x128 块基础上分组和缩放元素(即,每个 token 每 128 个通道);(2) 对于权重,我们在 128x128 块基础上分组和缩放元素(即,每 128 输入通道每 128 输出通道)。这种方法确保量化过程可以通过根据更小组元素调整比例更好地适应异常值。在附录 B.2 中,我们进一步讨论了当我们以与权重量化相同的方式在块基础上分组和缩放激活时的训练不稳定性。
我们方法的一个关键修改是引入了 GEMM 操作内维度上的每组缩放因子。此功能在标准 FP8 GEMM 中未直接支持。然而,结合我们精确的 FP32 累积策略,可以高效实现。
值得注意的是,我们的细粒度量化策略与微缩放格式(Rouhani et al., 2023b)的思想高度一致,而 NVIDIA 下一代 GPU(Blackwell 系列)的 Tensor Core 已宣布支持具有更小量化粒度的微缩格式(NVIDIA 2024a)。我们希望我们的设计可以作为未来工作与最新 GPU 架构保持同步的参考。
提高累积精度
低精度 GEMM 操作通常遭受下溢问题,其精度在很大程度上依赖于高精度累积,这通常在 FP32 精度中执行(Kalamar et al. 2019; Narang et al. 2017)。然而,我们观察到 NVIDIA H800 GPU 上的 FP8 GEMM 的累积精度限制在保留大约 14 位,这明显低于 FP32 累积精度。当内维度 K 较大时(Wortsman et al. 2023),此问题将更加明显,这是大规模模型训练的典型场景,其中批量大小和模型宽度增加。以 K=4096 的两个随机矩阵 GEMM 操作为例,在我们的初步测试中,Tensor Core 中的有限累积精度导致最大相对误差接近 2%。尽管存在这些问题,有限的累积精度仍然是一些 FP8 框架(NVIDIA, 2024b)中的默认选项,严重限制了训练精度。
为解决此问题,我们采用了提升到 CUDA Cores 的策略以获得更高精度(Thakkar et al. 2023)。该过程如图 7(b) 所示。具体来说,在 Tensor Cores 上执行 MMA(矩阵乘法累积)期间,中间结果使用有限位宽累积。一旦达到 N C N_C NC 间隔,这些部分结果将被复制到 CUDA Cores 上的 FP32 寄存器,其中执行全精度 FP32 累积。如前所述,我们的细粒度量化沿内维度 K 应用每组缩放因子。这些缩放因子可以在 CUDA Cores 上有效乘以去量化过程,而无需额外计算成本。
值得注意的是,此修改减少了单个 warpgroup 的 WGMMA(Warpgroup 级矩阵乘法累积)指令问题率。然而,在 H800 架构上,两个 WGMMA 通常并行:当一个 warpgroup 执行提升操作时,另一个能够执行 MMA 操作。此设计使两个操作重叠,保持 Tensor Cores 的高利用率。根据我们的实验,设置 N C = 128 N_C = 128 NC=128 元素,相当于 4 个 WGMMAs,表示在不引入大量开销的情况下显著提高精度的最小累积间隔。
指数的尾数
与之前工作采用的混合FP8格式(NVIDIA, 2024b; Peng et al., 2023b; Sun et al., 2019b)相比,该格式在前向传播(Fprop)中使用E4M3(4位指数和3位尾数),在梯度下降(Dgrad)和权重梯度(Wgrad)中使用E5M2(5位指数和2位尾数),我们在所有张量上采用E4M3格式以获得更高的精度。我们将这种方法的可行性归因于我们的细粒度量化策略,即平铺和块状缩放。通过对较小的元素组进行操作,我们的方法有效地在这些分组元素之间共享指数位,减轻了有限动态范围的影响。
在线量化
在张量级量化框架(NVIDIA, 2024b; Peng et al., 2023b)中,采用延迟量化,该框架维护了最大绝对值的历史记录,以便在先前的迭代中推断当前值。为了确保准确的尺度并简化框架,我们在线计算每个1x128激活平铺或128x128权重块的最大绝对值。基于此,我们推导出缩放因子,然后将激活或权重在线量化为FP8格式。
3.3.3 低精度存储和通信
结合我们的FP8训练框架,我们进一步通过将缓存的激活和优化器状态压缩为低精度格式来减少内存消耗和通信开销。
低精度优化器状态。我们采用BF16数据格式而不是FP32来跟踪AdamW(Loshchilov and Hutter 2017)优化器中的第一和第二矩,而不会产生明显的性能下降。然而,主权重(由优化器存储)和梯度(用于批量大小累积)仍然保留在FP32中,以确保整个训练过程中的数值稳定性。
低精度激活。如图6所示,Wgrad操作在FP8中执行。为了减少内存消耗,将线性操作符的反向传递中的激活缓存在FP8格式中是一个自然的选择。然而,对于低成本高精度训练,对几个操作符进行了特殊考虑:
(1) 注意力操作符后的线性输入。这些激活也用于注意力操作符的反向传递,这使其对精度敏感。我们为这些激活采用了定制的E5M6数据格式。此外,这些激活将在反向传递中从1x128量化平铺转换为128x1平铺。为了避免引入额外的量化误差,所有缩放因子都是四舍五入缩放的,即2的整数次幂。
(2) MoE中SwiGLU操作符的输入。为了进一步减少内存成本,我们缓存SwiGLU操作符的输入并在反向传递中重新计算其输出。这些激活也以FP8格式存储,采用我们的细粒度量化方法,在内存效率和计算精度之间取得平衡。
低精度通信
通信带宽是训练MoE模型的一个关键瓶颈。为了缓解这一挑战,我们在MoE上投影之前将激活量化为FP8,然后应用调度组件,这与MoE上投影中的FP8 Fprop兼容。与注意力操作符后的线性输入一样,此激活的缩放因子是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的全对全通信,我们使用与训练中相同的方法:首先通过IB在节点间传输令牌,然后通过NVLink在节点内GPU之间转发。特别是,我们对浅层中的密集MLP使用1路张量并行,以节省TP通信。
为了在MoE部分的不同专家之间实现负载平衡,我们需要确保每个GPU处理大约相同数量的令牌。为此,我们引入了冗余专家的部署策略,该策略复制高负载专家并冗余地部署它们。高负载专家基于在线部署期间收集的统计数据进行检测,并定期进行调整(例如,每10分钟)。在确定冗余专家集之后,我们根据观察到的负载仔细重新安排节点内GPU之间的专家,努力在不增加跨节点全对全通信开销的情况下尽可能平衡GPU之间的负载。对于DeepSeek-V3的部署,我们为预填充阶段设置了32个冗余专家。对于每个GPU,除了它承载的原始8个专家外,它还将承载一个额外的冗余专家。
此外,在预填充阶段,为了提高吞吐量并隐藏全对全和TP通信的开销,我们同时处理两个具有相似计算工作量的微批次,将一个微批次的注意力和MoE与另一个的调度和组合重叠。
最后,我们正在探索一种动态冗余策略,其中每个GPU承载更多专家(例如,16个专家),但每次推理步骤中只有9个将被激活。在每层的全对全操作开始之前,我们即时计算全局最优路由方案。考虑到预填充阶段涉及的大量计算,计算此路由方案的开销几乎可以忽略不计。
3.4.2. 解码
在解码过程中,我们将共享专家视为路由专家。从这个角度来看,每个令牌在路由过程中将选择9个专家,其中共享专家被视为一个高负载专家,将总是被选中。解码阶段的最小部署单元由40个节点和320个GPU组成。注意力部分采用TP4与SP结合,并与DP80结合,而MoE部分使用EP320。对于MoE部分,每个GPU只托管一个专家,64个GPU负责托管冗余专家和共享专家。调度和组合部分的全对全通信通过IB上的直接点对点传输来实现低延迟。此外,我们利用IBGDA(NVIDIA, 2022)技术进一步减少延迟并提高通信效率。
与预填充类似,我们定期根据在线服务的统计专家负载确定一组冗余专家。然而,我们不需要重新排列专家,因为每个GPU只托管一个专家。我们还在探索解码的动态冗余策略。然而,这需要更仔细地优化算法,以计算全局最优路由方案,并与调度内核融合以减少开销。
此外,为了提高吞吐量并隐藏全对全通信的开销,我们还在解码阶段同时处理两个具有相似计算工作量的微批次。与预填充不同,注意力在解码阶段消耗了更多的时间。因此,我们将一个微批次的注意力与另一个微批次的调度+MoE+组合重叠。在解码阶段,每个专家的批量大小相对较小(通常在256个令牌以内),瓶颈是内存访问而不是计算。由于MoE部分只需要加载一个专家的参数,内存访问开销很小,因此使用较少的SM不会显著影响整体性能。因此,为了避免影响注意力部分的计算速度,我们可以只为调度+MoE+组合分配一小部分SM。
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域向多个专家传输分块数据期间管理细粒度内存布局。