一、多卡训练基础:分布式训练的核心概念

大家好,我是你们的老朋友。今天咱们聊聊多卡训练的基础知识。说实话,我刚入行那会儿,觉得单卡训练已经够用了,直到第一次遇到一个模型要跑两周……嗯,从那以后我就彻底投入了分布式训练的怀抱。

分布式训练,说白了就是把一个大的训练任务拆成多个小任务,让多张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 核心知识体系

下面这张图,是我自己总结的分布式训练知识框架。你看一眼,心里就有谱了。

多卡训练基础 并行策略 数据并行(Data Parallelism) 模型并行(Model Parallelism) 混合并行(Hybrid Parallelism) 训练模式 同步训练(Sync) 异步训练(Async) 混合同步(Hybrid Sync) 通信拓扑 环形(Ring) 树形(Tree) 全连接(All-to-All) 2D-Torus 核心目标:提升训练速度 + 保证模型质量 关键指标:吞吐量(samples/sec)、通信效率、显存利用率

1.5 实战中的选择建议

说了这么多理论,到底怎么选?我给大家一个简单的决策流程:

  1. 先看模型大小:单卡能装下吗?能→数据并行;不能→模型并行或混合并行。
  2. 再看卡的数量:≤32卡→同步训练;≥64卡→考虑异步或混合同步。
  3. 最后看硬件:有NVLink→全连接拓扑;普通网络→环形拓扑。

我的建议:刚开始做多卡训练,别追求花哨的方案。先用数据并行+同步训练+环形拓扑,这套组合最稳。等跑通了,再慢慢优化。我曾经见过一个团队,一上来就搞混合并行+异步训练,结果调了两个月还没收敛……

好了,这一章的内容就到这里。分布式训练的基础概念,说白了就是搞清楚「怎么分活」「怎么同步」「怎么通信」。这三件事想明白了,后面的调优才有方向。

想要更多资料,联系可可