DeepSeek-V3 与 GPT 核心技术原理及差异
DeepSeek-V3 与 GPT 核心技术原理及差异:从架构革新到工程实现
1. 溯源与基准:Transformer 到 GPT
1.1 Transformer
2017 年在《Attention Is All You Need》中提出 Transformer 架构,彻底抛弃了 RNN 的循环结构与 CNN 的局部卷积,以纯粹的注意力机制建立了序列到序列的建模范式。
1.1.1标准 MHA 公式
对于输入序列 X=(x1,x2,…,xn)X=(x_1,x_2,…,x_n)X=(x1,x2,…,xn),每个注意力头 iii 拥有独立的投影矩阵:
其中 WiQ,WiK,WiV∈Rdmodel×dkW^Q_i,W^K_i,W^V_i∈ℝ^{d_{model}×d_k}WiQ,WiK,WiV∈Rdmodel×dk。每个头的 Scaled Dot-Product Attention 为:
hhh 个头的输出拼接后经输出投影矩阵 WOW^OWO 得到 Multi-Head Attention 的最终输出:
论文设定 h=8h=8h=8,dk=dv=dmodel/h=64d_k=d_v=d_{model}/h=64dk=dv=dmodel/h=64,dmodel=512d_{model}=512dmodel=512。除以 dk\sqrt{d_k}dk 的缩放因子防止点积过大导致 Softmax 梯度消失——这是 MHA 数学稳定性的第一个关键细节。
1.1.2 Encoder-Decoder 架构
原始 Transformer 包含 6 层 Encoder 和 6 层 Decoder:
- Encoder 每层:Multi-Head Self-Attention → Add & Norm → Feed-Forward Network (FFN) → Add & Norm
- Decoder 每层:Masked Multi-Head Self-Attention → Add & Norm → Cross-Attention (Q 来自 Decoder,K/V 来自 Encoder) → Add & Norm → FFN → Add & Norm
FFN 结构:
FFN(x)=max(0,xW1+b1)W2+b2FFN(x)=max(0,xW_1+b_1)W_2+b_2FFN(x)=max(0,xW1+b1)W2+b2
内层维度 dff=2048d_{ff}=2048dff=2048
核心组件拆解
① Input Embedding & Positional Encoding
- Embedding:把词变成向量
- Positional Encoding (位置编码):一次性读取全句,为每个词附加位置标识,让模型区分词语先后顺序。
② Multi-Head Attention
让句子里每个词都能“看见”其他所有词;“多头”代表模型可从多维角度建模词语间关联。
③ Add & Norm
- Add:残差连接,保证多层堆叠下信息、梯度不丢失
- Norm:层归一化,稳定数据分布,降低训练波动
④ Feed Forward(MLP)
注意力完成特征交互后,每层接入全连接网络,对提取特征做非线性变换加工。
1.2 GPT :Decoder-Only 与自回归生成
GPT 系列对 Transformer 做了关键简化——仅保留 Decoder 部分,移除 Cross-Attention 子层。这一设计选择带来了以下优势:
- 自回归生成的天然适配:语言建模本质上是"根据上文预测下一词",Decoder-Only 的 Masked Self-Attention 恰好满足这一因果约束
- 训练效率:同一段文本只需一次前向传播即可计算所有位置的损失,无需 Encoder-Decoder 的两次编码
- 扩展性:Decoder-Only 架构可以简洁地堆叠更多层(GPT-3 达到 96 层),每层结构完全一致,工程实现高度统一
GPT-2 单层 Decoder 流程图

推理过程——自回归循环:
- 输入序列经 Embedding + Positional Encoding 后进入第一个 Block
- 每个 Block 依次处理,最后一个 Block 输出隐向量
- 隐向量与 Embedding 矩阵相乘得到词汇表上的 logits
- Softmax → 采样(Top-K 或 Top-P)→ 生成下一个 Token
- 新 Token 追加到输入序列末尾,重复步骤 1-4
1.3 KV Cache 的数学本质与显存危机
1.3.1 KV Cache 的引入动机
在自回归推理的第 t+1t+1t+1 步,需计算当前 Query qt+1q_{t+1}qt+1 与所有历史 Key/Value 的注意力:
若每步重新计算全部 kj,vjk_j,v_jkj,vj,总计算量为 O(t2)O(t^2)O(t2)。因此标准做法是缓存已计算的 Key 和 Value。
1.3.2显存占用的严格推导
设模型有 LLL 层、nhn_hnh 个注意力头、每头维度 dhd_hdh、当前序列长度 ttt、batch size 为 bbb:
KVCachepertoken=2×nh×dh×L(每个token在每层的K+V)KVCachetotal=b×t×2×nh×dh×L(总缓存元素数)MemoryKVCache=KVCachetotal×sizeof(dtype) \begin{matrix} KV Cache_{per token} & =2×n_h×d_h×L \quad(每个 token 在每层的 K + V)\\ KV Cache_{total} & =b×t×2×n_h×d_h×L \quad(总缓存元素数)\\ Memory_{KV Cache} & =KV Cache_{total}×sizeof(dtype) \end{matrix} KVCachepertokenKVCachetotalMemoryKVCache=2×nh×dh×L(每个token在每层的K+V)=b×t×2×nh×dh×L(总缓存元素数)=KVCachetotal×sizeof(dtype)
以 GPT-3 175B 典型配置(L=96L=96L=96, nh=96n_h=96nh=96, dh=128d_h=128dh=128)为例,BF16 精度下:
MemoryKVCache(pertoken)=2×96×128×96×2 bytes≈4.72 MB/token \begin{matrix} Memory_{KV Cache}(per token) & =2×96×128×96×2 \;bytes\\ & ≈4.72 \;MB/token \end{matrix} MemoryKVCache(pertoken)=2×96×128×96×2bytes≈4.72MB/token
序列长度与显存的线性灾难:
| 序列长度 ttt | b=1b=1b=1 KV Cache 显存 | b=8b=8b=8 KV Cache 显存 | b=64b=64b=64 KV Cache 显存 |
|---|---|---|---|
| 2,048 | 9.66 GB | 77.3 GB | 618 GB |
| 8,192 | 38.6 GB | 309 GB | 2,473 GB |
| 32,768 | 154.7 GB | 1,237 GB | 9,898 GB |
| 128,000 | 604.2 GB | 4,834 GB | 38,671 GB |
单张 H100 仅有 80 GB HBM。128K 上下文的 b=1b=1b=1 推理就需 604 GB——需要 8 张 H100 仅存放 KV Cache,遑论模型权重和中间激活。
1.3.3 Memory Wall 的物理本质
Decode 阶段每步的算术强度:
算术强度极低意味着每从 HBM 搬运一个字节,GPU 只做极少计算。H100 HBM 带宽 3.35 TB/s,而计算能力达 989 TFLOPS (FP16)——访存速度远跟不上计算速度,计算单元大量空转。这就是 GPT 长文本推理的 Memory Wall:每步延时与 KV Cache 读取量成正比,即与序列长度成正比。
TstepGPT∝BytesKVCache(t)HBMBandwidth∝tT^{GPT}_{step}∝\frac{Bytes_{KV Cache}(t)}{HBM Bandwidth}∝tTstepGPT∝HBMBandwidthBytesKVCache(t)∝t
2. DeepSeek-V3 核心重构
DeepSeek-V3 对 Transformer 做了两处根本性的架构手术:注意力机制(MLA)和 FFN 层(DeepSeekMoE)。这两处修改分别针对 Memory Wall 和计算冗余——前者从数学上压缩了推理访存量,后者从结构上解耦了参数量与计算量。
2.1 MLA:低秩联合压缩的数学原理
2.1.1前置:多头注意力完整演进链路
自2017年Transformer提出MHA以来,大模型注意力机制的迭代主线始终只有一条:在尽量无损模型表征能力的前提下,压缩KV Cache、破解显存与带宽瓶颈。从原始MHA到最终DeepSeek-V3所用的MLA,形成一条循序渐进的技术演进链:MHA → MQA → GQA → MLA,每一轮优化都是效果与缓存开销的极限拉扯。
(1)MHA:原始多头注意力,性能最优、缓存开销最大
MHA是Transformer原生注意力,为每个注意力头分配独立Q/K/V投影矩阵,多头并行建模多维语义特征,表征能力最强。但致命缺陷是每一个注意力头都需要缓存专属K、V,KV Cache显存占用与头数成正比,长序列推理下显存爆炸,也是前文1.3节Memory Wall的直接诱因。
(2)MQA:极致压缩,牺牲精度换显存
2019年提出的MQA是首个极简优化方案:保留多组查询Q,让全部注意力头共享同一组K、V。该方案直接将KV Cache压缩至原始MHA的 1/h1/h1/h,显存压缩达到理论上限,但过度压缩破坏多头表征多样性,极易造成语义理解精度下降,模型能力损耗明显。
(3)GQA:折中方案,平衡精度与显存
为调和MHA与MQA的矛盾,GQA提出分组折中策略:将全部注意力头划分为 ggg 个分组,同一分组内的头共享K、V,不同分组相互独立。参数边界清晰:g=hg=hg=h 等价于原生MHA,g=1g=1g=1 等价于MQA。主流大模型(LLaMA2、DeepSeek-V1)默认设置 g=8g=8g=8,兼顾推理显存开销与模型效果,但GQA依旧存在固有缺陷:依赖拆分、复制向量实现分组共享,属于表层线性优化,无法从数学本质上消除KV冗余,压缩上限存在天花板。
(4)演进终点:MLA 跳出传统优化框架
按照苏剑林老师博客结论:GQA本质上已是隐式低秩投影,但受限于固定拆分逻辑,无法进一步压缩。而MLA跳出“分组共享KV”的固有思路,直接从矩阵低秩分解、矩阵吸收的底层数学逻辑重构注意力,既保留多头表征能力,突破GQA压缩上限,又兼容RoPE位置编码,成为V3架构的核心底座。下文结合DeepSeek,拆解MLA完整原理。
| 注意力机制 | 单Token KV缓存元素量 | 模型表征能力 |
|---|---|---|
| Multi-Head Attention (MHA) | 2nhdhL2nhd_hL2nhdhL | 强 |
| Grouped-Query Attention (GQA) | 2ngdhL2ngd_hL2ngdhL | 中等 |
| Multi-Query Attention (MQA) | 2dhL2d_hL2dhL | 弱 |
| MLA (Ours) | (dc+dhR)L≈dL(d_c+d_h^R)L≈dL(dc+dhR)L≈dL | 更强 |
2.1.2 核心:Key 和 Value 存在低秩结构
标准 MHA 为 K 和 V 各自维护一个 d×dd×dd×d 的投影矩阵,直接从 hth_tht 映射到 kt,vtk_t,v_tkt,vt。MLA 的核心观察是:不同注意力头的 Key 之间(Value 之间)存在强烈的线性相关性,它们在低维子空间中共享表示。
压缩-解压的数学形式
MLA 引入一个共享的低维隐向量 ctKV∈Rdcc^{KV}_t∈ℝ^{d_c}ctKV∈Rdc(dc≪dh⋅nhd_c≪d_h⋅n_hdc≪dh⋅nh):
下行投影(压缩):
ctKV=WDKVht其中WDKV∈Rdc×dc^{KV}_t=W^{DKV}h_t \quad 其中W^{DKV}∈ℝ^{d_c×d}ctKV=WDKVht其中WDKV∈Rdc×d
上行投影(解压):
推理阶段的关键性质——矩阵吸收:
在注意力计算中,Query 与 Key 的点积为:
可以将 WUKW^{UK}WUK 吸收到 Query 侧的投影矩阵中,推理时无需显式计算 kjCk^C_jkjC。同理,WUVW^{UV}WUV 可吸收到 WOW^OWO 中:
因此推理时 KV Cache 仅需存储低维的 ctKVc^{KV}_tctKV,而非完整的 kt,vtk_t,v_tkt,vt。
MLACache 压缩比的定量分析
KVCacheMLAKVCacheMHA=dc+dhR2⋅nh⋅dh以DeepSeek−V2配置:4dh+dh/22⋅nh⋅dh=4.52⋅nh≈2.25nh \begin{matrix} \frac{KV Cache_{MLA}}{KV Cache_{MHA}} & =\frac{d_c+d_h^R}{2⋅n_h⋅d_h}\\ 以 DeepSeek-V2 配置:\frac{4d_h+d_h/2}{2⋅n_h⋅d_h} & =\frac{4.5}{2⋅n_h}≈\frac{2.25}{n_h} \end{matrix} KVCacheMHAKVCacheMLA以DeepSeek−V2配置:2⋅nh⋅dh4dh+dh/2=2⋅nh⋅dhdc+dhR=2⋅nh4.5≈nh2.25
当 nh=96n_h=96nh=96 时,MLA 的 KV Cache 仅为 MHA 的约 2.3%(实际报告显示为 6.7%,包含解耦 RoPE 的额外开销)。相比 GQA(g=8g=8g=8 时压缩到 8/96≈8.3%8/96≈8.3\%8/96≈8.3%),MLA 压缩率更高且不牺牲每头的注意力多样性。
2.2 RoPE 与吸收性的冲突及解耦方案
2.2.1 RoPE 的定义与相对位置性质
RoPE(Rotary Position Embedding)通过旋转矩阵对 Query 和 Key 施加位置编码:
其中 Rt∈Rdh×dhR_t∈ℝ^{d_h×d_h}Rt∈Rdh×dh 为分块对角旋转矩阵,满足关键性质:
Rs⊤Rt=Rt−sR_s^⊤R_t=R_{t−s}Rs⊤Rt=Rt−s
这使得注意力计算天然包含相对位置信息:
qs⊤ktRoPE=(Rsqs)⊤(Rtkt)=qs⊤Rs⊤Rtkt=qs⊤Rt−sktq_s^⊤k^{RoPE}_t=(R_s q_s)^⊤(R_t k_t)=q_s^⊤R_s^⊤R_t k_t=q_s^⊤R_{t−s}k_tqs⊤ktRoPE=(Rsqs)⊤(Rtkt)=qs⊤Rs⊤Rtkt=qs⊤Rt−skt
2.2.2 冲突的数学证明
假设将 RoPE 施加到已压缩再升维的 Key 上:
ktRoPE=Rt⋅(WUKctKV)k^{RoPE}_t=R_t⋅(W^{UK}c^{KV}_t)ktRoPE=Rt⋅(WUKctKV)
在注意力计算中:
qt⊤⋅kjRoPE=qt⊤⋅Rj⋅WUK⋅cjKVq_t^⊤⋅k^{RoPE}_j=q_t^⊤⋅R_j⋅W^{UK}⋅c^{KV}_jqt⊤⋅kjRoPE=qt⊤⋅Rj⋅WUK⋅cjKV
我们试图将 WUKW^{UK}WUK 吸收到 qtq_tqt 侧:
qt⊤⋅Rj⋅WUK⋅cjKV≠(qt⊤WUK)⋅Rj⋅cjKVq_t^⊤⋅R_j⋅W^{UK}⋅c^{KV}_j≠(q_t^⊤W^{UK})⋅R_j⋅c^{KV}_jqt⊤⋅Rj⋅WUK⋅cjKV=(qt⊤WUK)⋅Rj⋅cjKV
矩阵乘法不满足交换律。RjR_jRj 夹在 qt⊤q_t^⊤qt⊤ 和 WUKW^{UK}WUK 之间,无法越过旋转矩阵。RjR_jRj 是位置依赖的(随 jjj 变化),而吸收要求 WUKW^{UK}WUK 能与 Query 侧合并成与位置无关的固定变换。两者的矛盾不可调和。
2.2.3 解耦 RoPE:两条独立路径
MLA 的解耦方案极其直接——让 RoPE 走旁路:
解耦方案拆分两条独立通道,参数约束、可吸收性、缓存规则整理如下表:
| 通道 | Query | Key | 是否可吸收 | 是否缓存 |
|---|---|---|---|---|
| 内容通道 | qtC=WUQ⋅WDQhtq^C_t=W^{UQ}⋅W^{DQ}h_tqtC=WUQ⋅WDQht | ktC=WUK⋅ctKVk^C_t=W^{UK}⋅c^{KV}_tktC=WUK⋅ctKV | WUKW^{UK}WUK 可被吸收 | 仅缓存 ctKVc^{KV}_tctKV |
| 位置通道 | qtR=Rt⋅WQR⋅ctQq^R_t=R_t⋅W^{QR}⋅c^Q_tqtR=Rt⋅WQR⋅ctQ | ktR=Rt⋅WKR⋅htk^R_t=R_t⋅W^{KR}⋅h_tktR=Rt⋅WKR⋅ht | 但维度极低 (dhR≪dhd_h^R≪d_hdhR≪dh) | 缓存 ktRk^R_tktR(所有头共享) |
最终拼接:
qt,i=[qt,iC; qt,iR]∈Rdh+dhRkt,i=[kt,iC; ktR]∈Rdh+dhR \begin{matrix} q_{t,i} & =[q^C_{t,i};\;q^R_{t,i}]∈ℝ^{d_h+d_h^R}\\ k_{t,i} & =[k^C_{t,i};\;k^R_t]∈ℝ^{d_h+d_h^R} \end{matrix} qt,ikt,i=[qt,iC;qt,iR]∈Rdh+dhR=[kt,iC;ktR]∈Rdh+dhR
注意力计算:
两部分独立计算后相加。ktRk^R_tktR 维度极低(通常取 dhR=dh/2=64d_h^R=d_h/2=64dhR=dh/2=64)且所有头共享,所以额外缓存开销很小。解耦 RoPE 不是工程技巧——它是低秩压缩 + 旋转位置编码这一组合下的数学必然产物。
2.3 DeepSeekMoE:细粒度稀疏激活的极致
2.3.1从稠密 FFN 到 MoE 的演进逻辑
标准 Transformer 的 FFN 是一个 d→4d→dd→4d→dd→4d→d 的双层全连接网络,所有 Token 共享同一套参数,模型规模受限于单卡算力;而 MoE Transformer 的核心思想是用多个独立的“专家”FFN 替代单一 FFN,仅在部分 Encoder 层中替换 FFN 为 MoE 模块,通过 Gating 路由器为每个 Token 选择并激活少数几个专家,在大幅扩展总参数量的同时保持单 Token 计算量可控;为解决大模型单卡显存瓶颈,工程上进一步将 MoE 层拆分为多设备模型并行部署,通过 All-to-All Dispatch/Combine 通信机制实现 Token 跨设备路由与结果收集,让大规模 MoE 模型的训练成为可能。
DeepSeek-V3 的 DeepSeekMoE 包含三类组件:
① 共享专家(Shared Expert)
- 数量:NsN_sNs 个
- 特点:所有 token 都会无差别经过这组专家,不需要路由选择
② 路由专家(Routed Expert)
- 数量:NrN_rNr 个
- 特点:只有被 Router 选中的 token 才会进入这些专家,是 MoE 的 “稀疏计算核心”
③ 路由器(Router)
- 位置:所有 token 输入的必经之路
- 核心功能: 对每个 token 计算所有路由专家的 “亲和度分数”,选出分数最高的 Top-KrK_rKr 个专家,输出每个 token 对应的专家选择和权重,指导后续路由计算。

2.3.2数学形式
FFN 输出由共享专家和路由专家的输出加权求和得到:
ht′=ut+∑i=1NsFFNi(s)(ut)+∑j=1Nrgt,j⋅FFNj(r)(ut) h'_t=u_t+\sum_{i=1}^{N_s}FFN^{(s)}_i(u_t)+\sum_{j=1}^{N_r}g_{t,j}⋅FFN^{(r)}_j(u_t) ht′=ut+i=1∑NsFFNi(s)(ut)+j=1∑Nrgt,j⋅FFNj(r)(ut)
其中门控值由 Sigmoid 亲和度归一化得到:
gt,j=st,j∑k∈TopKst,k,st,j=σ(ut⊤ej)g_{t,j}=\frac{s_{t,j}}{\sum_{k∈TopK}s_{t,k}},\quad s_{t,j}=σ(u_t^⊤e_j)gt,j=∑k∈TopKst,kst,j,st,j=σ(ut⊤ej)
核心配置:
Ns=64N_s=64Ns=64(共享专家),Nr=256N_r=256Nr=256(路由专家)
TopK = 8(每 Token 激活 8 个路由专家)+ 64 共享专家 = 72 个激活专家
总参数 671B,激活参数 37B,激活比 ≈ 18:1
2.3.3 Device-Limited Routing
在分布式训练中,每个 Token 最多被发送到 MMM 个节点:
- 选择亲和度得分之和最高的 MMM 个节点
- 在这 MMM 个节点的专家中选 TopK
论文显示 M≥3M≥3M≥3 时收益明显。这一设计将跨节点通信限制在可控范围,使得 4 节点的 EP 配置下,通信与计算可几乎完全重叠。
2.4 无辅助损失负载均衡的动态偏置机制
2.4.1 传统方案的困境
MoE 路由 TopK({st,i})TopK(\{s_{t,i}\})TopK({st,i}) 极易坍缩——少数专家被高频激活,其余闲置。标准做法是加辅助损失 Lauxℒ_{aux}Laux 强制均匀:
Ltotal=LLM+α⋅Lauxℒ_{total}=ℒ_{LM}+α⋅ℒ_{aux}Ltotal=LLM+α⋅Laux
但辅助损失过大会损害模型性能,过小则无法有效均衡。
2.4.2 动态偏置方案
DeepSeek-V3 将路由决策与输出权重解耦:
路由决策(决定选谁):TopK({st,i+bi}i=1Nr,K)输出门控(决定用多大权重):gt,i=exp(st,i)∑j∈TopKexp(st,j) \begin{matrix} 路由决策(决定选谁) & :TopK(\{s_{t,i}+b_i\}_{i=1}^{N_r},K)\\ 输出门控(决定用多大权重) & :g_{t,i}=\frac{\exp(s_{t,i})}{\sum_{j∈TopK}\exp(s_{t,j})} \end{matrix} 路由决策(决定选谁)输出门控(决定用多大权重):TopK({st,i+bi}i=1Nr,K):gt,i=∑j∈TopKexp(st,j)exp(st,i)
偏置 bib_ibi 只影响路由选择,不进入输出门控。训练中根据实际负载动态调节:
bi←{bi−γ,专家i过载(门槛升高→更难被选中)bi+γ,专家i欠载(门槛降低→更容易被选中) b_i← \begin{cases} b_i−γ, & 专家i过载(门槛升高 → 更难被选中)\\ b_i+γ, & 专家i欠载(门槛降低 → 更容易被选中) \end{cases} bi←{bi−γ,bi+γ,专家i过载(门槛升高→更难被选中)专家i欠载(门槛降低→更容易被选中)
其中 γγγ 为偏置更新速度超参数。
2.4.3 为什么这比辅助损失更好
- 辅助损失:在梯度层面拉扯模型参数,迫使专家选择趋向均匀——这会干扰语言建模的优化目标
- 动态偏置:在控制逻辑层面调整——相当于在路由器上加了一个"流量控制器",模型本身可以自由学习最优表征
此外,为防止极端情况,DeepSeek-V3 还使用了一个微型序列级平衡损失 LBalℒ_{Bal}LBal 作为安全网,但系数极小,对主损失的干扰可忽略。
关键成果:DeepSeek-V3 在整个训练过程中没有丢弃任何 Token(V2 曾丢弃 10%),训练高度稳定,未发生任何不可恢复的 loss spike 或回滚。
3. DeepSeek-V3 工程创新
DeepSeek-V3 的工程创新是其能以 $557.6 万成本训练 671B 模型的关键。FP8 训练将显存和带宽需求减半,DualPipe 将通信完全隐藏在计算之后——两项叠加,打破了跨节点 MoE 训练的通信瓶颈。
3.1 FP8 混合精度训练框架
| 精度格式 | 总位数 | 指数位 | 尾数位 | 动态范围 | 精度 | 显存占用 (相对 FP32) |
|---|---|---|---|---|---|---|
| FP32 | 32 | 8 | 23 | ±3.4×10³⁸ | 最高 | 100% |
| BF16 | 16 | 8 | 7 | ±3.4×10³⁸ | 中等 | 50% |
| FP16 | 16 | 5 | 10 | ±65504 | 中等 | 50% |
| FP8 E4M3 | 8 | 4 | 3 | ±448 | 较低 | 25% |
| FP8 E5M2 | 8 | 5 | 2 | ±57344 | 更低 | 25% |
FP8 训练的主要挑战:
- 动态范围极窄(E4M3 仅 ±448)→ 异常值(outliers)导致严重量化误差
- 累加精度受限:H800 Tensor Core 的 FP8 GEMM 累加精度仅约 14 位,远低于 FP32
- 不同张量对精度的敏感度不同:激活、权重、梯度各有特性
3.2 细粒度量化:Tile-wise 与 Block-wise
3.2.1 Tensor-wise 量化的局限
传统 FP8 量化对整个 Tensor 使用单一 scale factor:
FP8(X)=Convert(Xscale),scale=max(∣X∣)448FP8(X)=Convert\left(\frac{X}{scale}\right),\quad scale=\frac{max(|X|)}{448}FP8(X)=Convert(scaleX),scale=448max(∣X∣)
但当 Tensor 中存在异常值(outlier)时,单一 scale 会导致大部分正常值被压缩到极小区间——产生严重的 rounding error。
3.2.2 DeepSeek 的细粒度方案
| 量化对象 | 分组方式 | 说明 |
|---|---|---|
| Activations | Tile-wise: 1×1281×1281×128 | 每个 token、每 128 个 channel 使用独立 scale |
| Weights | Block-wise: 128×128128×128128×128 | 每 128 输入通道 × 128 输出通道使用独立 scale |
量化核心原理:通过将量化粒度缩小到更小的元素组,每组内的数值分布更均匀,scale 可以更精确地反映该组的动态范围。即使整个 Tensor 存在极端异常值,也只影响其所在 tile/block,不会污染其他区域的量化精度。
对应的细粒度量化公式:
FP8(Xi,j)=Convert(Xi,jscalei(tile)),scalei=maxj(Xi,j)448FP8(X_{i,j})=Convert\left(\frac{X_{i,j}}{scale^{(tile)}_i}\right),\quad scale_i=\frac{\max_j(X_{i,j})}{448}FP8(Xi,j)=Convert(scalei(tile)Xi,j),scalei=448maxj(Xi,j)
3.2.3 激活与权重的尺度耦合
在 GEMM 计算 C=A×BC=A×BC=A×B 中,激活 AAA 的 tile scale 沿内维度 KKK 方向变化,权重 BBB 的 block scale 也沿 KKK 方向变化。两者的 dequantization 可在 CUDA Core 上高效融合。
这种 per-group scaling 沿 GEMM 内维度 KKK 的功能并非标准 FP8 GEMM 原生支持。DeepSeek 通过精确的 FP32 累加策略 + CUDA Core dequant 实现了这一机制。这一设计与 NVIDIA Blackwell 系列宣布的 microscaling 格式高度一致,具有前瞻性。
3.3 累加精度提升与 E4M3 全场景策略
3.3.1 累加精度问题
NVIDIA H800 GPU 的 FP8 GEMM(WGMMA 指令)在 Tensor Core 上的累加精度仅约 14 位,显著低于 FP32 的 23 位尾数 + 隐式位。当内维度 KKK 较大时(大 batch size 或宽模型),累加误差可达到近 2%。
3.3.2 Promotion to CUDA Core 策略
DeepSeek 采用 间隔提升(Interval Promotion) 方案:
每 NC=128N_C=128NC=128 个 MMA 元素(即 4 次 WGMMA),将 Tensor Core 的中间结果复制到 CUDA Core 的 FP32 寄存器
在 CUDA Core 上完成高精度 FP32 累加 + dequantization(乘以 scale factors)
利用 H800 架构上两个 warpgroup 交替执行的特点:一个 warpgroup 执行提升操作时,另一个可继续 MMA——两者重叠,Tensor Core 利用率不受影响。
3.3.3 E4M3 全场景策略
与以往工作(Fprop 用 E4M3,Dgrad/Wgrad 用 E5M2)不同,DeepSeek-V3 在所有 GEMM 中统一使用 E4M3 格式:
| 操作 | 传统策略 | DeepSeek-V3 策略 |
|---|---|---|
| Fprop | E4M3(精度优先) | E4M3 |
| Dgrad | E5M2(范围优先) | E4M3 |
| Wgrad | E5M2(范围优先) | E4M3 |
E4M3 全场景的可行性源于细粒度量化:通过在更小的 tile/block 内共享 exponent 位,有效缓解了 E4M3 动态范围不足的问题。Mantissa over Exponents——优先保证精度,用分块缩放来弥补范围。
3.3.4 低精度存储与通信
- Optimizer States:AdamW 的一阶矩和二阶矩从 FP32 降为 BF16,几乎无损
- Master Weights & Gradients:保持 FP32,确保数值稳定性
- Cached Activations:以 FP8 存储,Wgrad 直接使用
- MoE Dispatch:激活在 All-to-All 通信前量化为 FP8,通信量减半
- Attention 后 Linear 输入:使用定制的 E5M6 格式(6 位尾数),scale 为 2 的整数次幂以避免额外量化误差
3.4 DualPipe 调度:计算-通信重叠的时序分析
3.4.1 问题背景
跨节点 MoE 训练的计算-通信比仅约 1:1——意味着如果不做重叠,GPU 将有 50% 的时间在等待通信。传统 1F1B(One-Forward-One-Backward)流水线并行无法解决这一问题。
3.4.2 DualPipe 的核心思想
DualPipe 将每个 micro-batch 的计算拆分为 4 个组件:Attention、All-to-All Dispatch、MLP、All-to-All Combine。反向传播中,Attention 和 MLP 进一步拆分为 backward-for-input 和 backward-for-weights。然后在一个 forward-backward chunk pair 中重新排列这些组件,实现计算与通信的完全重叠。
3.4.3 全流水线调度的双向设计
DualPipe 通过将每个 micro-batch 的计算细粒度拆解为 Forward (F)、Backward-for-Input (B) 和 Backward-for-Weights (W) 三个阶段,并从流水线两端双向喂入任务,实现了计算与通信在时间轴上的‘垂直对齐’。镜像对称的调度让跨节点的 All-to-All 通信(Dispatch/Combine)被完全掩盖在 MLP 和 Attention 的计算窗口内,几乎消除了流水线气泡(Pipeline Bubble)。

3.4.4 Pipeline Bubble 对比
| Method | Bubble说明 |
|---|---|
| 1F1B PP | (PP−1)(F+B)(PP-1)(F +B)(PP−1)(F+B) |
| ZB1P | (PP−1)(F+B−2W)(PP-1)(F +B-2W)(PP−1)(F+B−2W) |
| DualPipe (Ours) | 气泡规模显著小于1F1B、ZB1P,配合大EP分摊双倍参数内存开销 |
PPP = pipeline stage 数,MMM = micro-batch 数,FFF = forward+backward 重叠因子。DualPipe 的 bubble 显著小于 1F1B 和 ZB1P,同时通过大 EP 分摊了双倍参数内存的开销。
3.4.5 FP8 如何消除跨节点通信瓶颈
跨节点 All-to-All 通信的瓶颈在于 IB 带宽(50 GB/s)仅为 NVLink 带宽(160 GB/s)的约 1/3。FP8 将通信量减半:
通信时间FP8=12⋅通信时间BF16通信时间_{FP8}=\frac{1}{2}⋅通信时间_{BF16}通信时间FP8=21⋅通信时间BF16
结合 DualPipe 的重叠策略和节点限制路由(每 Token ≤4 节点),DeepSeek-V3 实现了 跨节点通信的几乎零开销——只要计算-通信比保持恒定,模型可进一步扩展而无需额外通信成本。
4. 训练增益:MTP 多 Token 预测
4.1 级联式 MTP 架构
传统 GPT 在每个位置仅预测下一个 Token(Next Token Prediction)。DeepSeek-V3 引入 Multi-Token Prediction (MTP),在每个位置预测后续 DDD 个 Token。
与 Gloeckle et al. (2024) 的并行独立输出头不同,DeepSeek 采用级联式(Sequential)MTP,保持完整的因果链:
关键设计细节:
- 共享 Embedding 与 Output Head:所有 MTP 模块与主模型共享同一套 Embedding 和 Output Head,物理共享减少了参数量和显存
- 因果链保持:hki+1h^{i+1}_khki+1 不仅依赖主模型对 tit_iti 的编码 hi1h^1_ihi1,还依赖前一 MTP 模块对 ti+1t_{i+1}ti+1 的预测编码 hi+1kh^k_{i+1}hi+1k——这与 EAGLE 投机解码的思路同源
- 级联而非并行:Gloeckle 等并行预测 DDD 个 Token 使用独立输出头,DeepSeek 级联预测保持因果链,使模型在预测更深位置的 Token 时可以利用其对较近位置的预测结果
MTP 总损失:
LMTP=λD∑k=1DLMTPk=λD∑k=1DCrossEntropy(Pk+1(tk+2),tk+2) ℒ_{MTP}=\frac{λ}{D}\sum_{k=1}^{D}ℒ^k_{MTP}=\frac{λ}{D}\sum_{k=1}^{D}CrossEntropy(P_{k+1}(t_{k+2}),t_{k+2}) LMTP=Dλk=1∑DLMTPk=Dλk=1∑DCrossEntropy(Pk+1(tk+2),tk+2)
其中 λλλ 为加权因子。
4.2 监督信号密度与推理加速
4.2.1 训练增益:增加监督信号密度
标准 Next Token Prediction 在每个位置只产生一个监督信号。MTP 在每个位置产生 D+1D+1D+1 个(主模型 1 个 + DDD 个 MTP 模块):
监督信号密度MTP=(D+1)×监督信号密度STP监督信号密度_{MTP}=(D+1)×监督信号密度_{STP}监督信号密度MTP=(D+1)×监督信号密度STP
这有两个效果:
- 数据效率提升:每个训练 step 从同样数量的 Token 中提取更多学习信号
- 预规划能力:为了预测 t+2,t+3,…t+2,t+3,…t+2,t+3,…,模型必须在当前层级就建立对未来语境的"预判"表征——这是一种隐式的规划(Planning)训练
4.2.2 推理加速:投机解码
MTP 模块在训练后可直接用于投机解码(Speculative Decoding):
- 主模型生成第一个 Token
- MTP 模块并行"投机"后续 DDD 个 Token
- 主模型一次性验证所有投机 Token
- 接受匹配的 Token,拒绝不匹配的,回退重生成
这可将推理时延降低到原来的 1/(D+1)1/(D+1)1/(D+1) 以下(取决于接受率)。在实际应用中,投机解码的加速比高度依赖于“接受率”。如果 MTP 模块预测的 Token 与主模型不一致,性能提升会大幅缩水甚至失效。
5. 全维度差异对比与创新总结
5.1 GPT vs DeepSeek-V3 全景对比
| 维度 | GPT-4 | DeepSeek-V3 |
|---|---|---|
| 总参数 | ~1.8T(MoE,推测) | 671B |
| 激活参数 | ~280B(推测) | 37B (5.5%) |
| 注意力机制 | GQA (g=8g=8g=8) | MLA (低秩联合压缩) |
| KV Cache/Token | 2⋅ng⋅dh⋅L2⋅n_g⋅d_h⋅L2⋅ng⋅dh⋅L | dc+dhR≈576d_c+d_h^R≈576dc+dhR≈576 元素 |
| KV Cache 压缩比 | ~10.4%(相对 MHA) | ~6.7%(相对 MHA) |
| FFN 结构 | 大粒度 MoE(推测 8-16 专家) | DeepSeekMoE(64 共享 + 256 路由) |
| 负载均衡 | 辅助损失 | 无辅助损失 + 动态偏置 |
| Token 丢弃 | 不明确 | 零丢弃 |
| 训练精度 | BF16/FP16 | FP8 混合精度 (E4M3 全场景) |
| 量化粒度 | Tensor-wise | Tile-wise (1×128) + Block-wise (128×128) |
| 流水线并行 | 1F1B / ZB | DualPipe(双向 + 通信完全隐藏) |
| 位置编码 | RoPE | 解耦 RoPE(内容通道可吸收) |
| 预测模式 | 单 Token 预测 (STP) | 多 Token 预测 (MTP) |
| 训练成本 | 数千万-上亿美元 | $557.6 万(2.788M H800 GPU 小时) |
| 训练数据 | ~15T tokens(推测) | 14.8T tokens |
| 上下文长度 | 128K | 128K(两阶段扩展:4K→32K→128K) |
| 训练稳定性 | 存在 loss spike,需回滚 | 全程无不可恢复 loss spike,零回滚 |
| 并行策略 | TP + PP + DP | 64-way EP + 16-way PP (DualPipe) + ZeRO-1 DP |
| 推理部署 | 统一部署 | PD 分离(Prefill 32 GPU / Decode 320 GPU) |
5.2 核心结论
| GPT 路线 | DeepSeek 路线 | |
|---|---|---|
| 解题思路 | 增大资源投入(更多 GPU × 更长时间) | 提高资源利用效率(同样资源做更多事) |
| 架构策略 | MHA/GQA + 稠密/大粒度 MoE 自 GPT-1 始基本不变 | 改造注意力、FFN、训练目标、数值精度 |
| 推理成本 | 与参数量 1:1 线性增长 | 与激活参数量挂钩,与总参数量解耦 |
| 长文本 | memory-bound,质变需要架构改动 | memory-efficient,架构层已解决 |
| 核心问题 | “如何获得更多算力?” | “如何让已有算力更高效?” |
DeepSeek-V3 的核心贡献
- MLA (Multi-head Latent Attention):通过低秩联合压缩,证明了 KV Cache 可以从 2nhdh2n_hd_h2nhdh 压缩到 dc+dhRd_c+d_h^Rdc+dhR,并通过解耦 RoPE 实现了内容通道中 WUKW^{UK}WUK 的完美吸收。这不是工程技巧,而是线性代数结构 + 位置编码约束下的数学必然。
- 无辅助损失负载均衡:将 MoE 的负载均衡从优化目标层面(辅助损失)下移到控制逻辑层面(动态偏置)——这是对"MoE 路由"问题本质的重新认识:负载均衡是工程约束,不应污染模型的学习目标。
- FP8 全场景训练:首次在超大规模模型上验证了 FP8 训练的可行性。细粒度量化(tile-wise + block-wise)+ 间隔 FP32 累加 + E4M3 全场景策略,三者构成完整的低精度训练方法论。
- DualPipe + 通信 Kernel 协同设计:将 MoE 通信从瓶颈变为可隐藏的背景操作。配合 FP8 减半的通信量,实现了跨节点通信的几乎零开销,使得 64-way EP 在 8 节点上的训练效率接近单节点。
- MTP (Multi-Token Prediction):通过级联式多 Token 预测增加训练信号密度,同时为投机解码提供现成的 draft model。
更多推荐



所有评论(0)