Megatron-LM是NVIDIA开发的一个用于训练超大规模Transformer模型的框架。它通过组合三种并行技术(数据并行DP、张量并行TP、流水线并行PP)实现了高效的3D并行策略。对于希望配置和优化LLM训练的用户来说,理解TP和PP的精确切分边界至关重要。
1. Megatron的3D并行网格
Megatron将所有可用的GPU组织成一个逻辑上的三维网格,每个维度对应一种并行策略。假设我们有N个GPU,我们定义三个并行维度的大小:
- $P_{dp}$ (数据并行度)
- $P_{tp}$ (张量并行度)
- $P_{pp}$ (流水线并行度)
要求 $P_{dp} \times P_{tp} \times P_{pp} = N$。
这种并行网格决定了通信组(Communication Groups)的划分,即哪些GPU需要在训练过程中互相通信。
2. 手绘拓扑图:模型结构的堆叠
想象一个大型Transformer模型是一个垂直堆叠的结构,每一层(Layer)都是一个Transformer Block。我们的手绘拓扑图可以从这个垂直堆叠开始。
张量并行(TP):在层内切分
TP的切分边界在Transformer层的内部。
张量并行关注如何将单个巨大的权重矩阵(例如,注意力机制中的QKV矩阵或前馈网络FFN中的权重矩阵)切分到$P_{tp}$个设备上。它的核心目标是减少单个GPU所需的内存,通过矩阵分块运算来实现。
切分点分析:
- 注意力模块的投影矩阵 (QKV): 权重矩阵通常按列切分(Column Parallel)。计算结果需要进行一次 All-Gather 或 All-Reduce 来聚合完整的输出。
- 前馈网络 (FFN) 的中间层: 第一个线性层按列切分,第二个线性层按行切分(Row Parallel)。
绘制 TP 切分: 在手绘图中,你可以画出一个Transformer Block的矩形。TP的边界是穿过这个矩形内部的垂直或水平线(取决于切分方向),将矩阵分成小块。
流水线并行(PP):在层间切分
PP的切分边界在Transformer层与层之间。
流水线并行关注如何将模型的顺序结构(即不同Transformer层)分配到$P_{pp}$个设备组上。每个设备组只负责模型的一部分连续层。
切分点分析:
假设模型有L层,流水线并行度为$P_{pp}$。每$L/P_{pp}$层构成一个流水线阶段(Stage)。
- Stage 1: Layers 1 到 $L/P_{pp}$
- Stage 2: Layers $(L/P_{pp}) + 1$ 到 $2L/P_{pp}$
- …
绘制 PP 切分: 在手绘图中,你需要画出垂直堆叠的Transformer Block。PP的边界是横向切过相邻Transformer Block之间的空间。这些边界代表了需要进行激活值(Activation)或梯度(Gradient)传输的通信点。
3. 实际切分边界的可视化总结
| 特征 | 张量并行 (TP) | 流水线并行 (PP) |
|---|---|---|
| 切分位置 | 层内 (矩阵运算内部) | 层间 (连续的Transformer Block之间) |
| 目的 | 减少权重矩阵和激活值的显存占用 | 允许使用更大的模型,提高GPU利用率 |
| 通信操作 | All-Reduce, All-Gather (高带宽需求) | Send / Recv (带宽要求相对低,但延迟敏感) |
4. 示例配置(伪代码)
虽然我们无法直接在文本中运行Megatron,但我们可以通过配置参数来展示如何定义这些边界,从而控制拓扑结构。
# 假设总共有32个GPU
# N = 32
# 场景 1: 重TP,轻PP,不使用DP
# 适用于单节点内多卡(或高速互联)训练超大单层模型
PP_SIZE=2 # 切分点数量少,模型切成2段
TP_SIZE=16 # 矩阵被切分成16份
DP_SIZE=1 # 不使用数据并行
# 场景 2: 重PP,轻TP
# 适用于跨节点训练(节点间带宽低,节点内带宽高)
PP_SIZE=8 # 模型被切分成8段
TP_SIZE=4 # 矩阵被切分成4份
DP_SIZE=1
# Megatron-LM 启动配置示例
# 假设使用PyTorch DDP/NCCL后端
run_megatron.sh \
--num-gpus 32 \
--model-parallel-size ${TP_SIZE} \
--pipeline-model-parallel-size ${PP_SIZE} \
--data-parallel-size ${DP_SIZE} \
--micro-batch-size 8 \
--global-batch-size 1024
在这个配置中,pipeline-model-parallel-size 决定了你在模型层间有多少个切分点($P_{pp}-1$个),而 model-parallel-size 决定了在每一个Transformer Layer内部,矩阵被切分了多少次。
汤不热吧