1、多卡训练基础:为什么需要多卡训练、常见的并行策略、性能指标
大家好,我是你们的老朋友。今天咱们聊聊多卡训练的基础。说实话,我刚入行那会儿,单卡跑个模型要等好几天,那叫一个煎熬。后来接触了多卡训练,才真正体会到什么叫「飞一般的感觉」。
你可能会问:单卡不够用吗?嗯,我举个例子。我去年训练一个百亿参数的推荐模型,单张A100跑一次要72小时。换成8卡并行,直接缩短到9小时。你说香不香?
为什么需要多卡训练
说白了,就三个原因:
- 模型太大:单卡显存放不下。比如GPT-3有1750亿参数,单张A100(80GB)连个零头都装不下。
- 数据太多:训练数据动辄TB级别,单卡处理太慢。
- 时间就是金钱:我见过一个团队,单卡训练要跑两周。后来改成8卡,两天搞定。研发迭代速度直接翻倍。
核心观点:多卡训练不是炫技,是刚需。当你的模型参数超过10亿,或者训练数据超过100GB,就该考虑多卡了。
常见的并行策略
这里我给大家梳理三种主流策略。每种我都踩过坑,咱们一个一个说。
1. 数据并行
这是最常用的方式。思路很简单:每张卡放一份完整的模型副本,然后把数据切分成多份,每张卡处理一份。
我习惯用PyTorch的DistributedDataParallel(DDP)。它比老版的DataParallel快很多,因为DDP只在反向传播时同步梯度,前向传播各卡独立跑。
# 伪代码示例
import torch.distributed as dist
from torch.nn.parallel import DistributedDataParallel as DDP
model = MyModel().to(device)
model = DDP(model)
# 每张卡只处理自己的数据
for data, label in dataloader:
output = model(data)
loss = criterion(output, label)
loss.backward()
optimizer.step()
我的经验:数据并行适合模型能塞进单卡显存的情况。如果模型太大,就得考虑模型并行或流水线并行。
2. 模型并行
模型并行就是把模型切分成多块,每张卡负责一部分。比如Transformer有12层,可以前6层放卡0,后6层放卡1。
我曾经在项目中遇到一个问题:模型并行时,卡与卡之间通信频繁,导致通信开销占比很高。后来我用了混合精度训练,把通信量减半,效果立竿见影。
避坑指南:模型并行要注意负载均衡。如果某张卡负责的层计算量特别大,其他卡就会空等。我建议用profiler先分析每层的计算时间,再合理切分。
3. 流水线并行
流水线并行是模型并行的升级版。它把模型分成多个阶段,每个阶段放在一张卡上。数据像流水线一样,依次经过各个阶段。
举个例子:模型有4层,分成4个阶段。卡0处理第1层,卡1处理第2层,以此类推。数据从卡0传到卡1,再到卡2、卡3。
这里有个关键点:流水线并行会有「气泡」问题。就是某张卡在等上一张卡的数据时,自己处于空闲状态。我常用的优化方法是「微批次」技术——把一个大batch拆成多个小batch,让流水线尽量填满。
# 流水线并行示意
# 假设模型分4个阶段,每个阶段一张卡
# 微批次数量为4
for micro_batch in range(4):
# 卡0处理第1个微批次
out0 = stage0(data[micro_batch])
# 卡1处理第2个微批次(同时卡0处理第3个)
out1 = stage1(out0)
# ... 依次类推
多卡训练的性能指标
怎么衡量多卡训练好不好?我一般看三个指标。
| 指标 | 定义 | 理想值 |
|---|---|---|
| 吞吐量 | 单位时间内处理的样本数(samples/s) | 越高越好 |
| 加速比 | 多卡训练速度 / 单卡训练速度 | 接近卡数(如8卡接近8倍) |
| 效率 | 加速比 / 卡数 × 100% | 接近100% |
举个例子:单卡每秒处理100个样本,8卡每秒处理700个样本。那么加速比是7倍,效率是7/8=87.5%。
实战经验:我见过很多团队,8卡训练效率只有60%。原因往往是通信瓶颈或负载不均。我的建议是:先用profiler定位瓶颈,再针对性优化。比如梯度压缩、异步通信、调整batch size等。
你想想看,如果效率只有60%,那8卡相当于只用了4.8卡。白白浪费了3.2卡的算力,多可惜。
知识体系总览
下面这张图总结了本章的核心内容。我习惯用这种图来梳理思路,一目了然。
嗯,以上就是本章的全部内容。多卡训练的基础,说白了就是搞清楚「为什么做」「怎么做」「怎么衡量」。我个人觉得,理解这三个问题,比背一堆参数配置更重要。
想要更多资料,联系可可