在 GPU 大模型(LLM)分布式训练与推理中,单个模型的参数量和中间激活值(Activation)往往远超单张显卡的显存容量(如 H100 的 80GB)。为了将百亿、千亿甚至万亿参数的模型放进集群,张量并行(Tensor Parallelism, TP)和流水线并行(Pipeline Parallelism, PP)是最核心的两种模型并行(Model Parallelism)方案。
一图看懂两者的拆分维度
两者最本质的区别在于切分模型的维度不同:
- TP(张量并行):横着切(层内拆分)。将模型中单个 Transformer 算子/矩阵乘法拆分到多卡上共同计算。
- PP(流水线并行):竖着切(层间拆分)。按网络层(Layers)将模型切分为多个阶段(Stages),不同卡负责不同的层。
[ Original Model ] ┌──────────────────┐ │ Layer 3 (Layers) │ ───────┐ ├──────────────────┤ │ │ Layer 2 (Layers) │ ├─ PP:按层切分到不同节点/卡 ├──────────────────┤ │ │ Layer 1 (Layers) │ ───────┘ └──────────────────┘ ▲ ▲ ▲ ▲ │ │ │ │ └─── TP ───┘ (TP:在同一层内部,按矩阵维度拆分到多卡)1. 张量并行(Tensor Parallelism, TP)
核心原理
TP 作用于 Transformer 内部的矩阵乘法(如 Self-Attention 的QKVQKVQKV投影以及 MLP 层)。以 Megatron-LM 的设计为例:
- Column Parallel MLP(列并行):
- 输入XXX复制发往所有卡。
- 权重矩阵WWW按列切分到NNN张卡(W=[W1∣W2]W = [W_1 \vert{} W_2]W=[W1∣W2])。
- 每张卡计算Yi=X⋅WiY_i = X \cdot W_iYi=X⋅Wi,最后将结果拼接。
- Row Parallel MLP(行并行):
- 输入XXX本身在每张卡上已经是切分好的(X=[X1∣X2]X = [X_1 \vert{} X_2]X=[X1∣X2])。
- 权重矩阵WWW按行切分(W=[W1W2]W = \begin{bmatrix} W_1 \\ W_2 \end{bmatrix}W=[W1W2])。
- 每张卡计算Yi=Xi⋅WiY_i = X_i \cdot W_iYi=Xi⋅Wi,最后通过All-Reduce将各卡结果相加得到最终输出YYY。
典型组合:MLP 层通常采用“列并行 + 行并行”的组合,这样整个 MLP 块只需要在末尾进行一次 All-Reduce即可完成同步。
特点与开销
- 通信频率极高:每一个 Transformer Layer 的前向和反向传播都需要进行多次跨卡通信(All-Reduce / All-Gather)。
- 硬件要求极高:由于通信频繁,TP通常限制在单个节点(Node)内部的 NVLink / NVSwitch 高带宽互联网络下使用。越界到跨节点 PCIe/以太网,通信会迅速成为严重瓶颈。
- 气泡(Bubble):几乎无计算气泡,显存与计算负载极其均匀。
2. 流水线并行(Pipeline Parallelism, PP)
核心原理
当模型层数极多(例如 80 层 Transformer),单个节点的卡数不足以承载 TP 时,就需要用到 PP:
- 分块:把 80 层模型平均切分成 4 个 Stage(每个 Stage 20 层),放置在 4 台机器上。
- 传递:Stage 1 计算完第 1~20 层后,将输出激活值(Activation)通过网络发送给 Stage 2;Stage 2 接着算 21~40 层,以此类推。
流水线气泡(Bubble)与调度算法
如果直接串行执行(100% 顺序等待),同一时刻只有一台机器在工作,GPU 利用率极低。为了解决这个问题,PP 引入了Micro-batch(微批次)调度策略:
把一个 Large Batch 拆分成多个 Micro-batches,让不同 Stage 形成流水线并发:
- 1F1B(One Forward, One Backward):在流水线建立(Warmup)阶段后,每完成一次前向计算(1 Forward),紧接着做一次反向计算(1 Backward)。这种调度能严格控制中间激活值的显存占用,是目前最常用的 PP 算法。
特点与开销
- 通信量小:节点间只需要传递 Stage 边界处的激活值张量(P2P 点对点通信),通信数据量远小于 TP 的 All-Reduce。
- 适合跨节点扩展:因为 P2P 通信量小,PP 非常适合用于跨节点(Inter-node)的集群扩展(通过 InfiniBand 或 RoCE 互联)。
- 存在流水线气泡(Pipeline Bubble):在流水线刚开始和结束阶段,部分 Stage 会处于等待状态(闲置)。Micro-batch 拆得越细,气泡占比越小,但显存开销和调度复杂度会增加。
TP 与 PP 对比总结
| 比较维度 | 张量并行(Tensor Parallelism, TP) | 流水线并行(Pipeline Parallelism, PP) |
|---|---|---|
| 拆分粒度 | 算子/矩阵层级(单个 Layer 内部) | 网络层级(多个 Sequential Layers) |
| 通信模式 | 集合通信(All-Reduce / All-Gather) | 点对点通信(P2P Activation Forwarding) |
| 通信频次与带宽要求 | 极高(每层都需通信,需 NVLink) | 较低(仅 Stage 边界通信,可走 RDMA) |
| 物理物理物理部署建议 | 单节点内部(Intra-node, 4/8 卡) | 跨节点之间(Inter-node) |
| 负载均衡与气泡 | 负载高度均衡,无流水线气泡 | 存在流水线气泡(依靠 1F1B 等算法优化) |
| 主要显存节省点 | 均匀切分权重(Weights)与梯度 | 按层切分权重与激活值 |
生产环境中的典型组合(3D Parallelism)
在实际的大模型训练(如 Megatron-DeepSpeed)中,TP 和 PP 通常不会孤立使用,而是与数据并行(DP / Zero-DP)结合构成3D 并行系统:
Total GPUs=TP Size×PP Size×DP Size\text{Total GPUs} = \text{TP Size} \times \text{PP Size} \times \text{DP Size}Total GPUs=TP Size×PP Size×DP Size
- 节点内(Intra-node):采用TP(8 卡 NVLink 充分发挥高带宽优势)。
- 跨节点(Inter-node):采用PP(降低跨机网卡的通信瓶颈)。
- 集群规模扩展:外层采用DP / ZeRO(扩展样本吞吐量)。