数据截至 (上游 commit e79cb4c1bae1)
Megatron-LM — 架构与原理
30 秒导读: Megatron-LM 是 NVIDIA 的大规模 Transformer 预训练框架,也是「张量并行、流水并行、序列并行」这些技术的策源地(2019 年论文的代码实体)。它回答的核心问题是:一个几百亿、几千亿参数的模型放不进一张 GPU,怎么把它沿不同维度切开摊到几千张卡上,还让通信开销尽量小。读懂它,就读懂了今天几乎所有大模型训练框架(包括 PyTorch 原生并行)的设计语汇。
1. 这是什么(零基础也能懂)
一句话定义
Megatron-LM 是一个给超大 Transformer 模型做预训练的框架:它把「模型的一层怎么切到多张卡上算」做成库(Megatron Core,megatron/core/),再配好一整套训练脚本(pretrain_gpt.py 等)告诉你怎么在几千张 GPU 上把 GPT 类模型从头训出来。
它要解决谁的什么问题
假设你有一块 80GB 显存的 H100,和一个 175B 参数的模型:
- 光参数(bf16)就要 350GB——一张卡连模型都装不下。
- 加上梯度(bf16 又是 350GB)和 Adam 优化器状态(fp32 主参数 + 两个动量,约 1400GB),单机想都别想。
- 就算装下了,单卡算一个 batch 要算到天荒地老。
于是必须回答:沿哪个维度切? 切参数?切层?切数据?切序列?Megatron 的历史贡献就是把「切法」系统化成几个正交维度,每个维度给出通信量上最优的切分点。今天是 所有「3D 并行」「5D 并行」说法的源头。
它能做什么
| 能力 | 具体支持 | 在哪 |
|---|---|---|
| 张量并行(TP) | 单层权重矩阵按列/行切到多卡 | megatron/core/tensor_parallel/layers.py |
| 流水并行(PP) | 层按段分到多卡,interleaved 1F1B 调度 | megatron/core/pipeline_parallel/schedules.py |
| 序列并行(SP) | LayerNorm/Dropout 处按序列维切激活 | megatron/core/tensor_parallel/mappings.py |
| 上下文并行(CP) | 长序列的 attention 按序列分片计算 | megatron/core/context_parallel/ |
| 专家并行(EP) | MoE 专家摊到多卡,All-to-All 调度 token | megatron/core/transformer/moe/ |
| 分布式优化器 | ZeRO 式优化器状态分片 | megatron/core/optimizer/distrib_optimizer.py |
| 混合精度 | FP16/BF16/FP8/FP4 | megatron/core/fp8_utils.py 等 |
| 模型 | GPT、T5、BERT、Mamba、混合架构、多模态 | megatron/core/models/ |
用起来什么样
最小形态是一个普通 torchrun 启动的脚本。核心心智模型从命令行参数就能读出来——五种并行各一个 size:
# 示意(基于 examples/gpt3/ 与 README 的真实用法精简)
torchrun --nproc_per_node 8 --nnodes 64 pretrain_gpt.py \
--tensor-model-parallel-size 8 \ # 一层切 8 份(节点内)
--pipeline-model-parallel-size 8 \ # 模型切 8 段(跨节点)
--num-layers 64 --hidden-size 8192 \
--num-experts 128 --moe-router-topk 8 # MoE 可选
库用法(不跑整套脚本)则是 examples/run_simple_mcore_train_loop.py:36 演示的样子:先 torch.distributed.init_process_group,再 parallel_state.initialize_model_parallel(tp_size, pp_size) 建立进程组网格,之后模型层的构造函数自动按这个网格切自己。
一句话直觉
把 Megatron 想成「一套切蛋糕的标准刀法」。 蛋糕是「参数 + 激活 + 优化器状态」三样东西,刀法有五种(TP/PP/DP/CP/EP),每把刀切的方向不同、产生的通信模式不同。框架的全部内容就是:每把刀怎么下刀(数学)、切完各块怎么拼回去(通信原语)、以及怎么保证多块拼起来的结果和没切时一模一样(正确性)。
2. 顶层全景(它大概怎么转)
2.1 代码的两个世界
仓库分两层,定位完全不同:
megatron/core/— 可组合的库:并行原语、Transformer 积木、优化器。框架开发者拿它搭自己的训练系统(NVIDIA 自家的 NeMo、外面无数框架都建立其上)。megatron/training/+pretrain_gpt.py— 参考训练脚本:用 core 组装出完整预训练流程,是「标准用法」的活教材。
本系列六章几乎全在 core 里打转——那里是并行机制本体。
2.2 顶层部件图
一个训练 step 里各部件的关系(从左到右是数据流方向):
┌─────────────────────────────────────────────┐
pretrain_gpt.py │ pretrain() 训练主循环 │
(入口脚本) ───►│ megatron/training/training.py:1500 │
│ │
│ train_step (training.py:3010) │
│ │ │
│ ▼ │
│ forward_backward_func ←── 三选一调度器 │
│ (pipeline_parallel/schedules.py:53) │
│ │ │
└────┼────────────────────────────────────────┘
▼
┌───────────────────────────────┐
│ GPTModel 前向 (一个 PP 段) │
│ embedding → N×TransformerLayer│
│ → output_layer → CE loss │
└───────┬───────────────┬───────┘
│ │
┌─────────▼────┐ ┌──────▼─────────┐
│ TP 原语 │ │ MoE 三件套 │
│ Column/Row │ │ Router→Dispatch│
│ ParallelLinear│ │ →Experts→Combine│
└───────┬───────┘ └──────┬─────────┘
│ │
▼ ▼
┌─────────────────────────────┐
│ 进程组网格 parallel_state │
│ (谁在哪个 TP/PP/DP/EP 组) │
└─────────────────────────────┘
▲
┌─────────────┴───────────────┐
│ DistributedOptimizer │
│ 梯度 reduce-scatter / │
│ 参数 all-gather / 分片 step │
└─────────────────────────────┘
怎么读这张图: 上半部是「调度」(哪个 microbatch 在哪个阶段算前向还是反向),中间是「模型」(每一层内部怎么被 TP/MoE 切开),底部是「底座」(所有跨卡行为最终都落到 parallel_state 建的进程组上;训练收尾时分布式优化器再沿 DP 组做一次参数同步)。
2.3 部件一句话职责
| 部件 | 干什么 |
|---|