一、分布式训练框架基础:三种并行策略与混合并行设计
大家好,我是你们这堂课的主讲人。今天咱们聊聊分布式训练里最基础、也最绕不开的三个概念:数据并行、模型并行、流水线并行。
说实话,我刚入行那会儿,觉得分布式训练不就是多卡跑跑嘛,有啥难的?结果第一次上手就栽了跟头——模型死活跑不起来,显存爆了,通信卡死,各种问题。后来才明白,选对并行策略,比调超参数重要得多。
好,咱们一个一个来看。
1.1 数据并行:最常用的并行方式
原理:把训练数据切成多份,每张卡拿一份,各自跑完整模型,然后同步梯度。
说白了就是:你有一份数据,我有一份数据,咱们各自算梯度,最后汇总一下,更新模型参数。
我习惯把数据并行比作「多个人抄同一本书」——每个人抄不同的章节,最后拼起来。但这里有个坑:每张卡上存的都是完整的模型副本。如果你的模型有 70B 参数,单卡显存放不下,那数据并行就玩不转了。
避坑指南:我曾经在一个 8 卡 A100 的集群上跑数据并行,结果发现 8 卡比 4 卡只快了 1.5 倍。为什么?通信开销太大了。你想想看,每张卡算完梯度,都要把梯度广播给所有人。卡越多,通信越重。所以数据并行不是无脑加卡就行的。
1.2 模型并行:把模型拆开放
当模型大到单卡放不下时,就得用模型并行。
原理:把模型的不同层或不同参数分到多张卡上。每张卡只存一部分模型,数据在卡间流转。
举个例子:一个 100 层的 Transformer,卡 0 放 1-25 层,卡 1 放 26-50 层,依此类推。数据从卡 0 进去,一层层算,最后从卡 3 出来。
嗯,这里要注意:模型并行有个天然的问题——串行依赖。卡 1 必须等卡 0 算完才能开始,卡 2 得等卡 1。这就导致 GPU 利用率上不去,很多时间花在等待上。
1.3 流水线并行:解决模型并行的等待问题
流水线并行是模型并行的一种优化。它把数据也切成微批次(micro-batch),让不同卡同时处理不同微批次的不同层。
我打个比方:工厂流水线上,工人 A 拧螺丝,工人 B 装外壳,工人 C 质检。如果一次只处理一个产品,那 B 和 C 大部分时间都在等。但如果把产品排成队,A 拧完一个就给 B,B 边装外壳边接下一个,这样大家都能忙起来。
流水线并行就是这个道理。它把训练数据切成更小的 micro-batch,让各张卡尽量同时工作,减少空闲时间。
| 并行策略 | 核心思想 | 适用场景 | 主要瓶颈 |
|---|---|---|---|
| 数据并行 | 数据分片,模型复制 | 模型能塞进单卡 | 通信开销 |
| 模型并行 | 模型分片,数据串行 | 模型太大放不下 | 串行等待 |
| 流水线并行 | 模型分片 + 数据微批 | 大模型 + 高吞吐需求 | 流水线气泡 |
1.4 混合并行策略:把三种策略组合起来
实际生产中,很少只用一种并行策略。大模型训练通常用混合并行。
我参与过一个千亿参数模型的训练,当时的设计思路是这样的:
- 先用流水线并行把模型切成几段,每段放在一组卡上
- 每组卡内部用模型并行(张量并行)处理超大层
- 所有组之间用数据并行同步梯度
说白了就是:流水线并行管层间,模型并行管层内,数据并行管副本。
为什么这么设计?你想想看,如果只用数据并行,模型太大放不下。如果只用模型并行,通信太频繁。如果只用流水线并行,气泡太多。三者结合,各取所长。
下面这张图是我自己画的混合并行架构,你看一眼就明白了:
你看,这张图里,纵向是流水线并行,横向是数据并行,每个卡组内部还有张量并行。三层嵌套,各司其职。
1.5 如何选择并行策略?
我一般按这个思路来选:
- 先看模型能不能塞进单卡。能?用数据并行。不能?往下看。
- 再看单层能不能塞进单卡。能?用流水线并行。不能?加张量并行。
- 最后看通信带宽够不够。带宽高,多用数据并行;带宽低,多用模型并行。
举个例子:你有个 100B 的模型,单卡显存 80GB。单卡肯定放不下,但单层(比如 attention 层)可能也就几 GB。这时候我建议用流水线并行 + 数据并行。流水线把模型切成 10 段,每段 10B,刚好放得下。然后复制 4 个流水线副本做数据并行,总共 40 张卡。
好了,这一章的内容就这些。三种并行策略的原理、适用场景、混合设计思路,我都讲清楚了。下一章咱们聊聊实际部署时怎么配置这些策略,包括 NCCL 通信优化、梯度累积这些实战技巧。
想要更多资料,联系可可