Chapter 09

Megatron 集成与多机训练

📌 commit b58b1bd训 70B+ 时切到 Megatron 后端

默认 ms-swift 走 HF Transformers + DeepSpeed 路径,对 ≤ 13B 模型够用。训 70B+ 模型时需要切到 Megatron 后端启用 TP/PP 并行。

9.1两条后端路径

默认 (HF)Megatron 后端
分布式DeepSpeed ZeRO-2/3TP + PP + DP + SP
模型实现transformersMegatron-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 推荐配置

并行原因
TP8NVLink 域内
PP4跨节点
DP132 / (8*4) = 1
SPtrue配合 TP
ZeRO1切 optim

9.4性能基线

Qwen2.5-72B、4 节点 × 8 H100、bf16、SFT LoRA、seqlen=4K:

后端tokens/s/GPUMFU
HF + DeepSpeed ZeRO-3~480~22%
Megatron TP=8 PP=4~1,650~52%
Megatron + FP8~2,200~64%

9.5什么时候不该用 Megatron 后端

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:

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 Attentionzigzag_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这章你需要带走的