Chapter 09
Megatron 集成与多机训练
默认 ms-swift 走 HF Transformers + DeepSpeed 路径,对 ≤ 13B 模型够用。训 70B+ 模型时需要切到 Megatron 后端启用 TP/PP 并行。
9.1两条后端路径
| 默认 (HF) | Megatron 后端 | |
|---|---|---|
| 分布式 | DeepSpeed ZeRO-2/3 | TP + PP + DP + SP |
| 模型实现 | transformers | Megatron-Core ParallelLinear |
| 支持规模 | ≤ 70B (ZeRO-3) | ≥ 100B 都行 |
| 易用性 | ★★★★★ | ★★★ |
| 性能 (70B+ 多机) | ★★★ | ★★★★★ |
9.2启用 Megatron 后端
swift sft \
--model Qwen/Qwen2.5-72B-Instruct \
--dataset alpaca-zh \
--train_type lora \
--megatron \ # ★ 开启 Megatron 后端
--tensor_model_parallel_size 4 \
--pipeline_model_parallel_size 2 \
--sequence_parallel \
--fp8 \ # H100/H200 可开
--num_train_epochs 1 \
--learning_rate 1e-4 \
--per_device_train_batch_size 1 \
--gradient_accumulation_steps 16
注意切到 Megatron 后端后,模型需要先转 Megatron 格式:
swift export \
--model Qwen/Qwen2.5-72B-Instruct \
--to_mcore true \ # ★ HF → Megatron-Core
--output_dir ./qwen2.5-72b-mcore
训完后再转回 HF:
swift export \
--mcore_model ./output \
--to_hf true \
--output_dir ./qwen2.5-72b-hf
9.3多机:用 torchrun 或 PAI
torchrun 多机
# 每台机器都跑
NNODES=4
NODE_RANK=$RANK # 0, 1, 2, 3
MASTER_ADDR=10.0.0.5
MASTER_PORT=12355
NPROC_PER_NODE=8 \
torchrun \
--nproc_per_node=8 \
--nnodes=$NNODES \
--node_rank=$NODE_RANK \
--master_addr=$MASTER_ADDR \
--master_port=$MASTER_PORT \
$(which swift) sft \
--model Qwen/Qwen2.5-72B-Instruct \
--megatron \
--tensor_model_parallel_size 8 \
--pipeline_model_parallel_size 4 \
...
4 节点 32 卡 70B 推荐配置
| 并行 | 值 | 原因 |
|---|---|---|
| TP | 8 | NVLink 域内 |
| PP | 4 | 跨节点 |
| DP | 1 | 32 / (8*4) = 1 |
| SP | true | 配合 TP |
| ZeRO | 1 | 切 optim |
9.4性能基线
Qwen2.5-72B、4 节点 × 8 H100、bf16、SFT LoRA、seqlen=4K:
| 后端 | tokens/s/GPU | MFU |
|---|---|---|
| HF + DeepSpeed ZeRO-3 | ~480 | ~22% |
| Megatron TP=8 PP=4 | ~1,650 | ~52% |
| Megatron + FP8 | ~2,200 | ~64% |
9.5什么时候不该用 Megatron 后端
- ≤ 13B 模型,ZeRO-2/3 完全够;
- 多模态训练(Megatron 后端的 VLM 兼容性不全);
- 开发期间快速迭代(HF 后端 reload 更快);
- 非 NVIDIA GPU(Megatron-Core 主要测过 NVIDIA)。
9.6常见踩坑
| 现象 | 处理 |
|---|---|
| to_mcore 转换 OOM | 转换在 CPU 上做,要 200+ GB RAM;分块或用大内存机 |
| NCCL hang | 多机要 IB;查 NCCL_SOCKET_IFNAME |
| tp_size × pp_size 不整除 world_size | 调整两者或卡数 |
| Megatron 后端 LoRA 不生效 | 检查 target_modules,Megatron 风格名 (linear_qkv) |
9.7mcore-bridge:v4 的 Megatron 桥
v4 的 Megatron 路径靠独立包 mcore-bridge(≥ 1.3.0)。位置 swift/megatron/init.py:124。
核心机制:
| 机制 | 位置 |
|---|---|
| HF → Megatron 权重转换 | 用 GPTBridge 把 HF weight 切到 TP 维度,导出 Megatron checkpoint |
| Megatron → HF 反向转换 | monkey-patch 的 GPTBridge.save_weights() 重组分片 + 注入 ModelScope metadata |
| Megatron-Core 环境初始化 | init_megatron_env()(init.py:211)打几个补丁让 NCCL / UVM 与 swift 兼容 |
| config 保留 | 把 hf_config 存进 Megatron checkpoint;LoRA 时还存 PEFT config |
init.py 真实做的几个 patch:
_patch_unified_memory()— 关 NvLink UVM 防多机 hang;_patch_mcore_bridge()— 扩展 weight saving 支持 LoRA + metadata;_patch_torch_FileSystemReader()— 16 worker 并行读 checkpoint。
9.85D 并行真实字段
本章前面只列了 TP / PP / SP。v4 全栈 Megatron 实际支持 5D 并行,对应 5 个字段:
| 维度 | flag | 含义 |
|---|---|---|
| Tensor Parallel | --tensor_model_parallel_size N | 列/行切矩阵 |
| Pipeline Parallel | --pipeline_model_parallel_size N | 层切到不同 stage |
| Virtual Pipeline | --virtual_pipeline_model_parallel_size N | "Interleaved 1F1B",降低 bubble |
| Context Parallel | --context_parallel_size N | 长序列沿 seq 维切(同 Ulysses) |
| Expert Parallel | --expert_model_parallel_size N | MoE expert 切到不同卡 |
约束:TP × PP × CP × DP = world_size,EP 是 MoE 模型内独立维度。1T 模型实战常配 TP=8 PP=8 CP=2 EP=8。
9.9Sequence Parallel:Ulysses + ZigZag Ring
2025-Q3 引入的序列并行体系在 swift/sequence_parallel/,提供两种实现:
| 方法 | 位置 | 原理 | 适用 |
|---|---|---|---|
| Ulysses | ulysses.py(40 KB) | Q/K/V 沿 head 维 all-to-all 切分 | 带宽充足(NVLink),中长序列 |
| ZigZag Ring Attention | zigzag_ring_attn.py(26 KB) | token 沿 ring P2P 流动,不全聚集 | 跨机带宽紧、极长序列 |
| ZigZag Ring NPU | zigzag_ring_attn_npu.py | 同上 + 华为昇腾优化 | NPU 集群 |
开启方式:--sequence_parallel_size N --sequence_parallel_mode ulysses(或 zigzag_ring)。配合 packing + flash-attn,能训百万 token 上下文。
9.10Ray 编排(MegatronRayPipeline)
2025-10 新增的 swift/ray/megatron/ 把 Megatron + GRPO 跑在 Ray 上:
| 组件 | 位置 |
|---|---|
MegatronRayPipeline | swift/ray/megatron/pipeline.py |
megatron_worker.py | 训练 worker(包 Megatron-LM) |
worker_group.py | 管理 TP / PP / EP worker 组 |
grpo_trainer.py | driver 侧 GRPO,协调 train + rollout |
rollout/ray_vllm_engine.py | vLLM 作为 rollout Ray actor |
rollout/weight_transfer.py | train ↔ rollout 权重同步(NCCL) |
checkpoint_engine/nccl.py | checkpoint NCCL collective 协调 |
YAML 驱动:swift rlhf my.ray.yaml 自动起 Ray 集群。这是 ms-swift 与 verl / OpenRLHF 拉平的关键能力。
9.11这章你需要带走的
- ≤ 13B 用默认 HF + ZeRO;≥ 70B 切到 Megatron 后端;
- Megatron 模式要先
swift export --to_mcore转格式; - 多机 4×8 70B 经典配置:TP=8 PP=4 SP=true;
- 开 FP8 可再 30% 加速(H100/H200)。