一、整体思路
大模型训练面临的核心矛盾是:单卡显存装不下模型,单卡算力也跑不动训练。
三种并行策略分别从不同维度拆解这个矛盾:
| 并行方式 |
主要解决什么 |
切分对象 |
通信特点 |
| 数据并行 DP |
吞吐不够、单卡 batch 太小 |
数据 |
梯度 All-Reduce |
| 张量并行 TP |
单层参数太大,单卡放不下 |
层内参数/矩阵 |
高频、高通信量 |
| 流水线并行 PP |
模型层数太多,单卡放不下 |
层间切分 |
点对点激活传输 |
实际训练中,三者通常不是二选一,而是组合使用,也就是常说的 3D 并行。
二、数据并行(Data Parallelism)
1、解决什么问题
数据并行解决的是:
- 单卡算力有限,训练吞吐不够;
- 单卡 batch size 太小,梯度噪声大、训练不稳定;
- 希望利用多张卡同时处理不同数据,提高整体吞吐。
它的基本思想是:每张卡上放一份完整模型,但每张卡处理不同的数据 batch。
2、工作流程
假设有 $N$ 张 GPU:
- 1、每张 GPU 复制一份完整模型参数;
- 2、将全局 batch 切成 $N$ 份,每张卡拿一份;
- 3、每张卡独立前向、反向,计算本地梯度;
- 4、对所有卡的梯度做 All-Reduce,求平均或求和;
- 5、每张卡用相同的平均梯度更新参数,保持参数一致。
3、优点
- 实现简单,PyTorch 的
DistributedDataParallel 就是典型代表;
- 扩展性好,增加卡数通常能提升吞吐;
- 对模型结构无侵入。
4、缺点
- 每张卡都要存一份完整模型参数、梯度、优化器状态,显存冗余严重;
- 当模型大到单卡放不下时,纯 DP 直接失效;
- 梯度 All-Reduce 通信量大,尤其是大模型参数量巨大时。
5、适用场景
- 模型能单卡放下;
- 主要瓶颈是吞吐,而不是显存;
- 中小模型训练,或大模型训练中作为最外层并行维度。
6、补充:ZeRO 与 DP 的关系
ZeRO 可以看作是对数据并行的显存优化:
- ZeRO-1:切分优化器状态;
- ZeRO-2:再切分梯度;
- ZeRO-3:再切分模型参数。
所以 ZeRO 本质上仍属于数据并行范畴,但通过切分冗余状态,让 DP 能支撑更大的模型。
三、张量并行(Tensor Parallelism)
1、解决什么问题
张量并行解决的是:
- 单层参数太大,单卡显存放不下;
- 单个矩阵乘法规模太大,单卡算不动。
它的基本思想是:把一层内部的参数矩阵切分到多张卡上,共同完成这一层的计算。
2、典型切分方式
以 Transformer 的线性层为例,假设权重矩阵为 $W$,有两种常见切分:
(1)按列切分
$$
Y = XW
$$
将 $W$ 按列切成 $W_1, W_2$,分别放在两张卡上:
$$
Y_1 = XW_1,\quad Y_2 = XW_2
$$
两张卡各自计算一部分输出,最后拼接:
$$
Y = [Y_1, Y_2]
$$
(2)按行切分
将 $W$ 按行切分:
$$
Y = X_1W_1 + X_2W_2
$$
每张卡拿到部分输入和部分权重,计算部分结果后做 All-Reduce 求和。
3、在 Transformer 中的应用
Megatron-LM 是典型代表:
- Self-Attention:Q、K、V 的投影矩阵按列切分,输出投影按行切分;
- MLP:第一个线性层按列切分,第二个线性层按行切分;
- 这样中间只需要在特定位置做 All-Reduce 或 All-Gather。
4、优点
- 能显著降低单卡参数显存;
- 单层计算被拆分,计算并行度高;
- 适合单层特别大的模型。
5、缺点
- 通信非常频繁,几乎每层都要通信;
- 对网络带宽和延迟要求极高,通常只在 NVLink/NVSwitch 同一节点内使用;
- 实现复杂,需要深入修改模型结构;
- 张量并行度过高时,通信开销会吃掉计算收益。
6、适用场景
- 单层参数极大,单卡放不下;
- 同一节点内多卡,且卡间带宽很高;
- 常与流水线并行、数据并行组合。
四、流水线并行(Pipeline Parallelism)
1、解决什么问题
流水线并行解决的是:
- 模型层数太多,整体放不下一张卡;
- 希望按层切分模型,让不同卡负责不同层。
它的基本思想是:把模型按层切成多个 stage,每个 stage 放在不同 GPU 上,数据像流水线一样依次经过各 stage。
2、工作流程
假设模型有 24 层,4 张卡:
- GPU 0:第 1–6 层;
- GPU 1:第 7–12 层;
- GPU 2:第 13–18 层;
- GPU 3:第 19–24 层。
一个 batch 进入 GPU 0,算完后把激活传给 GPU 1,依次往后传。
3、核心问题:流水线气泡
如果一次只处理一个 micro-batch,那么同一时刻只有一张卡在计算,其他卡在等待,利用率极低。
解决办法是 micro-batch 流水线:
- 把一个 batch 切成多个 micro-batch;
- 让不同 micro-batch 在不同 stage 上重叠执行;
- 例如 GPipe、PipeDream、1F1B 调度等。
但即使如此,仍然存在 流水线气泡:
- 填充阶段:前面 stage 在工作,后面 stage 空闲;
- 排空阶段:后面 stage 在工作,前面 stage 空闲。
4、优点
- 能支持非常深的模型;
- 通信量相对张量并行小,只需传激活;
- 跨节点也能用,对带宽要求低于 TP。
5、缺点
- 存在流水线气泡,设备利用率下降;
- micro-batch 越多,气泡越小,但显存占用越高;
- 调度复杂,需要仔细设计 1F1B 等策略;
- 负载不均衡时,stage 划分需要仔细调优。
6、适用场景
- 模型层数极多,单卡放不下;
- 跨节点多机训练;
- 常与数据并行、张量并行组合。
五、实际训练中如何组合使用
实际大模型训练中,通常是 3D 并行:数据并行 DP × 流水线并行 PP × 张量并行 TP
1、典型组合方式
以 Megatron-LM + DeepSpeed 为例:
-
最内层:张量并行 TP
- 放在同一节点内,利用 NVLink 高带宽;
- 切分单层大矩阵。
-
中间层:流水线并行 PP
-
最外层:数据并行 DP
- 复制多份模型,提高吞吐;
- 配合 ZeRO 切分优化器状态、梯度、参数。
2、一个具体例子
假设有 64 张 GPU,可以这样配置:
- TP = 8:同一节点内 8 卡做张量并行;
- PP = 4:4 个 stage 跨节点流水线;
- DP = 2:再复制 2 份做数据并行。
总卡数:
$$
8 \times 4 \times 2 = 64
$$
3、选择原则
| 维度 |
优先解决 |
放在哪里 |
原因 |
| TP |
单层太大 |
节点内 |
通信频繁,需要高带宽 |
| PP |
层数太多 |
跨节点 |
通信较少,只需传激活 |
| DP |
吞吐不足 |
最外层 |
实现简单,扩展性好 |
4、实际中的权衡
- TP 太大:通信开销高,效率下降;
- PP 太大:流水线气泡多,利用率下降;
- DP 太大:梯度同步通信量大,但可用 ZeRO 缓解;
- 所以实际配置需要根据 模型大小、节点数、网络拓扑、显存容量 综合调优。
六、简单评价这道面试题
1、这道题的价值
这道题是一道非常典型的 大模型分布式训练入门必问题,优点是:
- 覆盖面广:一道题能考察 DP、TP、PP 三个核心概念;
- 区分度好:初级候选人可能只答出 DP,中级能说清 TP/PP,高级能讲清 3D 并行组合与权衡;
- 贴近实战:实际训练大模型时,确实需要组合使用这三种并行策略;
- 有延展性:可以继续追问 ZeRO、Megatron、流水线气泡、通信优化等。
2、这道题的不足
- 题目本身比较宽泛,如果候选人只背概念,容易答得泛泛;
- 没有具体场景约束,比如“多少卡、什么模型、什么网络拓扑”,导致答案可能不够聚焦;
- 对高级候选人来说,如果只答基本定义,深度不够,需要追问才能区分水平。
3、建议的追问方向
如果候选人答得不错,可以继续追问:
- 1、ZeRO 和 DP 是什么关系?ZeRO-3 为什么能进一步省显存?
- 2、TP 为什么通常只在节点内做?如果跨节点做 TP 会有什么问题?
- 3、PP 的流水线气泡怎么计算?1F1B 调度相比 GPipe 有什么改进?
- 4、如果 64 卡训练一个 70B 模型,你会怎么配置 TP/PP/DP?
- 5、如何判断当前训练是计算受限还是通信受限?
4、总体评价
这是一道 很好的中高级面试题,适合用来考察候选人对大模型训练系统的整体理解。但它更适合作为 开场题或框架题,真正区分水平还需要配合追问。如果候选人能把三种并行的原理、优缺点、组合方式和实际权衡都讲清楚,基本可以判断其具备大模型分布式训练的系统性认知。
评论专区
评论加载中...登录后即可发表评论