Megatron-LM是由NVIDIA开发的一套用于训练超大规模语言模型的框架。随着模型参数量突破万亿级别,任何单一的并行技术都难以高效地在有限的硬件资源上完成训练。Megatron-LM通过巧妙地结合三种主要的并行策略——张量并行(Tensor Parallelism, TP)、流水线并行(Pipeline Parallelism, PP)和数据并行(Data Parallelism, DP),构建了高效的3D并行训练方案。
理解Megatron-LM的核心在于理解这三种并行技术在训练过程中的具体角色分配。
1. 张量并行(TP):层内并行化(Intra-Layer Parallelism)
张量并行是Megatron-LM最独特且核心的优化点,它旨在解决单个Transformer层内权重矩阵过大的问题。
角色分配:
TP将一个Transformer层内部的权重矩阵(例如,注意力机制中的$W_Q, W_K, W_V$或前馈网络中的$W_{ffn}$)进行分割,并将这些分割后的块分布到TP组中的不同GPU上。
- 行分割(Row Split): 通常用于输入维度(隐藏层维度)上的分割,例如在前馈层的第二个线性层或注意力输出投影层。这要求在进行矩阵乘法之前,需要对输入激活进行All-Gather或对结果进行All-Reduce操作。
- 列分割(Column Split): 通常用于输出维度上的分割,例如在前馈层的第一个线性层或QKV矩阵。这使得每个GPU独立计算,但在层结束时需要进行通信。
通过TP,单个GPU不再需要存储完整的权重矩阵,从而大幅减少了单个设备上的内存占用,使得单个层可以适应更大的隐藏层维度。
2. 流水线并行(PP):层间并行化(Inter-Layer Parallelism)
流水线并行旨在解决模型层数过多,整个模型无法装入单个TP组的总内存中的问题。
角色分配:
PP将模型的连续层分割成若干个阶段(Stages),每个阶段分配给一个PP组(可能包含多个TP组)。
- 阶段分配: 例如,一个100层的模型可以被分成4个阶段,每个阶段包含25层。
- 通信机制: 数据在不同的PP阶段间流动。为了提高GPU利用率,Megatron-LM采用微批次(Micro-Batching)技术,将一个大批次(Global Batch)切分为多个微批次(MBS),利用GPU空闲时间进行前向和后向传播,形成流水线,从而减少“气泡(Bubble)”时间。
PP确保了整个模型结构可以被容纳,是训练极深模型的关键。
3. 数据并行(DP):跨模型复制并行化
数据并行是最传统的并行方法,旨在增加训练吞吐量和提高有效批次大小。
角色分配:
DP将模型的完整(TP和PP后的)副本分布到不同的DP组中,每个DP组处理不同的输入数据切片。
- 数据分配: 每个DP组接收不同的数据样本。
- 同步机制: 在反向传播结束后,所有DP组必须使用All-Reduce操作来同步和平均它们的梯度,确保所有模型副本保持相同的权重。
DP主要负责加速训练过程并增加有效批次大小。
4. 3D 并行中的角色整合
在Megatron-LM的3D并行架构中,总的GPU数量 $G$ 被分解为三个维度的乘积:
$$ G = N_{dp} \times N_{pp} \times N_{tp} $$
角色分配总结:
| 并行维度 | 关注点 | 目标 | 通信频率 | 依赖关系 |
|---|---|---|---|---|
| TP ($N_{tp}$) | 矩阵切分(层内) | 减少权重内存占用 | 较高(每次矩阵乘法) | 组内同步 |
| PP ($N_{pp}$) | 层切分(层间) | 容纳完整模型 | 中等(每次微批次) | 跨组异步/同步 |
| DP ($N_{dp}$) | 数据切分(模型复制) | 增加吞吐量和批次大小 | 较低(每次迭代的梯度同步) | 跨组同步 |
实用配置示例
假设我们有128块GPU,我们希望训练一个极大的模型,我们可以配置 $N_{dp}=8, N_{pp}=4, N_{tp}=4$ (即 $8 \times 4 \times 4 = 128$)。配置示例如下:
# 运行 Megatron-LM 启动脚本
# 配置 8 个数据并行组,4 个流水线并行阶段,4 个张量并行切片
python pretrain_gpt.py \
--num-layers 72 \
--hidden-size 10240 \
--tensor-model-parallel-size 4 \
--pipeline-model-parallel-size 4 \
--micro-batch-size 8 \
--global-batch-size 256 \
--num-workers 128
# 注意:DP组的大小 (8) 是由总worker数和 TP/PP 大小隐式决定的 (128 / (4*4))
在这个配置中:
1. TP (4): 每个Transformer层被切分成4块,分布在4个GPU上。
2. PP (4): 72层模型被切分成4个阶段,每个阶段约18层,分布在4个TP组上。
3. DP (8): 存在8个完全独立的模型副本,每个副本由 $4 \times 4 = 16$ 块GPU构成,它们独立处理数据,并在迭代结束时同步梯度。
通过这种分工,Megatron-LM高效地解决了超大规模模型训练中遇到的内存瓶颈和计算效率问题。
汤不热吧