Appearance
前沿专题 · 分布式训练收拢地图:三并行、ZeRO 与 MoE 集群
前置要求:第9章 · TinyGPT 预训练的显存三笔账(
规则)与梯度累积小节,以及第12章 · DeepSeek 架构专题的 MoE 推理与 FP8/DualPipe 正文。未读过两章也能顺序读完本页——每个概念在本页首次出现处都有一句话定义——但先读正文再回来,两边的表会互相点亮。
分工声明:本页收拢全书已有的分布式训练概念点位并给出统一心智模型;实现级细节(通信库/容错/调度)仍在课程边界之外——先读第9章口试题与第12章 MoE/FP8 的正文,再回来把地图拼起来。README 明言本课「不实现生产级分布式框架」,生态边界页把 3D 并行、DeepSpeed、Megatron-LM 定为「只讲原理与通信代价,不在此实现昂贵的分布式集群框架」——本页就是这两句承诺的兑现:原理与通信代价的统一视图,仅此而已。它的立项依据是覆盖差距审计(2026-10-05)决策矩阵里「分布式训练收拢页:概念点位散落,记录候选」那一行。
本页定位
分布式训练的概念点位在本书里散落四处:第9章有一张五行的并行范式总表与一道闭卷口试题,第12章有 expert parallelism、all-to-all、DualPipe 与 FP8 各自的机制讲解,术语表有 MFU/HFU、
| 点位 | 现居地 | 本页动作 |
|---|---|---|
| 第9章(见该章「大模型训练显存开销解构公式」节) | 第一节收拢为「为什么必须分布式」 | |
| DP / TP / PP / ZeRO-1/2/3 总表 | 第9章「分布式并行四大范式全景」节 | 第二节拆成心智模型 + 通信原语 |
| ZeRO 各阶段分片对象与通信量 | 第9章同表、术语表 FSDP 词条 | 第三节补上每卡记账的算术 |
| expert parallelism / all-to-all / offloading | 第12章「MoE 推理:all-to-all 通信与 expert offloading」节 | 第四节收拢进地图 |
| DualPipe 双向流水线、通信气泡 | 第12章「系统吞吐杀手锏」节 | 第四节一段收拢 |
| FP8 混合精度训练 | 第12章「FP8 混合精度训练」节、第7章混合精度格式表 | 第五节与推理量化划界 |
| MFU / HFU | 术语表「算力利用率」词条 | 第一节引用 |
本页不新增实验模块、不进入 clean_room/ 合同、不发明站内没有的数字——每个数字都能回溯到上表中的某一行原文。
一、为什么必须分布式:放不下与跑不快
三笔静态账:16Φ
设模型参数量为
- 权重:FP16/BF16 存放,每参数 2 字节
; - 梯度:反向传播算出的参数梯度同为 FP16/BF16
; - AdamW 优化器状态:FP32 主权重副本(
)+ 一阶动量 ( )+ 二阶方差 ( ) 。
合计静态显存
第四笔是动态激活值:随批大小
跑不快的度量:MFU
显存解决「放得下」,吞吐解决「跑得快」。度量标尺是算力利用率 MFU(model FLOPs utilization,术语表词条):实际模型吞吐与硬件峰值理论吞吐之比,工业级通常 35%~55%——也就是说,接近一半的峰值算力花在(或耗在)别处,通信等待是主要去向之一。分母的分母是第9章的估算式:一次完整训练 step 每 token 约
二、三大并行的心智模型
三种并行回答的是三个不同的「什么放不下」:数据并行(DP)不切模型——每卡持有完整模型,各拿不同 batch,把吞吐放大到卡数倍;张量并行(TP)切单个矩阵乘——把一层 Linear 的权重按行或列切到多卡(如 Attention 的 QKV 与 MLP),卡间协同算完这一次乘法;流水线并行(PP)切纵深——按 Transformer 层切(如前 16 层在 GPU 0、后 16 层在 GPU 1),数据像过流水线一样穿过各段。
各自的通信原语
三个原语先定义(都是集合通信或多卡间传数据的模式,机制以第9章总表的用法为准):
- All-Reduce:把所有卡上的同形张量聚合成同一份结果、每卡各持一份。DP 在反向传播后用它对梯度取平均——第9章原文:数据并行的 All-Reduce「是卡与卡之间再取一次平均」。
- All-Gather:每卡各出一块分片,拼成完整张量发给所有卡。TP 拼激活、ZeRO-3 拉参数都靠它。
- 点对点(P2P):两张卡之间直发一份张量。PP 把激活值从上一段直发下一段。
三种并行与原语的对应(收割自第9章总表,数字与原文一致):
| 并行 | 通信模式 | 通信量级 | 物理约束 |
|---|---|---|---|
| DP | 反向后一次梯度 All-Reduce | 与参数量成正比 | 任意集群,但单卡必须装得下 |
| TP | 前向与反向全程 All-Reduce / All-Gather | 极高频 | 仅限机内超高速 NVLink(400GB/s 以上),不跨机 |
| PP | 激活值 P2P 点对点 | 量小但引入流水线气泡(GPU 空等下一段的空转时间) | 可跨机普通网络;1F1B 调度降低气泡 |
一句口诀总结取舍:通信频率决定物理位置——TP 每算一层都要通信,只能待在机内;PP 只在段边界传激活,普通跨机网络就够;DP 一个 step 通信一次,约束反而只剩显存。
还有一个第9章正文埋的等价性,读地图时容易漏:梯度累积是数据并行的单机影子。
何时用哪种
回到流程图的那个问题:模型放得下 → DP(吞吐优先);单层太大 → TP(纵向切不动了);层数太多 → PP(纵深装不下)。真实大训练是三者叠加的 3D 并行(数据 × 张量 × 流水线),边界页对它的定位是「只讲原理与通信代价」——组合调优是工程实践题,不在本课范围。
三、ZeRO:把数据并行的冗余切片
DP 的显存软肋在总表第一行就写了:每卡冗余持有完整
| 阶段 | 分片什么 | 每卡静态显存( | 通信量(第9章原文) |
|---|---|---|---|
| DDP(对照) | 不分片,每卡全量冗余 | 与参数量成正比 | |
| ZeRO-1 | 优化器状态(各卡存 | 与标准 DDP 完全相同 | |
| ZeRO-2 | 优化器状态 + 梯度 | 与标准 DDP 完全相同 | |
| ZeRO-3 / FSDP | 优化器 + 梯度 + 参数全部拆分 | 增加约 50% |
「每卡静态显存」一列不是新增事实,是把第9章三笔账代入各阶段分片定义的算术:ZeRO-1 每卡保留权重
本质是一笔通信换内存的交易:ZeRO-1/2 白拿内存收益(通信量与 DDP 完全相同);ZeRO-3 开始付费——参数不再常驻每卡,前向反向进行到哪一层,就要临时 All-Gather 把那层参数拼齐、用完立刻释放(第9章原文),多出来的这批参数收集通信就是「约 50%」的来源。这就是验收口试题 2 的答案骨架。
四、MoE 的路由并行:expert parallelism 与 all-to-all
MoE 给并行地图加了第四根轴。第12章的定义:256 个 routed expert 无法放进单卡显存,必须分片到多卡——每个 GPU 只持有专家集合的一个子集,这就是 expert parallelism(专家并行);它与 tensor/pipeline 并行正交,路由到「不在本卡」的专家时触发远程访问(见第12章)。
通信模式也随之换了原语:all-to-all——token 要从输入设备分发到各专家所在设备(scatter),专家算完再把结果收回输入设备(gather)。这种跨节点集合通信是 MoE 推理延迟的主要来源,带宽随 routed expert 数线性增长(第12章原文)。配套的两个工程手段同节有完整讲解:expert offloading(冷专家放 CPU 内存/SSD,激活时经 PCIe 拉回,以延迟换显存)与 capacity factor(限制每专家每步处理 token 数,超载 drop and re-route)。
DualPipe:把 all-to-all 藏进算力背后(收拢自第12章)。万卡训练的瓶颈往往不是 GPU 算得不够快,而是多机跨网络通信在排队。传统流水线并行(如 1F1B)里 GPU 常在原地等通信,产生 30%~50% 的空转(通信气泡 Bubble)。DualPipe(DeepSeek-V3 配套,开源实现见其 GitHub)同时启动两个对称方向的流水线,把计算细拆为注意力前向、MoE 分发通信、专家计算、注意力反向等微块,让一路的 all-to-all 通信恰好藏在另一路密集 GEMM 矩阵计算的背后,使万卡集群的通信开销几乎被 100% 掩盖;底层由 3FS 分布式文件系统(RDMA 网络、TB/s 级并行吞吐)与 Fire-Flyer AI-HPC 软硬件协同集群兜住 I/O。它与第9章 PP 表里的 1F1B 是同一根轴上的两代调度:1F1B 降气泡,DualPipe 用双向对称调度把气泡压向零。
五、训练侧精度:FP8 与推理量化的边界
「量化」一词在本课有三个互不相同的使用位置,收拢页最后把边界划清(详细对照表见第12章「与第10章 int8 推理量化的对比」节):
- 推理权重量化(第10章):int8/int4、per-tensor/per-channel scale,训后量化(PTQ),省显存省带宽,风险是权重误差导致输出漂移;
- 推理 KV cache 量化(第10章、第12章):把缓存的 K/V 压到 int8/FP8,只影响推理读取量,与权重量化正交、可叠加;
- FP8 混合精度训练(第12章):训练全程的量化感知路线——权重/激活用 FP8(e4m3),按 tile/block 细粒度 scaling,累加与敏感算子保持高精度。
一句话划界:前两者是推理侧的存储/带宽压缩,FP8 是训练侧的吞吐手段——它在训练全程保护梯度与累加精度(e4m3 动态范围约 ±448,超范围即被 clip),成功时如 DeepSeek-V3 全训练仅用 2.788M H800 GPU 小时且无不可恢复的 loss spike,失败时是训练不稳,两条风险路径完全不同(第12章原文:这不是「免费的 2 倍吞吐」)。两种 FP8 格式(E4M3 前向激活 / E5M2 反向梯度)的完整对比表在第7章混合精度深度解构一节。
六、站内对象 × 并行组合对照
下表每一行都只使用站内已有事实,是「谁用了哪种组合」的收拢视图:
| 站内对象 | 已交代的并行/精度组合 | 关键数字(站内原文) | 出处 |
|---|---|---|---|
| TinyGPT(本课) | 单机训练循环 + 梯度累积;DP/TP/PP/ZeRO 只讲原理与代价,不启动大规模训练 | 第9章 | |
| DDP(基线) | 数据并行:每卡完整模型 + batch 切分 | 通信量与参数量成正比;单卡须装下 | 第9章 |
| Megatron-LM | 张量并行的代表实现 | 机内 NVLink 400GB/s 以上,不跨机 | 第9章、边界页 |
| ZeRO-1/2/3(FSDP) | 数据并行 + 状态分片(通信换内存) | ZeRO-1/2 通信同 DDP;ZeRO-3 约 +50%; | 第9章、术语表 |
| DeepSeek-V3 | 专家并行(MoE 256 选 8 + 1 共享)+ DualPipe 双向流水线 + FP8 混合精度 + 3FS 存储 | 2.788M H800 GPU 小时;气泡 30%~50% 几乎被完全掩盖 | 第12章 |
动手观察(可选,纯 numpy)
本页无实验模块——这是收拢页的定位,不是遗漏。想把地图落到数值上,两条已铺好的路:
- 首选:回到第9章的训练循环,在小批量上跑梯度累积,对照「各批被监督 token 数相同时,卡间 All-Reduce 平均 == 全体 token 平均」的等价性。
- 可选最小对拍:用纯 numpy 把数据并行梯度平均的加权规则复现一遍(思路,约十行,无需多进程——两张「卡」用两个数组模拟,卡间通信用显式的平均运算代替):
python
import numpy as np
rng = np.random.default_rng(0)
n1, n2 = 4, 8 # 两卡被监督 token 数(故意不同)
L1, L2 = rng.random(n1), rng.random(n2) # 两卡的逐 token 损失
all_reduce_avg = 0.5 * (L1.mean() + L2.mean()) # 卡间再取平均(各卡等权)
global_mean = np.concatenate([L1, L2]).mean() # 全体 token 的平均(真值)
weighted = (n1 * L1.mean() + n2 * L2.mean()) / (n1 + n2) # 第9章的 n_i/S 记账
# 预期信号:n1 != n2 时 all_reduce_avg != global_mean,而 weighted == global_mean;
# 把 n1 换成与 n2 相等再跑,all_reduce_avg 才与 global_mean 一致——
# 这就是第9章「各卡被监督 token 数相同,All-Reduce 才等于全体平均」的可执行版本。本页验收口试题
每题 5–10 分钟自测,不看资料作答:
- 三大并行各自的通信原语是什么?为什么张量并行只能待在机内 NVLink(400GB/s 以上)而流水线并行可以跨机普通网络?
- ZeRO-3 的通信量为什么比标准 DDP 增加约 50%?增加的具体是什么通信?(提示:参数是否常驻每卡。)
- ZeRO-1 与 ZeRO-2 各自分片了什么?为什么说它们的内存收益是「白拿的」,而 ZeRO-3 开始付费?用
与 写出 卡时每卡静态显存。 - 数据并行的 All-Reduce 平均在什么条件下才等于全体被监督 token 的平均?不满足时正确的加权式是什么(写出
)? - expert parallelism 与 tensor/pipeline 并行的正交性体现在哪里?MoE 的 all-to-all 通信从哪来?DualPipe 用什么思路把它掩盖?
- FP8 混合精度训练与第10章 int8 推理量化,在目的、量化时机、主要风险上各差在哪?为什么说 FP8 不是「免费的 2 倍吞吐」?
论文与延伸
- ZeRO: Rajbhandari, Rasley, Ruwase, He, ZeRO: Memory Optimizations Toward Training Trillion Parameter Models, 2019, arXiv:1910.02054——第三节三阶段分片的原始出处。
- Megatron-LM: Shoeybi 等, Megatron-LM: Training Multi-Billion Parameter Language Models Using Model Parallelism, 2019, arXiv:1909.08053——张量并行(切单个矩阵乘)的代表实现。
- DeepSeek-V3 Technical Report, 2024, arXiv:2412.19437——FP8 训练、MoE 专家并行与 DualPipe 的出处(第12章已展开,含 DualPipe 与 3FS 开源实现链接)。
- 只给名字:GPipe(流水线并行的早期代表,本课不展开);DeepSpeed(ZeRO 生态的代表实现,边界页仅提名)。
- 站内深读:术语表(MFU、
、FSDP、DualPipe、fp8 词条)· 必读论文索引 · 速查表 第④/⑤域。
资源 / 成本 / 隐私
本页为纯阅读收拢页:无可交付实验,成本为 0;可选的 numpy 对拍在任意笔记本 CPU 上秒级完成,不依赖网络、GPU 或外部服务,不产生任何隐私敏感数据。
Evidence
学习者提交模板(待填写,不是当前机器证据)
复制下面模板并填写自己的真实运行结果。所有 <...> 都是未填写状态;未做可选对拍时,整份模板保持未填写即可,不构成任何完成声明。
yaml
schema: learn-llm.evidence.v1
module: distributed-training-map
commit: <learner-commit-sha>
verified_at: <iso-date>
environment: <sanitized-python-device>
seed: 0
commands:
- <your-numpy-allreduce-parity-command-if-run>
metrics:
- name: weighted_mean_equals_global_mean
expected: true
actual: <recorded-value>
- name: unequal_counts_allreduce_mismatches
expected: true
actual: <recorded-value>
- name: equal_counts_allreduce_matches
expected: true
actual: <recorded-value>
artifacts:
- <your-numpy-script-repo-relative-path>
cost:
gross_usd: 0
credit_usd: 0
licenses:
- source: learn-llm chapters 09/12 and reference pages (harvest-only consolidation)
license: internal
known_failures:
- none本页模板记录的只是可选 numpy 对拍的布尔断言;它不表示任何分布式系统被搭建或运行——那在本课边界之外。