分布式训练基础:四大并行策略深度对比

做分布式训练,说白了就是解决一个核心问题:如何把大模型塞进多张卡里,还能跑得快。

我刚开始接触分布式时,也一头雾水。数据并行、模型并行、流水线并行、混合并行……这些名词听着就头大。但实际踩过几次坑后,我发现它们其实各有各的脾气。今天我就把这四种策略掰开揉碎了讲清楚。

一、数据并行(DP / DDP)

核心思想:每张卡都存一份完整的模型副本,只把数据切分到不同卡上。

这是最直观的并行方式。你想想看,如果我有4张卡,就把一个batch的数据切成4份,每张卡算一份,最后把梯度汇总更新。

DP(DataParallel):PyTorch早期方案,单进程多线程。主卡负责梯度汇总,容易成为瓶颈。

DDP(DistributedDataParallel):多进程方案,每张卡独立进程,通过Ring All-Reduce通信。效率高得多。

我个人习惯直接用DDP。DP在单机多卡时还能用,但跨机器时性能差得离谱。我记得有一次用DP跑8卡,通信开销占了将近40%的时间,换成DDP后直接降到5%以内。

我的经验:DDP的batch_size设置要小心。总batch_size = 单卡batch_size × 卡数。如果单卡batch_size太小(比如1或2),BN层的统计量会不准。我一般建议单卡至少8以上。

二、模型并行

核心思想:模型太大,一张卡放不下。把模型的不同层切分到不同卡上。

举个例子,一个12层的Transformer,我可以把前4层放卡0,中间4层放卡1,后4层放卡2。数据要依次经过这三张卡,就像流水线一样。

但这里有个坑:计算是串行的。卡0算完才能给卡1,卡1算完才能给卡2。所以模型并行通常只用在单机多卡场景,跨机器通信延迟太高。

我曾经踩过的坑:模型并行时,层与层之间的通信量很大。如果切分不合理,通信时间可能比计算时间还长。我建议把计算量大的层放在同一张卡上,减少跨卡通信次数。

三、流水线并行

核心思想:模型并行的一种优化。把数据切分成多个micro-batch,让不同卡同时处理不同micro-batch。

说白了,就是让流水线"满起来"。假设有4张卡,模型切成4段。我不等第一个micro-batch跑完所有卡,而是让卡0算完第一个micro-batch就传给卡1,同时卡0开始算第二个micro-batch。

这样,大部分时间所有卡都在工作,而不是干等着。

关键参数:micro-batch数量(通常设为4-8个)。太少则流水线"气泡"大,太多则显存占用高。

我记得在训练GPT-3时,流水线并行几乎是标配。但要注意,流水线并行会引入额外的显存开销,因为需要保存多个micro-batch的中间结果。

四、混合并行

核心思想:把上面几种策略组合起来用。这是大模型训练的终极方案。

实际场景中,很少只用一种策略。比如训练一个100B参数的模型:

  • 先用模型并行把模型切到多张卡上(因为单卡放不下)
  • 再用流水线并行提高卡间利用率
  • 最后用数据并行扩展更多节点

这就是典型的3D并行(3D Parallelism)。

策略 适用场景 通信开销 显存需求
数据并行(DDP) 模型能放进单卡,数据量大 中等(梯度同步) 每卡一份完整模型
模型并行 模型太大,单卡放不下 高(层间传输) 每卡一部分模型
流水线并行 模型大,且层数多 中等(micro-batch传输) 每卡一部分模型+中间结果
混合并行 超大规模模型(100B+) 高(多种通信混合) 按策略组合

五、核心对比:一张图看懂

下面这张图是我自己总结的,四种策略的适用边界和关系:

分布式训练并行策略对比 数据并行 (DP/DDP) 每卡存完整模型 数据切分到各卡 梯度同步更新 适用:模型≤单卡显存 模型并行 模型切分到各卡 每卡存部分层 串行计算 适用:模型>单卡显存 流水线并行 模型切分+micro-batch 多卡并行计算 减少气泡时间 适用:层数多的大模型 混合并行 数据+模型+流水线 3D并行 灵活组合 适用:100B+超大规模 箭头表示可组合使用,虚线表示可选路径

六、如何选择?我的实战建议

说实话,没有银弹。我一般按这个思路来选:

  1. 模型能放进单卡吗?能 → 用DDP。不能 → 往下看。
  2. 模型层数多吗?多(比如50层以上)→ 考虑流水线并行。少 → 用模型并行。
  3. 卡的数量多吗?多(比如32卡以上)→ 混合并行。少 → 简单策略就行。

我的小技巧:刚开始做分布式时,别一上来就搞混合并行。先跑通DDP,再逐步加模型并行和流水线并行。这样出了问题好排查。

我曾经在一个项目里,团队直接上了3D并行,结果调试了整整两周才发现是通信配置的问题。后来我学乖了,先简单后复杂,逐步叠加。

七、避坑指南

坑1:通信拓扑 - 多机训练时,网络拓扑很重要。如果跨机通信走的是千兆网,那数据并行基本跑不动。我建议至少万兆网或InfiniBand。

坑2:负载不均 - 模型并行时,不同层的计算量可能差很多。比如Attention层和FFN层,计算量就不一样。要手动调整切分策略,让每张卡的计算时间尽量接近。

坑3:显存碎片 - 流水线并行时,micro-batch数量越多,中间结果占的显存越多。我一般控制在4-8个,再多就容易OOM。

嗯,以上就是我对这四种并行策略的理解。说白了,没有最好的策略,只有最适合你场景的策略。多试试,多调调,慢慢就有感觉了。

可可精品资料库