状态传导图
模型副本相同,数据不同;通信集中在梯度同步。
观察点 01
每张卡一份模型,各算不同样本再同步梯度
GPU 看到不同 mini-batch,前向和反向独立进行;随后对梯度做 All-Reduce,让每份模型用相同更新。模型仍需单卡放得下。
- 单卡模型副本完整复制
- 层内通信频率主要同步梯度
DP 主要扩吞吐,不直接解决一份模型权重放不下。
DP 切 batch,TP 切层内矩阵,PP 切层,SP/CP 切不同范围的序列激活,EP 切专家,ZeRO/FSDP 切模型状态。它们解决的不是同一个“放不下”。
状态传导图
模型副本相同,数据不同;通信集中在梯度同步。
观察点 01
GPU 看到不同 mini-batch,前向和反向独立进行;随后对梯度做 All-Reduce,让每份模型用相同更新。模型仍需单卡放得下。
DP 主要扩吞吐,不直接解决一份模型权重放不下。
状态传导图
切法不同会改变 collective 类型;图中只展示共同计算一层的抽象。
观察点 02
权重按列、行或头维切分,输入/输出需要 All-Gather、All-Reduce 或 Reduce-Scatter。通信发生在很多层内部,所以通常优先放在高速 NVLink 域。
TP 解决单层太大,代价是每层都可能通信。
状态传导图
跨 stage 搬的是激活与梯度,不是每次搬全部权重。
观察点 03
模型层被切成 stage,激活从前一 stage 传到后一 stage,反向梯度再传回来。微批次不足或 stage 不均会出现 pipeline bubble。
PP 解决整模型分层放置,关键是平衡 stage 和填满流水线。
状态传导图
同样切 sequence,不代表覆盖范围、通信位置和权重副本都相同。
观察点 04
Megatron SP 配合 TP,只在 LayerNorm、Dropout 等非 TP 区域保持序列分片,并用 All-Gather / Reduce-Scatter 转换布局;CP 则让输入和所有层激活沿 context 分片,attention 还要交换其他 rank 的 K/V。CP rank 仍复制权重,weight gradients 需要归并。
SP 主要消除 TP 区域之间的部分重复激活;CP 才是让每卡常驻一段长上下文。
状态传导图
Group map 是预先配置,不是每个 token 经过的运行时算子;性能仍取决于路由负载、通信与专家 FFN 的重叠。
观察点 05
运行 token 路由前,框架先建立 attention 与 expert 的 process-group 映射;MoE Parallel Folding 可让两侧在同一 world 上使用不同分组。标准 EP 再用 All-to-All dispatch 把 token 发到专家 owner,计算后 All-to-All combine;当前 Megatron Core 也提供 All-Gather 与 Flex dispatcher。
EP 的标准路径是双向 All-to-All,但它不是唯一 dispatcher,也不要求所有并行度机械相乘。
状态传导图
它经常与 TP、PP、CP、EP 组合,不是互斥选项;迁移和恢复要按具体版本测试。
观察点 06
ZeRO-1 切优化器状态,Stage 2 再切梯度,Stage 3 / FSDP full shard 继续切参数;计算某层前按需 All-Gather,反向后 Reduce-Scatter。PyTorch FSDP1 wrapper 与 FSDP2 fully_shard 共享这层数据流抽象,但参数表示、API 与 state dict 不相同。
分片越彻底,常驻显存越低,但按需通信与调度越复杂。
你现在应该能解释:分片越彻底,常驻显存越低,但按需通信与调度越复杂。
大模型训练不是“多买几张卡就自动变快”。你要决定:样本怎么切、矩阵怎么切、层怎么切、长序列怎么切、专家怎么切、优化器状态怎么切。切错了,显存省了但通信爆了;切对了,千卡才能像一个系统一样工作。
← 左右滑动查看完整链路 · 打开原图
70×10⁹×2 bytes ≈ 140 GB(十进制),已超过单张 80GB GPU;训练还需梯度、优化器状态、激活和临时 buffer。实际是否保留 FP32 master weights 取决于精度与优化器实现。| 先记一句 | DDP 切 batch,TP 切层内矩阵,PP 切层,SP 切部分序列维激活,CP 切全网络序列,EP 切专家,ZeRO/FSDP 切模型状态。 |
| 真正难点 | 切开以后要拼回正确结果,通信会变成新的瓶颈。 |
| 读法 | 初学者先看“切什么”;进阶读者再看 all-reduce、all-gather、reduce-scatter、all-to-all 的通信代价。 |
训练显存不只是权重,还包括梯度、优化器状态、激活与临时通信/算子 buffer。70B FP16/BF16 权重约 140GB;若再用 BF16 梯度、FP32 Adam 一阶/二阶矩并保留 FP32 master weights,一个常见粗算可到每参数约 16 bytes。这个数字会被混合精度策略、量化优化器和分片方式改变,不能当固定常数。
一种常见混合精度账本:BF16 参数 2B + BF16 梯度 2B + FP32 master 参数 4B + Adam 的 FP32 m/v 8B = 16B/参数。于是模型状态约 70×10⁹×16 = 1.12 TB,尚未计激活和临时 buffer。理想 ZeRO-3/FSDP full-shard 在 16 卡上把这部分均分为约 70 GB/卡;真实峰值还要加层级 all-gather、prefetch、碎片和激活。
单卡装不下权重、梯度、优化器状态和激活。需要 ZeRO/FSDP/TP/PP 把状态拆开。
数据量太大,单卡训练周期不可接受。需要 DP 扩 batch、TP/PP 扩模型计算。
不同切法引入不同频率与大小的 collective/P2P;拆得更细不一定总字节更多,但常更依赖延迟、拓扑和 overlap。
| 并行方式 | 切什么 | 主要通信 | 典型目的 |
|---|---|---|---|
| DDP | 数据 / batch | gradient all-reduce | 模型能单卡容纳时扩吞吐,工程相对成熟。 |
| TP | 矩阵 / hidden dimension | all-reduce / all-gather | 单层矩阵太大时切计算。 |
| PP | 层 / pipeline stage | stage 间传激活和梯度 | 模型层数太多时切模型。 |
| SP / CP | 序列维激活(范围不同) | gather/scatter、P2P 或 all-to-all 等 | SP 配合 TP 省部分激活;CP 面向长上下文切全网络序列。 |
| EP | MoE 专家 | 典型为 all-to-all;也有 all-gather / flex dispatcher | 专家太多时切专家权重和 token 路由。 |
| ZeRO / FSDP | 参数、梯度、优化器状态 | all-gather / reduce-scatter | 让每卡不再复制全套训练状态。 |
经典 DDP 把模型复制 N 份,数据切成 N 份,各 rank 前向/反向后同步梯度。它能提高吞吐,但完整模型和未分片状态仍要在每卡存在;ZeRO/FSDP 属于数据并行域内的状态分片,正是为突破这个限制。
上式假设每个 rank 的本地样本数相同、loss 采用相同归一化。若有效样本数因 padding/mask 不同,应按有效权重汇总,不能无条件把 rank 均值再简单平均。
g_A=1,GPU B 用 6 个得到 g_B=3。直接平均 rank 得 (1+3)/2=2;按样本加权才是 (2×1+6×3)/8=2.5。所以分布式 loss 归一化必须和有效 token/样本口径一致。join() 为已结束 rank 镜像通信;若训练图里还有 SyncBatchNorm 等非 DDP collective,官方要求用提前终止保护,不能靠加权避免 hang。当单层权重或激活过大,可把线性层按输出维(column parallel)或输入维(row parallel)切给多个 rank。Megatron-LM 通过成对安排 column/row-parallel 线性层,减少需要物化完整中间激活的次数;实际 collective 取决于前后层布局。
上式只展示 column shard:每卡算一段输出。是否立刻 all-gather 取决于下一算子能否继续消费分片输出;row shard 则通常需要对局部结果求和。
| 切法 | 直觉 | 通信 |
|---|---|---|
| Column parallel | 每卡算一部分输出通道。 | 可保持分片给下一层,或在需要时 all-gather。 |
| Row parallel | 每卡持有一部分输入通道权重。 | 局部 matmul 后 all-reduce 求和。 |
| Attention head split | 不同 rank 计算不同 attention heads。 | 通常在 row-parallel 输出投影处归并,不一定在“前后”都同步。 |
| Megatron Sequence Parallel | 配合 TP,把 LayerNorm/Dropout 等区域的激活沿序列分片。 | 以 reduce-scatter / all-gather 衔接 TP 区域;不同于长上下文 CP。 |
Pipeline Parallel 把模型按层分成多个 stage,不同 GPU 负责不同层。一个 micro-batch 像流水线上的工件,从 stage 0 流到 stage p-1,再反向流回来。
p=stage 数、m=micro-batch 数。该式是“各 stage 等时、前后向对称、同步 flush、只计理想填充/排空”的简化模型;GPipe flush 与基础非交错 1F1B 在这些假设下具有同一 bubble fraction。交错/virtual pipeline、stage 不均衡、前后向耗时不等与通信会改变结果。
p=4、m=8,简化式给出 (4-1)/(8+4-1)=3/11≈27.3%。把 micro-batch 增至 32 时变为 3/35≈8.6%;但 micro-batch 更小可能降低单次 GEMM 利用率,数量更多也会增加调度开销,所以不是越多越好。按层切模型,适合很深且单卡装不下的场景。与每层多次 collective 的 TP 相比,PP 通信频率通常更低,因此常被考虑跨节点放置;仍需核对激活张量大小和网络。
有 pipeline bubble、调度复杂、stage 负载不均会拖慢整体;激活保存和重计算策略也更难。
普通 DDP 每卡复制参数、梯度和优化器状态。ZeRO 按 stage 分片这些状态;PyTorch 现有 FSDP1 wrapper 与 FSDP2 fully_shard 两套接口。两者的 full-shard 数据流都可抽象为计算前 All-Gather 参数、反向后 Reduce-Scatter 梯度,概念上接近 ZeRO-3,但参数表示、API、调度和 state dict 不能混为同一实现。
← 左右滑动查看完整链路 · 打开原图
这只近似 ZeRO-3 / full-shard 的持久模型状态理想均分,不适用于 ZeRO-1/2,也不包含激活、临时 all-gather、prefetch、未分片模块、bucket 和内存碎片。
| 阶段 | 切什么 | 直觉 |
|---|---|---|
| ZeRO-1 | Optimizer states | Adam 的一阶/二阶矩,以及实现中属于优化器状态的 FP32 master weights,不再每卡全量复制。 |
| ZeRO-2 | Optimizer states + gradients | 梯度也分片,反向后 reduce-scatter。 |
| ZeRO-3 / FSDP full shard | 参数 + 梯度 + 优化器状态 | 参数也分片,计算模块前按需 all-gather;FSDP 另有不分/只分梯度等策略。 |
| Offload | CPU/NVMe | 进一步救 GPU 显存,但会付带宽/延迟代价。 |
FullyShardedDataParallel wrapper 和 flat-parameter/state-dict 语义为主;FSDP2用 fully_shard 给每个参数建立 DTensor 分片,并在 forward/backward hook 中按需 all-gather、reshard 与 reduce-scatter。当前官方文档建议 FSDP1 用户评估迁移,但这不表示两套 checkpoint 可直接互换;迁移与恢复都应按具体版本做 round-trip 测试。长序列会近似线性增加多数激活,并增加 attention 计算;是否保存二次方 attention 矩阵取决于 FlashAttention 等实现。Megatron SP 与 CP 都沿序列维分片,但覆盖模块不同;MoE 的 EP 则沿专家维分布权重并路由 token。
所以 SP 主要减少 TP 中原本重复保存的部分激活;CP 才是面向超长上下文、让每卡只常驻一段序列的并行维度。Megatron CP rank 仍复制模型权重,因此 backward 的 weight gradients 还要沿相应数据并行/CP 组归并;切序列不等于把权重也切掉。
“3D/4D/5D”是常见教学简称,不是统一标准。TP、PP、CP、EP、DP 的分组要同时满足模型形状、全局 batch、序列长度与网络拓扑;ZeRO/FSDP 又是在数据并行域内选择状态分片策略。对 MoE 而言,attention 与 expert 甚至可以采用不同的 rank 映射。
← 左右滑动查看完整拓扑 · 打开原图
TP×CP×DP×PP,expert 侧可改用 ETP×EP×EDP×PP。两套映射都覆盖同一个 world,因此满足 TP×CP×DP×PP = ETP×EP×EDP×PP = world size;CP 与 EP 是在同一批 ranks 上重映射,不再机械相乘。| 组合 | 解决什么 | 常见取舍 |
|---|---|---|
| DP + ZeRO/FSDP | 复制的模型状态成为容量瓶颈。 | 分片程度越高,持久状态越少,但参数 gather 与调度更复杂。 |
| TP + DP | 单层矩阵太大,同时要扩吞吐。 | TP 放节点内高速互联,DP 放外层。 |
| TP + PP + DP | 大 dense Transformer 经典 3D 并行。 | 要平衡 pipeline bubble、TP 通信和全局 batch。 |
| DP + TP + PP + EP | MoE frontier 模型。 | all-to-all 和 all-reduce 同时存在,调度复杂。 |
| SP + TP | 减少 TP 区域之间原本重复保存的部分激活。 | SP 不负责让每个 attention 只常驻一段超长上下文;需要与 TP 的布局转换配套。 |
| CP + FlashAttention | 长上下文的跨卡容量与单卡 attention I/O。 | CP 分片序列并引入跨 rank KV 通信;FlashAttention 降低各 rank 内 attention 的 HBM 往返,两者解决不同层级的问题。 |
| 低精度 + 并行 | 降低部分参数、激活或通信张量的字节数。 | 并非使用 FP8/FP4 就自动压缩所有 collective;通信 dtype、累加精度和 scale 策略必须逐路径确认。 |
经典 DDP 复制模型状态;超出单卡容量时可选 ZeRO/FSDP、TP、PP 或它们的组合,不是只有一种必选方案。
TP 会增加层内通信。超过高速互联范围后,通信可能吞掉计算收益。
PP 通信较粗,但有 bubble 和负载均衡问题;micro-batch 太少会空等。
它省显存,但参数 all-gather、reshard、prefetch 都会增加通信和实现复杂度。
MoE 会引入 EP 和 all-to-all。专家路由不均衡时,慢专家决定整层速度。
超大训练还要验证恢复:模型、优化器、scheduler、RNG 与数据游标缺一不可;并行拓扑改变后是否能 reshard,也必须实际演练。
| 数值账 | 单卡/小规模基线与目标拓扑的 loss、梯度和短程收敛是否在容差内;不能只看“能跑”。 |
| 显存账 | 同时记录 allocated、reserved 与峰值,并覆盖 warmup、首次 all-gather、重计算和 optimizer step。 |
| 性能账 | 看 tokens/s、step time、扩展效率、collective overlap 和慢 rank;MFU 只是一种派生口径。 |
| 恢复账 | 做真实 save→kill→load→继续训练。PyTorch Distributed Checkpoint 支持多 rank 保存与 load-time resharding,但应用仍要完整保存非模型状态,并验证不同拓扑的恢复路径。 |
| DP | 切 batch,模型复制;靠 all-reduce 同步梯度。 |
| TP | 切矩阵/hidden/head;层内通信频繁,适合同节点高速互联。 |
| PP | 切层;用 micro-batch 填流水线,核心问题是 bubble。 |
| ZeRO/FSDP | 切参数/梯度/优化器状态;省显存,增加 gather/scatter。 |
| SP / CP | SP 配合 TP 分片部分非 attention 激活;CP 分片全网络序列并为 attention 交换 KV。 |
| EP | 切 MoE 专家;标准 dispatcher 常用双向 all-to-all,具体框架也可能用 all-gather / flex。 |
页面于 2026-07-14 逐项复核。显存与 bubble 数字均为教学估算:1GB 按十进制字节,且不包含实现相关临时 buffer;collective 与 rank-group 模式以文中典型 Megatron/ZeRO/FSDP 布局为例,不能替代具体框架版本、拓扑和 workload 的通信 trace。