LLaMAFactory Megatron的加速(3)参数解释
2026-01-09
LLaMA-Factory
00

目录

LlamaFactory 中 Megatron 启动原理和超参数详解
1. Megatron 的启动原理
2. Megatron 对三个部位训练的支持
3. 基础 Megatron 超参数详解
4. MoE 模型额外超参数详解
推荐配置策略

LlamaFactory 中 Megatron 启动原理和超参数详解

根据代码分析,我为您详细解答这些问题。

1. Megatron 的启动原理

在 LlamaFactory 中,Megatron 通过 MCA (Megatron Core Adapter) 集成。

启动流程如下:

核心文件:

  • src/train.pysrc/llamafactory/train/tuner.py
  • src/llamafactory/train/mca/workflow.py

启动机制:

bash
展开代码
USE_MCA=1 llamafactory-cli train examples/megatron/qwen3_moe_full.yaml

代码路径 (tuner.py:69-83):

python
展开代码
if finetuning_args.stage in ["pt", "sft", "dpo"] and finetuning_args.use_mca: if not is_mcore_adapter_available(): raise ImportError("mcore_adapter is not installed...") if finetuning_args.stage == "sft": from .mca import run_sft as run_sft_mca run_sft_mca(model_args, data_args, training_args, finetuning_args, callbacks)

当设置 USE_MCA=1 时,系统会:

  • 使用 mcore_adapter.models.AutoModel.from_pretrained() 加载模型(而非 HF 的 AutoModel)
  • 使用 McaTrainer 替代标准的 Trainer
  • 启用 Megatron-Core 的并行化机制

2. Megatron 对三个部位训练的支持

完全支持!workflow.py:164-179 中实现了针对 Qwen2-VL / Qwen3-VL 的冻结逻辑:

python
展开代码
if getattr(model.config, "hf_model_type", None) in ["qwen2_vl", "qwen2_5_vl", "qwen3_vl"]: params_to_freeze = [] if finetuning_args.freeze_vision_tower: params_to_freeze.extend(["vision_model.blocks", "vision_model.patch_embed"]) if finetuning_args.freeze_multi_modal_projector: params_to_freeze.extend(["multi_modal_projector"]) if finetuning_args.freeze_language_model: params_to_freeze.extend(["embedding", "decoder", "output_layer"]) if params_to_freeze: for name, p in model.named_parameters(): if any(name.startswith(k) for k in params_to_freeze): p.requires_grad_(False)

您的配置完全有效:

yaml
展开代码
freeze_vision_tower: false # 训练视觉编码器 freeze_multi_modal_projector: false # 训练投影层 freeze_language_model: false # 训练语言模型

3. 基础 Megatron 超参数详解

参数设置含义与说明
tensor_model_parallel_size1张量并行度(在单个 Transformer 层内部切分权重矩阵)
原理:将每个注意力头、FFN 等矩阵按列或行切分到多个 GPU。
如何设置
• 单机多卡(同一节点内高速互联):2/4/8(需是 GPU 数的因子)
• 跨节点:不建议使用,通信开销大
您的场景:1(不使用 TP)是合理的
pipeline_model_parallel_size1流水线并行度(按层切分模型)
原理:将模型的层分成 N 段,分配到 N 个 GPU,形成流水线。
如何设置
• 计算公式:PP * TP * DP = 总GPU数
• 推荐值:2/4/8(层数必须能被 PP 整除)
您的场景:1(不使用 PP)
sequence_parallelfalse序列并行(沿序列长度维度并行)
前提:必须启用 tensor_model_parallel_size > 1
作用:减少激活内存占用。
您的场景:false(因为 TP=1)
bias_activation_fusiontrue融合 bias 加法和激活函数操作
效果:减少 kernel 启动次数,提升约 5-10% 速度。
建议:始终设为 true。
apply_rope_fusiontrue融合 RoPE 位置编码计算
效果:优化位置编码的计算效率。
建议:始终设为 true。
use_distributed_optimizertrue分布式优化器状态
原理:将优化器状态(如 Adam 的 momentum)分片存储。
效果:显著降低显存占用(约 33% 优化器内存)。
建议:多卡训练时必须 true。

4. MoE 模型额外超参数详解

您的 MoE 配置新增了 5 个参数:

参数设置含义与说明
overlap_param_gathertrue参数收集与计算重叠
原理:在 DDP/FSDP 中,提前开始下一层的参数 all-gather。
效果:隐藏通信延迟,提升 10-15% 吞吐。
建议:始终 true。
overlap_grad_reducetrue梯度规约与反向传播重叠
原理:边计算梯度边进行 all-reduce 通信。
效果:隐藏通信延迟。
建议:始终 true。
moe_grouped_gemmtrueMoE 专家使用分组矩阵乘法
原理:将多个专家的 GEMM 操作合并成一次调用。
效果:大幅提升 MoE 计算效率(30-50%)。
建议:MoE 模型必须 true。
moe_token_dispatcher_typealltoallToken 分发到专家的通信策略
可选值
alltoall: All-to-All 通信(标准方式)
allgather: All-Gather 通信(备选)
如何选择
• 专家并行 > 1:使用 alltoall(您的场景)
• 专家并行 = 1:使用 allgather
expert_model_parallel_size2专家并行度(将 64 个专家分配到 2 个 GPU 组)
原理:每个 GPU 组负责 32 个专家。
约束EP * TP * PP <= 总GPU数
如何设置
• 专家数多:设为 2/4/8
您的场景(Qwen3-30B-A3B,3 个激活专家)
expert_model_parallel_size: 2 是合理的。
总并行:EP(2) * PP(4) = 8 GPUs
recompute_granularityfull重计算粒度(牺牲速度换显存)
可选值
null: 不重计算
selective: 选择性重计算(如激活函数)
full: 完整重计算整个 Transformer 块
效果:full 可节省 50% 激活内存,但慢 20-30%。
建议
• 显存充足:nullselective
• 显存不足:full

推荐配置策略

8 卡场景(您的 MoE 配置):

yaml
展开代码
# 全局批次大小 = (8 GPU / EP(2) / PP(4)) * bs(1) * acc(8) = 8 tensor_model_parallel_size: 1 # 不用TP,避免通信开销 pipeline_model_parallel_size: 4 # 4段流水线 expert_model_parallel_size: 2 # 专家分2组 # 数据并行度自动 = 8 / (1 * 4 * 2) = 1 sequence_parallel: false # TP=1时必须false bias_activation_fusion: true # 必开 apply_rope_fusion: true # 必开 use_distributed_optimizer: true # 必开 overlap_param_gather: true # 必开 overlap_grad_reduce: true # 必开 moe_grouped_gemm: true # MoE必开 moe_token_dispatcher_type: alltoall # EP>1时用alltoall recompute_granularity: full # 显存紧张时用full

如果只有 4 卡:

yaml
展开代码
tensor_model_parallel_size: 1 pipeline_model_parallel_size: 2 # 改为2 expert_model_parallel_size: 2 # 保持2 # 其他参数不变

如果显存充足(如 H100 80GB):

yaml
展开代码
recompute_granularity: selective # 改为selective提速 pipeline_model_parallel_size: 2 # 减少PP提速

参考资料:

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!