根据代码分析,我为您详细解答这些问题。
在 LlamaFactory 中,Megatron 通过 MCA (Megatron Core Adapter) 集成。
启动流程如下:
核心文件:
src/train.py → src/llamafactory/train/tuner.pysrc/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✅ 完全支持! 在 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 # 训练语言模型
| 参数 | 设置 | 含义与说明 |
|---|---|---|
| tensor_model_parallel_size | 1 | 张量并行度(在单个 Transformer 层内部切分权重矩阵) 原理:将每个注意力头、FFN 等矩阵按列或行切分到多个 GPU。 如何设置: • 单机多卡(同一节点内高速互联):2/4/8(需是 GPU 数的因子) • 跨节点:不建议使用,通信开销大 您的场景:1(不使用 TP)是合理的 |
| pipeline_model_parallel_size | 1 | 流水线并行度(按层切分模型) 原理:将模型的层分成 N 段,分配到 N 个 GPU,形成流水线。 如何设置: • 计算公式: PP * TP * DP = 总GPU数• 推荐值:2/4/8(层数必须能被 PP 整除) 您的场景:1(不使用 PP) |
| sequence_parallel | false | 序列并行(沿序列长度维度并行) 前提:必须启用 tensor_model_parallel_size > 1。作用:减少激活内存占用。 您的场景:false(因为 TP=1) |
| bias_activation_fusion | true | 融合 bias 加法和激活函数操作 效果:减少 kernel 启动次数,提升约 5-10% 速度。 建议:始终设为 true。 |
| apply_rope_fusion | true | 融合 RoPE 位置编码计算 效果:优化位置编码的计算效率。 建议:始终设为 true。 |
| use_distributed_optimizer | true | 分布式优化器状态 原理:将优化器状态(如 Adam 的 momentum)分片存储。 效果:显著降低显存占用(约 33% 优化器内存)。 建议:多卡训练时必须 true。 |
您的 MoE 配置新增了 5 个参数:
| 参数 | 设置 | 含义与说明 |
|---|---|---|
| overlap_param_gather | true | 参数收集与计算重叠 原理:在 DDP/FSDP 中,提前开始下一层的参数 all-gather。 效果:隐藏通信延迟,提升 10-15% 吞吐。 建议:始终 true。 |
| overlap_grad_reduce | true | 梯度规约与反向传播重叠 原理:边计算梯度边进行 all-reduce 通信。 效果:隐藏通信延迟。 建议:始终 true。 |
| moe_grouped_gemm | true | MoE 专家使用分组矩阵乘法 原理:将多个专家的 GEMM 操作合并成一次调用。 效果:大幅提升 MoE 计算效率(30-50%)。 建议:MoE 模型必须 true。 |
| moe_token_dispatcher_type | alltoall | Token 分发到专家的通信策略 可选值: • alltoall: All-to-All 通信(标准方式)• allgather: All-Gather 通信(备选)如何选择: • 专家并行 > 1:使用 alltoall(您的场景)• 专家并行 = 1:使用 allgather |
| expert_model_parallel_size | 2 | 专家并行度(将 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_granularity | full | 重计算粒度(牺牲速度换显存) 可选值: • null: 不重计算• selective: 选择性重计算(如激活函数)• full: 完整重计算整个 Transformer 块效果:full 可节省 50% 激活内存,但慢 20-30%。 建议: • 显存充足: null 或 selective• 显存不足: 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提速
参考资料:


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