← 返回题目列表

分布式训练的数据并行、张量并行、流水线并行有什么区别?

高频 困难 第 10 / 25 题 更新于 2026/08/03
分布式训练数据并行张量并行流水线并行3D并行

简化版

单卡装不下大模型、也训不快,于是要多卡协同,三种基本并行方式分别切分不同的东西:

  • 数据并行(DP):每张卡放一份完整模型,各自算不同的数据批,再同步梯度。切的是数据,最简单,但每张卡都要装下整个模型。
  • 张量并行(TP):把单个层内的大矩阵横竖切开分到多张卡上算,一层的计算由多卡合作完成。切的是层内张量,通信频繁,通常限于单机多卡(NVLink)。
  • 流水线并行(PP):把模型按层切成几段,不同卡负责不同段,像流水线一样接力,用 micro-batch 填满流水减少空泡。切的是层(深度)

训练超大模型时三者组合使用,叫 3D 并行(DP × TP × PP),再叠加 ZeRO 显存优化。

详细版

为什么需要并行

  • 显存装不下:一个 70B 模型光参数 + 梯度 + 优化器状态就要上 TB 级显存,远超单卡。
  • 算得太慢:万亿 token 单卡训要几十年,必须多卡并行提速。

三种并行对比

并行切分对象通信内容通信频率典型范围
数据并行 DP数据批梯度(all-reduce)每步一次跨机器
张量并行 TP层内矩阵激活/部分和(all-reduce)每层多次机内(NVLink)
流水线并行 PP模型层(段)段间激活段边界跨机器

数据并行(DP)

  • 每卡完整模型副本,处理不同 mini-batch,反向后 all-reduce 同步梯度,保持各副本一致。
  • 优点:简单、扩展性好。缺点:每卡都要存整个模型,大模型放不下(靠 ZeRO/FSDP 解决)。

张量并行(TP)

  • 把矩阵乘法在维度上切分:如 FFN 的权重按列切、注意力按头切,每卡算一部分,再通过 all-reduce 合并。
  • 优点:能拆开单层、突破单卡容量。缺点:每层都要通信,带宽要求极高,一般只在单机内多卡用(靠 NVLink)。

流水线并行(PP)

  • 模型按层分成 S 段,卡 1 算 1k 层,卡 2 算 k+12k 层……前向的激活传给下一段。
  • 问题:流水线空泡(bubble)——启动和排空阶段有卡在空等。用micro-batch(把 batch 切小、连续注入)填满流水线,降低空泡比例。

完整版教学

一、先分清”两个瓶颈”决定了要切什么

大模型训练卡在两处,对应不同并行:

  • 算力瓶颈(训得慢)→ 数据并行:多卡各算一部分数据,线性提速。
  • 显存瓶颈(装不下)→ 张量并行 + 流水线并行 + ZeRO:把模型本身拆开分摊到多卡。

理解这个分野,就知道为什么要三种并行并存:DP 主要解决速度,TP/PP 主要解决「单卡装不下模型」。真正的大模型两个瓶颈都撞上,所以要组合。

二、数据并行:最直观的”人多力量大”

数据并行像「多个学生用同一本书,各做不同习题,然后对答案统一订正」:

  1. 每张卡持有完整模型副本
  2. 把一个大 batch 拆成若干份,每卡处理一份,独立前向 + 反向算出各自的梯度;
  3. all-reduce 把所有卡的梯度求平均,让每卡拿到一致的全局梯度;
  4. 各卡用相同梯度更新,保持副本同步。

它最简单、最常用,但硬伤是冗余:N 张卡存了 N 份一模一样的模型 + 优化器状态,巨大浪费。当模型大到单卡都装不下一份时,纯 DP 就失效了——这正是 ZeRO/FSDP 要消除的冗余(见相关题)。

三、张量并行:把一层”横切竖剖”给多卡合作

当单层的矩阵大到一张卡都算不动/放不下,就用张量并行把层内的矩阵运算切开。以 Transformer 为例(Megatron-LM 的经典切法):

  • FFN:第一个权重矩阵按切分到各卡,各卡算自己那部分的中间结果,激活后第二个矩阵按切分,最后 all-reduce 求和得到完整输出。
  • 多头注意力:按注意力头切分——不同卡算不同的头,天然并行,最后拼接。

代价是通信极频繁:每一层的前向和反向都要 all-reduce 同步部分和。这要求卡间带宽极高,所以 TP 通常只在单机内的多张卡之间做(靠 NVLink/NVSwitch 的高带宽),跨机器做 TP 会被网络拖垮。

四、流水线并行:按深度接力,但要防”空泡”

流水线并行把模型按层纵向切成几段,每段放一张(组)卡上,像工厂流水线:

卡1: 层 1~10   →  卡2: 层 11~20  →  卡3: 层 21~30  →  ...

前向时激活从前一段流到后一段,反向时梯度反向流回。问题是空泡(pipeline bubble):流水线刚启动时,卡 2、卡 3 没数据只能空等;排空时前面的卡也闲置。若只送一个大 batch,空泡占比很高,利用率低。

解法是 micro-batch:把一个 batch 切成很多小份,连续不断地注入流水线,让各段几乎同时都有活干,把空泡摊薄。micro-batch 越多,空泡比例越低(但太多会增加激活显存和调度开销),需要权衡。GPipe、1F1B 等调度策略进一步优化了空泡和显存。

记忆钩子:PP 的敌人是空泡,武器是 micro-batch——把大批次切小、像挤牙膏一样连续喂进流水线。

五、3D 并行:组合拳训超大模型

训练千亿级模型时,单一并行都不够,于是三者组合成 3D 并行

  • 张量并行(机内):单机 8 卡内用 TP 拆开每一层,靠 NVLink 高带宽扛住频繁通信。
  • 流水线并行(跨机少量):把模型分成几段,跨几台机器接力。
  • 数据并行(最外层):在上述「模型并行组」之外再复制多份,用 DP 扩大吞吐。

再叠加 ZeRO/FSDP 消除数据并行里的显存冗余、混合精度降显存、梯度检查点省激活。这一整套组合,是训练 GPT-3/Llama 这类模型的标准工程。分配原则:通信最频繁的 TP 放机内、次频繁的 PP 跨少量机器、通信最省的 DP 放最外层跨机器——按通信强度匹配硬件带宽。

六、面试拆解算例

预训练题最好落到预算账和稳定性账。假设训练一个 7B 模型,目标 token 数是 1T,按常见粗估 6 × 参数量 × token 数,训练计算量约为 6 × 7e9 × 1e12 = 4.2e22 FLOPs。如果有效集群算力是 1e18 FLOPs/s,理想情况下也要约 42,000 秒;现实还要扣通信、数据加载、checkpoint 和故障恢复的损耗。

training_flops ≈ 6 * N * D
N = 7e9 parameters
D = 1e12 tokens
training_flops ≈ 4.2e22
账本关键变量常见瓶颈排查信号
数据账token 数、重复率、质量分脏数据和污染eval 异常偏高
算力账GPU 数、利用率、通信MFU 低step time 抖动
显存账batch、序列长、优化器状态OOM激活占用过高
稳定性账学习率、精度、梯度loss spikeoverflow/NaN
语料 -> 清洗去重 -> tokenization -> 分布式训练 -> checkpoint -> 评测
  |        |             |                |             |
 质量     覆盖率         吞吐              可恢复         能力验证

所以回答「分布式训练的数据并行、张量并行、流水线并行有什么区别?」时,不能只说某个技巧“省显存”或“加速”。要说明它省的是哪一笔账、牺牲了什么、线上训练日志里应该观察哪个信号。

七、常见误区与追问

  • 误区:数据并行能解决”模型装不下”。 不能,DP 每卡都要完整模型;装不下要靠 TP/PP/ZeRO。
  • 误区:张量并行可以随便跨机器。 TP 通信太频繁,跨机器会被网络拖死,通常限机内 NVLink。
  • 追问:DP 的梯度怎么同步? 反向后 all-reduce 求平均,保证各副本更新一致。
  • 追问:流水线空泡是什么,怎么减? 启动/排空阶段卡空等;用 micro-batch 连续注入填满流水线。
  • 追问:TP 切在哪? FFN 按列/行切、注意力按头切,每层 all-reduce 合并。
  • 追问:3D 并行怎么分配? 通信强度匹配带宽——TP 机内、PP 跨少量机、DP 最外层。
  • 追问:DP 和 ZeRO 什么关系? ZeRO 是”去冗余的数据并行”,把优化器状态/梯度/参数分片,解决 DP 每卡存整份的浪费。

八、加强记忆

三种并行记「切什么」:数据并行切数据(每卡整模型、同步梯度、解决速度)、张量并行切层内矩阵(多卡合作算一层、通信频繁、限机内 NVLink)、流水线并行切层/深度(分段接力、用 micro-batch 防空泡)。简要说抓分工:DP 治”慢”,TP+PP 治”装不下”。超大模型用 3D 并行(TP 机内 + PP 跨少量机 + DP 最外层)+ ZeRO + 混合精度 + 梯度检查点,核心分配原则是按通信强度匹配硬件带宽。记住 PP 的「空泡 vs micro-batch」和 TP 的「只能机内」两个关键点,就不会答错。