01. 数据并行、模型并行、流水线并行、张量并行有什么区别?各自适合什么场景?
整理数据并行、模型并行、流水线并行、张量并行的区别与适用场景。
简单回答
这四种并行策略针对的问题不同。数据并行(DP)是最基础的方案,把数据拆分到多个 GPU,每张卡都有完整模型副本;模型并行(MP)是模型太大放不进单卡时的解法,把模型层切开放在不同卡上;流水线并行(PP)是把不同的 Transformer 层分配到不同设备,像工厂流水线一样串行处理;张量并行(TP)是把单层的权重矩阵横向切开,多卡同时参与一层的计算。大规模训练通常是这几种并行方式的组合使用,而不是只用一种。
详细解答
数据并行(Data Parallelism)
数据并行是最直觉、最常用的并行方式。核心思路是:把一个大 batch 的数据切成 N 份,分给 N 张 GPU,每张 GPU 都有完整的模型副本,各自独立做前向和反向传播,然后通过 AllReduce 通信把所有 GPU 的梯度汇总平均,各自更新参数。
数据并行的优势是实现简单、扩展性好,PyTorch 的 DDP(DistributedDataParallel)是工业界最常用的实现。局限很明显:模型必须能放进单张 GPU 的显存。对于几十亿参数的大模型,单卡显存根本装不下,数据并行就失效了。
另外,数据并行的通信量和模型参数量成正比,参数越多,AllReduce 的通信开销越大。这是后来 ZeRO 优化要解决的核心问题。
模型并行(Model Parallelism / Pipeline Parallelism)
广义的"模型并行"分两个维度,实际上经常被混用,需要区分清楚:
流水线并行(Pipeline Parallelism, PP) 是按层切分模型——把前 L/4 层放在 GPU 0,接下来 L/4 层放在 GPU 1,依此类推。数据从 GPU 0 流向 GPU 1,再流向 GPU 2……像工厂流水线一样。
流水线并行的问题是"气泡"(Pipeline Bubble)——在朴素实现里,GPU 1 必须等 GPU 0 把 micro-batch 的前向算完才能开始,GPU 0 在等 GPU 1 反向时处于空闲状态。有效利用率其实不高。Gpipe 和 PipeDream 等工作通过 micro-batch 流水线(把一个 batch 切成多个 micro-batch 交错执行)来减少气泡,但气泡无法完全消除,bubble ratio 约为 ,其中 是流水线阶段数, 是 micro-batch 数量。
张量并行(Tensor Parallelism, TP) 是把单层的权重矩阵切开,多卡同时计算这一层。比如一个 的 FFN 权重矩阵,可以沿列方向切成 N 份,每张卡各持有 的一部分,分别做矩阵乘法,最后 AllReduce 合并结果。
Megatron-LM 是张量并行最有代表性的工程实现。它对 Transformer 的 Self-Attention 和 FFN 层都设计了专门的切分方案,使得每层内部只需要两次 AllReduce 通信,通信开销相对可控。
张量并行的优点是能有效利用 GPU 的并行算力,缺点是对通信带宽要求极高——切分粒度越细,每层的通信次数越多,NVLink 这种高带宽互联是必要条件。跨节点做张量并行带宽不够,效果会很差。
各自适合的场景
数据并行适合模型能放进单卡的场景,是标配。当单卡放不下模型时,才需要引入模型并行策略。
流水线并行适合层数多(Transformer 层数多)、层间通信量小的模型。它的通信量主要是相邻阶段之间的 activation,数据量相对少。但需要处理好 bubble 的问题,batch size 不能太小。
张量并行适合单层维度大(hidden size 大)的模型,能充分利用节点内的高速互联(NVLink)。通常限制在节点内(同一台机器的 8 张 A100 之间)使用。
大规模训练(比如 GPT-3 175B 级别)通常是 DP + PP + TP 的 3D 并行组合。典型配置:8 路 TP(节点内)+ N 路 PP(跨节点)+ M 路 DP(数据并行),每个 TP 组是节点内的 8 张卡,多个 TP 组之间做 PP,多个 PP 流水线之间做 DP。
面试时可以这样答
四种并行策略解决的问题层次不同。数据并行是最基础的,把数据切成多份各自算梯度然后 AllReduce 汇总,每张卡都有完整模型,限制是模型必须放进单卡。
模型放不进单卡时就需要模型并行。流水线并行是按层切分,不同 GPU 负责不同层,像流水线一样工作,缺点是有 bubble,实际利用率不到 100%。张量并行是把单层的权重矩阵横向切开,多卡并行算一层,需要节点内高速互联(NVLink),通信频率高。
实际大规模训练很少只用一种,标准做法是 3D 并行:节点内做张量并行(8 路 TP 利用 NVLink),节点间做流水线并行(减少跨节点通信量),再外层套数据并行。比如训一个千亿参数的模型,可能是 8 路 TP × 16 路 PP × 若干路 DP 这样的配置。
常见追问
- 流水线并行的 bubble 有什么方法可以缓解?1F1B 调度是什么?
- 张量并行切分 Attention 的时候,Q/K/V 矩阵是怎么切的?
- 3D 并行的并行度怎么配置?有没有自动搜索的方法?