公司动态
用 LLaMA-Factory 微调 MoE 模型的完整操作路径
用 LLaMA-Factory 微调 MoE 模型的完整操作路径【免费下载链接】LlamaFactoryUnified Efficient Fine-Tuning of 100 LLMs VLMs (ACL 2024)项目地址: https://gitcode.com/GitHub_Trending/ll/LlamaFactory场景稠密大模型装不下MoE 却能跑用 LLaMA-Factory 微调大模型时稠密 20B 以上的模型在单卡上基本无解但 Qwen3-235B-A22B 这类 MoE 模型是另一个故事总参数 235B前向时只激活 22B 量级的专家计算量接近稠密 22B 模型。这就是 MoE 微调最典型的使用场景——参数规模拉满算力成本可控。LLaMA-Factory 对 MoE 的路由损失、ZeRO-3 兼容性都有原生处理你只需要在常规 LoRA 配置上多写几行。MoE 的路由和辅助损失到底在做什么把 MoE 想成一家银行FFN 不再是一个窗口办所有事的大柜台而是并排坐着一排专家前面站一个路由router。每个 token 进来路由只把它派给最合适的 top-k 个专家其余专家这次不干活——参数很多但每次只算一小部分。说白了这套机制有个隐藏风险路由本身是训练出来的参数放任不管它会把 token 集中派给少数几个专家造成负载失衡有的专家饿死。标准做法是加一项辅助损失惩罚这种失衡权重由moe_aux_loss_coef控制这是 LLaMA-Factory 暴露给你的唯一 MoE 专属参数默认None即完全不启用。一旦你填了数值moe.py 会自动帮你打开output_router_logits、把系数写入模型配置的router_aux_loss_coef并在 DeepSpeed ZeRO-3 下把 MoE block 注册为 leaf module——ZeRO-3 不会拆分块内参数避免专家参数上反复 all-gather 的通信开销。已适配的模型包括 Mixtral、Qwen2/3-MoE、DeepSeek、Llama4、Olmoe 等常见架构。⚡ 一条完整路径装环境、写配置、跑通第一次环境要求一行带过Python 3.11、PyTorch 2.4CUDA或 NPU/ROCm环境多卡用 ZeRO 的话再装 DeepSpeed。git clone https://gitcode.com/GitHub_Trending/ll/LLaMA-Factory cd LLaMA-Factory pip install -e .配置只贴影响结果的几行存为examples/train_lora/qwen3moe_lora_sft.yamlmodel_name_or_path: Qwen/Qwen3-235B-A22B-Instruct-2507 # MoE 基座模型 stage: sft do_train: true finetuning_type: lora lora_rank: 8 # 官方示例用的秩够用 lora_target: all dataset: alpaca_en_demo # 仓库自带示范数据 template: qwen3 cutoff_len: 2048 moe_aux_loss_coef: 0.01 # 路由辅助损失防专家负载失衡 max_steps: 2000关于moe_aux_loss_coef多说一句常见的起始区间在 0.001–0.01 之间具体以实际版本和训练曲线为准先给 0.01 再往下调是稳妥的。# 单卡先跑通 llamafactory-cli train examples/train_lora/qwen3moe_lora_sft.yaml # 多卡省显存加 ZeRO-3 llamafactory-cli train examples/train_lora/qwen3moe_lora_sft.yaml \ --deepspeed examples/deepspeed/ds_z3_config.json跑通后你会看到saves/目录下出现 LoRA 权重和trainer_state.json在配置里加上plot_loss: true还能直接生成 loss 曲线图。损失平稳下降、没有 NaN第一次就算成了。关键参数速查参数作用推荐区间moe_aux_loss_coef路由辅助损失权重0.001–0.01从 0.01 起步以实际版本为准per_device_train_batch_size单卡批次1–2OOM 就降到 1gradient_accumulation_steps等效批次4–8learning_rate学习率1e-5–1e-4LoRA 场景 按需进阶三条显存和并行的路如果你需要多卡省显存上面已经给了 ZeRO-3 的跑法补充取舍双卡且显存够用时ds_z2_config.json通常更快因为 MoE block 在 ZeRO-3 下虽不被拆分但其余参数的通信开销仍然存在显存实在不够再切ds_z3_offload_config.json把优化器状态卸载到 CPU代价是速度下降。如果你需要真正的专家并行235B 级别就算 ZeRO-3 在 8 卡上也偏紧可以启用 FSDPTurbo 插件做专家并行EP 专家参数分片EFSDP在训练配置里写dist_config: name: fsdpturbo ep_size: 16 # 专家并行组大小需整除 dp_size边界要清楚该插件目前内置注册了qwen3_moe和qwen3_5_moe两个模型规格未注册的模型会直接报错而不是静默忽略这是刻意设计避免配置与模型结构失配。如果你只有一台工作站ZeRO-3 offload 都塞不下的场景还有 KTransformers专家权重量化后放 CPUGPU 只保留当前激活的部分仓库示例用它跑 Qwen3-235B MoE 的 LoRA 微调use_kt: true # 启用 KTransformers 加速完整配置可以参考 qwen3moe_lora_sft_kt.yaml示例里用gradient_accumulation_steps: 8抵消单卡 batch 只能为 1 的问题。 排障速查现象大概率原因最小改动专家负载长期失衡辅助损失居高不下moe_aux_loss_coef偏小从 0.001 提到 0.01训练中途 CUDA OOMbatch 或序列长度过大per_device_train_batch_size: 1gradient_accumulation_steps: 8新 MoE 模型下 ZeRO-3 吞吐骤降模型类型未注册 leaf moduletransformers 版本旧升级 transformers或临时换ds_z2_config.jsonfsdpturbo明确报错模型不在内置注册表仅 qwen3_moe / qwen3_5_moe换已注册模型或回退普通 FSDP2慢但显存够用梯度检查点未关、未开 flash-attndisable_gradient_checkpointing: trueflash_attn: fa2收尾到这里你有了 MoE 路由损失的工作机制、一条从装环境到跑通的 LoRA 微调路径以及省显存、专家并行、单机工作站三条进阶路线。想继续深挖并行分片的内部实现可以看docs/zh/advanced/distributed/fsdpturbo-ep-efsdp.md想确认 ZeRO-3 leaf 注册支持哪些模型直接翻 moe.py 里的模型类型列表即可。【免费下载链接】LlamaFactoryUnified Efficient Fine-Tuning of 100 LLMs VLMs (ACL 2024)项目地址: https://gitcode.com/GitHub_Trending/ll/LlamaFactory创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考