大模型并行策略:数据并行、张量并行与流水线并行切的是什么
更新时间:2026-09-25。上一篇训练梯度同步与集合通信讲清了数据并行里梯度怎么在卡间归约,这一篇往后退一步,回答「当一张卡根本放不下模型时,还能把什么东西切开」。大模型训练的并行策略听起来名目繁多,实质只有三种切法:切数据、切权重矩阵、切网络的层。这一篇把三种切法切开的维度、各自产生什么通信、单卡显存降到多少、分别适合什么规模逐一算清,最后解释为什么工业界训练千亿模型必然用三者叠加的 3D 并行。物理链路带宽是这一切的前提,可先读 NVLink 多 GPU 互联。
本文要回答的问题
- 一个千亿参数模型训练时到底要占多少显存,为什么单卡甚至单机都放不下?
- 数据并行、张量并行、流水线并行分别切的是训练任务的哪个维度:batch、矩阵权重还是层?
- 三种并行各自触发什么通信原语(AllReduce / 层内归约 / P2P send-recv),每步通信量与什么成正比?
- 流水线并行的「气泡」是什么,(p-1)/(m+p-1) 这个气泡率公式怎么来的,为什么要把 batch 切成 micro-batch?
- 为什么实际部署从不单用一种并行,而是 TP 在机内、PP 跨节点、DP 最外层的 3D 组合?
一、先算显存账:为什么必须切开
讨论怎么切之前,先看要切的东西有多大。Transformer 类大模型的训练显存由四部分构成:模型权重、权重对应的梯度、优化器状态、前向保存下来的激活值。
FP16 混合精度训练下,权重每参数 2 字节,梯度再 2 字节;Adam 优化器要保存 FP32 主权重、一阶矩、二阶矩,每参数共 12 字节。也就是说不算激活,每参数训练态约需 16 字节。1750 亿参数对应约 2.8TB,7000 亿参数超过 11TB;而单张 A100/H100 的显存只有 80GB,一台 8 卡服务器也只有 640GB。激活值随批大小和序列长度增长,70 亿模型在常见批大小下激活就可达每卡数十 GB。
激活值这笔账随并行方式变化很大:朴素训练要为每层保存反向所需的中间结果,总量约与层数、batch、序列长度三者乘积成正比;梯度检查点(activation checkpointing)只在部分层存检查点、其余在反向时重算一遍,用约三分之一的额外计算换数倍激活显存节省,因此几乎是长序列训练的默认选项。
结论很硬:大模型没有任何一张卡能放下完整训练态,连「每卡一份完整副本」的数据并行都无法直接使用。必须把模型本身沿某个维度切开分摊到多卡。可切的维度恰好三个:输入数据的 batch 维、单层内部的权重矩阵、模型纵向的层序列——对应数据并行、张量并行、流水线并行。
| 显存项目 | 每参数字节 | 175B 模型合计 | 备注 |
|---|---|---|---|
| FP16 权重 | 2 | 约 350GB | 推理只需这一项 |
| FP16 梯度 | 2 | 约 350GB | 反向传播产生 |
| Adam 优化器状态 | 12 | 约 2.1TB | FP32 主权重 + 两个矩 |
| 激活值 | 随 batch/seq 增长 | 数百 GB 起 | 可用重计算换显存 |
二、三种切法的全景示意
这张图是全篇的总纲,三种切法的对象互不重叠。数据并行动的是输入:模型原封不动复制 N 份,把一个全局 batch 的样本摊给 N 张卡,卡间唯一的耦合是反向结束后梯度必须一致。张量并行动的是单层内部:把一次矩阵乘法的权重矩阵沿某个维度拆开,每张卡只持有权重的一部分,于是同一次前向计算必须由多卡协作完成。流水线并行动的是网络的纵向结构:把几十上百层按层号切成几段,每段叫一个阶段(stage),不同卡像流水线工位一样依次处理同一个样本。
还要注意三种切法正交:它们切开的是训练任务三个互不干涉的维度,因此可以任意叠加——这正是后文 3D 并行成立的前提。记住三个关键词:DP 切样本、TP 切块、PP 切段。下面的三节分别计算它们的通信量与显存开销。
三、数据并行:切 batch,每步一次 AllReduce
数据并行(data parallel)的前向和反向全程各卡独立,唯一通信点在反向结束、优化器更新之前:N 张卡各持一套不同的梯度,必须归约成同一份平均梯度。这个全局操作就是 AllReduce,Ring AllReduce 实现下每卡通信量为 2(N-1)/N·M(M 为模型大小),卡数很多时趋近于 2M,推导细节见训练梯度同步与集合通信。
数据并行的优点是通信频次低——每步只同步一次;缺点是显存不省:每张卡都要装下完整权重、梯度和优化器状态,即上一节算出的约 16 字节/参数。所以纯数据并行只适用于单卡放得下的模型,70 亿参数是 80GB 卡的实战天花板,再大就必须叠加 TP/PP。
给个直观算例。70 亿参数模型 FP16 权重约 14GB、训练态约 112GB,单张 80GB 卡放不下,但 8 卡纯数据并行每卡一份 112GB 仍超显存,实战中需配合梯度检查点或直接上 ZeRO。8 卡每步 AllReduce 的单卡通信量为 2×7/8×14GB ≈ 24.5GB(仅算梯度),NVLink 有效带宽 400GB/s 下约 60 毫秒,若单步计算约 300 毫秒,扩展效率在 80% 以上。同样配置跑在 PCIe 或普通以太网上,通信时间膨胀数倍,加卡反而减速。
一个重要补丁是 ZeRO/FSDP:用 reduce-scatter 加 all-gather 替换完整 AllReduce,把优化器状态、梯度乃至权重本身也沿 DP 维分片,每卡只存 1/N。通信总量不变,显存却降下来,代价是前向前后多了 all-gather 拼参数的频次。它本质上是让数据并行组兼做显存切分,但和真正的张量并行仍有区别:ZeRO 切的是参数张量的存储,单层计算时仍需拼全;TP 切的是计算本身。顺带一提,数据并行还有全局批过大的算法约束:卡数翻倍意味着全局 batch 翻倍,学习率通常要按线性缩放规则同步调大,并辅以 warmup,否则收敛点数变差。
四、张量并行:切矩阵权重,逐层 AllReduce
张量并行(tensor parallel)把单层内部的矩阵乘法拆到多卡。以 Megatron-LM 的经典拆法为例:线性层 Y = XA 中把 A 按列切成 [A1, A2] 分到两卡,各卡独立算出 XA1、XA2;紧接着的下一层 Z = YB 把 B 按行切成 [B1; B2],各卡算出 (XA1)B1 与 (XA2)B2,两者逐元素相加才等于完整结果。这个相加就是一次层内 AllReduce。
关键设计在于:列切分和行切分必须配对出现,于是每两层只做一次 AllReduce,而不是每层都归约。Transformer 中自注意力和 MLP 各含这样一对,通信量与激活大小成正比。
通信量可以具体估算。设每卡 micro-batch 大小为 b、序列长度 s、隐层宽度 h,一次 AllReduce 经过 ring 传输的数据量约为 2(t-1)/t·bsh 元素(t 为 TP 卡数,前向一次、反向再一次)。一个 L 层模型每步要做约 L 次这样的归约。以 175B 量级模型为例,单层激活张量约 GB 级,几十上百层累计通信量高达数百 GB——但它被切成几十次中等消息、且每次都必须在下一层计算前完成,处在逐层的关键路径上。这决定了 TP 组只能放在 NVLink/NVSwitch 全互联域内(有效带宽数百 GB/s),绝不能跨 InfiniBand 节点(50-100GB/s),工业界 TP 度几乎不超过单机 8 卡。
代入一组真实量级。175B 模型隐层宽度 h=12288、序列长度 s=2048、每卡 micro-batch b=1,单层一次前向 AllReduce 的激活张量约 b·s·h·2 字节 ≈ 50MB,ring 下实际传输约 100MB;一个 96 层模型光前向就近 10GB,加上反向翻倍、再乘上每层注意力与 MLP 的多对归约,单卡每步 TP 通信量在数十 GB。NVLink 400GB/s 下这些消息可压进百毫秒量级;同样流量走 IB NDR(约 50GB/s)则要近 1 秒,且它无法与下一层计算重叠——TP 不跨节点的结论就是这么算出来的。选 t 时还有一个限制:注意力头数、FFN 中间维必须能被 t 整除,否则某些头无法切分。
显存上 TP 把权重、梯度、优化器状态均匀切成 1/t,是三种并行里唯一切单层计算的;代价除了通信,还有列切分后某些逐元素操作(如 LayerNorm、softmax)需要额外的 all-gather,序列并行(sequence parallel)优化正是把这部分通信也省掉。实践中 TP 度的选取不是越大越好:t 从 4 增到 8,激活归约的 ring 步数和启动延迟同步增加,若单层计算本身已经很短,通信占比反而上升,MFU 可能不升反降。
五、流水线并行:切层阶段,P2P 传激活与气泡
流水线并行(pipeline parallel)把全部 L 层切成 p 段,卡 k 只持有第 k 段的层和对应的权重,显存占用的模型部分约为纯串行的 1/p。相邻阶段之间唯一需要交换的是边界激活:前向时上一阶段把激活发给下一阶段,反向时梯度沿原路回传,原语是点对点的 send/recv(NCCL 中实现为 ring 上的 P2P 拷贝),通信量每个边界仅 bsh 量级,且每步每边界只发生一次。
通信量小、且天然按阶段并行,PP 因此适合跨节点、可以把 p 开得很大。但它引入了独有的问题:流水线气泡(bubble)。
若一个 batch 整体流入,第一个阶段算完样本后,其余 p-1 个阶段全部空闲等数据;样本流到第二阶段时,第一阶段又无事可做。满载前要爬坡 p-1 个周期,排空时再损失 p-1 个周期。解决办法是把 batch 切成 m 个 micro-batch,让它们连续注入、填满流水线:以 GPipe 调度为例,m 个 micro-batch 的总耗时为 (m+p-1) 个单阶段计算周期,其中真正有效计算为 m 个周期,气泡固定占 p-1 个周期,气泡率为:
气泡占比 = (p-1)/(m+p-1)
举例:p=8 阶段、m=8 个 micro-batch,气泡率 7/15 ≈ 47%,近一半算力空转;m 增大到 64,气泡率降到 7/71 ≈ 10%。这就是为什么 PP 必须配合很小的 micro-batch、很大的切分数量。更进一步的 1F1B(one forward one backward)调度让每张卡交替做前向和反向,把激活显存从 m 份压到约 p 份;交错阶段(interleaved schedule)让每卡持有多段不连续的层,气泡再缩到 1/v(v 为每卡模型片数)。千亿模型实战中 m 常取上百,气泡压到 5%-10%。
PP 的另一个隐蔽代价是负载均衡。Transformer 模型常带独立的词嵌入层和输出头,它们的计算量与一个普通层不同却都得落在某个阶段;若简单按层数均分,首尾阶段可能明显更重,流水线按最慢阶段节拍运转,其余卡全部被拖慢。工程做法是把嵌入层与输出头配对放在同一阶段(Megatron 即如此),再微调各段层数。此外 m 也不能无限增大:每个在途 micro-batch 都要在某个阶段上占一份激活显存,1F1B 之前的朴素调度需要同时保存 m 份激活,这正是 1F1B 与梯度检查点常与 PP 一起出现的原因。
六、三种并行对比
| 维度 | 数据并行 DP | 张量并行 TP | 流水线并行 PP |
|---|---|---|---|
| 切分维度 | batch(样本维) | 单层权重矩阵(列/行) | 层序列(阶段) |
| 通信原语 | AllReduce(ZeRO 为 reduce-scatter + all-gather) | 层内 AllReduce / all-gather | P2P send/recv,沿阶段环 |
| 每步通信量 | 约 2M,每步 1 次 | 约 L 次、每次 O(bsh),逐层发生 | 每边界 O(bsh),m 次 micro-batch |
| 单卡模型显存 | 完整 M(ZeRO 可降至 M/N) | M/t | M/p |
| 通信频次/延迟敏感度 | 低,可大量重叠 | 极高,卡在逐层关键路径 | 中,注入/排空时暴露 |
| 物理范围 | 可跨节点 | 仅限 NVLink 全互联域(≤8 卡) | 可跨 InfiniBand 节点 |
| 典型适用 | 小模型扩吞吐;作最外层 | 单机内层切分,t=2/4/8 | 跨节点扩模型容量,p=2-16 |
| 独有代价 | 显存不省 | 通信量巨大、实现复杂 | 气泡、micro-batch 调度、负载均衡 |
这张表揭示了三者互补的本质:TP 省显存最彻底但通信最贵,只能在最小物理范围用;PP 通信便宜、能跨节点,但有气泡且要求各阶段计算均衡(各段层数必须对齐,否则慢阶段拖死整条线);DP 实现最简单、扩展数据吞吐最直接,但不解决单卡装不下的问题。没有任何一种单独够用,组合是必然。
七、3D 并行:TP 在机内、PP 跨节点、DP 最外层
这张图就是工业界训练千亿模型的实际拓扑,读法是从内向外分三层。最内层是张量并行组:同一台机器内 8 卡经 NVLink/NVSwitch 全互联,吃同一份 micro-batch、协作完成层内矩阵乘,承担最频繁的 AllReduce。中间层是流水线并行:同一 DP 副本内,连续的层阶段分布在不同节点上,节点间经 InfiniBand 做 P2P send/recv,只传边界激活。最外层是数据并行:若干个「TP×PP 拼出的完整模型」互为副本,各自吃不同 mini-batch,每步在副本之间做梯度 AllReduce。
总卡数为三者乘积:N = t × p × d。以 1750 亿模型的典型配置为例:t=8(单机)、p=8 阶段、d=若干数据并行副本,单个副本占 8 台机器 64 卡,训练态 2.8TB 摊到 64 卡约每卡 44GB,恰好装进 80GB;再横向复制 d 份扩吞吐,总规模达数百卡。更大的万亿模型用 t=8、p=16 起步、d 继续外扩,卡数上千。
再给一个公开论文级配置作为参照:万亿参数模型训练态约 16TB,取 t=8、p=16,则单副本 128 卡、每卡模型状态约 125GB,80GB 卡仍不够,需把 p 提到 32 或叠加 ZeRO 式分片;此时集群常见规模为 t×p×d = 8×32×12 ≈ 3072 卡。可以看到三个旋钮的调节顺序始终遵循同一逻辑:先把 t 顶到单机物理上限 8,再用 p 把单副本显存压进单卡,最后用 d 把集群剩余卡数吃满以换取数据吞吐。p 还受气泡约束不能过大,d 则受全局 batch 与学习率的收敛约束,三者构成一组联动的可行域。通信层次严格遵循带宽金字塔:最热的 TP 流量锁在 NVLink(数百 GB/s),PP 流量小可以走 IB(50-100GB/s),DP 的 AllReduce 每步一次且可与反向计算重叠,同样容忍跨节点。
工程上还有几个实战要点。其一,三个并行组的卡必须按物理拓扑精心打组(rank mapping),让 TP 组落在同一 NVLink 域,错配会让带宽跌一个数量级。其二,DP 的 AllReduce 可做层级化:机内先归约、跨机只传归约结果。其三,各 PP 阶段的层数、TP 度必须一致以防负载倾斜,解码层与非解码层混排时需手工配平。其四,micro-batch 数 m 要同时满足气泡率和显存约束,它是 3D 配置中最核心的权衡旋钮。物理拓扑如何被 NCCL 探测利用,见训练梯度同步与集合通信;HPC 科学计算中同样的分层通信思想见多 GPU 域分解。
这一篇在知识体系里的位置
这一篇处在「物理互联 → 通信算法 → 并行策略」链条的顶端,是前两篇的综合应用。链路带宽层级(NVLink/InfiniBand)见 NVLink 多 GPU 互联;DP 每步 AllReduce 的通信量推导与 NCCL 拓扑感知见 训练梯度同步与集合通信;同样的切分与分层通信在 HPC 中的对应物见 多 GPU 域分解。卡内为什么是矩阵乘主导、脉动阵列如何吃 TP 切下的分块,见 AI 加速器与脉动阵列和 GPU 架构深入:SIMT、warp 调度。
总结
大模型并行策略只有三种切法:数据并行切 batch 维、每步一次 AllReduce 但显存不省,张量并行把单层权重按列按行拆开、每两层一次 AllReduce、通信最热故只能锁在单机 NVLink 域内,流水线并行把层切成 p 段、靠 P2P send/recv 传边界激活、用 m 个 micro-batch 把气泡率压到 (p-1)/(m+p-1);实际训练千亿模型必然按「TP 机内、PP 跨节点、DP 最外层」组成 3D 并行,让每一种通信都落在带宽金字塔最合适的层级上。