Skip to content

前沿专题 · 分布式训练收拢地图:三并行、ZeRO 与 MoE 集群 ​

前置要求:第9章 · TinyGPT 预训练的显存三笔账(16Φ 规则)与梯度累积小节,以及第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、16Φ、FSDP 词条,速查表有两张压缩卡片。每处都正确,但没有一处把它们拼成一张可以整体复述的地图——面试或读论文时需要的恰恰是那张地图。本页做且只做这件事:

点位现居地本页动作
16Φ 三笔账、激活重计算第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Φ ​

设模型参数量为 Φ(单位:个)。全参数训练时,每张卡上常驻的训练状态由三笔账构成(见第9章):

  1. 权重:FP16/BF16 存放,每参数 2 字节 ⇒2Φ;
  2. 梯度:反向传播算出的参数梯度同为 FP16/BF16 ⇒2Φ;
  3. AdamW 优化器状态:FP32 主权重副本(4Φ)+ 一阶动量 m(4Φ)+ 二阶方差 v(4Φ)⇒12Φ。

合计静态显存 16Φ 字节。第9章的算例:7B 模型即 7×16=112 GB——单卡 80GB 的顶级显卡连静态参数都放不下。这就是「单卡放不下」的定量含义:放不下的不是模型,是训练状态。

第四笔是动态激活值:随批大小 B 与上下文长度 T 增长。工业界的对策是激活重计算(activation checkpointing)——前向不存中间激活、反向用到该层时重算一次,用约 25%~30% 的前向重算算力换激活显存降 60%~70%(见第9章)。它省的是第四笔账,与前三笔的切分正交。

跑不快的度量:MFU ​

显存解决「放得下」,吞吐解决「跑得快」。度量标尺是算力利用率 MFU(model FLOPs utilization,术语表词条):实际模型吞吐与硬件峰值理论吞吐之比,工业级通常 35%~55%——也就是说,接近一半的峰值算力花在(或耗在)别处,通信等待是主要去向之一。分母的分母是第9章的估算式:一次完整训练 step 每 token 约 6Φ FLOPs(前向约 2Φ,反向约为前向 2 倍),这正是 MFU 公式 MFU=Tokens/sec×6ΦPeak Hardware TFLOPs 里那个 6Φ 的出处。


二、三大并行的心智模型 ​

三种并行回答的是三个不同的「什么放不下」:数据并行(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与参数量成正比任意集群,但单卡必须装得下 16Φ
TP前向与反向全程 All-Reduce / All-Gather极高频仅限机内超高速 NVLink(400GB/s 以上),不跨机
PP激活值 P2P 点对点量小但引入流水线气泡(GPU 空等下一段的空转时间)可跨机普通网络;1F1B 调度降低气泡

一句口诀总结取舍:通信频率决定物理位置——TP 每算一层都要通信,只能待在机内;PP 只在段边界传激活,普通跨机网络就够;DP 一个 step 通信一次,约束反而只剩显存。

还有一个第9章正文埋的等价性,读地图时容易漏:梯度累积是数据并行的单机影子。K 个 micro-batch 的梯度累积与 K 卡数据并行的 All-Reduce 平均,在「各卡(各批)被监督 token 数相同」时给出同一个全体平均;token 数不同时,直接取卡间平均得到的是「每批平均值的平均」,正确的全体平均要按第9章的 niS 加权(ni 是第 i 批被监督 token 数,S 是总数)。见第9章「一次参数更新看见多少 token」节。

何时用哪种 ​

回到流程图的那个问题:模型放得下 → DP(吞吐优先);单层太大 → TP(纵向切不动了);层数太多 → PP(纵深装不下)。真实大训练是三者叠加的 3D 并行(数据 × 张量 × 流水线),边界页对它的定位是「只讲原理与通信代价」——组合调优是工程实践题,不在本课范围。


三、ZeRO:把数据并行的冗余切片 ​

DP 的显存软肋在总表第一行就写了:每卡冗余持有完整 16Φ。ZeRO(Zero Redundancy Optimizer)的思路是保留数据并行的执行方式,把这份冗余按阶段切开——第9章总表的三行定义:

阶段分片什么每卡静态显存(N 卡)通信量(第9章原文)
DDP(对照)不分片,每卡全量冗余16Φ与参数量成正比
ZeRO-1优化器状态(各卡存 1/N 的 AdamW 状态)4Φ+12Φ/N与标准 DDP 完全相同
ZeRO-2优化器状态 + 梯度2Φ+14Φ/N与标准 DDP 完全相同
ZeRO-3 / FSDP优化器 + 梯度 + 参数全部拆分16Φ/N(术语表 FSDP 词条公式)增加约 50%

「每卡静态显存」一列不是新增事实,是把第9章三笔账代入各阶段分片定义的算术:ZeRO-1 每卡保留权重 2Φ + 梯度 2Φ,优化器 12Φ/N;ZeRO-2 再把梯度也切掉,剩 2Φ+(2Φ+12Φ)/N;ZeRO-3 全切,即 16Φ/N。N 越大每卡越省——FSDP(Fully Sharded Data Parallel,ZeRO-3 的同义名)由此「彻底打破单卡显存墙」。

本质是一笔通信换内存的交易: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 推理量化的对比」节):

  1. 推理权重量化(第10章):int8/int4、per-tensor/per-channel scale,训后量化(PTQ),省显存省带宽,风险是权重误差导致输出漂移;
  2. 推理 KV cache 量化(第10章、第12章):把缓存的 K/V 压到 int8/FP8,只影响推理读取量,与权重量化正交、可叠加;
  3. 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 只讲原理与代价,不启动大规模训练16Φ 记账;7B → 112 GB 静态第9章
DDP(基线)数据并行:每卡完整模型 + batch 切分通信量与参数量成正比;单卡须装下 16Φ第9章
Megatron-LM张量并行的代表实现机内 NVLink 400GB/s 以上,不跨机第9章、边界页
ZeRO-1/2/3(FSDP)数据并行 + 状态分片(通信换内存)ZeRO-1/2 通信同 DDP;ZeRO-3 约 +50%;16Φ/N第9章、术语表
DeepSeek-V3专家并行(MoE 256 选 8 + 1 共享)+ DualPipe 双向流水线 + FP8 混合精度 + 3FS 存储2.788M H800 GPU 小时;气泡 30%~50% 几乎被完全掩盖第12章

动手观察(可选,纯 numpy) ​

本页无实验模块——这是收拢页的定位,不是遗漏。想把地图落到数值上,两条已铺好的路:

  1. 首选:回到第9章的训练循环,在小批量上跑梯度累积,对照「各批被监督 token 数相同时,卡间 All-Reduce 平均 == 全体 token 平均」的等价性。
  2. 可选最小对拍:用纯 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 分钟自测,不看资料作答:

  1. 三大并行各自的通信原语是什么?为什么张量并行只能待在机内 NVLink(400GB/s 以上)而流水线并行可以跨机普通网络?
  2. ZeRO-3 的通信量为什么比标准 DDP 增加约 50%?增加的具体是什么通信?(提示:参数是否常驻每卡。)
  3. ZeRO-1 与 ZeRO-2 各自分片了什么?为什么说它们的内存收益是「白拿的」,而 ZeRO-3 开始付费?用 4Φ+12Φ/N 与 16Φ/N 写出 N 卡时每卡静态显存。
  4. 数据并行的 All-Reduce 平均在什么条件下才等于全体被监督 token 的平均?不满足时正确的加权式是什么(写出 ni/S)?
  5. expert parallelism 与 tensor/pipeline 并行的正交性体现在哪里?MoE 的 all-to-all 通信从哪来?DualPipe 用什么思路把它掩盖?
  6. 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、16Φ、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 对拍的布尔断言;它不表示任何分布式系统被搭建或运行——那在本课边界之外。

私有学习站 · 原理从零构建 · 勿提交个人隐私或密钥