一、分布式训练基础:为什么需要多卡训练?
单卡瓶颈:你跑不动了
说实话,我刚开始做深度学习那会儿,一张V100就能搞定大部分模型。但现在?随便一个LLM都是百亿参数起步。单卡训练,说白了就是三个字——跑不动。
单卡的瓶颈主要卡在哪儿?我总结下来就三点:
- 显存墙:一张A100 80G,看着挺大对吧?但一个175B的模型,光参数就要350GB。你连模型都装不下,更别提训练了。
- 算力墙:单卡算力再强,也是有限的。我算过一笔账,用单卡A100训练GPT-3,大概需要...嗯,36年。你等得起吗?
- 带宽墙:数据从CPU搬到GPU,PCIe 4.0 x16也就32GB/s。跟GPU内部HBM的2TB/s比,差了俩数量级。数据搬运就成了瓶颈。
核心结论:单卡训练不是能不能跑的问题,是能不能在合理时间内跑完的问题。我见过太多团队,模型设计得挺好,结果训练时间比项目周期还长——这就尴尬了。
多卡优势:人多力量大
多卡训练的优势,你想想看,其实跟团队协作一个道理。一个人搬不动的大石头,十个人一起上,问题就解决了。
具体来说,多卡训练带来三个核心好处:
- 显存池化:8张A100就是640G显存,模型再大也能装下。我去年做的一个MoE模型,单卡根本放不下,8卡分布式训练才跑起来。
- 算力叠加:理论上,N张卡就是N倍的算力。当然实际会有通信开销,但线性加速比做到0.8以上是没问题的。
- 容错能力:单卡挂了,训练就停了。多卡训练可以加容错机制,某张卡出问题,其他卡还能继续。
我的经验:多卡训练不是简单的堆硬件。我曾经踩过一个坑——8卡训练比4卡还慢。后来发现是通信拓扑没配好,数据交换成了瓶颈。所以,多卡训练要讲究策略。
常见的并行策略概览
说到并行策略,很多新手容易混淆。我习惯把它们分成三类,说白了就是:数据怎么分、模型怎么分、计算怎么流水。
1. 数据并行(Data Parallelism)
这是最直观的策略。每张卡都存一份完整的模型,但只处理一部分数据。每轮训练完,各卡同步梯度。
- 优点:实现简单,PyTorch的DistributedDataParallel(DDP)几行代码就能搞定
- 缺点:模型太大时,单卡放不下就没办法了
- 适用场景:模型能塞进单卡,但数据量大、需要加速训练
# PyTorch DDP 示例
import torch.distributed as dist
from torch.nn.parallel import DistributedDataParallel as DDP
model = MyModel().to(rank)
ddp_model = DDP(model, device_ids=[rank])
# 训练循环照常,DDP自动处理梯度同步
2. 模型并行(Model Parallelism)
模型太大,一张卡放不下怎么办?那就把模型切开,每张卡放一部分。这就是模型并行。
- 优点:可以训练超大模型,突破单卡显存限制
- 缺点:卡间通信频繁,计算和通信难以重叠
- 适用场景:模型大到单卡放不下,比如175B的GPT-3
避坑指南:我曾经做过一个模型并行方案,把Transformer的每一层放在不同卡上。结果发现,前向传播时数据在卡间传来传去,大部分时间都花在通信上了。后来改用张量并行(Tensor Parallelism),把单层内的矩阵切分到多卡,通信量才降下来。
3. 流水线并行(Pipeline Parallelism)
模型并行有个问题——同一时刻只有一张卡在工作,其他卡都在等。流水线并行就是解决这个问题的。它把数据切成微批次(micro-batch),让不同卡同时处理不同微批次。
- 优点:提高设备利用率,减少空闲时间
- 缺点:存在流水线气泡(pipeline bubble),需要精心调度
- 适用场景:模型层数多,且每层计算量大
关键点:流水线并行的核心是减少气泡。我常用的技巧是——把微批次数量设为流水线深度的2-4倍,这样气泡占比能降到10%以下。
三种策略的对比
| 策略 | 核心思想 | 通信开销 | 显存需求 | 实现难度 |
|---|---|---|---|---|
| 数据并行 | 数据切分,模型复制 | 中等(梯度同步) | 高(每卡存完整模型) | 低 |
| 模型并行 | 模型切分,数据复制 | 高(层间通信) | 低(每卡存部分模型) | 中 |
| 流水线并行 | 模型切分 + 微批次调度 | 中(边界通信) | 低(每卡存部分模型) | 高 |
知识体系结构图
下面这张图,是我梳理的分布式训练知识体系。你可以看到,三种并行策略不是互斥的,实际训练中往往是组合使用。
我的建议:刚开始做多卡训练,别一上来就搞3D并行。先跑通数据并行,再逐步加模型并行和流水线并行。我见过太多人一上来就搞复杂方案,结果调试了两个月还没跑起来——得不偿失。
好了,这一章的内容就到这里。分布式训练的基础概念,说白了就是搞清楚「数据怎么分、模型怎么切、计算怎么流水」。后面我们会深入每个策略的细节,包括通信优化、显存管理、以及实际调参技巧。