模型并行详解:张量并行、流水线并行与序列并行
说明:本篇为综述/无第一手实验数据,采用 Megatron-LM/公开大模型训练实践路线。
实验目标
单卡装不下大模型时,除了数据并行(09 章 DDP/FSDP),还有模型并行:张量并行把一层切到多卡、流水线并行把层按阶段分卡、序列并行把序列维度切分。本篇目标:讲清三种模型并行的原理(怎么切)→ 显存与通信权衡 → Megatron 实践 → 与数据并行组合的工程矩阵。读完能回答:什么场景用哪种并行、通信代价多大、怎么组合。
代码逐段拆解
第一段:张量并行——把一层切开
python
# 张量并行(Tensor Parallelism, TP):一层内的矩阵运算切到多卡
# 以 Linear 层为例(Megatron 列/行并行拆分):
# 列并行:W 按列切 W=[W1, W2],各卡算 Y_i = X·W_i,AllReduce 合并
# 行并行:W 按行切,各卡算部分和,AllReduce 累加
# 通信:每层一次 AllReduce(与层数成正比)
# 显存:每卡只存 1/TP 权重 + 1/TP 激活
def tp_linear(X, W, tp=8):
W_split = split_col(W, tp) # 各卡持有 1/8
Y_local = X @ W_split[rank] # 本地部分
Y = all_reduce(Y_local) # 层内通信一次
return Y要点:
- TP 是"层内切":矩阵运算切到多卡,各卡算部分结果后 AllReduce——通信量与层数成正比(每层都同步)。
- 显存收益直接:权重和激活都只有 1/TP——TP 主要解决"单层装不下"(超大 hidden size)。
- TP 通信最重:每层都 AllReduce,所以 TP 必须配高速互联(03 章),一般只在一节点内(8 卡 NVLink)使用。
第二段:流水线并行——按阶段分卡
python
# 流水线并行(Pipeline Parallelism, PP):层按阶段切,卡按阶段分配
# 模型层分成 PP 个阶段,阶段 i 的卡只算自己的层
# 数据按 micro-batch 流过流水线(1F1B 调度减少气泡)
# 通信:只在阶段边界传激活/梯度(低频,远小于 TP)
# 显存:每卡只存本阶段层的权重+激活(但激活有流水线暂存)
# 气泡代价:PP 越大气泡越大(调度不当)
def pp_forward(model, micro_batches, pp=4):
for mb in micro_batches:
out = stage[rank](mb) # 每卡只跑自己的阶段
send(out, rank+1) # 阶段间低频通信要点:
- PP 是"层间切":按层分阶段,各卡只存本阶段——解决"整模型装不下"而非"单层装不下"。
- 通信低频:只在阶段边界传数据,通信量远小于 TP——PP 对互联要求低(跨节点友好)。
- 代价是气泡:流水线启动/排空有气泡(空闲卡),1F1B 调度缓解但 PP 规模过大气泡上升——PP 太大收益递减。
原理讲解
三种并行对比(估算口径)
| 维度 | 张量并行 TP | 流水线并行 PP | 序列并行 SP |
|---|---|---|---|
| 切分方式 | 层内矩阵切 | 层按阶段切 | 序列维度切 |
| 解决什么 | 单层装不下 | 整模型装不下 | 长序列激活 |
| 通信 | 每层 AllReduce(重) | 阶段边界(轻) | 注意力区(中) |
| 互联要求 | 高(节点内) | 低(跨节点) | 中 |
| 显存收益 | 权重+激活 1/TP | 权重 1/PP | 激活 1/SP |
核心认知:三种并行解决不同问题——TP 治"层太大"、PP 治"模型太长"、SP 治"序列太长"(SP 与长上下文预训练 10 章衔接)。通信与显存收益是反比:TP 收益直接但通信重、PP 通信轻但有气泡、SP 只压激活。
组合矩阵:数据并行 × 模型并行(3D 并行)
大模型训练 = 数据并行(DP/FSDP)× TP × PP
DP 管"数据副本"(吞吐) → 显存友好(FSDP 分片)
TP 管"层内"(单层) → 节点内 8 卡
PP 管"层间"(整模型) → 跨节点
组合规则(经验):
TP 不出节点(NVLink 带宽);PP 跨节点(低频通信);
DP 最大化(并行度最高);显存不足再加深 TP/PP。组合判断:先 DP/FSDP 吃满数据并行,单层装不下加 TP(节点内),整模型装不下加 PP(跨节点)——按"先数据、再层内、再层间"的顺序加深并行(11 章 Megatron 实操衔接)。
实验结果
(估算口径,非实测;示意性趋势)
| 方案 | 可训练规模 | 通信压力 | 气泡 |
|---|---|---|---|
| DP/FSDP | 中(分片) | 低-中 | 无 |
| + TP(8) | 大(单层) | 高(节点内) | 无 |
| + PP | 更大(整模型) | 低(阶段间) | 有(可控) |
工程启示
- 先想清楚"哪装不下":单层大 → TP;整模型大 → PP;序列长 → SP——对症下药,别一上来 3D 并行。
- TP 不出节点:TP 每层 AllReduce,必须配节点内高速互联(03 章/01 章 NVLink),跨节点 TP 通信会失控。
- PP 通信轻但有气泡:阶段间低频通信适合跨节点;1F1B 调度控制气泡,PP 规模别过大。
- 组合按"先数据、再层内、再层间":DP/FSDP 打底 → TP 治层 → PP 治模型(11 章 Megatron 实操衔接)。
下一篇预告:模型并行讲完,预训练侧补最后一块——"后训练对齐:SFT/RLHF/DPO 的算力与工程"。