GPU 并行策略详解:TP / PP / EP / SP
训练和推理大模型时,单卡显存和算力远远不够。本文系统梳理四种主流并行策略 —— Tensor Parallelism、Pipeline Parallelism、Expert Parallelism、Sequence Parallelism,关键机制配有可交互动画。
Tensor Parallelism (TP)
在单层内部切分权重矩阵,每张卡算一部分,再 AllReduce 合并结果。
Column Parallel:按列切分权重矩阵
把原始权重矩阵
- GPU 0 持有
- GPU 1 持有
每张卡用完整输入
交互动画:完整 MLP 层的 TP 计算流程(Megatron-LM 风格)
Megatron-LM 的精髓是 Column Parallel → GeLU(无通信)→ Row Parallel → AllReduce,整个 MLP 前向只需 1 次 AllReduce。下面动画逐步展示两张 GPU 上的完整计算流程:
**核心要点:**整个 MLP 前向只需 1 次 AllReduce!
**为什么:**Column Parallel 输出的
分别是完整结果的不同列。GeLU 是逐元素操作,不需要完整向量。Row Parallel 的输出 形状相同但值不同,加起来才是完整结果 → AllReduce 求和。 **对比朴素方案:**如果两个 Linear 都用 Column Parallel,中间需要 AllGather 拼接完整结果才能做第二次乘法。Megatron 的 Column→Row 组合巧妙地跳过了中间通信。
**典型配置:**TP = 8(单节点 8 卡 NVLink 900GB/s),每层 forward 1 次 AllReduce,backward 1 次 AllReduce。
Pipeline Parallelism (PP)
按层切分模型,每张卡(或一组卡)负责连续的几层,数据像流水线一样流过。
模型按层切分到 4 个 Stage
| Stage | GPU | 负责的层 |
|---|---|---|
| Stage 0 | GPU 0 | Layer 0-7 + Embedding |
| Stage 1 | GPU 1 | Layer 8-15 |
| Stage 2 | GPU 2 | Layer 16-23 |
| Stage 3 | GPU 3 | Layer 24-31 + LM Head |
交互动画:1F1B Pipeline Schedule
1F1B(One Forward One Backward)调度让每个 stage 在稳态时交替执行一个 forward 和一个 backward 微批,最大化 GPU 利用率。下面动画展示 4 个 GPU、4 个 micro-batch 的 forward / backward 流转(深色 = Forward,浅色 = Backward,空格 = Pipeline Bubble):
**核心要点:**PP 按层切,每个 stage 只存自己那几层的权重和激活,stage 间通过网络传激活值。
**通信量:**只传激活张量(比 AllReduce 小很多),可跨节点。
**缺点:**Pipeline bubble(GPU 空等),需要足够多 micro-batch 来填满流水线。
**典型配置:**PP = 4-16,跨节点通过 InfiniBand / RoCE 连接。
Expert Parallelism (EP)
MoE 模型专属:每个 Expert 放在不同 GPU 上,Router 决定 token 发给哪个 Expert。
交互动画:Token Dispatch(Router → Expert 路由过程)
下面动画展示 token 经过 Router 计算 gating score、通过 All-to-All 发到目标 Expert 的 GPU、计算后再发回的完整 dispatch 过程:
EP vs TP 在 MoE 层的对比
| 方案 | 切分方式 | 通信 | 负载 |
|---|---|---|---|
| TP=8(切每个 Expert 内部) | 每卡持有所有 Expert 的 1/8 | 每层 AllReduce(大) | 均衡(每卡算一样的量) |
| EP=8(每个 Expert 独占一卡) | 每卡持有 1 个完整 Expert | All-to-All(token dispatch) | 可能不均(热门 Expert 更忙) |
**核心要点:**EP 把不同 Expert 放在不同卡上,通过 All-to-All 通信交换 token。
**优势:**天然匹配 MoE 结构,每卡只需存一个 Expert 的权重和优化器状态。
**挑战:**All-to-All 通信量取决于 batch size 和 expert 数量;负载不均衡时部分卡空闲。
**典型配置:**EP = Expert 数量 或其因子(EP=8 for 8 experts)。
Sequence Parallelism (SP)
沿序列维度切分,TP 不能切的操作(LayerNorm、Dropout)由 SP 来分摊。
问题:TP 切不了 LayerNorm 和 Dropout
一个 Transformer Layer 内部的操作,可以分成两类:
- 可以 TP 切(按隐藏维度切分):Self-Attention、FFN / MLP
- 需要完整隐藏维度(TP 切不了):LayerNorm、Dropout + Residual
SP 的解法:在序列维度上切分这些操作
输入序列 [batch, seq_len, hidden_dim] 沿 seq_len 维度切给两张卡:
- GPU 0:前半序列(如前 4 个 token)→ 在本地做 LayerNorm / Dropout
- GPU 1:后半序列(如后 4 个 token)→ 在本地做 LayerNorm / Dropout
因为 LayerNorm / Dropout 都是沿 hidden 维度逐 token 独立的操作,按序列切分完全不影响正确性。
TP + SP 配合:完整的一层流程
1 | |
关键洞察:
**核心要点:**SP 不是独立的并行策略,是 TP 的配套补充。TP 切 Attention/FFN,SP 切 LayerNorm/Dropout。
**省了什么:**激活值显存。没有 SP 时,每张卡都要存完整序列的 LayerNorm 激活;有了 SP,每卡只存 seq_len/TP 的激活。
**通信开销:**用 AllGather + ReduceScatter 替代原来的 AllReduce,总量相同,但激活显存减少到 1/TP。
**典型配置:**SP = TP(永远跟 TP 一起开,Megatron-LM 默认行为)。
总结对比
| 策略 | 切分维度 | 通信类型 | 通信量 | 适用范围 | 典型值 |
|---|---|---|---|---|---|
| TP | Hidden dimension | AllReduce | 大(每层 2 次) | 节点内 NVLink | 2-8 |
| PP | Layer (depth) | P2P (激活) | 小(只传激活) | 跨节点 | 4-16 |
| EP | Expert index | All-to-All | 中(token dispatch) | MoE 层,跨节点 | 8-64 |
| SP | Sequence length | AllGather + ReduceScatter | = TP 通信量 | 配合 TP,节点内 | = TP |
1T MoE 模型:四种并行如何组合
1 | |
本文正文 markdown 渲染,3 个交互动画通过自定义 {% anim %} 标签以隔离 iframe 嵌入,源自 Arkive 教程。