4. 多GPU并行策略:数据并行、模型并行、流水线并行、混合并行

4.1 核心原理:并行维度的拆解

当单块GPU无法满足大模型的显存需求或算力需求时,我们需要将训练任务拆解到多块GPU上协同完成。拆解的核心在于回答两个问题:“数据怎么分”和“模型怎么分”。根据拆解维度的不同,形成了三种基础并行策略,以及它们的组合——混合并行。

  • 数据并行(Data Parallelism, DP):每块GPU持有完整的模型副本,但只处理训练数据的一个分片。前向与反向计算各自独立完成,梯度计算完成后通过AllReduce通信在所有GPU间求平均,再同步更新参数。
  • 模型并行(Model Parallelism, MP):将模型自身切分到多块GPU上。每块GPU只负责模型的一部分层或一部分参数。根据切分方式又分为层间并行(Pipeline Parallelism)和层内并行(Tensor Parallelism)。
  • 流水线并行(Pipeline Parallelism, PP):是模型并行的一种特殊形式,按层(Layer)的边界将网络切分为多个阶段(Stage),每个Stage部署在一块或多块GPU上,数据以微批次(Micro-batch)形式在Stage间顺序流动。
  • 混合并行(Hybrid Parallelism):在大规模集群(如数百上千卡)上,单一策略往往无法同时解决显存容量、通信带宽和计算效率问题,因此需要将DP、PP、TP(张量并行)甚至序列并行组合使用。
关键认知:数据并行解决“数据吞吐量”问题,模型并行解决“单卡显存放不下”的问题,流水线并行解决“层间串行导致的GPU空闲”问题,混合并行则是为了在超大规模场景下同时获得三种优势。
四种并行策略对比示意 数据并行 (DP) 模型副本 GPU 0 模型副本 GPU 1 数据分片 A 数据分片 B AllReduce 梯度同步 张量并行 (TP) 一个 Transformer 层 Q/K/V 分片 注意力头分片 FFN 分片 GPU 0 GPU 1 GPU 2 层内 AllGather / Reduce-Scatter 流水线并行 (PP) — 微批次流水 Stage 1 层 1-4 GPU 0 Stage 2 层 5-8 GPU 1 Stage 3 层 9-12 GPU 2 mb1 → mb2 → mb3 mb1 → mb2 → mb3 mb1 → mb2 → mb3 存在“气泡”(bubble)空闲 混合并行 (Hybrid) — 3D 并行 DP=2 数据分片 0/1 PP=2 Stage 0/1 TP=2 张量分片 总 GPU 数 = DP × PP × TP 例如:8 卡 = 2×2×2

4.2 方法流程:如何选择与组合

在实际工程中,选择并行策略需要遵循一套决策流程,而不是凭经验随意组合。以下是一个典型的判断路径:

  1. 第一步:判断单卡显存是否足够容纳模型参数、梯度和优化器状态。如果足够,优先使用纯数据并行(DP),因为它实现最简单、通信开销最低。
  2. 第二步:如果单卡放不下,先尝试张量并行(TP),因为它将单个层的计算切分到多卡,避免了层间通信的串行等待,但TP需要高带宽的卡间连接(如NVLink),否则通信会成为瓶颈。
  3. 第三步:如果TP后仍然放不下,或TP通信代价过高,则叠加流水线并行(PP),将网络按层切分为多个Stage。PP的通信量远小于TP,但会引入“气泡”空闲。
  4. 第四步:当集群规模超过32卡时,通常采用混合并行:先按PP切分Stage,再在每个Stage内部使用TP,最后在整体上叠加DP。这就是业界常说的“3D并行”或“Megatron-Turing”模式。
工程经验:在8卡单机场景下,如果模型小于10B参数,通常使用纯DP即可;如果模型在10B~30B之间,推荐PP+DP;超过30B或单卡显存小于40GB时,才需要引入TP。TP对通信带宽要求极高,跨机(非NVLink)场景下慎用。

4.3 案例/场景:以GPT-3 175B为例

以训练GPT-3 175B模型为例,其参数量需要约350GB的FP16权重,加上梯度和Adam优化器状态(FP32),总显存需求超过1.2TB。单张A100 80GB显然无法容纳。业界典型的配置如下:

并行维度 配置值 作用
PP(流水线并行) 8 个 Stage 将96层Transformer分为8段,每段12层
TP(张量并行) 8 路 每个Stage内部将注意力/FFN切到8卡
DP(数据并行) 64 路 64个模型副本并行处理不同数据批次
总GPU数 8 × 8 × 64 = 4096 对应一个完整的3D并行网格

在这个配置下,数据流遵循以下路径:

输入数据 → DP切分(64路) → 每个DP副本内部:
  进入PP Stage 0(GPU 0~7) → 层内TP切分(8卡并行计算)
  → 输出激活传递给PP Stage 1(GPU 8~15) → ... → Stage 7输出
反向传播时,梯度沿PP反向流动,同时每个Stage内部TP做梯度AllReduce,
最后DP维度再做一次全局梯度同步。
常见误区:不要以为PP的Stage数越多越好。Stage数过多会导致每个Stage的计算量过小,通信和调度开销占比上升,气泡率增大。经验上,每个Stage至少应包含4~6层Transformer,且单Stage的计算时间应远大于通信时间。

4.4 误区/复盘:并行策略的典型错误

在实际部署中,以下错误最为常见,值得反复复盘:

  • 误区一:盲目追求TP。TP虽然能降低显存,但其通信量是PP的数十倍。在千兆以太网或跨机场景下,TP的通信延迟会直接拖垮训练吞吐。正确做法是优先PP,TP仅在NVLink域内使用。
  • 误区二:忽略优化器状态的显存占用。Adam优化器需要保存FP32的动量(momentum)和方差(variance),这部分显存是模型权重的8倍(FP32权重4字节×2 + 梯度4字节)。很多初学者只计算了模型权重,导致OOM。
  • 误区三:PP的微批次数量设置不当。微批次(micro-batch)数量过少会导致气泡率上升;过多则会增加激活显存。一般建议微批次数量 ≥ 2×PP的Stage数,才能让流水线充分填充。
  • 误区四:混合并行时通信域配置错误。例如将TP组跨机配置,或者将DP组配置在同一台机器内,导致通信拓扑与硬件拓扑不匹配,造成不必要的跨机流量。
复盘建议:在每次训练任务启动前,先绘制一张“并行策略-通信拓扑”对照表,明确每个通信组(TP组、PP组、DP组)包含哪些GPU、它们之间的物理连接是NVLink还是InfiniBand,再据此决定并行维度的顺序和大小。

最后需要强调的是,并行策略的选择不是一次性的。随着模型规模增长、集群拓扑变化或训练稳定性问题出现,需要重新评估DP/PP/TP的比例。建议在每次大规模训练前,使用小规模配置(如1/10的模型和1/10的数据)跑通流程并测量通信耗时占比,再逐步扩展到全量配置,避免在千卡集群上因策略错误而浪费大量资源。