小白也能看懂的分布式训练:几千张显卡怎么一起训练一个大模型
引言:一张卡根本放不下
先来看一组让人头大的数字:
-
一个 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集群
更多推荐

所有评论(0)