1. 分布式训练基础

单卡瓶颈:你跑不动了

说实话,我刚开始做深度学习那会儿,一张V100就能搞定大部分模型。但现在?随便一个LLM都是百亿参数起步。单卡训练,说白了就是三个字——跑不动。

单卡的瓶颈主要卡在哪儿?我总结下来就三点:

  • 显存墙:一张A100 80G,看着挺大对吧?但一个175B的模型,光参数就要350GB。你连模型都装不下,更别提训练了。
  • 算力墙:单卡算力再强,也是有限的。我算过一笔账,用单卡A100训练GPT-3,大概需要...嗯,36年。你等得起吗?
  • 带宽墙:数据从CPU搬到GPU,PCIe 4.0 x16也就32GB/s。跟GPU内部HBM的2TB/s比,差了俩数量级。数据搬运就成了瓶颈。

核心结论:单卡训练不是能不能跑的问题,是能不能在合理时间内跑完的问题。我见过太多团队,模型设计得挺好,结果训练时间比项目周期还长——这就尴尬了。

多卡优势:人多力量大

多卡训练的优势,你想想看,其实跟团队协作一个道理。一个人搬不动的大石头,十个人一起上,问题就解决了。

具体来说,多卡训练带来三个核心好处:

  1. 显存池化:8张A100就是640G显存,模型再大也能装下。我去年做的一个MoE模型,单卡根本放不下,8卡分布式训练才跑起来。
  2. 算力叠加:理论上,N张卡就是N倍的算力。当然实际会有通信开销,但线性加速比做到0.8以上是没问题的。
  3. 容错能力:单卡挂了,训练就停了。多卡训练可以加容错机制,某张卡出问题,其他卡还能继续。

我的经验:多卡训练不是简单的堆硬件。我曾经踩过一个坑——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%以下。

三种策略的对比

策略 核心思想 通信开销 显存需求 实现难度
数据并行 数据切分,模型复制 中等(梯度同步) 高(每卡存完整模型) 低
模型并行 模型切分,数据复制 高(层间通信) 低(每卡存部分模型) 中
流水线并行 模型切分 + 微批次调度 中(边界通信) 低(每卡存部分模型) 高

知识体系结构图

下面这张图,是我梳理的分布式训练知识体系。你可以看到,三种并行策略不是互斥的,实际训练中往往是组合使用。

分布式训练并行策略体系 分布式训练 数据并行 模型并行 流水线并行 DDP FSDP DeepSpeed 张量并行 层并行 GPipe PipeDream 实际训练中的组合策略 数据并行 + 张量并行 + 流水线并行 = 3D并行 这是训练千亿参数大模型的标配方案

我的建议:刚开始做多卡训练,别一上来就搞3D并行。先跑通数据并行,再逐步加模型并行和流水线并行。我见过太多人一上来就搞复杂方案,结果调试了两个月还没跑起来——得不偿失。

好了,这一章的内容就到这里。分布式训练的基础概念,说白了就是搞清楚「数据怎么分、模型怎么切、计算怎么流水」。后面我们会深入每个策略的细节,包括通信优化、显存管理、以及实际调参技巧。