3、分布式训练基础:数据并行、模型并行、流水线并行的基本概念与通信模式

当单卡显存无法容纳大模型,或单卡算力无法满足训练吞吐要求时,分布式训练成为必然选择。然而,分布式训练并非简单地将多张GPU拼接起来,其核心挑战在于:如何切分计算与数据,以及如何高效地同步梯度与激活值。NCCL(NVIDIA Collective Communications Library)正是为解决GPU间高速通信而生。理解三种基本并行策略——数据并行、模型并行、流水线并行——及其对应的通信模式,是掌握NCCL集合通信与GPU集群优化的第一块基石。本章将深入剖析这三种策略的原理、通信特征、适用场景及常见误区,并引入张量并行作为模型并行的重要补充,为后续章节的通信原语与拓扑优化打下基础。

三种并行策略与通信模式对比 数据并行 (DP) 每卡持有完整模型副本 数据切分,梯度聚合 GPU0 GPU1 GPU2 AllReduce 梯度同步 通信量: 与模型参数量成正比 每步通信 2×模型大小 模型并行 (MP/TP) 模型切分到多卡,数据相同 层内切分,激活值通信 GPU0 GPU1 GPU2 AllGather / ReduceScatter 通信量: 与激活值大小成正比 每层 2×激活值 流水线并行 (PP) 按层切分,层间流水 微批次调度,点对点通信 Layer 1-2 Layer 3-4 Layer 5-6 P2P Send/Recv 通信量: 仅边界激活值 通信频率低,但延迟敏感 关键维度对比 维度 数据并行 模型并行(TP) 流水线并行 切分维度 数据批次 权重矩阵 网络层 通信原语 AllReduce AllGather/ReduceScatter P2P Send/Recv 通信频率 每步一次 每层多次 每个微批次边界 主要瓶颈 带宽 延迟 气泡率

上图从切分维度、通信原语、通信频率和主要瓶颈四个维度,对三种并行策略进行了直观对比。可以看到,数据并行通过AllReduce同步梯度,通信量与模型大小强相关;模型并行(张量并行)在层内切分权重,通过AllGather和ReduceScatter交换激活值,通信量与激活值大小相关;流水线并行则按层切分,仅需在层边界进行点对点通信。下面我们将逐一深入分析。

3.1 数据并行:最经典的扩展策略

核心原理

数据并行(Data Parallelism, DP)是最早被广泛采用的分布式训练策略。其核心思想是:每张GPU都保存一份完整的模型副本,但各自处理不同的数据子集(mini-batch)。在每次迭代中,各GPU独立完成前向传播和反向传播,计算出各自的梯度。随后,通过集合通信操作(如AllReduce)将所有GPU上的梯度进行求和平均,得到全局梯度,再用该梯度更新所有GPU上的模型参数。

数据并行的通信模式非常清晰:每步训练仅需一次AllReduce通信。AllReduce操作将分布在N个GPU上的梯度张量进行规约(求和或平均),并将结果广播回所有GPU。NCCL针对AllReduce在NVLink和InfiniBand上做了深度优化,例如采用Ring-AllReduce算法,将通信量从朴素算法的2(N-1)倍模型大小降低到2(N-1)/N倍,接近理论下限。

通信量估算:假设模型参数量为M(以字节计),GPU数量为N。采用Ring-AllReduce时,每步训练的总通信量为 2 × M × (N-1) / N 字节。当N较大时,通信量趋近于 2M。例如,一个7B参数模型(FP16精度,约14GB),在8卡集群上每步通信量约为28GB。这要求GPU间具备高带宽(如NVLink 600GB/s或InfiniBand 400Gb/s)才能保证通信时间远小于计算时间。

判断方法

选择数据并行作为主要扩展策略,通常需要满足以下条件:

  • 单卡显存足够容纳完整模型(包括参数、梯度、优化器状态和激活值)。例如,7B模型在FP16下需要约14GB参数+14GB梯度+28GB Adam状态(若使用Adam),加上激活值,单卡至少需要80GB显存。
  • 训练吞吐量受限于计算而非通信。当计算时间远大于通信时间时,数据并行的扩展效率接近线性。
  • 全局batch size可以相应增大。数据并行会线性增加全局batch size,需要调整学习率(如线性缩放规则)以保持收敛效果。

案例拆解: 175B 的数据并行实践

在训练 175B模型时,采用了数据并行与模型并行混合的策略。在单节点内(8张A100 80GB),使用张量并行(模型并行的一种)将模型切分到8卡上;在节点间(共几十个节点),使用数据并行。这种混合策略的核心考量是:节点内NVLink带宽高(600GB/s),适合高频通信的张量并行;节点间InfiniBand带宽相对较低(400Gb/s),适合低频通信的数据并行。

具体而言,每个节点内的8张卡通过NVLink全互联,构成一个张量并行组。不同节点之间,每张卡持有模型的一个分片,但处理不同的数据批次。在梯度同步时,先在各节点内部进行局部AllReduce,再跨节点进行全局AllReduce。这种分层通信策略有效降低了跨节点通信量,提升了整体扩展效率。

经验提醒:在实际工程中,数据并行的扩展效率通常用"弱扩展"(weak scaling)来衡量:当GPU数量翻倍时,全局batch size也翻倍,训练时间应保持不变。若扩展效率低于70%,应优先检查通信是否成为瓶颈,考虑使用梯度压缩、梯度累积或混合精度训练来降低通信量。

常见误区

  • 误区一:数据并行不需要通信优化。实际上,当模型规模增大或GPU数量增多时,AllReduce的通信量线性增长,通信时间可能超过计算时间,导致扩展效率急剧下降。
  • 误区二:梯度同步必须使用AllReduce。在某些场景下,可以使用ReduceScatter+AllGather的组合,或使用分桶(bucket)梯度聚合来减少通信次数,但NCCL的AllReduce已经高度优化,通常无需手动拆分。
  • 误区三:数据并行只适用于小模型。实际上,数据并行可以与模型并行、流水线并行自由组合,形成3D并行策略,以应对超大规模模型训练。

3.2 模型并行(张量并行):层内切分

核心原理

当单卡显存无法容纳模型时,需要将模型本身切分到多张GPU上。模型并行(Model Parallelism, MP)有两种主要形式:张量并行(Tensor Parallelism, TP)和流水线并行(Pipeline Parallelism, PP)。本节先讨论张量并行。

张量并行的核心思想是:将某一层的权重矩阵按行或按列切分到多张GPU上,每张GPU只负责计算部分结果,然后通过通信操作拼接完整输出。以Transformer的线性层为例,假设输入为X,权重为W,输出为Y = XW。可以将W按列切分为[W1, W2, ..., Wn],分别放在n张GPU上,每张GPU计算Yi = XWi,最后通过AllGather操作将所有Yi拼接为完整的Y。

张量并行的通信模式是每层前向和反向传播各需要一次AllGather和一次ReduceScatter。具体来说:前向传播时,需要AllGather收集各卡的部分输出以得到完整输出;反向传播时,需要ReduceScatter将梯度分发到各卡。通信量与激活值大小成正比,而非模型参数量。

通信量估算:假设某层的输入维度为B×S×H(B为batch size,S为序列长度,H为隐藏维度),张量并行度为N。前向AllGather的通信量为 B×S×H×(N-1)/N 字节,反向ReduceScatter的通信量相同。因此,每层每步的通信量约为 2×B×S×H 字节。对于 175B模型(H=12288,B=2,S=2048),单层通信量约为100MB,而模型有96层,总通信量约9.6GB,远小于数据并行的28GB。

判断方法

张量并行适用于以下场景:

  • 单卡显存无法容纳单层权重。例如, 175B的单个注意力层权重约1.4GB(FP16),加上激活值和梯度,单卡难以容纳。
  • 节点内GPU间具备高带宽互联(如NVLink或PCIe Gen4/5)。张量并行通信频率高,对带宽和延迟都极为敏感,跨节点使用张量并行会导致通信开销过大。
  • 模型层数较多且每层计算量较大。这样通信时间可以被计算时间有效掩盖。

案例拆解:Megatron-LM的张量并行实现

NVIDIA的Megatron-LM框架是张量并行的经典实现。以Transformer层为例,Megatron将注意力层的QKV投影矩阵按列切分,将输出投影矩阵按行切分;将MLP层的两个线性层分别按列和按行切分。这种切分方式使得每个Transformer层只需要两次AllGather和两次ReduceScatter通信,通信效率极高。

在8张A100(NVLink全互联)上,Megatron-LM训练 175B时,张量并行度为8,节点内通信延迟约2-3微秒,带宽利用率可达90%以上。实测表明,张量并行度为8时,计算通信比约为5:1,即通信时间仅占计算时间的20%,扩展效率可达85%以上。

风险提示:张量并行度不宜设置过高。当并行度超过节点内GPU数量时,需要跨节点通信,而跨节点带宽远低于NVLink,会导致通信时间急剧增加。例如,在40GbE网络下,张量并行度从8提升到16,通信时间可能增加4倍以上,扩展效率可能降至50%以下。因此,张量并行度通常限制在单节点内。

常见误区

  • 误区一:张量并行可以无限扩展。实际上,张量并行度受限于单层权重的大小和节点内GPU数量,过度切分会导致通信开销超过计算收益。
  • 误区二:张量并行与数据并行互斥。实际上,两者可以组合使用:先进行张量并行切分模型,再对切分后的模型副本进行数据并行。
  • 误区三:张量并行只关注权重切分,忽略激活值通信。实际上,激活值的AllGather/ReduceScatter通信是张量并行的主要通信开销,优化激活值通信(如使用NCCL的NVLS(NVLink Sharp)特性)对提升性能至关重要。

3.3 流水线并行:层间切分与微批次调度

核心原理

流水线并行(Pipeline Parallelism, PP)将模型按层切分为多个阶段(Stage),每个阶段分配到一张或多张GPU上。数据以微批次(micro-batch)的形式依次流过各个阶段,形成流水线。与张量并行不同,流水线并行通信频率低,但通信延迟对性能影响显著。

流水线并行的通信模式是点对点(P2P)通信:每个阶段仅与其前驱和后继阶段通信,传递该阶段的输出激活值和反向传播的梯度。NCCL提供了Send/Recv原语,支持GPU间的直接点对点传输,无需经过CPU或共享内存。

流水线并行面临的核心挑战是气泡(bubble)问题:在流水线启动和排空阶段,部分GPU处于空闲状态。为减少气泡,通常采用微批次调度策略,如GPipe的Fill-Drain调度和PipeDream的1F1B(One-Forward-One-Backward)调度。1F1B调度通过交错前向和反向传播,显著减少了气泡率。

气泡率计算:假设流水线阶段数为P,微批次数量为M。GPipe的气泡率为 (P-1)/(M+P-1)。当P=8,M=32时,气泡率约为18%。而PipeDream的1F1B调度可将气泡率降至 (P-1)/(2M+P-1),在相同条件下约为10%。增加微批次数量M可以进一步降低气泡率,但会增加激活值显存占用。

判断方法

流水线并行适用于以下场景:

  • 模型层数非常多(如100层以上),且单卡无法容纳连续的多层。
  • 跨节点训练。由于流水线并行通信频率低(每个微批次仅通信一次),对带宽要求不高,适合在InfiniBand或甚至以太网环境下使用。
  • 需要平衡计算与通信。流水线并行允许每个阶段包含不同数量的层,可以针对不同GPU的算力进行负载均衡。

案例拆解: 175B的3D并行配置

在训练 175B时,采用了3D并行策略:张量并行度=8(节点内),流水线并行度=4(节点间),数据并行度=16(跨节点)。总GPU数为8×4×16=512张A100。

具体配置如下:每个节点内的8张卡组成一个张量并行组,处理同一层的不同分片;4个节点组成一个流水线组,每个节点负责模型的一部分层;16个流水线组之间进行数据并行。这种配置的通信模式为:节点内高频AllGather/ReduceScatter(张量并行),节点间低频P2P Send/Recv(流水线并行),跨流水线组AllReduce(数据并行)。

实测数据表明,该配置在512张A100上的训练吞吐量达到约560 TFLOPs,相比单卡(约50 TFLOPs)实现了约11倍的加速,扩展效率约为70%。其中,流水线并行的气泡率约为12%,数据并行的通信开销约占10%,张量并行的通信开销约占8%。

经验提醒:在配置3D并行时,应遵循"先张量并行,再流水线并行,最后数据并行"的优先级。因为张量并行对带宽要求最高,应限制在节点内;流水线并行对延迟敏感,应尽量使用高速网络;数据并行对带宽要求适中,可以跨较慢的网络。此外,应确保每个流水线阶段的计算时间大致相等,避免出现"短板效应"。

常见误区

  • 误区一:流水线并行不需要高速网络。虽然流水线并行通信频率低,但单次通信的数据量可能很大(如的激活值可达数百MB),且延迟会影响微批次的流转速度。因此,仍建议使用RDMA网络(如InfiniBand或RoCE)以降低延迟。
  • 误区二:微批次越多越好。增加微批次数量可以降低气泡率,但会线性增加激活值显存占用。当显存不足时,需要采用激活值重计算(activation checkpointing)技术,这会增加约30%的计算量。
  • 误区三:流水线并行与数据并行不能同时使用。实际上,流水线并行可以与数据并行组合:每个流水线组处理不同的数据批次,在梯度同步时进行跨组AllReduce。

3.4 三种并行策略的对比与选型

维度 数据并行 (DP) 张量并行 (TP) 流水线并行 (PP)
切分对象 数据批次 权重矩阵 网络层
通信原语 AllReduce AllGather / ReduceScatter P2P Send/Recv
通信频率 每步一次 每层两次 每个微批次一次
通信量 2×模型大小 2×激活值大小 边界激活值大小
带宽敏感度 高 极高 中
延迟敏感度 低 高 极高
主要瓶颈 带宽 延迟 气泡率
适用场景 模型可放入单卡 单层权重超单卡显存 模型层数多,跨节点

在实际工程中,三种并行策略往往不是互斥的,而是组合使用。选择哪种策略或组合,需要综合考虑模型规模、显存容量、网络拓扑、带宽和延迟等因素。一个实用的选型流程如下:

  1. 判断单卡显存是否足够容纳完整模型。若足够,优先使用数据并行;若不足,进入下一步。
  2. 判断单层权重是否超单卡显存。若是,必须使用张量并行;若否,可考虑流水线并行。
  3. 判断节点内GPU数量是否足够。张量并行度应不超过节点内GPU数,否则需引入跨节点通信,性能会大幅下降。
  4. 根据网络带宽选择流水线并行度。若跨节点带宽较高(如InfiniBand 400Gb/s),可适当增加流水线并行度;若带宽较低(如25GbE),应减少流水线并行度,增加数据并行度。
  5. 最后调整数据并行度,以充分利用所有GPU资源。
总结复盘:分布式训练的核心是"切分"与"通信"的平衡。切分越细,单卡负载越轻,但通信开销越大。数据并行适合模型可完整放入单卡的场景,通信模式简单但带宽压力大;张量并行适合单层超显存的场景,通信频率高但可限制在节点内;流水线并行适合超深模型,通信频率低但需关注气泡率。在实际应用中,应优先使用NCCL提供的集合通信原语(