引言:一张卡根本放不下

先来看一组让人头大的数字:

  • 一个 7B(70 亿参数)的模型,光参数本身用 FP16 存储就要 14 GB 显存。

  • 一个 70B 的模型,参数量 140 GB,而一张 A100 才 80 GB 显存——一张卡根本放不下。

  • 训练时除了参数,还要存梯度、优化器状态,实际显存消耗是参数量的 3~4 倍。

  • 再加上激活值(中间计算结果),显存开销更是雪上加霜。

更现实的问题是:即使用 FP16 勉强塞进一张卡,训练数据动辄上万亿 token,一张卡跑完可能要几个月甚至几年。

所以,大模型训练必须用分布式训练——把任务拆给几十、几百甚至上千张 GPU 一起干。本文将用最通俗的方式,带你搞懂分布式训练的核心原理。


一、为什么需要分布式训练?

总结起来就三个词:模型太大、数据太多、时间太长。

挑战

说明

模型太大

70B 模型的参数 + 梯度 + 优化器状态轻松超过 500 GB,单卡放不下

数据太多

预训练数据通常是 1~3 万亿 token,单卡处理不完

时间太长

单卡训练 70B 模型可能需要 1 年以上,商业上不可接受

分布式训练的核心思想就是一个字:拆。拆数据、拆模型、或者两者都拆。


二、数据并行(Data Parallelism):每人做同一套卷子

类比理解

想象一个 100 人的班级要批改试卷。老师把班级分成 8 个小组,每组拿同一套试卷,各自独立批改。改完后,组长把各组的结果汇总,算出平均分,然后所有组统一更新"标准答案"。

这就是数据并行的思路:

  • 每张 GPU 都有完整的模型副本(每组都有完整的试卷和标准答案)。

  • 训练数据被切分成多份,每张卡处理一部分。

  • 每张卡算出梯度后,所有卡做一次"梯度同步",确保大家用相同的参数更新。

DDP 的基本原理

PyTorch 提供的 Distributed Data Parallel(DDP) 是数据并行的标准实现。它的核心流程只有三步:

1. 每张 GPU 拿到完整模型的一份拷贝
2. 各自用自己的那部分数据做前向和反向计算,得到梯度
3. All-Reduce 操作:所有 GPU 互相通信,把梯度加起来取平均
4. 每张 GPU 用平均梯度各自更新模型(因为起点和更新都一样,模型保持一致)

DDP 的优点是简单好用,加几行代码就能跑。但缺点是:每张卡都要存完整的模型,所以模型太大多卡也放不下。


三、模型并行(Model Parallelism):把模型拆开

当模型大到一张卡放不下时,就必须把模型本身拆开了。这里介绍两种主流拆法。

3.1 张量并行(Tensor Parallelism):切披萨

类比:一块超大披萨一个人烤不下,就把它切成 8 块,8 个人各烤一块,最后拼起来就是一整张披萨。

在技术层面,神经网络中的每一层本质上是一个大矩阵乘法。比如一个 [4096, 4096] 的权重矩阵,可以沿列或行切成多个小块,每张 GPU 只存一小块,各自做部分矩阵乘法,最后通过一次通信(All-Reduce 或 All-Gather)把结果拼起来。

单卡计算: Y = X × W (W 是 4096×4096 的矩阵)

张量并行(4卡):
  GPU0: Y0 = X × W0  (W0 是 4096×1024)
  GPU1: Y1 = X × W1  (W1 是 4096×1024)
  GPU2: Y2 = X × W2  (W2 是 4096×1024)
  GPU3: Y3 = X × W3  (W3 是 4096×1024)
  All-Gather 后拼接得到完整 Y

特点:张量并行的通信量很大,必须发生在每一层内部,所以通常只在同一台机器的 GPU 之间使用(机器内部用 NVLink,带宽很高)。

3.2 流水线并行(Pipeline Parallelism):工厂流水线

类比:工厂里生产一个产品需要经过 5 道工序,每道工序由不同的工人负责。产品从第一道工序开始,一道一道往后传,每个工人做完就传给下一个人。

在模型训练中,就是把 Transformer 的不同层分配给不同的 GPU。比如一个 80 层的模型,可以分给 8 张卡,每张卡负责 10 层:

GPU0: 第 1~10 层
GPU1: 第 11~20 层
GPU2: 第 21~30 层
...
GPU7: 第 71~80 层

数据从 GPU0 开始,逐层往后传递,像流水线一样。

一个关键问题:如果 GPU0 在算的时候,GPU1~7 都在干等着,那效率就太低了。解决方案是 Micro-batch(微批次)——把一个大 batch 拆成很多小 batch,像流水线一样依次"喂"进去,让尽可能多的 GPU 同时工作。

特点:流水线并行的通信发生在相邻两张卡之间,通信量相对较小,适合跨机器使用。


四、3D 并行:三种策略的组合

实际的大模型训练通常把三种并行策略组合在一起,称为 3D 并行:

3D 并行 = 数据并行 × 张量并行 × 流水线并行

举个真实的例子:训练一个 70B 模型,用 128 张 A100 GPU(8 台机器,每台 8 张卡)。

并行维度

配置

说明

张量并行(TP)

8 路

同一台机器的 8 张卡之间做张量并行

流水线并行(PP)

4 路

8 台机器中取 4 组做流水线

数据并行(DP)

4 路

剩余 4 组做数据并行

选择策略的一般原则:

  • 张量并行:优先在同一台机器内部使用(利用 NVLink 高带宽)。

  • 流水线并行:跨机器使用(通信量小,对带宽要求低)。

  • 数据并行:在最外层扩展,进一步提高吞吐量。


五、ZeRO 优化:合租公寓的智慧

数据并行有个问题:每张卡都存完整的模型和优化器状态,非常浪费显存。DeepSpeed 框架提出了 ZeRO(Zero Redundancy Optimizer) 来解决这个问题。

类比:合租公寓分担房租

想象 8 个人合租一套公寓,月租 8000 元:

  • 不用 ZeRO:每人手里都揣着 8000 元现金(每人存完整的模型状态),太浪费。

  • ZeRO-1:把优化器状态(相当于水电费账单)平均分给 8 个人,每人只存 1/8。

  • ZeRO-2:在 Stage 1 的基础上,梯度也每人只存 1/8。

  • ZeRO-3:在 Stage 2 的基础上,连模型参数也只存 1/8,需要用到时再从其他人那里"借"过来。

用表格表示:

ZeRO 阶段

切分内容

显存节省倍数(N 张卡)

Stage 1

优化器状态

~4 倍

Stage 2

优化器状态 + 梯度

~8 倍

Stage 3

优化器状态 + 梯度 + 参数

~N 倍(接近线性)

ZeRO-3 的代价是通信量增加(每次前向/反向都需要收集完整参数),但在实际工程中,通过巧妙的预取(Prefetch)策略,性能损失可以控制在可接受范围内。


六、主流分布式训练框架对比

目前大模型训练领域有三个主流框架:

特性

DeepSpeed

Megatron-LM

FSDP(PyTorch)

开发方

微软

NVIDIA

Meta / PyTorch 官方

核心特性

ZeRO 优化

张量并行 + 流水线并行

类似 ZeRO-3 的全分片

易用性

中等(需配置文件)

较低(代码侵入性较强)

高(PyTorch 原生)

模型规模

支持万亿级参数

支持千亿级参数

支持千亿级参数

灵活性

高(ZeRO 三档可选)

中等

中等

典型用户

很多开源项目

大厂预训练

PyTorch 生态用户

简单总结:如果你想快速上手,FSDP 最省事;如果想极致优化显存,DeepSpeed 的 ZeRO 是首选;如果做超大规模预训练,Megatron-LM 久经考验。实际项目中,很多时候会把它们组合使用(比如 Megatron-LM + DeepSpeed)。


七、实际案例:训练一个 7B 模型需要多少卡?

以 LLaMA-7B 为例,我们来算一笔账:

模型基本信息:

  • 参数量:70 亿

  • FP16 参数量:7B × 2 bytes = 14 GB

  • 训练时总显存(参数 + 梯度 + 优化器状态):约 14 × 4 = 56 GB(使用 AdamW 优化器)

方案一:单卡 A100-80GB + ZeRO-Offload

理论上可行(56 GB < 80 GB),但速度极慢,不推荐用于正式训练。

方案二:8 卡 A100-80GB + DDP

  • 每卡显存需求:~56 GB(每张卡有完整模型)

  • 80 GB 够用,但留给激活值和 batch 的空间不多

  • 预估训练时间:约 2~4 周(取决于数据量和 batch size)

方案三:8 卡 A100-80GB + ZeRO-2(推荐)

  • 优化器状态和梯度分片后,每卡显存需求大幅降低

  • 估算每卡约 20~25 GB,剩余空间可以放更大的 batch size

  • 预估训练时间:约 1~2 周

  • 这也是很多开源项目(如 Alpaca、Vicuna)微调 7B 模型的典型配置

方案四:64 卡 A100 + 3D 并行

  • 适合从头预训练,数据量在万亿 token 级别

  • 张量并行 8 路 + 数据并行 8 路

  • 预估训练时间:约 1~3 个月


八、总结

分布式训练是大模型训练的基础设施级技术,核心思路就是"拆":

策略

拆什么

适用场景

数据并行

拆数据

模型能放进单卡

张量并行

拆每一层

单层太大,同机器内

流水线并行

拆不同层

模型整体太大,跨机器

ZeRO

拆冗余状态

减少数据并行的显存浪费

实际工程中,通常是多种策略的组合。对于大多数开发者来说,DDP + ZeRO-2 已经能覆盖 7B~13B 模型的训练需求;如果你要训练更大的模型,就需要深入了解 3D 并行了。

下一篇我们将聊训练优化技巧——混合精度训练、梯度累积、FlashAttention 等让训练又快又稳的实用技术,敬请期待!


如果这篇文章对你有帮助,欢迎点赞、收藏、关注三连支持!你的支持是我持续创作的最大动力。 有任何问题也欢迎在评论区交流,我会尽量回复。


CSDN 标签:分布式训练、大模型训练、DeepSpeed、数据并行、模型并行、张量并行、流水线并行、ZeRO优化、Megatron-LM、FSDP、A100、GPU集群

更多推荐