一、分布式训练概述:为什么需要多卡训练?从单卡到多卡的演进,同步与异步的哲学
1.1 单卡训练的瓶颈——我踩过的第一个坑
先说说我自己的经历。几年前我接手一个BERT-large的微调任务,单张V100跑一个epoch要将近40个小时。调个学习率,等结果出来已经是第二天了。那时候我就在想:这哪是调参,分明是熬鹰。
单卡训练的瓶颈其实很直白:
- 显存墙:一张卡就那么多显存,模型大了装不下
- 算力墙:单卡算力再强,也有天花板
- 时间墙:一个实验跑几天,迭代速度太慢
你想想看,GPT-3有1750亿参数,单卡连参数都放不下,更别提训练了。所以多卡训练不是选择题,而是必答题。
核心结论:单卡训练的时代已经过去了。现在做深度学习,多卡分布式训练是基本功,不是加分项。
1.2 从单卡到多卡的演进——这条路我走了三年
分布式训练的演进,说白了就是三个阶段的跨越。
第一阶段:数据并行
这是最直观的思路。每张卡放一份完整的模型副本,把数据切分成多份,各算各的梯度,然后汇总更新参数。我在2018年第一次做多卡训练时用的就是这招。
但这里有个坑:通信开销。每张卡算完梯度后,需要把所有梯度同步到其他卡上。卡越多,通信量越大。我曾经在32卡上跑数据并行,结果通信时间比计算时间还长,你说气不气人?
第二阶段:模型并行
当模型大到一张卡放不下时,就得把模型切开了。比如Transformer有12层,可以前6层放卡0,后6层放卡1。前向传播时,卡0算完传给卡1,反向传播时反过来。
我个人习惯把模型并行分成两种:
- 层间并行:按层切分,简单但存在串行瓶颈
- 张量并行:把一层内部的矩阵运算拆开,更细粒度
我的经验:模型并行适合超大模型,但通信模式更复杂。如果你模型能塞进一张卡,优先用数据并行,别给自己找麻烦。
第三阶段:混合并行
现在的大模型训练,基本都是数据并行+模型并行+流水线并行的组合拳。比如用数据并行处理不同batch,用模型并行切分超大层,用流水线并行让不同卡同时处理不同阶段的计算。
嗯,这里要注意:混合并行的调度策略非常关键。我曾经在64卡集群上调试一个混合并行方案,光调通信拓扑就花了两周。
1.3 同步与异步的哲学——两种世界观
分布式训练的核心问题之一就是:各卡算完梯度后,怎么更新参数?
这就引出了同步和异步两种哲学。
同步训练:稳,但慢
同步训练的逻辑很简单:所有卡算完当前batch的梯度后,统一做一次AllReduce,拿到平均梯度,然后一起更新参数。大家步调一致,模型行为可复现。
但问题也很明显:木桶效应。只要有一张卡慢了,所有卡都得等它。我在实际项目中遇到过某台机器的散热有问题,导致计算速度比其他卡慢20%,结果整个集群都在等它。
| 特性 | 同步训练 | 异步训练 |
|---|---|---|
| 收敛稳定性 | 高,等价于单卡大batch | 低,梯度可能陈旧 |
| 训练速度 | 受最慢卡限制 | 不受卡间速度差异影响 |
| 实现复杂度 | 低,AllReduce即可 | 高,需要处理梯度延迟 |
| 适用场景 | 小规模集群(≤64卡) | 大规模集群(≥128卡) |
异步训练:快,但飘
异步训练的思路是:各卡算完梯度后,直接用自己的梯度更新参数,不用等别人。这样快的卡不用等慢的卡,整体吞吐量更高。
但这里有个致命问题:梯度陈旧性。卡A用第10步的梯度去更新参数时,参数可能已经被卡B用第11步的梯度更新过了。你想想看,这会导致梯度方向不一致,收敛不稳定。
我曾经在128卡集群上试过纯异步训练,loss曲线像心电图一样上下乱跳。后来加了梯度裁剪和动量修正,才勉强稳住。
避坑指南:我曾经天真地以为异步训练能白嫖加速比,结果模型不收敛,白白浪费了两周算力。现在我的原则是:能同步就别异步,除非你集群规模大到同步代价无法承受。
1.4 同步与异步的折中——半同步方案
现实世界不是非黑即白的。在实际工程中,我们经常用一些折中方案:
- 梯度累积:每张卡算多个batch的梯度,累积后再同步。相当于把同步频率降低,减少通信开销。
- 局部同步:把卡分成几个组,组内同步,组间异步。我习惯叫它「小同步大异步」。
- 异步边界同步:每隔K步强制同步一次,保证模型不会漂太远。
这些方案说白了就是在「稳」和「快」之间找平衡点。具体选哪个,取决于你的模型大小、集群规模、网络带宽。
1.5 本章知识体系总览
下面这张图是我自己总结的分布式训练知识体系,帮你理清脉络:
1.6 本章小结
这一章我们聊了三个核心问题:
- 为什么需要多卡训练——说白了就是单卡搞不定大模型
- 从单卡到多卡的演进——数据并行→模型并行→混合并行
- 同步与异步的哲学——稳和快的取舍,没有银弹
我个人觉得,理解这些基础概念比会调几个参数重要得多。因为后面的所有技巧——负载均衡、通信优化、梯度压缩——都是围绕这些核心问题展开的。
一句话总结:分布式训练的本质是用通信换算力,用复杂度换速度。你每多一张卡,就多了一份通信开销,也多了一份调试的烦恼。但如果你能驾驭它,回报是巨大的。