一、分布式训练概述

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 并行策略 数据并行 模型并行 流水线并行 核心目标:用多机多卡的算力,解决单机解决不了的问题 本章聚焦:为什么需要分布式训练、核心挑战、框架对比

嗯,这张图把分布式训练的核心模块都串起来了。后面我们会逐一深入每个模块。记住,分布式训练不是银弹,选对框架、做好规划,才能发挥集群的真正实力。

我的建议:如果你是新手,先从PyTorch DDP入手,跑通一个简单的分布式训练流程。然后再尝试DeepSpeed,感受一下显存优化的威力。Megatron-LM可以等遇到超大模型时再研究。

想要更多资料,联系可可