并行计算基础:数据并行、模型并行、流水线并行

大模型训练与推理的核心挑战在于:单卡显存容量有限(如H100 80GB、A100 80GB),而百亿乃至万亿参数模型动辄需要数百GB乃至数TB的显存空间。与此同时,单卡算力(如H100约989 TFLOPS FP16)面对数万亿的训练语料,其计算时间以年为单位,完全不可接受。因此,并行计算成为大模型工程化的必由之路。本章将系统梳理三种最基础的并行范式——数据并行(Data Parallelism, DP)、模型并行(Model Parallelism, MP,含张量并行)与流水线并行(Pipeline Parallelism, PP),从定义、优缺点、适用场景三个维度展开对比,并给出选型判断路径。

三种并行范式核心对比与选型路径 数据并行 (DP) 复制模型,切分数据 每卡独立前向/反向 梯度AllReduce同步 通信量: 与模型大小成正比 适用: 模型可放入单卡显存 典型: PyTorch DDP 模型并行 (MP) 切分模型参数/层 每卡持有部分权重 前向/反向需跨卡通信 通信量: 与激活值/切分维度相关 适用: 单卡放不下完整模型 典型: Megatron-LM 张量并行 流水线并行 (PP) 按层切分,分阶段执行 不同卡处理不同微批次 仅阶段边界传输激活/梯度 通信量: 与边界张量大小相关 适用: 模型层数深、单卡放不下 典型: GPipe / PipeDream 选型判断路径 模型能否 放入单卡? 是 数据并行 (DP) 优先选择,扩展性最好 否 进入模型并行 / 流水线并行 实际工程中通常组合使用:DP + PP + MP(3D并行)

上图展示了三种并行范式的核心差异与选型路径。数据并行通过复制模型、切分数据来提升吞吐;模型并行通过切分模型参数解决显存瓶颈;流水线并行则通过按层切分并引入微批次调度来平衡计算与通信。三者并非互斥,现代大模型训练系统(如Megatron-DeepSpeed、ColossalAI)普遍采用3D混合并行策略。下面逐一深入剖析。

2.1 数据并行(Data Parallelism)

核心原理

数据并行是最直观、应用最广泛的并行范式。其核心思想是:每个计算设备(GPU)持有完整的模型副本,将全局训练数据切分为多个分片,每个设备处理不同的数据分片。在每次训练迭代中,各设备独立完成前向传播和反向传播,计算出本地梯度;随后通过AllReduce通信操作(如Ring-AllReduce)在所有设备间同步梯度,确保每个设备获得全局平均梯度,再据此更新本地模型参数。

从数学角度看,设全局批量大小为 \(B\),并行度为 \(N\),则每个设备处理 \(B/N\) 条样本。梯度同步公式为:

g_global = (1/N) * Σ(g_i)   // i = 1..N,g_i为第i个设备的本地梯度

同步完成后,所有设备上的模型参数保持一致,进入下一轮迭代。数据并行的通信开销与模型参数量成正比——每轮迭代需要传输两倍模型大小的梯度数据(AllReduce的reduce和broadcast阶段)。

判断方法与操作流程

判断是否适合数据并行,可遵循以下流程:

  1. 显存检查:确认模型权重、优化器状态(如Adam的动量和方差)、梯度三者之和能否放入单卡显存。例如,7B参数模型在FP16下权重占14GB,Adam优化器状态占42GB,总计约56GB,勉强可放入80GB的A100/H100。
  2. 扩展性评估:计算通信占比。若模型较小(如1B以下),通信开销可忽略,数据并行可线性扩展至数百卡;若模型较大(如70B),单卡放不下,需先结合模型并行。
  3. 工程实现:使用PyTorch DDP(DistributedDataParallel)或Horovod。DDP采用Ring-AllReduce,通信量不随卡数增加而增加(仅与模型大小相关),扩展效率较高。
实战场景:某团队训练13B参数LLM,单卡A100 80GB可容纳(权重26GB + 优化器78GB = 104GB,需开启ZeRO Stage 1或2优化)。采用64卡数据并行,全局批量大小1024,每卡16条。实测吞吐从单卡约500 tokens/s提升至约28000 tokens/s,扩展效率约87%(理想为100%)。主要损耗来自梯度AllReduce通信,约占训练时间的13%。

常见误区与总结

  • 误区一:数据并行一定线性扩展。实际上,随着卡数增加,通信占比上升,扩展效率下降。当卡数超过128时,需考虑梯度压缩或异步并行。
  • 误区二:忽略优化器状态显存。Adam优化器需要额外存储2倍模型大小的状态,FP16训练时总显存需求约为模型大小的16倍(权重2 + 梯度2 + 优化器12)。
  • 误区三:数据并行无法解决单卡放不下的问题。若模型超过单卡显存,数据并行无法启动,必须结合模型并行或ZeRO技术。

总结:数据并行适合模型可放入单卡、追求高吞吐、训练数据量大的场景。它是并行策略的“第一选择”,也是混合并行的基础组件。

2.2 模型并行(Model Parallelism / 张量并行)

核心原理

模型并行(狭义上指张量并行,Tensor Parallelism)解决的是单卡显存无法容纳完整模型的问题。其核心思想是:将模型的参数矩阵按特定维度切分,分布到多张卡上,每张卡只持有模型的一部分权重,计算时通过通信协作完成前向和反向传播。

以Transformer的线性层为例,假设权重矩阵为 \(W \in \mathbb{R}^{d_{in} \times d_{out}}\),张量并行有两种切分方式:

  • 按行切分(Row Parallel):将 \(W\) 按输出维度切分为 \([W_1; W_2; ...; W_N]\),每卡持有部分行。前向计算时,各卡对输入 \(X\) 做部分矩阵乘,然后通过AllReduce汇总结果。
  • 按列切分(Column Parallel):将 \(W\) 按输入维度切分为 \([W_1, W_2, ..., W_N]\),每卡持有部分列。前向计算时,各卡对输入 \(X\) 的对应分片做矩阵乘,输出拼接后得到完整结果。

Megatron-LM提出的1D张量并行方案中,Transformer的每个自注意力头和FFN层均采用列并行+行并行的组合,在每层内引入两次AllReduce通信。通信量约为每层激活值大小的2倍,与模型参数量无关。

判断方法与操作流程

模型并行的适用判断:

  1. 显存瓶颈确认:当模型权重+优化器状态+激活值超过单卡显存时,需引入模型并行。
  2. 通信硬件评估:张量并行要求卡间通信延迟极低(<2μs)、带宽极高(>300GB/s)。因此,张量并行通常限制在单节点内(如8卡NVLink全互联),跨节点使用张量并行会因通信瓶颈导致严重性能下降。
  3. 切分维度选择:对于Transformer,优先切分注意力头的数量(Head Parallelism)和FFN中间层维度。切分粒度越细,通信频率越高,但显存节省越多。
经验提醒:张量并行度(TP Size)一般不超过8。当TP=8时,单层内通信次数为2次AllReduce,通信量约为激活值的2倍。若TP=16,通信量不变但通信次数翻倍,且跨节点通信延迟显著增加,实际吞吐可能不升反降。

案例拆解:70B模型张量并行训练

背景与约束:某公司训练70B参数模型,使用32台8卡A100服务器(共256卡)。单卡80GB显存,模型FP16权重140GB,Adam优化器状态420GB,总需求560GB,远超单卡容量。

初始方案:仅使用数据并行,无法启动。需引入模型并行。

关键参数与决策:

并行维度配置显存占用/卡通信开销
张量并行 (TP)TP=8(单节点内)权重17.5GB + 优化器52.5GB = 70GB每层2次AllReduce,NVLink带宽600GB/s
流水线并行 (PP)PP=4(跨节点)每阶段约17.5GB阶段边界传输激活值,约数百MB/微批次
数据并行 (DP)DP=8(跨节点)梯度同步AllReduce跨节点,IB网络400Gbps

实际操作:采用3D并行配置(TP=8, PP=4, DP=8),共256卡。每节点内8卡做张量并行,节点间4路流水线并行,8个节点副本做数据并行。

结果对比:相比纯数据并行(无法运行),3D并行成功训练。实际吞吐约3500 tokens/s/卡,MFU(模型浮点利用率)约42%。主要瓶颈在流水线并行带来的气泡(Bubble)和跨节点梯度同步。

风险与代价:张量并行导致每层计算粒度变小,kernel启动开销增加;流水线并行引入约15%的气泡率。复盘发现,若将PP从4调整为8(减少DP),气泡率可降至10%,但梯度同步通信增加,整体收益有限。

常见误区与总结

  • 误区一:张量并行度越大越好。实际上,TP>8时通信延迟成为主导,且显存节省收益递减。
  • 误区二:忽略激活值显存。张量并行虽减少参数显存,但激活值(尤其是长序列场景)可能占据大量显存,需配合激活重计算(Activation Checkpointing)。
  • 误区三:跨节点张量并行。除非使用超高速互联(如NVLink over InfiniBand),否则跨节点张量并行性能极差。

总结:模型并行(张量并行)适合单卡放不下、节点内卡间通信极快的场景。它是大模型训练的“骨架”,通常与流水线并行、数据并行组合使用。

2.3 流水线并行(Pipeline Parallelism)

核心原理

流水线并行将模型按层切分为多个阶段(Stage),每个阶段分配到不同的设备上。数据以微批次(Micro-batch)的形式依次流过各个阶段。与模型并行不同,流水线并行中每张卡只负责模型的一部分层,前向传播时数据从第0阶段流向最后阶段,反向传播时梯度反向流动。

关键调度策略:

  • GPipe方案:将全局批量分为多个微批次,依次送入流水线。前向完成后统一反向,存在大量气泡(Bubble),利用率约 \(1/(P-1+MB)\),其中P为阶段数,MB为微批次数。
  • PipeDream方案:采用1F1B(One-Forward-One-Backward)调度,每个设备交替执行前向和反向,减少气泡。但存在梯度滞后问题,需引入权重版本控制。
  • Interleaved调度:将每个阶段的层再细分为多个子块,轮流分配给设备,进一步减少气泡,但通信次数增加。

流水线并行的通信量仅发生在相邻阶段边界,传输的是激活值(前向)和梯度(反向),通信量远小于数据并行和模型并行。

判断方法与操作流程

流水线并行的适用判断:

  1. 模型层数深:当模型层数超过50层(如 175B有96层),适合按层切分。
  2. 跨节点部署:当模型需要跨多台服务器时,流水线并行是跨节点通信的最佳选择(相比张量并行,通信量小一个数量级)。
  3. 微批次大小:需要足够大的全局批量(如≥512)以填充流水线,否则气泡率过高。
风险提示:流水线并行最大的问题是气泡(Bubble)。当阶段数为P,微批次数为MB时,GPipe的气泡率约为 \((P-1)/(MB+P-1)\)。若P=8,MB=16,气泡率约30%;若MB=64,气泡率降至10%。因此,使用流水线并行时必须保证足够的微批次数。

案例拆解: 175B流水线并行调优

背景与约束:训练175B模型,共96层Transformer,使用64台8卡A100(512卡)。单卡无法容纳,需跨节点并行。

初始配置:TP=8(节点内),PP=8(跨节点),DP=8。全局批量1536,微批次大小16,即MB=96。

现象与问题:实测MFU仅35%,低于预期的45%。分析发现气泡率约 \((8-1)/(96+8-1) ≈ 6.8%\),但实际性能损失达20%。进一步排查发现,阶段间通信(激活值传输)使用CPU-GPU拷贝,延迟过高。

优化操作:

  1. 将阶段间通信改为GPU Direct RDMA,绕过CPU,延迟从50μs降至8μs。
  2. 调整微批次调度为1F1B,减少设备空闲时间。
  3. 将PP从8调整为4(增加DP至16),气泡率升至13%,但通信开销降低,整体MFU提升至42%。

结果对比:优化后MFU从35%提升至42%,训练吞吐提升20%。代价是DP增加导致梯度同步通信量增加约15%,但整体收益为正。

复盘经验:流水线并行的调优需在气泡率与通信开销之间寻找平衡点。PP过大导致气泡高,PP过小导致跨节点通信频繁。实际工程中,PP通常取4-8,且需配合1F1B调度。

常见误区与总结

  • 误区一:流水线并行通信量小,可以随意跨节点。虽然通信量小,但通信频率高(每个微批次都要传输),延迟敏感。需使用RDMA网络。
  • 误区二:微批次越大越好。微批次过大会导致显存不足(激活值累积),需配合激活重计算。
  • 误区三:忽略负载均衡。不同层的计算量不同(如Embedding层和LM Head层计算量大),需合理分配层到各阶段,否则出现“木桶效应”。

总结:流水线并行适合模型层数深、跨节点部署、全局批量大的场景。它是连接节点间并行的“桥梁”,与张量并行互补。

2.4 三种并行范式对比与选型总结

对比维度数据并行 (DP)模型并行/张量并行 (MP/TP)流水线并行 (PP)
切分对象训练数据模型参数/计算图模型层/阶段
每卡持有完整模型副本部分参数矩阵部分层
通信模式AllReduce(梯度)AllReduce(激活/梯度,每层多次)点对点(阶段边界)
通信量与模型大小成正比与激活值大小成正比与边界张量大小成正比
通信频率每轮一次每层多次每个微批次一次
显存节省无(需完整模型)按切分比例节省按层数比例节省
主要瓶颈梯度同步带宽卡间通信延迟气泡率
扩展上限数百卡(受通信影响)8卡内(受NVLink限制)4-16阶段(受气泡限制)
适用场景模型可放单卡,追求吞吐单卡放不下,节点内并行跨节点,层数深
选型决策建议:实际大模型训练几乎不会只用一种并行策略。推荐路径为:
① 先判断模型能否放入单卡 → 能则用DP;
② 不能则引入TP(节点内)解决单卡显存;
③ 若仍需跨节点,则叠加PP(跨节点);
④ 最后用DP(跨节点副本)扩展吞吐。
典型配置:7B模型用DP=64;13B用TP=8+DP=32;70B用TP=8+PP=4+DP=8;175B用TP=8+PP=8+DP=16。