1、分布式训练基础:为什么需要多卡训练、数据并行与模型并行概念、同步与异步训练的区别
1.1 为什么需要多卡训练?
说实话,我刚入行那会儿,也觉得单卡训练挺香的。一张V100跑个ResNet-50,几天就完事了。但后来模型越做越大,从几亿参数到几百亿参数,单卡根本塞不下。
你想想看,GPT-3有1750亿参数,光存储参数就需要700GB以上的显存。一张A100才80GB,怎么玩?
所以,多卡训练不是「要不要」的问题,而是「不得不」的选择。核心原因就三个:
- 显存墙:单卡显存有限,大模型放不下
- 时间墙:单卡训练一个LLM可能要几年,等不起
- 算力墙:单卡算力有限,无法满足大规模数据吞吐
核心观点:多卡训练的本质是用「通信」换「算力」,用「并行」换「时间」。
我在项目中遇到过最典型的场景:一个百亿参数的推荐模型,单卡训练需要45天。上了64卡分布式训练后,压缩到18小时。虽然通信开销不小,但收益是实打实的。
1.2 数据并行与模型并行概念
这两个概念,说白了就是「怎么切」的问题。
数据并行(Data Parallelism)
数据并行是最直观的思路。每张卡上都放一份完整的模型副本,然后把训练数据切成多份,每张卡处理一份。
举个例子:
# 伪代码示意
batch_size = 1024
num_gpus = 8
per_gpu_batch = 128 # 每张卡处理128条数据
# 每张卡独立前向、反向
for data in dataloader:
local_grad = model(data_on_this_gpu)
# 然后所有卡的梯度做all-reduce
global_grad = all_reduce(local_grad)
optimizer.step(global_grad)
嗯,这里要注意:数据并行要求模型能完整塞进单卡显存。如果模型太大,那就得换思路了。
我的经验:数据并行适合模型参数小于单卡显存70%的场景。留点余量给激活值和优化器状态,不然容易OOM。
模型并行(Model Parallelism)
模型并行则是把模型本身切开。每张卡只负责模型的一部分。
我习惯把模型并行分成两种:
- 层间并行(Pipeline Parallelism):按层切分,卡1负责1-10层,卡2负责11-20层
- 层内并行(Tensor Parallelism):把一层内部的矩阵运算切分到多卡
为什么会这样设计?因为有些模型大到一个Transformer层都放不进单卡,那就得把这一层也切开。
| 维度 | 数据并行 | 模型并行 |
|---|---|---|
| 切分对象 | 训练数据 | 模型参数 |
| 通信模式 | 梯度同步(all-reduce) | 激活值传递(P2P) |
| 适用场景 | 模型能塞进单卡 | 模型太大放不下 |
| 通信频率 | 每个step一次 | 每个micro-batch多次 |
避坑指南:我曾经在模型并行时踩过一个坑——通信和计算没有重叠。卡1在算的时候,卡2在空等。后来加了异步通信和流水线气泡优化,吞吐量提升了40%。
1.3 同步与异步训练的区别
这个问题,说白了就是「大家要不要等齐了再干活」。
同步训练(Synchronous Training)
同步训练的逻辑很简单:所有卡算完当前batch的梯度后,统一做一次all-reduce,拿到全局平均梯度,然后一起更新参数。
优点很明显:
- 训练稳定,收敛曲线平滑
- 数学上等价于单卡大batch训练
- 调试方便,问题容易复现
缺点也直接:
- 慢卡拖累整体(straggler问题)
- 通信开销集中在梯度同步上
异步训练(Asynchronous Training)
异步训练则各玩各的。每张卡算完梯度后,直接更新全局参数,不用等别人。
我刚开始做分布式时,觉得异步训练效率高,就一股脑上了。结果呢?模型死活不收敛。后来才发现,异步训练存在梯度陈旧性问题——你用的参数可能是别人更新了好几轮之前的版本。
关键对比:同步训练用「等待」换「精度」,异步训练用「精度」换「速度」。
| 对比项 | 同步训练 | 异步训练 |
|---|---|---|
| 收敛稳定性 | 高 | 低(需调参) |
| 吞吐量 | 受限于最慢卡 | 接近线性扩展 |
| 实现复杂度 | 低 | 高(需处理竞争) |
| 业界使用 | 主流(95%场景) | 少数场景(如推荐系统) |
我的建议:除非你非常清楚自己在做什么,否则默认选同步训练。异步训练虽然看起来快,但调参成本极高。我曾经花了两周时间调异步训练的learning rate和梯度裁剪,最后还是换回了同步。
知识体系总览
下面这张图,是我自己梳理的分布式训练基础框架。每次带新人时,我都会先让他们看这张图。
这张图把本章的核心逻辑串起来了。从上往下看:先搞清楚「为什么需要多卡」,再理解「并行策略怎么选」,最后决定「训练模式用同步还是异步」。每一步都有取舍,没有银弹。
一句话总结:分布式训练的本质,就是在「通信开销」和「计算效率」之间找平衡。数据并行适合小模型,模型并行解决大模型放不下的问题。同步训练保精度,异步训练提速度。选哪个,取决于你的模型大小、集群规模和业务容忍度。
想要更多资料,联系可可