2026-04-22 · architecture / ai-infra
【大模型基础设施工程】06:3D 并行深度——数据 / 张量 / 流水 / 序列 / ZeRO
万卡训练的基石:从 DP、TP、PP、SP、EP 到 ZeRO/FSDP,再到 DualPipe 的零气泡流水,一篇讲透并行策略的工程选型与通信优化。





















上一篇我们系统梳理了 3D 并行的原理。到了 1B 参数以上的规模,任何人都不会从零实现这些并行——业界会直接用 Megatron-LM 或 DeepSpeed。这两个开源框架几乎支撑了过去五年全球大模型训练的半壁江山:GPT-3、Turing-NLG、BLOOM、OPT、LLaMA 系列的内部 fork、Qwen、Yi、DeepSeek 早期版本……背后或多或少都有它们的影子。
本篇是系列第 7 篇,聚焦开源训练框架:
训练框架本质上是在把 PyTorch 里的 nn.Module
拆到多个 GPU
上,同时尽量不让算法工程师察觉。但”拆”有几种完全不同的哲学,于是演化出了多个流派。
流派 A:PyTorch 原生(DDP → FSDP → FSDP2)
nn.Module
无缝;代码最少;调试最容易。流派 B:Megatron-LM / Megatron-Core(Nvidia)
流派 C:DeepSpeed(Microsoft)
三者并非互斥:早期 BLOOM、GPT-NeoX 流行的 “Megatron-DeepSpeed” 组合,就是 TP / PP 用 Megatron、ZeRO-1 用 DeepSpeed。
| 框架 | 组织 | 定位 |
|---|---|---|
| torchtitan | Meta / PyTorch | 官方示例,演示 FSDP2 + TP + PP + FP8 |
| Colossal-AI | 潞晨科技(新加坡国大 → 商业化) | 国内易用派,全家桶 |
| GPT-NeoX | EleutherAI | 基于 Megatron-DeepSpeed 的研究分支 |
| OSLO | TUNiB(韩国) | 曾活跃,现合并进 HF Accelerate |
| Mesh-TensorFlow / T5X / Pax | JAX 路线,TPU 原生 | |
| MaxText | JAX 最新旗舰示例 | |
| Axolotl / LLaMA-Factory / unsloth | 社区 | SFT/LoRA 微调包装器 |
| NeMo | Nvidia | 端到端产品,封装 Megatron-Core |
| HAI-LLM | DeepSeek | 闭源,DualPipe 已开源 |
| Internevo / InternLM-train | 上海 AI Lab | 书生系列自研 |
| 昆仑镜 / PaddleNLP | 百度 | 飞桨大模型套件 |
| 维度 | FSDP2 | Megatron-Core | DeepSpeed | torchtitan | Colossal-AI |
|---|---|---|---|---|---|
| 主要组织 | Meta / PyTorch | Nvidia | Microsoft | Meta / PyTorch | 潞晨 |
| 主要并行 | DP + ZeRO-3 | TP+PP+SP+CP+DP | ZeRO 1/2/3 | FSDP2+TP+PP+CP | ZeRO + Gemini |
| 代码侵入 | 极低 | 高 | 极低 | 中 | 中 |
| MFU 潜力(70B) | ~40% | 50%+ | ~35% | ~45% | ~40% |
| Offload | 有(实验) | 无 | NVMe 成熟 | 无 | 有 |
| MoE | 需第三方 | 内置 | 内置 | 实验 | 内置 |
| FP8 | 实验(torchao) | 成熟(TE) | 实验 | 成熟 | 实验 |
| 长上下文 | CP(新) | CP + SP 成熟 | Ulysses | CP | 实验 |
| 学习成本 | 低 | 高 | 低-中 | 中 | 中 |
先给结论,后面再展开:
2019 年 Nvidia 发表 “Megatron-LM: Training Multi-Billion Parameter Language Models Using Model Parallelism”,首次在工业界给出了 Transformer 张量并行(Tensor Parallelism,后文简称 TP)的完整实现。之后持续演化:
定位:Nvidia 为自己硬件性能背书的参考实现。每一行代码都是针对 A100 / H100 / B200 调过的,MFU 常常能压到 50% 以上(70B LLaMA 量级)。
一个 2025 年的 Megatron-LM 仓库大致如下:
Megatron-LM/
├── megatron/
│ ├── core/ # Megatron-Core,可 pip
│ │ ├── tensor_parallel/ # ColumnParallelLinear 等
│ │ ├── pipeline_parallel/ # 1F1B / Interleaved / ZB 调度
│ │ ├── transformer/ # Block、LayerNorm、MLP、Attention
│ │ │ └── moe/ # GroupedMLP、token dispatcher
│ │ ├── distributed/ # DDP、param buckets
│ │ ├── optimizer/ # 分布式 Adam
│ │ └── datasets/ # GPT dataset、blended dataset
│ ├── training/ # pretrain 入口、checkpoint 逻辑
│ ├── inference/ # 推理入口(轻量)
│ └── legacy/ # 老版保留
├── examples/ # GPT、BERT、T5、Retro 的启动脚本
├── tools/ # preprocess_data、checkpoint convert
└── tests/
初学者的主路径:examples/gpt3/(启动脚本)→
megatron/training/pretrain.py(训练循环)→
megatron/core/models/gpt/gpt_model.py(模型)→
megatron/core/tensor_parallel/layers.py(并行层)。
Transformer 里主要两块计算:Attention 和 MLP。Megatron 对它们都做了 TP。
MLP
块(最典型):Y = GeLU(XA) · B
XA:按列切 A
成 [A1, A2, ..., An],每 rank 算
X · Ai。这一步没有通信。· B:按行切
B 成 [B1; B2; ...; Bn],每 rank 算
GeLU(XAi) · Bi。这一步结果需要在 rank 间
all-reduce 求和。一个 MLP 前向有 1 次 all-reduce。反向多一次 all-reduce。
Attention 块:
所以一个 Transformer Layer 的 TP 通信成本固定是 2 次前向 + 2 次反向 all-reduce(attention + mlp 各一次)。这也是为什么 TP 的规模受限于 NVLink/NVSwitch 域——8 卡 NVLink 内 all-reduce 还能承受,跨节点走 IB 就变成灾难。
伪代码示意:
class ColumnParallelLinear(nn.Module):
def __init__(self, in_f, out_f, tp_size):
super().__init__()
self.weight = nn.Parameter(torch.empty(out_f // tp_size, in_f))
def forward(self, x):
return F.linear(x, self.weight) # 无通信
class RowParallelLinear(nn.Module):
def __init__(self, in_f, out_f, tp_size):
super().__init__()
self.weight = nn.Parameter(torch.empty(out_f, in_f // tp_size))
def forward(self, x):
out = F.linear(x, self.weight)
dist.all_reduce(out, group=tp_group) # 关键通信点
return outTP 切了权重,但激活值(X 本身)还是在每个
rank 完整存一份——这在 seq_len 很长时会成为显存瓶颈。
Megatron 2022 年的 SP 把 LayerNorm 和 Dropout 这些”沿序列维度 element-wise”的算子,按 seq 维度切到 TP ranks 上。代价是把 all-reduce 替换成 reduce-scatter + all-gather(带宽总量一样,但中间激活省一半)。
开启方式:--sequence-parallel(依赖
--tensor-model-parallel-size > 1)。
朴素 PP (GPipe):切成 N 段,第一段算完全部前向再反向。bubble(流水线气泡)巨大。
1F1B:一个 forward 接一个
backward,稳态下 bubble 比例为
(p-1)/(m+p-1),p 是 stage
数,m 是 micro-batch 数。Megatron
默认调度。
Interleaved 1F1B(虚拟流水线):每个 GPU
持有多个非连续 stage(比如 GPU0 管 layer 0–3 和 layer
16–19),bubble 变成
(p-1)/(v·m+p-1),v 是每 GPU 的
chunk 数。通信次数增加 v 倍,换 bubble
缩减。
Zero Bubble Pipeline (ZB-H1 /
ZB-V):2023 年 Sea AI Lab
提出,利用”权重梯度计算可以延后”的特性,把 backward 拆成
B 和 W 两部分,理论上 bubble
可以降到 0。Megatron 在 2024 年合入。
开启方式:
--pipeline-model-parallel-size 8
--num-layers-per-virtual-pipeline-stage 2 # 开 interleaved
--use-zero-bubble-pipeline # 开 ZB(较新版本)早期 Megatron-LM 是一坨脚本 +
模型实现,整合进下游项目很痛苦。2023 年 Nvidia
把核心并行、优化器、通信逻辑抽出为
megatron.core(俗称
Mcore),作为可 pip install
的库:
megatron.core.transformer:Transformer
block 构建。megatron.core.tensor_parallel:ColumnParallelLinear
等。megatron.core.pipeline_parallel:1F1B、Interleaved、ZB
调度。megatron.core.distributed:DistributedDataParallel、param
buckets。megatron.core.optimizer:fused
Adam、分布式优化器(Megatron 版 ZeRO-1)。megatron.core.transformer.moe:MoE
支持(dispatcher、grouped GEMM)。NeMo、Nemotron、国内多数大厂自研训练栈(通义、Baichuan、零一万物、MiniMax、阶跃星辰等)都是包一层 Mcore。Mcore 现在才是 Nvidia 战略重心,Megatron-LM 仓库更多是”示例”角色。
Megatron 2024 年加入 Context Parallelism(CP)专门处理长序列(32K 以上)。思路类似 DeepSpeed Ulysses,但实现路径不同——用 Ring Attention 在 seq 维度切分 KV,通过环形 all-gather 拼回完整 attention 结果。
--context-parallel-size 4。Megatron 2022 年引入的 Distributed Optimizer(俗称 “Mcore ZeRO-1”)把 Adam 的 FP32 优化器状态沿 DP 维度切分:
1/DP 的优化器状态。效果与 DeepSpeed ZeRO-1 等价,显存省约 4x(FP32 m/v)。与
TP / PP
完全正交,打开即用:--use-distributed-optimizer。
从 NVIDIA/Megatron-LM 仓库跑一个 GPT
预训练最小配置(单节点 8xH100,约 7B 模型):
# pretrain_gpt.sh 精简
GPUS_PER_NODE=8
NNODES=1
TP=2
PP=1
MICRO_BATCH=2
GLOBAL_BATCH=128
torchrun --nproc_per_node=$GPUS_PER_NODE pretrain_gpt.py \
--tensor-model-parallel-size $TP \
--pipeline-model-parallel-size $PP \
--sequence-parallel \
--num-layers 32 \
--hidden-size 4096 \
--num-attention-heads 32 \
--seq-length 4096 \
--max-position-embeddings 4096 \
--micro-batch-size $MICRO_BATCH \
--global-batch-size $GLOBAL_BATCH \
--lr 3e-4 --min-lr 3e-5 \
--lr-decay-style cosine \
--weight-decay 0.1 \
--clip-grad 1.0 \
--bf16 \
--use-flash-attn \
--use-distributed-optimizer \
--recompute-activations \
--train-iters 100000 \
--data-path /data/my_gpt_text_document \
--tokenizer-type GPTSentencePieceTokenizer \
--tokenizer-model /data/tokenizer.model \
--save /ckpt --save-interval 2000 \
--tensorboard-dir /tb要点:
--use-distributed-optimizer:启 ZeRO-1
风格分布式优化器。--recompute-activations:激活重计算,trade
算力换显存。--bf16 加 --fp8-format hybrid
可开 FP8(H100+)。.bin + .idx(tools/preprocess_data.py
生成)。DeepSpeed 2020 年发布,核心贡献是 ZeRO (Zero Redundancy Optimizer):把 DDP 下每张卡冗余存一份的”优化器状态、梯度、参数”切到各 rank 上。
对照:FSDP = 大体等价于 ZeRO-3;FSDP2 = 基于 DTensor 重写,API 更现代。
配置片段:
{
"zero_optimization": {
"stage": 3,
"offload_optimizer": {"device": "cpu", "pin_memory": true},
"offload_param": {"device": "nvme", "nvme_path": "/mnt/nvme"},
"overlap_comm": true,
"contiguous_gradients": true,
"reduce_bucket_size": 5e8,
"stage3_prefetch_bucket_size": 5e8,
"stage3_param_persistence_threshold": 1e6
},
"bf16": {"enabled": true},
"gradient_accumulation_steps": 16,
"train_micro_batch_size_per_gpu": 2
}DeepSpeed 的卖点之一是 API 极简:
import deepspeed
model = MyTransformer(config) # 原生 nn.Module
model_engine, optimizer, _, _ = deepspeed.initialize(
model=model,
model_parameters=model.parameters(),
config="ds_config.json",
)
for batch in loader:
loss = model_engine(batch).loss
model_engine.backward(loss)
model_engine.step()deepspeed 命令行启动器会自动处理 torchrun 的
rank 分配。HF Transformers 的 Trainer 内置了
DeepSpeed 集成,大量 SFT/RLHF 脚本直接用。
大规模 ZeRO-3 的瓶颈是权重 all-gather 的带宽。ZeRO++ 提出:
结合起来在 400G IB 集群上可以把 ZeRO-3 的 throughput 提升 2x 左右。
比 Megatron-MoE 更早的工业级 MoE 实现,提供:
Azure OpenAI 早期 MoE 训练、BLOOM-ZeRO 都用过。下一篇 MoE 训练会展开。
2023 年春发布,一键跑完 SFT → RM → PPO 三阶段,是当时最早的开源 RLHF 全家桶。但现在 OpenRLHF、trl、veRL、ColossalChat 已经接管主流,DeepSpeed-Chat 维护变慢。第 9 篇会详细对比。
2023 年 DeepSpeed 提出 Ulysses,把 attention 在
head 维度 上分到不同 rank(与 Megatron SP
切 seq 不同思路)。通过两次 all-to-all(进入 attention
前和出 attention 后)来实现,单次通信量为
O(N·d/P),比 Megatron 的 Ring Attention /
Context Parallelism 在某些配置下更省。
长上下文训练(32K+)的事实标准之一。第 16 篇会再讲。
2024 年起 Microsoft 内部把更多精力投向 PyTorch 官方 FSDP2 / torchtitan 的贡献,DeepSpeed 的维护节奏放缓。但它仍是:
如果你在 2026 年开新项目,不是”必须用 DeepSpeed”的场景(例如历史代码、NVMe offload)都可以评估一下 FSDP2 是否更合适。
最早的 PyTorch 多卡方案是
DistributedDataParallel (DDP):每张卡复制一份模型,反向时
all-reduce 梯度。简单可靠,但显存上限由单卡决定——训 7B
模型光模型 + Adam 状态就要 ~112GB(FP32 优化器),放不下
A100。于是 FSDP 出现。
2022 年随 PyTorch 1.11 引入,参考了 FairScale 的 FSDP 实现。等价于 ZeRO-3:
API:
from torch.distributed.fsdp import FullyShardedDataParallel as FSDP
model = MyTransformer(...)
model = FSDP(
model,
sharding_strategy=ShardingStrategy.FULL_SHARD,
mixed_precision=MixedPrecision(
param_dtype=torch.bfloat16,
reduce_dtype=torch.float32,
),
auto_wrap_policy=transformer_auto_wrap_policy(...),
)局限:flat parameter(把一组 param 拼成一个大 tensor 再切)导致与 TP / PP 组合困难;自定义 wrap policy 坑多。
2024 年 PyTorch 2.4+ 正式推出 FSDP2,底层换成 DTensor(分布式 tensor 抽象):
DTensor,自然支持与 TP 共存(TP 切 dim 0,FSDP
切 dim 1)。fully_shard(module) 就地
wrap,不再创造新 class。torch.compile
友好。示例:
from torch.distributed._composable.fsdp import fully_shard, MixedPrecisionPolicy
for layer in model.layers:
fully_shard(layer, mp_policy=MixedPrecisionPolicy(
param_dtype=torch.bfloat16,
reduce_dtype=torch.float32,
))
fully_shard(model)
for batch in loader:
loss = model(batch).loss
loss.backward()
optimizer.step()
optimizer.zero_grad()FSDP2 的哲学是”组合而非封装”:TP 用
parallelize_module(torch.distributed.tensor.parallel),PP
用 torch.distributed.pipelining,三者都基于
DTensor,可以叠加。这也是 torchtitan 的设计基础。
无论 FSDP 还是 DeepSpeed ZeRO-3,“临时 all-gather 完整权重” 是公共限制:
CPU offload。torch.compile
组合:FSDP1 对 torch.compile
支持差;FSDP2 基本可用,但仍有 graph break。FULL_STATE_DICT 在大模型上会 OOM;必须用
SHARDED_STATE_DICT。FSDP2 默认
DTensor-aware,友好很多。pytorch/torchtitan 2024 年发布,定位类似
Megatron-LM 的”官方示例仓库”,演示如何用纯 PyTorch 组合出 3D
并行:
torch.distributed.pipelining)做流水。torchao)。torch.compile
端到端编译。# torchtitan llama3 config 片段
[parallelism]
data_parallel_replicate_degree = 1
data_parallel_shard_degree = 64
tensor_parallel_degree = 8
pipeline_parallel_degree = 2
context_parallel_degree = 1
[training]
seq_len = 8192
mixed_precision_param = "bfloat16"
compile = true
[float8]
enable_float8_linear = truetorchtitan 的代码量远小于 Megatron-LM(~5k LOC 对 Megatron 的 ~100k),适合学习 3D 并行源码。它不是生产框架,但越来越多公司把它当作自研训练栈的”起点”。
潞晨科技(尤洋团队从新加坡国大衍生出的创业公司)2022 年开源 Colossal-AI。卖点:
import colossalai
from colossalai.booster import Booster
from colossalai.booster.plugin import GeminiPlugin
colossalai.launch_from_torch(config={})
plugin = GeminiPlugin(precision="bf16", placement_policy="auto")
booster = Booster(plugin=plugin)
model, optimizer, _, _, _ = booster.boost(model, optimizer)国内中小团队 / 高校用得较多;但在头部大厂,自研栈或 Megatron-Core 仍然占主导。
没有银弹。下面是经验矩阵,覆盖 2025 主流场景。
对于 Megatron 风格 3D 并行,配置顺序建议:
N,预留 TP × PP × DP = N。num_heads 必须能整除
TP。PP=1。否则
2/4/8。num_layers 必须能整除 PP。grad_accum 凑。MFU(Model FLOPs Utilization)= 实测 FLOPs / 峰值 FLOPs。H100 BF16 峰值 989 TFLOPS。一个 70B 模型在 H100 上跑,MFU < 35% 说明你有救。
HFU(Hardware FLOPs Utilization):把激活重计算也算进来的”含水率”。HFU 总是 ≥ MFU。
调 MFU 的常见动作:
--use-flash-attn(或更新的
Flash-Attn-3)。--sequence-parallel +
--tp-comm-overlap。--recompute-granularity full →
selective,只重计算 attention。大模型训练最怕 loss spike(损失突然飙升)。遇到时按顺序排查:
num_heads % TP != 0、num_layers % PP != 0、rank
分配错。dcgmi diag -r 3。调试技巧:开
--log-throughput --log-memory --log-world-size-to-tensorboard,以及
NVTE_DEBUG=1 /
TORCH_DISTRIBUTED_DEBUG=DETAIL。
torch.profiler + Chrome
trace:看算子级时间。nsys profile):看 GPU /
通信 overlap。nccl-tests:单独压测集合通信带宽。py-spy dump:抓 CPU 端 pickle / dataloader
卡死。“计算与通信 overlap” 是 MFU 最重要的来源,框架提供了若干开关:
| 开关 | Megatron-LM | DeepSpeed | FSDP2 |
|---|---|---|---|
| 梯度 reduce 与 backward overlap | --overlap-grad-reduce |
"overlap_comm": true |
默认开 |
| 参数 gather 与 forward overlap | --overlap-param-gather |
"stage3_prefetch" |
forward_prefetch |
| TP all-reduce 与 GEMM overlap | --tp-comm-overlap(需 TE) |
N/A | 需要手动写 |
| PP P2P 与计算 overlap | 自动(1F1B) | 自动 | PP 自动 |
TE(Transformer Engine)的 --tp-comm-overlap
是 Megatron 高 MFU 的秘密武器之一:它把 all-reduce 拆成
reduce-scatter + all-gather,分别与前后两个 GEMM
overlap。
以 LLaMA-7B、bf16、seq=4096、micro-batch=1 为例:
合计 ~105 GB,放不下单张 A100-80G。方案:
ZeRO-1 (DP=8):优化器切 8 → 7 GB;总占用 35
+ 激活 = 单卡 ~55 GB,可行。ZeRO-3 (DP=8):权重 + 梯度 + 优化器全切 →
单卡 ~10 GB + 激活;可训更大。TP=2, DP=4:权重 + 激活都切 2;优化器仍可
ZeRO-1。这笔账一定要动手算,否则选型全凭感觉。
在进入具体代码前,先摆出三者的心智模型差异:
pretrain_gpt.py 改配置,模型必须符合它的 block
约定。代码量看起来多,但并行”全免费”。import torch
import torch.distributed as dist
from torch.distributed._composable.fsdp import fully_shard, MixedPrecisionPolicy
from transformers import AutoModelForCausalLM, AutoTokenizer
def main():
dist.init_process_group("nccl")
rank = dist.get_rank()
torch.cuda.set_device(rank % torch.cuda.device_count())
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-3-8B", torch_dtype=torch.bfloat16
)
mp = MixedPrecisionPolicy(
param_dtype=torch.bfloat16, reduce_dtype=torch.float32
)
for block in model.model.layers:
fully_shard(block, mp_policy=mp)
fully_shard(model, mp_policy=mp)
optim = torch.optim.AdamW(model.parameters(), lr=1e-5, betas=(0.9, 0.95))
tok = AutoTokenizer.from_pretrained("meta-llama/Llama-3-8B")
model.train()
for step, batch in enumerate(load_data(tok)):
batch = {k: v.cuda() for k, v in batch.items()}
out = model(**batch, labels=batch["input_ids"])
out.loss.backward()
torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)
optim.step()
optim.zero_grad(set_to_none=True)
if rank == 0 and step % 10 == 0:
print(f"step {step} loss {out.loss.item():.4f}")
if __name__ == "__main__":
main()启动:torchrun --nproc_per_node=8 train.py。不到
50 行就能跑 8B 模型全量微调。
Megatron 不走 nn.Module 裸写,而是通过
pretrain_gpt.py 这类入口 + 大量参数。最小
diff:
# my_pretrain.py
from megatron.training import pretrain
from megatron.core.models.gpt import GPTModel
from megatron.core.transformer.transformer_config import TransformerConfig
def model_provider(pre_process, post_process):
cfg = TransformerConfig(
num_layers=32,
hidden_size=4096,
num_attention_heads=32,
use_cpu_initialization=False,
bf16=True,
tensor_model_parallel_size=2,
pipeline_model_parallel_size=1,
sequence_parallel=True,
)
return GPTModel(config=cfg,
vocab_size=128256,
max_sequence_length=4096,
pre_process=pre_process,
post_process=post_process)
def forward_step(data_iter, model):
batch = next(data_iter)
return model(batch["tokens"], batch["position_ids"], batch["attention_mask"]), \
lambda loss: {"lm_loss": loss}
if __name__ == "__main__":
pretrain(train_valid_test_dataset_provider,
model_provider,
ModelType.encoder_or_decoder,
forward_step)代码量不多,但 “Megatron 约定”(参数 registry、checkpoint 格式、dataloader index)要了解。
import deepspeed, torch
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-7B")
engine, opt, _, _ = deepspeed.initialize(
model=model,
model_parameters=model.parameters(),
config="ds_zero3.json",
)
for batch in loader:
out = engine(**batch, labels=batch["input_ids"])
engine.backward(out.loss)
engine.step()启动:deepspeed --num_gpus 8 train.py --deepspeed ds_zero3.json。
# FSDP2 / torchtitan
torchrun --nproc_per_node=8 --nnodes=$N --node_rank=$R \
--master_addr=$MASTER --master_port=29500 train.py
# Megatron-LM
torchrun --nproc_per_node=8 --nnodes=$N --node_rank=$R \
--master_addr=$MASTER --master_port=29500 pretrain_gpt.py \
--tensor-model-parallel-size 4 --pipeline-model-parallel-size 2 ...
# DeepSpeed(内置 launcher,读 hostfile)
deepspeed --hostfile=hostfile --num_gpus=8 train.py \
--deepspeed --deepspeed_config ds_config.json
# NeMo(基于 PyTorch Lightning)
python examples/nlp/language_modeling/megatron_gpt_pretraining.py \
--config-path=conf --config-name=megatron_llama_config.yaml \
trainer.devices=8 model.tensor_model_parallel_size=4三者都依赖 NCCL
环境变量:NCCL_IB_HCA、NCCL_SOCKET_IFNAME、NCCL_IB_GID_INDEX
是跨机训练最常踩的坑,第 4
篇互联讲过一次,实战中别忘了设。
结合公开资料和行业共识(部分为合理推测,权重标注):
Megatron-Core 基本是全球头部预训练的”最大公约数”——这就是 Nvidia 把生态绑死在 CUDA 之上的一个缩影。
三个 2022 年的开源大模型给了我们难得的”框架考古”机会:
这三个项目间接奠定了 2023 年后 LLM 训练栈的共识:Megatron 管并行,DeepSpeed 管 ZeRO。2024 年后 Mcore 吃掉 DP 和 ZeRO-1 能力,这个”双人组”开始被单一 Mcore 替代。
Q1:FSDP2 能不能完全替代 DeepSpeed?
对 ZeRO-2/3 场景基本可以。但 DeepSpeed 的 NVMe offload、MoE、Ulysses、推理引擎是一揽子生态,不是单点功能。做 SFT/LoRA 或中小模型预训练,FSDP2 已足够;搞复杂 RLHF 或离线训练探索,DeepSpeed 仍有独到优势。
Q2:Megatron-LM 和 Megatron-Core 到底选哪个?
新项目一律选 Megatron-Core。Megatron-LM 现在是”官方示例仓库”,新 feature 先进 Core 再进 LM 脚本。你要嵌入自研训练栈,必须用 Core。
Q3:我要训练一个带视觉输入的多模态模型,用哪个?
accelerate + FSDP2。Q4:训练中途换框架现实吗?
Checkpoint 格式是最大障碍。Megatron-Core 的 checkpoint
格式与 FSDP 的 DCP(Distributed Checkpoint)互不兼容。可以写
converter(HF 格式 safetensors
是中间枢纽),但需要仔细验证 LN、embedding tying、RoPE
等细节。
Q5:MFU 多高才算好?
经验值(H100,bf16,LLaMA 架构):
低于这些值,先查 dataloader、通信 overlap、activation recompute 粒度。
Q6:国产卡上哪个框架可以用?
Q7:什么时候该自研训练框架?
一般大厂经历的路径:
DeepSeek 的 HAI-LLM、字节的豆包自研栈、Meta 的 torch-native 都属于第 3 阶段。中小团队最合理的路线是长期停留在 2。
Q8:训练稳定性和框架的关系有多大?
中等。大部分 loss spike 来源于数据、学习率、数值精度,与框架无关;但框架会在三个地方影响稳定性:
Q9:2026 年一个新团队的”最优默认”是什么?
保守版本:torchtitan(研究)+ Megatron-Core(生产)+ veRL / OpenRLHF(对齐)。激进版本:押注 FSDP2 + TP + PP 纯官方栈,赌 PyTorch 生态的长期胜利。
┌──────────────────────────────┐
│ Megatron-LM (GitHub 仓库) │
│ 示例脚本 + 研究 feature 首发│
└──────────────┬───────────────┘
│ 复用底层
▼
┌──────────────────────────────┐
│ Megatron-Core (pip 库) │
│ TP / PP / SP / MoE / CP │
│ + 分布式优化器 + FP8 │
└──────────────┬───────────────┘
│ 封装
▼
┌──────────────────────────────┐
│ NeMo Framework (产品) │
│ 数据 / 训练 / 对齐 / 推理 │
│ + Recipes + 商业支持 │
└──────────────────────────────┘
│ 训练出
▼
┌──────────────────────────────┐
│ Nemotron 模型家族 │
│ 340B / 5 / Mini / Nano │
└──────────────────────────────┘
Nvidia 的全景:
对企业客户:Nvidia 提供的不是 Megatron,而是整个 NeMo 平台。对研究者和大厂自研团队:Mcore 是核心。对个人 / 学习:Megatron-LM 仓库 + torchtitan。
观察 2024–2026 的走向:
torch.compile
+ functorch + Inductor
正在尝试自动插入通信算子;Google Pax/XLA
已经这么做了很多年。如果你是刚入行的训练工程师,一条合理的学习路径:
megatron/core/tensor_parallel/layers.py,理解
ColumnParallelLinear、RowParallelLinear、gather/scatter
的数学。megatron/core/pipeline_parallel/schedules.py,手画一遍
1F1B 时空图。safetensors
+ DCP:HF 生态兼容,离线转换好做。下一篇我们进入 MoE 训练工程,看看 Mixtral、DeepSeek V3、Qwen MoE 是怎样把稀疏激活玩成工程的——Expert Parallelism、All-to-All、负载均衡、DeepEP、MegaBlocks 一次性讲透。
torchtitan 官方仓库。上一篇:3D 并行深度:数据 / 张量 / 流水 / 序列 / ZeRO 下一篇:MoE 训练工程
把当前热点继续串成多页阅读,而不是停在单篇消费。
2026-04-22 · architecture / ai-infra
万卡训练的基石:从 DP、TP、PP、SP、EP 到 ZeRO/FSDP,再到 DualPipe 的零气泡流水,一篇讲透并行策略的工程选型与通信优化。
2026-04-22 · architecture / ai-infra
面向工程师的大模型基础设施开篇地图,覆盖 2022 到 2026 的工程分水岭、五层工程栈、训练与推理的工程差异、中国与全球行业版图以及成本曲线。
2026-04-22 · architecture / ai-infra
从 CPU 与 GPU 的架构差异出发,讲清楚 SM、Warp、Tensor Core、HBM、NVLink 的工程含义,并结合 Roofline、FlashAttention 与国产算力栈,给出大模型工程师能直接上手的 GPU 心智模型。
2026-04-22 · architecture / ai-infra
从 nvcc 到 Triton,把 NVIDIA 软件栈的每一层拆给大模型工程师看,顺便谈谈 ROCm、CANN 为什么一直追不上。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。