分布式训练基础:四大并行策略深度对比
做分布式训练,说白了就是解决一个核心问题:如何把大模型塞进多张卡里,还能跑得快。
我刚开始接触分布式时,也一头雾水。数据并行、模型并行、流水线并行、混合并行……这些名词听着就头大。但实际踩过几次坑后,我发现它们其实各有各的脾气。今天我就把这四种策略掰开揉碎了讲清楚。
一、数据并行(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+) | 高(多种通信混合) | 按策略组合 |
五、核心对比:一张图看懂
下面这张图是我自己总结的,四种策略的适用边界和关系:
六、如何选择?我的实战建议
说实话,没有银弹。我一般按这个思路来选:
- 模型能放进单卡吗?能 → 用DDP。不能 → 往下看。
- 模型层数多吗?多(比如50层以上)→ 考虑流水线并行。少 → 用模型并行。
- 卡的数量多吗?多(比如32卡以上)→ 混合并行。少 → 简单策略就行。
我的小技巧:刚开始做分布式时,别一上来就搞混合并行。先跑通DDP,再逐步加模型并行和流水线并行。这样出了问题好排查。
我曾经在一个项目里,团队直接上了3D并行,结果调试了整整两周才发现是通信配置的问题。后来我学乖了,先简单后复杂,逐步叠加。
七、避坑指南
坑1:通信拓扑 - 多机训练时,网络拓扑很重要。如果跨机通信走的是千兆网,那数据并行基本跑不动。我建议至少万兆网或InfiniBand。
坑2:负载不均 - 模型并行时,不同层的计算量可能差很多。比如Attention层和FFN层,计算量就不一样。要手动调整切分策略,让每张卡的计算时间尽量接近。
坑3:显存碎片 - 流水线并行时,micro-batch数量越多,中间结果占的显存越多。我一般控制在4-8个,再多就容易OOM。
嗯,以上就是我对这四种并行策略的理解。说白了,没有最好的策略,只有最适合你场景的策略。多试试,多调调,慢慢就有感觉了。