一、多卡训练基础:分布式训练的核心概念
大家好,我是你们的老朋友。今天咱们聊聊多卡训练的基础知识。说实话,我刚入行那会儿,觉得单卡训练已经够用了,直到第一次遇到一个模型要跑两周……嗯,从那以后我就彻底投入了分布式训练的怀抱。
分布式训练,说白了就是把一个大的训练任务拆成多个小任务,让多张GPU同时干活。你想想看,一张卡要跑10天,十张卡理论上1天就能跑完——当然,实际没这么理想,但方向是对的。
1.1 数据并行 vs 模型并行
这两个概念,我经常在面试里问候选人。很多人能背出定义,但真到实战就懵了。
数据并行:每张卡都存一份完整的模型副本,只把数据切分。比如你有4张卡,一个batch 64条数据,每张卡分16条。各自算完梯度后,再同步更新模型参数。
模型并行:模型太大,一张卡装不下。比如GPT-3有1750亿参数,单卡显存根本hold不住。那就把模型切成几块,每张卡负责一部分。
我的经验之谈:数据并行是日常最常用的方案。模型并行一般只在模型超大时才用。我在项目中遇到过一位同事,模型明明能塞进单卡,非要用模型并行,结果通信开销比计算还大,反而更慢了。
还有一种叫混合并行,就是数据并行+模型并行一起上。大厂训练千亿参数模型基本都是这套路。
1.2 同步训练 vs 异步训练
这个选择,直接影响你的训练速度和模型质量。
| 对比项 | 同步训练 | 异步训练 |
|---|---|---|
| 梯度更新方式 | 所有卡算完再统一更新 | 各卡算完各自更新 |
| 训练速度 | 受最慢的卡拖累 | 快,无等待 |
| 模型收敛 | 稳定,梯度一致 | 可能有梯度滞后问题 |
| 适用场景 | 小规模集群(≤32卡) | 大规模集群(≥64卡) |
我个人习惯,在32卡以内用同步训练。为什么?因为稳定。我曾经在64卡上试过异步训练,结果模型loss像过山车一样,调了半天学习率才稳住。后来我学乖了——小规模同步,大规模才考虑异步。
小技巧:如果你非要用异步训练,建议把学习率调小一点,或者用梯度裁剪。我一般会把学习率降到同步训练的0.7~0.8倍。
1.3 通信拓扑结构
多卡之间怎么通信?这可不是随便连的。常见的拓扑结构有这几种:
- 环形(Ring):每张卡只和相邻的两张卡通信。数据像接力棒一样传一圈。NCCL的Ring AllReduce就是典型。
- 树形(Tree):像二叉树一样,父节点汇总子节点的数据。适合广播操作。
- 全连接(All-to-All):每张卡和所有卡都通信。速度快但带宽消耗大。
- 2D-Torus:二维网格结构,常用于TPU集群。
你想想看,8张卡用全连接,每张卡要发7次、收7次,总共56次通信。如果用环形,每张卡只发2次、收2次,总共16次。差距很明显吧?
注意:通信拓扑的选择要结合硬件。NVLink连接的GPU可以用更高效的拓扑。如果是普通以太网,环形结构更稳妥。我曾经在InfiniBand集群上试过全连接,结果网络被打爆了……
1.4 核心知识体系
下面这张图,是我自己总结的分布式训练知识框架。你看一眼,心里就有谱了。
1.5 实战中的选择建议
说了这么多理论,到底怎么选?我给大家一个简单的决策流程:
- 先看模型大小:单卡能装下吗?能→数据并行;不能→模型并行或混合并行。
- 再看卡的数量:≤32卡→同步训练;≥64卡→考虑异步或混合同步。
- 最后看硬件:有NVLink→全连接拓扑;普通网络→环形拓扑。
我的建议:刚开始做多卡训练,别追求花哨的方案。先用数据并行+同步训练+环形拓扑,这套组合最稳。等跑通了,再慢慢优化。我曾经见过一个团队,一上来就搞混合并行+异步训练,结果调了两个月还没收敛……
好了,这一章的内容就到这里。分布式训练的基础概念,说白了就是搞清楚「怎么分活」「怎么同步」「怎么通信」。这三件事想明白了,后面的调优才有方向。
想要更多资料,联系可可