☰
DeepSeek-V3拆解:671B MoE、DualPipe与557万账单
2026/11/4 7:26:27 网站建设 项目流程

简介:DeepSeek-V3 技术报告 PDF 面向大模型研究者、算法工程师与深度学习方向的高年级学习者,可用于了解这一总参数 671B、每 token 激活 37B 的 MoE 语言模型的技术路线。正文包括多头潜在注意力(MLA)、DeepSeekMoE 与无辅助损失负载均衡、多 token 预测训练目标等架构设计,并延伸至 DualPipe 流水并行、FP8 混合精度训练等基础设施细节,以及 148 万亿 token 预训练与后训练流程、基准评测结果。压缩包内共 1 个 PDF 文件,约 5.44MB,为完整报告原文,含章节目录、对比图表与消融实验附录,便于按模块查阅引用。已有 157 人学习下载。读者可从中获取训练成本(2.788M H800 GPU 小时)、性能基准对照、硬件设计建议与后续研究方向等一手信息,适合论文精读、技术汇报或复现实验时作参考底稿。

1. 一份 671B 的报告,真正值钱的是那张 557 万美元的账单

671B 总参数、每 token 激活 37B、14.8T 训练 token、2.788M H800 GPU 小时。第一次翻 DeepSeek-V3 技术报告,我先看的不是基准图里 MMLU 那行 88.5,而是表 1 里那笔账:预训练 2664K GPU 小时、上下文扩展 119K、后训练 5K,按每 GPU 小时 2 美元折算,总共 557.6 万美元。同样的卡、同样的集群规模,很多团队跑出来的账要翻好几倍,差的不是运气,是算法、框架、硬件三层协同设计有没有打通。

这篇拆解面向三类人:要选模型的人看参数结构和成本口径,做训练优化的人看 DualPipe、FP8、跨节点全到全通信怎么叠在一起,读报告做技术判断的人看哪些数字能抄、哪些前提一丢就翻车。我把自己读这份 PDF 时踩过的坑也摆出来,省得你走一遍。

2. 参数账先算清:671B 总参里只有 37B 在干活

2.1 MLA 压缩的是 KV 缓存,别把它当参数裁剪

多头潜在注意力(MLA)这个名字容易被误读成「把注意力头砍掉省参数」,实际省的是推理阶段的 KV 缓存和训练阶段的激活内存,总参数量一分没少。它的做法是把每个 token 的 key 和 value 先下投影成一个低维潜在向量 c,再分别上投影还原出 k 和 v;携带旋转位置编码(RoPE)的那一小段 key 单独走一条解耦通路,不参与压缩。

这个设计带来的直接变化是缓存结构。标准多头注意力在推理时要缓存所有头的 k 和 v,缓存量随头数线性增长;MLA 只缓存潜在向量 c 和那段带位置信息的 k,缓存项从「与头数成正比」变成了「与压缩维度成正比」。上下文拉长到 128K 时,这个差别不是百分之几,而是数量级上的显存和带宽差别,长上下文能不能跑得起、单卡能挂多长序列,基本由这一项决定。

报告里对查询侧也做了低秩压缩,把 query 先压到低维再上投影。这一招在推理时收益不大,但在训练时能明显压低激活内存占用,属于典型的「训练省钱、推理省显存」两头吃的设计。我在看这类结构时有个习惯:先分清哪部分是为了省参数、哪部分是为了省内存、哪部分是为了省带宽,三者混在一起谈,很容易得出「MoE 就是省算力」这种半对半错的结论。

提示:估算部署显存时,先按 37B 激活参数算权重,再单独按压缩维度算 KV 缓存,不要把 671B 整个乘上去,也不要把缓存项直接忽略。

2.2 细粒度专家加共享专家:MoE 的分班逻辑

DeepSeekMoE 的结构可以粗暴理解成「固定班底 + 走班老师」。前馈网络部分拆成两类:一类是共享专家,每个 token 都过,负责吸收通用模式;另一类是路由专家,数量多、单个更细,由门控网络按 token 挑出 K 个激活。FFN 的最终输出是共享专家输出之和,加上被选中路由专家输出的加权和。共享专家兜住通用能力,路由专家做特化,这是它跟早期 MoE 最大的结构差别。

门控的算法细节值得停一下。亲和力分数用 sigmoid 算,而不是 softmax,然后在被选中的那 K 个分数之间做归一化得到门控值。sigmoid 的好处是每个专家的分数彼此独立,不会因为一个专家分数变高就强行压低别人;归一化只作用在选中的集合上,保证加权和量级稳定。这个组合在实现上比 softmax 略麻烦,但对专家特化更友好。

路由还有一层硬约束叫节点限制路由。每个 token 最多只会被发到 M 个节点,节点按「该节点上所有专家的亲和力得分之和」排序选出。这条约束不是为了模型效果,纯粹是为了控制跨节点通信量,是后面 DualPipe 能把通信藏起来的前提。另一个配套结果是全程无丢弃 token:负载均衡做得好,就不需要用 capacity factor 强截断,训练和推理都不丢 token,避免了那类「某些 token 直接被扔掉」的隐性质量损失。

2.3 无辅助损失的负载均衡:一个偏置项顶替一项损失函数

传统 MoE 防路由崩溃靠辅助损失:在主损失之外加一项,惩罚专家负载不均。问题是这项损失和语言建模目标方向不一致,权重给小了不起作用,给大了拖累效果,调这个权重是很多训练任务里的玄学环节。这份报告的做法是给每个路由专家挂一个偏置项 b,只在选 top-K 的时候加到亲和力分数上,门控值仍旧用原始分数算。

训练过程中持续统计整个 batch 上每个专家的负载,每一步结束时按方向微调:某专家过载就把它的 b 调小一点,欠载就调大一点,调整步长是一个叫偏置更新速度的超参数 γ。b 不参与梯度、不进优化器、不影响前向数值,它本质上是把「均衡」这件事从损失函数里挪到了路由决策的参数更新上,所以不会跟主目标打架。

# 无辅助损失负载均衡:每个训练步结束后按整批负载调整偏置 b # 关键点:b 只参与 top-K 路由选择,不参与门控值计算 GAMMA = 1e-3 # 偏置更新速度,报告称 bias update speed,量级需按模型规模调 def update_expert_bias(expert_score_sum, bias, gamma=GAMMA): # expert_score_sum: 形状 [num_routed_experts],整个 batch 上各专家的负载统计 # bias: 形状 [num_routed_experts],初始化为 0 mean_load = expert_score_sum.mean() for i in range(len(bias)): if expert_score_sum[i] > mean_load: # 过载,压低偏置 bias[i] -= gamma elif expert_score_sum[i] < mean_load: # 欠载,抬高偏置 bias[i] += gamma return bias

这段逻辑有三个容易改错的地方。统计粒度必须是整个 batch 而不是单条序列,按序列调会让偏置在长序列上抖得厉害;γ 的量级要跟路由分数的量级对齐,分数用 sigmoid 出来在 0 到 1 之间,γ 取太大偏置会震荡,取太小追不上负载漂移;更新要放在优化器 step 之后做,混进梯度里就退化成辅助损失了。

报告还保留了一项极小的序列级平衡损失,权重 α 给得非常小,作用是防止单个序列内部出现极端倾斜。这一点常被忽略:所谓「无辅助损失」不是一项均衡手段都不要,而是不再依赖大权重辅助损失来做全局均衡,序列级的兜底还在。

3. 训练效率拆解:DualPipe、FP8 和跨节点全到全怎么叠

3.1 管道气泡对比:三种 PP 调度差在哪

MoE 训练里跨节点专家并行引入的通信开销很大,报告给的比例是计算与通信大约 1:1。这个比例下,如果通信和计算是串行的,一半的卡时都在等数据。DualPipe 的思路是把每个块拆成四段:注意力、全到全分发、MLP、全到全合并;反向块再把注意力和 MLP 各自拆成「对输入的梯度」和「对权重的梯度」。拆完之后手工调整通信与计算占用的 SM 比例,让分发和合并完全藏在计算后面。

调度上它用双向流水:同时从管道两端喂微批次,正反两个方向的批次对称推进。这样做的另一个好处是气泡更少,而且气泡和激活内存都不随微批次数增加而涨。

方法管道气泡峰值激活内存
1F1B(PP − 1)(F + B)1 × PP
ZB1P(PP − 1)(F + B − 2W)1 × PP
DualPipe约 (PP/2 − 1)(F&B + B − 3W)2 × PP + 1

表里 F 是前向块耗时,B 是完整反向块耗时,W 是「对权重的梯度」那段耗时,F&B 是两个相互重叠的前向反向块的耗时。代价是峰值激活内存翻倍还多一格,但因为 EP 开得大(64 路专家并行),这部分内存并不构成瓶颈。判断能不能抄,就看你的 EP 规模和微批次能否被 2 整除:DualPipe 只要求管道阶段和微批次可被 2 整除,不要求微批次能被管道阶段整除,这个限制比一些双向流水方案宽松。

3.2 IB 和 NVLink 的带宽差:路由约束是算出来的

集群是 2048 张 H800,每节点 8 卡走 NVLink 和 NVSwitch,节点间走 InfiniBand。报告给的数字是 NVLink 160GB/s、IB 50GB/s,比值约 3.2 倍。这个硬件事实直接决定了路由策略:每 token 最多发往 4 个节点,先把 token 通过 IB 送到目标节点上「节点内索引相同」的那张卡,到了之后立刻用 NVLink 转发到真正持有目标专家的卡,不让它被后续到达的 token 堵住。

算一下就明白为什么是 4 个节点:每节点平均能命中 3.2 个专家,4 个节点理论上能覆盖最多 13 个专家,而实际只选 8 个路由专家,所以这套转发机制在额定通信成本下还有余量。实现上只用了 20 个 SM,切成 10 个通信通道,发送、转发、接收各由专门的 warp 处理,warp 数量按实际负载动态分配。为了减少对其他计算 SM 的干扰,还用了定制 PTX 指令并自动调通信块大小,压 L2 缓存占用。

这里的血泪经验是:很多团队抄了 DualPipe 的调度图,却没抄节点限制路由和这套转发内核,结果通信仍然压不住,还以为是调度算法不行。调度和通信内核是一套东西,拆开用基本失效。

3.3 FP8 混合精度:分块量化保住了什么

FP8 训练在这份报告里是首次在这么大体量上被验证有效。框架是混合精度:大部分矩阵乘跑在 FP8 上,少数对精度敏感的算子留在 BF16 甚至 FP32,累加用高精度。真正决定成败的是量化粒度——按张量整体量化还是按块量化,前者实现简单但容易被离群值带偏,后者把缩放因子下沉到更细的块,能显著降低量化误差。

报告专门列了「量化和乘法带来的精度提升」和「低精度存储与通信」两节,说明这件事不是换个 dtype 就完事:存储和通信也走低精度,才能在显存和带宽两头拿到收益。如果只把计算降到 FP8、存储和通信还是 BF16,收益会砍掉一大半,还多了精度风险。

3.4 内存省下来的地方:重算、CPU 侧 EMA、共享头

三处细节值得单独记。第一,所有 RMSNorm 在反向时重算,MLA 的上投影也重算,不长期保存输出激活,用少量算力换大量显存。第二,指数移动平均参数放 CPU 内存,每步异步更新,不占 GPU 显存也几乎不占时间。第三,靠 DualPipe 把最浅层(含嵌入)和最深层(含输出头)放在同一个 PP rank 上,让 MTP 模块和主模型物理共享嵌入层与输出头的参数和梯度。

第三点是个巧劲:多 token 预测模块本来要多带一套嵌入和输出头,共享之后这部分开销直接消失。这类「靠并行布局顺手省内存」的设计,比单独写一个省显存 trick 更值得学。

4. 从 14.8T token 到零回滚:稳定性和后训练才是分水岭

4.1 两阶段长上下文:先 32K 再 128K

预训练在 14.8T 高质量多样化 token 上完成,之后做两阶段上下文扩展:第一阶段把最大长度拉到 32K,第二阶段再拉到 128K。分两段而不是一步到位,是为了避免位置编码外推一次跨太大导致的性能塌陷,中间那一段相当于给模型一个适应期。

报告里最扎眼的一句是训练全程稳定:没有出现任何不可恢复的损失峰值,也没有做任何回滚。大规模训练里,损失尖峰和回滚是常态,一次回滚意味着几天卡时白烧。能做到零回滚,一半靠前面那些工程优化(通信藏住了、数值精度控住了、负载均衡不掉 token),一半靠数据质量和超参没乱来。评估一句「训练稳定」,比多刷两个点更值钱。

4.2 从长链思维模型蒸馏:把反思模式搬进来

后训练分两段:监督微调加强化学习。强化学习部分用了奖励模型和群体相对策略优化,这套组合在推理类任务上比较常见,作用是让模型在同一个问题上采样多条回答、按相对优劣更新策略,省掉一个独立的价值网络。

更有意思的是知识蒸馏那一步:把长链思维模型里的推理能力提炼进标准模型。长链模型擅长验证和反思,但输出冗长、延迟高;标准模型快但推理弱。蒸馏的价值是把「先验证再作答」的模式注入进去,同时用训练手段控制住输出风格和长度,不让它学会长篇大论。报告还提到模型本身可以当生成式奖励模型用,以及自我奖励的讨论,这两块属于后训练的延伸玩法,做对齐的人可以顺着看。

4.3 评测数字怎么读:六个数各有各的前提

报告正文点名的几个核心结果,我按「这个数说明什么」列一遍:

基准分数该看什么
MMLU88.5学科知识广度,接近闭源旗舰,开源里领先
MMLU-Pro75.9更难的多学科推理,区分度比 MMLU 高
GPQA59.1研究生级问答,考的是硬知识而非套路
MATH-50090.2数学推理,报告称超过部分长链模型
AIME 202439.2竞赛数学,非长链模型里的最好水平
Codeforces51.6竞赛编程百分位,代码竞赛类基准领先
SWE-bench 已验证42.0工程类修复任务,略低于最强闭源,但明显高于其他开源

读这张表要盯住两个前提:一是这些是非长链思维模型里的对比,跟长链模型的分数不能直接并排;二是事实性基准上呈现明显的中文优势,英文事实知识仍落后于最强闭源模型,中文事实知识反超。选型时如果业务以中文知识问答为主,这个差异比总分更值得看。

5. 读这份报告最容易踩的五个坑

5.1 按 671B 估算部署显存,结果算出来要八张卡起步

现象:拿 671B 乘 2 字节,估出 1.3TB 权重,直接判定单机部署不可能。

原因:MoE 每 token 只激活 37B,权重确实要全量驻留,但决定单卡能不能跑的是「权重分片 + 激活参数走哪条路径 + KV 缓存」,三者混算就失真。

解决:权重按 671B 分片规划,单卡显存压力按分片后的份额算;KV 缓存单独按 MLA 的压缩维度算;先留出通信缓冲,再看能不能塞进整机。别用一个总数拍板。

5.2 以为无辅助损失就是彻底不要均衡手段

现象:照着删掉辅助损失,训练到几十亿 token 后路由开始倾斜,最后几个专家吃掉大部分 token。

原因:报告里的偏置项更新和极小权重的序列级损失是一套组合,只删损失、不实现偏置更新,等于把安全带解了还继续开。

解决:先实现按 batch 统计的偏置更新,确认偏置在训练中确实在动;再补一个极小权重的序列级损失兜底;监控每个专家的负载曲线,倾斜超过阈值就停下来查 γ 和数据分布。

5.3 抄了 DualPipe 的调度图,通信没藏住

现象:按双向流水改完,理论气泡少了,实际吞吐几乎没变,profiler 里全到全通信仍占三成以上时间。

原因:DualPipe 依赖节点限制路由和配套的跨节点转发内核,路由不受限时跨节点流量暴涨,转发路径也不对,通信自然藏不住。

解决:先把每 token 的目标节点数压到 4 以内,按节点上专家亲和力之和选节点;再实现「先 IB 到同索引卡、再 NVLink 转发」的路径;最后才调 SM 和通道配比。

5.4 把 2.788M GPU 小时当成从零到上线的全部成本

现象:拿 557.6 万美元去做预算,实际花超一大截。

原因:报告明确写了这笔账只含官方训练,不含前期研究、架构与算法消融、数据构建与清洗的成本。消融实验在真实项目里往往比正式训练更烧卡。

解决:预算里单列消融和数据两栏,按正式训练的 1 到 2 倍准备;把长上下文扩展和后训练单独排期,它们是 119K 和 5K GPU 小时的量级,但依赖不同的数据和流程。

5.5 拿不同评测设置下的分数直接对比

现象:把自己的 MMLU 分数和报告里的 88.5 并排放,发现差了几个点,怀疑模型或实现有问题。

原因:few-shot 数量、prompt 模板、是否用思维链、答案抽取规则,任何一项不同都能造成几个点的差。

解决:复现时固定一套自己的评测脚本,先在公开小模型上校准,再拿去评目标模型;引用他人分数时标注设置;跨模型对比只比同设置下的数。

6. 落地清单:把这份报告拆成三件今天就能动手的事

我不建议把这份 PDF 当论文通读一遍就放下,它的价值集中在三块可操作的东西上,按优先级排一下:

优先级动作产出
高把参数账和成本账做成自己的估算表给定卡数和周期,算出能训多大、烧多少钱
高按 FP8 与通信重叠列优化核对单逐条对照现有训练框架,找出没吃到的那几项
中把评测口径写进验收标准内部评测脚本固定设置,跨模型可比

第一件事最容易被跳过,但回报最直接。把总参、激活参数、KV 缓存、每万亿 token 的 GPU 小时、租赁单价这五个格子填上,你会发现很多「训不起」的判断其实是估错了对象。报告给的锚点是每万亿 token 约 180K H800 GPU 小时,在 2048 卡集群上折合 3.7 天,拿这个去校准自己的数字,偏差大就说明哪里漏算了。

# 按报告口径核算训练成本:只算 GPU 小时,不含消融实验与数据构建 pretrain = 2_664_000 # 预训练 H800 GPU 小时 ctx_extend = 119_000 # 两阶段长上下文扩展 post_train = 5_000 # SFT + RL price = 2.0 # 每 GPU 小时租赁价,美元 total_hours = pretrain + ctx_extend + post_train print(f"总 GPU 小时: {total_hours/1e6:.3f}M") print(f"总成本: {total_hours*price/1e6:.2f}M 美元") tokens = 14.8e12 print(f"每万亿 token: {pretrain/(tokens/1e12)/1000:.0f}K GPU 小时") # 改动 price 和卡数即可换算自己的预算;若卡数减半,周期约翻倍,成本不变

这段脚本的意义不在算出来的三个数,而在它把「卡数、周期、成本」三者的换算关系固化了。卡数减半不会省钱,只是把时间拉长;单价谈下来才是真的省。改 price 那一行做敏感性分析,比拍脑袋报预算靠谱得多。

第二件事是把优化核对单打印出来贴在工位上:RMSNorm 和上投影有没有重算、EMA 有没有挪到 CPU、嵌入层和输出头有没有物理共享、通信内核有没有压 L2 占用、分块量化的粒度够不够细。这五条只要中三条以上,训练吞吐就会有肉眼可见的变化,不需要动模型结构。

第三件事最没有技术含量却最容易翻车。我在早期项目里吃过一次亏:拿内部评测脚本跑出来的分数去对标公开榜单,差 4 个点,排查了两周才发现是答案抽取规则不同。从那以后我每次看一份训练报告,都强制走一遍「参数量、激活量、通信比、评测口径」四问,四个都能对上,才敢把数字往汇报里写。

这份报告真正的门槛不在公式,而在那些「为什么是 4 个节点」「为什么 γ 这么小」「为什么气泡和激活内存都不随微批次涨」的取舍背后。PDF 本身值得存一份在手边,改架构、调并行、报预算的时候翻到对应章节,比搜二手解读快得多。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询