一、分布式训练概述
1.1 为什么需要分布式训练
说实话,我刚入行那会儿,训练一个BERT模型用单卡跑了两周。结果调了个超参数,又得重来。那种感觉,就像你看着进度条一点一点往前爬,心里急得不行。
现在的大模型,参数动辄百亿千亿。单张GPU显存才多少?A100也就80GB。你想想看,一个1750亿参数的GPT-3,光存参数就要700GB。单卡根本装不下。
所以分布式训练不是「要不要」的问题,而是「怎么做得更好」的问题。核心驱动力就两个:
- 显存墙:模型太大,单卡放不下。我见过团队试图用模型并行硬塞,结果OOM报错,折腾了两天。
- 时间墙:单卡训练要几个月,业务等不起。分布式能把训练时间从月压缩到天。
核心观点:分布式训练的本质,是用多台机器的算力和显存,去解决单机解决不了的问题。不是炫技,是刚需。
1.2 核心挑战
分布式训练听着美好,落地全是坑。我踩过的、见过的,总结下来就三个大头。
通信瓶颈
这是最要命的。你想想,8张卡之间要同步梯度,每张卡算完自己的,得把结果告诉别人。数据量一大,通信就成了瓶颈。
举个例子,一个10亿参数的模型,梯度大小约4GB(float32)。8卡之间做AllReduce,一次通信就要传几十GB的数据。网络带宽再高也扛不住。
我的经验:我在项目中遇到过,把8台机器放在同一个机架里,用InfiniBand互联,通信延迟从毫秒级降到了微秒级。网络拓扑设计,真的不能省。
同步开销
同步训练里,每张卡算完一个batch,得等所有人算完才能更新参数。这就好比一群人搬砖,有人搬得快,有人搬得慢,快的得等慢的。
为什么会这样?因为数据分布不均匀,或者机器性能有差异。我见过一台机器因为散热问题降频,结果整个集群都在等它。
避坑指南:我曾经天真地以为所有机器性能都一样。直到有一次,一台机器的GPU因为温度过高自动降频,训练速度直接慢了30%。从那以后,我每次都会检查机器的硬件状态。
容错性
集群越大,出错的概率越高。1000张卡的集群,单卡故障率假设是0.1%,那每轮训练都有63%的概率至少有一张卡出问题。
说白了,分布式训练必须考虑「挂了怎么办」。是重新开始?还是从checkpoint恢复?我见过一个团队训练了三天,第四天机器挂了,结果发现没做checkpoint...嗯,那场面,项目经理脸都绿了。
1.3 主流框架对比
现在市面上主流的分布式框架,我基本都用过。给你说说我的真实感受。
| 特性 | PyTorch DDP | DeepSpeed | Megatron-LM |
|---|---|---|---|
| 易用性 | 高,几行代码搞定 | 中,需要配置 | 低,学习曲线陡 |
| 显存优化 | 基础 | ZeRO系列,很强 | 模型并行,专业 |
| 通信效率 | NCCL后端,不错 | 梯度压缩,更好 | 流水线并行,极致 |
| 适用场景 | 中小模型 | 大模型训练 | 超大模型训练 |
| 社区活跃度 | 最高 | 高 | 中 |
PyTorch DDP
我个人习惯,小规模实验先用DDP。它简单,几行代码就能跑起来。底层用NCCL做通信,效率不错。
但DDP有个问题:每张卡都要存一份完整的模型参数。模型一大,显存就爆了。我试过用DDP训练30亿参数的模型,8张A100,显存直接拉满。
# DDP 基本用法
import torch.distributed as dist
from torch.nn.parallel import DistributedDataParallel
model = MyModel()
model = DistributedDataParallel(model)
# 剩下的训练代码几乎不用改
DeepSpeed
DeepSpeed的ZeRO系列,说白了就是把模型参数、梯度、优化器状态分散到多张卡上。每张卡只存一部分,用的时候再通信取回来。
我特别喜欢ZeRO-3,它能把显存占用降到原来的1/N(N是卡数)。之前用DDP跑不动的模型,换DeepSpeed就能跑了。
个人经验:DeepSpeed的配置项很多,我建议从ZeRO-2开始试。ZeRO-3虽然省显存,但通信开销大,小模型反而更慢。
Megatron-LM
Megatron-LM是NVIDIA出的,专为超大模型设计。它用了模型并行和流水线并行,能把一个巨大的模型切到多张卡上。
说实话,这个框架学习成本高。我刚开始看它的代码,头都是大的。但如果你要训练千亿参数级别的模型,它几乎是唯一选择。
我记得有一次,团队要训练一个500亿参数的模型。用DeepSpeed跑,显存还是不够。最后切到Megatron-LM,用模型并行把Transformer的每一层切到4张卡上,终于跑起来了。
注意:Megatron-LM对代码侵入性强。你的模型结构得按它的方式来写。迁移成本不低,建议先做技术验证。
知识体系总览
下面这张图,是我梳理的分布式训练核心知识体系。你可以把它当个地图,后面每章都会对应到其中的一个模块。
嗯,这张图把分布式训练的核心模块都串起来了。后面我们会逐一深入每个模块。记住,分布式训练不是银弹,选对框架、做好规划,才能发挥集群的真正实力。
我的建议:如果你是新手,先从PyTorch DDP入手,跑通一个简单的分布式训练流程。然后再尝试DeepSpeed,感受一下显存优化的威力。Megatron-LM可以等遇到超大模型时再研究。
想要更多资料,联系可可