AReaL 基于 Megatron-LM 后端微调大型 MoE 模型:并行策略、Bridge 选择与训练稳定性实践
2026/9/18 7:10:51 网站建设 项目流程

AReaL 基于 Megatron-LM 后端微调大型 MoE 模型:并行策略、Bridge 选择与训练稳定性实践

【免费下载链接】AReaLThe RL Bridge for LLM-based Agent Applications. Made Simple & Flexible.项目地址: https://gitcode.com/GitHub_Trending/are/AReaL

本篇技术指南聚焦 AReaL 项目中以 Megatron-LM(Megatron-Core)作为 RL 训练后端的完整使用路径:从一行配置切换后端、Bridge 选择、MoE 混合并行折叠,到确定性算法对齐推理/训练精度,并附带可直接落地的 GSM8K + Qwen3-30B-A3B GRPO 运行命令。读完你可以为自家大型 MoE 模型配置 5D 并行训练,并理解每个关键配置在源码中的落点。

Megatron 后端能做什么:为什么大型 MoE 需要它

与 PyTorch FSDP 相比,Megatron-LM 支持完整的 5D 并行性(数据并行 DP、张量并行 TP、流水线并行 PP、上下文并行 CP、专家并行 EP),可以提供更好的扩展性和效率,尤其适合动辄数十亿到数千亿参数的 MoE 模型。AReaL 对 Megatron-LM 作为 RL 训练后端提供了完整支持,核心实现在 areal/engine/megatron_engine.py 的MegatronEngine类中。

在 AReaL 中,MegatronEngineTrainEngine的完整实现,覆盖了 RL 训练所需的全部能力:

  • 分布式训练:通过create_process_group调用mpu.initialize_model_parallel初始化 Megatron 的并行状态(见 megatron_engine.py),支持 TP/PP/CP/EP 以及虚拟流水线并行(VPP);
  • HF 权重互通:通过 bridge 机制完成 HuggingFace 权重 ↔ Megatron 模型的双向转换与实时同步;
  • RL 训练方法train_batchcompute_logpppo_update等 RPC 方法被注册在cpu_staged_rpc_methods中(megatron_engine.py),可服务 GRPO/PPO/DPO/RLVR 等训练器;
  • 扩展能力:FP8 训练、LoRA(需megatron-bridge)、MTP(Multi-Token-Prediction)、tree-attention 训练、checkpoint 异步保存等。

启用 Megatron 后端:一行配置切换

从 FSDP 切换到 Megatron 只需要更改一行:把actor.backend字段从fsdp:d4改为megatron:d4。例如在 YAML 配置中:

actor: backend: "megatron:d4"

Backend 字符串语法

AReaL 将每个backend字符串解析为ModelAllocation对象,驱动该引擎的 GPU 资源分配。语法为:

<backend>:<parallelism_dims>

并行维度如下表所示(完整参考见 docs/zh/reference/alloc_mode.md):

维度缩写描述适用于
Datad模型副本数量所有后端
Tensort跨 GPU 分割操作所有后端
Pipelinep跨 GPU 阶段分割层Megatron、Archon
Contextc跨 GPU 分割序列长度所有后端
Experte跨 GPU 分割 MoE 专家Megatron、Archon

组件所需的 GPU 总数按下式计算(专家并行e不增加 world size,它只在既有 GPU 网格内重新分配专家放置位置):

world_size = dp × tp × pp × cp

例如:

Backend 字符串每引擎 GPU 数说明
megatron:d2p2t4162 DP × 2 PP × 4 TP
megatron:d2p2t4e416同一网格,4 路专家并行

注意:所有分配字符串都必须显式指定后端前缀,裸维度字符串(如d4t2)不再被接受。另外顶层的allocation_mode配置字段已弃用,请使用各引擎自己的backend字段;当critic.backendref.backend为空时,会自动继承actor.backend的值。

训练后端定位

后端支持的维度使用场景
fsdpd,t,c简单并行的默认选择
megatrond,t,p,c,e流水线或专家并行必需
archond,t,p,c,eMegatron 的替代方案(实验性)

从源码看,MegatronEngineConfig(定义于 areal/api/cli_args.py)承载了并行、精度、checkpoint、MoE、FP8、bridge 等全部训练侧配置,这些配置均可通过 YAML 中的actor.megatron.*字段或命令行覆盖注入。

Bridge 后端选择:mbridge 与 megatron-bridge

MegatronEngine支持通过actor.megatron.bridge_type选择两种 bridge 后端(HF ↔ Megatron 之间的模型构建与权重转换桥):

actor: megatron: bridge_type: mbridge # 默认(向后兼容)

设置bridge_type: megatron-bridge即可启用新后端。bridge_type字段的可选值在 cli_args.py 中定义为["mbridge", "megatron-bridge"],默认mbridge

两种后端的取舍与迁移建议(详见 docs/zh/reference/bridge_backend.md):

  • mbridge(默认):正在被弃用,不支持 PEFT/LoRA;但在 HF 模型加载/保存上实现更快、更优化,若使用磁盘(而非 XCCL)进行权重广播,仍推荐 mbridge。
  • megatron-bridge:支持更多(更新)的模型架构,并提供内置的 PEFT/LoRA 实现;若使用 XCCL 进行权重广播,加载/保存耗时影响较小,推荐作为新工作流的首选。
  • 当前限制MegatronEngine的 tree-attention 训练路径目前仅支持mbridge,暂不支持megatron-bridge

这一约束在源码中有直接印证:在 megatron_engine.py 的initialize中,启用 LoRA 且bridge_cls != "megatron-bridge"时会直接抛出NotImplementedError_apply_megatron_bridge_lora(megatron_engine.py)通过MegatronBridgeLoRA注入 LoRA 模块,target_modules未指定或含all-linear时会展开为linear_qkvlinear_projlinear_fc1linear_fc2四类线性层目标。

仓库中的 LoRA + MoE 示例 examples/math/gsm8k_grpo_megatron_lora_moe.yaml 展示了完整配置组合:

actor: backend: "megatron:(attn:d1p6t1c1|ffn:d1p6t1e1)" path: Qwen/Qwen3-30B-A3B-Base megatron: bridge_type: megatron-bridge weight_update_mode: xccl use_lora: ${rollout.use_lora} peft_type: lora lora_rank: 32 lora_alpha: 32 target_modules: [linear_qkv, linear_proj, linear_fc1, linear_fc2]

注意该示例中 rollout 侧使用 vLLM 并开启enable_lora: truemax_lora_rank,配合rollout.use_lora: true实现训练/推理两侧的 LoRA 协同。

MoE 并行策略:注意力和专家模块独立并行

对于 MoE 模型,Megatron 使用混合语法支持注意力模块和 FFN(专家)模块的独立并行:

megatron:(attn:<attn_dims>|ffn:<ffn_dims>)

例如文档中的 16-GPU 配置:

megatron:(attn:d1p4t2c2|ffn:d1p4t1e4)
模块dppptpcpepWorld Size
attn1422-16
ffn141-416

该配置使用 PP=4,注意力模块使用 TP=2 和 CP=2,而专家模块使用 TP=1 和 EP=4。这种"MoE Parallel Folding"机制来自 Megatron-LM 的 transformer/moe 实现,可以降低同时组合上下文并行(CP)和专家并行(EP)时的最低 GPU 要求。

约束条件

使用混合语法时必须遵守以下约束(见 docs/zh/reference/alloc_mode.md):

  • 流水线并行大小(p)对attnffn必须相同;
  • World size 必须匹配(如果ffn中省略d,则自动派生);
  • 专家并行(e)仅在ffn部分有效。

相关 MoE 配置项

在 MegatronEngineConfig 中,还提供了一批与 MoE 训练强相关的细粒度配置,可通过actor.megatron.*设置:

  • moe_token_dispatcher_type(默认alltoall):token dispatcher 类型,可选allgatheralltoallflex
  • moe_permute_fusion/moe_router_fusion:是否融合 token 重排 / TopK 路由与 aux-loss 计算(后者要求 TransformerEngine ≥ 2.7.0);
  • moe_shared_expert_overlap:共享专家计算与 dispatcher 通信重叠,默认None(保持模型 bridge 自身默认);
  • moe_router_dtype(默认fp32):路由器 gate GEMM 以 FP32 计算以提升数值稳定性;
  • moe_router_bias_update_rate:aux-loss-free 负载均衡(DeepSeek V3 风格)的expert_bias更新速率,1e-3对应 DeepSeek V3;
  • moe_z_loss_coeff:路由器 z-loss 缩放系数,起始值建议1e-3None表示关闭。

这些参数会在_build_hf_mcore_bridge(megatron_engine.py)中通过set_extra_args注入 mbridge,且只会透传目标TransformerConfig类确实接受的字段。

对齐推理和训练精度:开启确定性算法

由于 MoE 模型的稀疏性,推理和训练期间前向传递计算的 logits 可能会严重不对齐,导致训练不稳定。为缓解这种不稳定,强烈建议设置actor.megatron.use_deterministic_algorithms=True以禁用 Megatron 中的非确定性计算,尽管这可能使训练步骤减慢约 10-20%。

actor: megatron: use_deterministic_algorithms: True

底层实现:它到底做了什么

该开关在 areal/engine/megatron_utils/deterministic.py 的set_deterministic_algorithms中实现,核心动作包括:

  1. 配置层:将TransformerConfig.deterministic_mode=True,并关闭cross_entropy_loss_fusionbias_dropout_fusion;在prebuild=True时还会强制attention_backend=flash(flash-attention 提供确定性的 backward,而 cuDNN fused-attention 的确定性反向需要随上下文长度增长的 workspace,成本过高);
  2. 环境变量层:设置NVTE_ALLOW_NONDETERMINISTIC_ALGO=0(禁用 TransformerEngine 非确定性内核)、NCCL_ALGO=Ring(固定 all-reduce 算法)、CUBLAS_WORKSPACE_CONFIG=:4096:8
  3. PyTorch 层:调用torch.use_deterministic_algorithms(True, warn_only=True)

为什么必须"模型构建前"生效

该函数在MegatronEngine.initialize中被调用两次(megatron_engine.py 与 L680-L682):

  • 第一次以prebuild=True作用于用于构建模型的TransformerConfig:因为 TP 线性层和 TransformerEngine 模块在__init__时就会拷贝 config 标志,若不在构建前设置,层级别的 kernel 会保持非确定性;
  • 第二次作用于已构建模型的 config:覆盖 loss fusion、pipeline schedule 等运行时读取 config 的消费者。

此外,NVTE_ALLOW_NONDETERMINISTIC_ALGO若在transformer_engine导入之后再设置,某些 TE 版本会在导入时快照该值而导致不生效;AReaL 的 launcher 会在启用该开关时自动于训练进程启动前导出该变量(代码中也有对应警告日志)。

端到端示例:GSM8K + Qwen3-30B-A3B 上运行 GRPO

文档给出了一条可直接运行的命令,在 32-GPU ray 集群(4 节点 × 8 GPU)上用 Qwen3 30B-A3B MoE 模型跑 GSM8K GRPO:

# 注意:此处的分配模式仅用于说明目的,未经过优化。 python3 examples/math/gsm8k_rl.py --config <megatron_config.yaml> \ scheduler.type=ray \ experiment_name=megatron-moe-gsm8k-grpo trial_name=trial-0 \ rollout.backend=sglang:d4t4 actor.backend=megatron:(attn:d1p4t2c2|ffn:d1p4t1e4) \ cluster.n_nodes=4 cluster.n_gpus_per_node=8 actor.path=Qwen/Qwen3-30B-A3B \ actor.megatron.use_deterministic_algorithms=True

该命令的配置分布如下:

  • rollout 推理侧sglang:d4t4,即 4 个实例 × 4 TP GPU = 16 GPU;
  • actor 训练侧megatron:(attn:d1p4t2c2|ffn:d1p4t1e4),即上文 16 GPU 的注意力/专家解耦并行;
  • 总计:16 + 16 = 32 GPU,与cluster.n_nodes=4 cluster.n_gpus_per_node=8一致;
  • 确定性训练actor.megatron.use_deterministic_algorithms=True保证推理与训练 logits 对齐。

运行入口 examples/math/gsm8k_rl.py 是 GSM8K 数学任务的通用 RL 脚本,通过--config指定 YAML,并在命令行覆盖关键字段(scheduler 类型、分配模式、集群规模、模型路径等)。

参考配置文件:从单卡到 LoRA-MoE

仓库中提供了一系列可直接对照的 Megatron 配置示例:

  • examples/math/gsm8k_grpo_megatron.yaml:基础版,actor.backend: "megatron:d4p1t1"(8 卡,PP=1),模型为 Qwen2.5-1.5B-Instruct,rollout 用 SGLang(sglang:d4p1t1),ref 通过ref.backend: ${actor.backend}与 colocation 策略与 actor 共享 GPU;
  • examples/math/gsm8k_grpo_megatron_fp8.yaml:FP8 训练(megatron.fp8_config)示例;
  • examples/math/gsm8k_grpo_megatron_lora.yaml:LoRA 训练示例;
  • examples/math/gsm8k_grpo_megatron_lora_moe.yaml:Qwen3-30B-A3B +megatron-bridge+ LoRA 的完整 MoE 示例。

以 gsm8k_grpo_megatron.yaml 为例,actor段的关键字段还包括:

actor: backend: "megatron:d4p1t1" path: Qwen/Qwen2.5-1.5B-Instruct disable_dropout: true dtype: bfloat16 mb_spec: max_tokens_per_mb: 10240 # 单 micro-batch 最大 token 数 optimizer: type: adam lr: 3e-6 lr_scheduler_type: constant gradient_clipping: 1.0 warmup_steps_proportion: 0.001 use_decoupled_loss: true # 解耦式 RL 损失 recompute_logprob: true scheduling_spec: - task_type: worker port_count: 2 gpu: 1 cmd: python3 -m areal.infra.rpc.rpc_server

其中scheduling_spec定义了训练 worker 的资源需求(每 worker 1 GPU、2 个端口),供调度器在集群上分配;mb_spec.max_tokens_per_mb控制 micro-batch 切分粒度,直接影响显存占用与吞吐。训练侧的并行初始化、micro-batch 切分、梯度同步等均由MegatronEngine统一接管。

从源码理解 MegatronEngine 的初始化关键链

如果你要基于 Megatron 后端做二次开发或排查问题,以下调用链值得关注(均在 areal/engine/megatron_engine.py):

  1. 并行组初始化create_process_group(L409-L455)→mpu.initialize_model_parallel(...),按tp-cp-ep-dp-pp的顺序建立 Megatron 并行状态,并对子通信组做 eager warmup(warmup_process_groups),避免与同驻(colocated)引擎的惰性初始化竞争;
  2. 模型与 bridge 构建initialize(L493-L714)→_build_hf_mcore_bridge(L782-L895)按bridge_type分派到 mbridge 或 megatron-bridge;随后make_hf_and_mcore_config生成 HF 与 MCore 双份 config,configure_pipeline_layer_splits依据 PP 策略切分层;
  3. 确定性开关:模型构建前set_deterministic_algorithms(tf_config, prebuild=True),构建后再执行一次覆盖运行时消费者(见上文);
  4. 权重加载_load_model_from_hf从 HF checkpoint 加载权重;若启用 FP8,还会清除 TE 参数上随机的high_precision_init_val(避免 distributed optimizer 用随机初值初始化主参数,见 L637-L659);
  5. 优化器与调度器_create_optimizer创建 Megatron 优化器与OptimizerParamScheduler,并将 optimizer 的 loss scale 函数接回 MTP / MoE aux-loss 的梯度缩放(_set_optimizer_grad_scale_func,L716-L733),保证 FP16 反缩放不会让辅助损失梯度失真。

对应地,MegatronCheckpointManager(areal/engine/megatron_utils/checkpointer.py)承担 Megatron 格式 checkpoint 的分布式保存/加载,支持异步保存以降低大 MoE checkpoint 的同步等待。

小结与最佳实践建议

场景推荐配置
首次从 FSDP 迁移仅改actor.backend: "megatron:...",其余保持默认
大型 MoE(如 30B-A3B)混合语法megatron:(attn:...\|ffn:...)解耦注意力/专家并行,配合 EP
训练稳定性actor.megatron.use_deterministic_algorithms=True(注意约 10-20% 减速)
新模型架构 / LoRAactor.megatron.bridge_type: megatron-bridge
磁盘权重广播 / tree-attention保留默认mbridge

一句话总结:在 AReaL 中使用 Megatron 训练大型 MoE 模型,核心就是"一行切后端、按需选 Bridge、混合语法做并行、确定性开关保稳定",其余训练流程(GRPO/PPO/DPO 等)与 FSDP 路径完全一致,均由统一的TrainEngine接口屏蔽差异。

【免费下载链接】AReaLThe RL Bridge for LLM-based Agent Applications. Made Simple & Flexible.项目地址: https://gitcode.com/GitHub_Trending/are/AReaL

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询