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卡的算力,多可惜。

知识体系总览

下面这张图总结了本章的核心内容。我习惯用这种图来梳理思路,一目了然。

多卡训练基础 - 知识体系 为什么需要多卡训练 模型太大,显存放不下 数据太多,训练太慢 时间就是金钱 常见并行策略 数据并行(DDP) 模型并行(切分模型) 流水线并行(微批次) 性能指标 吞吐量(samples/s) 加速比(多卡/单卡) 效率(加速比/卡数) 核心原则:根据模型大小和数据量选择合适的并行策略 模型能塞进单卡 → 数据并行 | 模型太大 → 模型/流水线并行

嗯,以上就是本章的全部内容。多卡训练的基础,说白了就是搞清楚「为什么做」「怎么做」「怎么衡量」。我个人觉得,理解这三个问题,比背一堆参数配置更重要。

想要更多资料,联系可可