尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

LLaMA-Factory MoE训练:从OOM到稳定收敛

LLaMA-Factory MoE训练:从OOM到稳定收敛 LLaMA-Factory MoE训练从OOM到稳定收敛【免费下载链接】LlamaFactoryUnified Efficient Fine-Tuning of 100 LLMs VLMs (ACL 2024)项目地址: https://gitcode.com/GitHub_Trending/ll/LlamaFactory从一个真实的显存告警说起夜里跑 LLaMA-Factory 的 MoE 训练7B 混合专家模型第一次全参数微调在单卡 A100 上第 23 步直接 OOM损失曲线刚画了二十步。同样配置的 dense 7B 在这张卡上是正常跑的差别不在 batch而在专家权重MoE 的全部专家都躺在参数表里稀疏激活省的是计算不是加载。换成 LoRA 加单样本梯度累积配合路由辅助损失开关显存才回到可控区间。下面是这套从故障里抠出来的可运行配置以及后续排查路径。⚡ 快速跑通最小可用配置把下面配置存为qwen2_moe_lora_sft.yaml这是一套单卡即可启动的 MoE 指令微调基线### model model_name_or_path: Qwen/Qwen2-MoE-7B-Instruct # 混合专家结构参数大而激活稀疏 trust_remote_code: true moe_aux_loss_coef: 0.01 # 路由辅助损失系数缺失时专家塌缩没有任何约束 ### method stage: sft do_train: true finetuning_type: lora lora_rank: 16 lora_target: all # 专家FFN是容量增长主力只挂注意力投影会漏掉它 ### dataset dataset: alpaca_en_demo template: qwen # 必须与模型官方对话模板一致否则分词错位 cutoff_len: 2048 max_samples: 1000 ### output output_dir: saves/qwen2-moe/lora/sft logging_steps: 10 save_steps: 500 plot_loss: true ### train per_device_train_batch_size: 1 gradient_accumulation_steps: 8 # 用累积模拟有效batch峰值显存只按1条样本算 learning_rate: 2.0e-4 lr_scheduler_type: cosine warmup_ratio: 0.1 bf16: true启动命令一行llamafactory-cli train qwen2_moe_lora_sft.yaml这套配置能跑起来的原因很直接LoRA 让可训练参数只剩适配器单样本前向把峰值显存压到最小区间而moe_aux_loss_coef一旦被显式设置框架会自动打开路由 logit 输出并把系数注入模型配置辅助损失开始生效。️ 配置逐项拆解每个参数背后的取舍MoE 模型的路由与 ZeRO-3 兼容逻辑集中在 MoE 实现理解它之后再回头看下面三组参数取舍就清楚了。模型层MoE 专用开关只有一个但它是整个训练的护栏。参数名本文取值选择理由常见误区moe_aux_loss_coef0.01平衡专家路由负载低于 0.005 少数专家会塌缩高于 0.02 辅助损失反噬主任务留空不报错但路由 logit 不输出辅助损失静默失效trust_remote_codetrueMoE 结构迭代快依赖官方远程代码保证路由模块正确加载假设主仓库已内置所有新模型类型踩坑不写moe_aux_loss_coef时训练一切正常但专家负载失衡没有任何约束机制训到后期才发现某些能力域明显退化回滚代价远高于早配。方法层显存预算决定了 MoE 微调几乎只能走 LoRA。参数名本文取值选择理由常见误区finetuning_typelora全部专家权重都在显存预算里LoRA 只更新适配器单卡硬上全参数第 23 步 OOMlora_targetall专家 FFN 承载主要容量增长只挂注意力投影等于白训照搬 dense 惯例写q_proj,v_projlora_rank16专家数量多且彼此独立rank 8 常欠拟合32 以上单卡收益有限盲目堆到 64 吃显存踩坑lora_target只写q_proj,v_proj是最常见的错误MoE 的收益恰恰在专家层注意力投影贡献有限。训练层MoE 的单样本显存峰值高于同规模 dense 模型batch 策略要反过来想。参数名本文取值选择理由常见误区per_device_train_batch_size/gradient_accumulation_steps1 / 8峰值显存按单样本计算用累积换有效 batch把 batch 堆到 2 求速度OOM 提前发生learning_rate2e-4LoRA 加 bf16比 dense 7B 略高以补偿稀疏激活直接抄全参数的 1e-5踩坑bf16 加默认梯度检查点已足够不必额外折腾use_reentrant之类的开关先保证基线能收敛再谈微调技巧。硬件适配从单卡 16GB 到多卡集群同一份基线配置在不同显存档位上要做不同取舍核心变量是量化、rank 与分片策略显存档位关键参数调整推荐 batch 策略预期速度≤16GBload_in_4bit: truelora_rank: 8cutoff_len: 10241 × 16 累积约 1 步/分钟7B MoE1024 长度16–48GBbf16 LoRArank 16保持默认梯度检查点1 × 8 累积约 2–3 步/分钟≥48GB 多卡ZeRO-3 或 FSDP2 分片专家参数rank 可到 32每卡 2 × 4 累积约 4–6 步/分钟跨卡近似线性多卡场景的关键不是自己手动切分专家而是依赖框架自动把 MoE 模块注册为 ZeRO-3 叶子模块避免路由参数被反复通信。参考 DeepSpeed ZeRO-3 配置 即可接入现有配置只需在 YAML 里加一行deepspeed指向该文件。 训练中的三个高频故障与排查路径故障一专家负载失衡现象特征loss 曲线看似正常但路由辅助损失长期偏高评测中特定能力域明显退化。定位手段开启plot_loss: true观察辅助损失趋势用llamafactory-cli train qwen2_moe_lora_sft.yaml --report_to tensorboard在 TensorBoard 里对比训练前后的损失分量。修复参数把moe_aux_loss_coef从 0.005 提到 0.01同时确认warmup_ratio不低于 0.1。故障二显存溢出现象特征训练中途抛torch.cuda.OutOfMemoryError或恰在保存 checkpoint 时崩溃。定位手段用nvidia-smi查看当前卡占用与进程分布只在保存时 OOM 说明是优化器状态写盘的瞬时峰值。修复参数启用 ZeRO-3llamafactory-cli train qwen2_moe_lora_sft.yaml --deepspeed examples/deepspeed/ds_z3_config.json或把cutoff_len降到 1024。故障三训练不收敛现象特征loss 长时间停在初始值或偶发 NaN 尖峰。定位手段检查output_dir下 trainer_state.json 的 loss 序列NaN 几乎总是学习率问题而非数据问题。修复参数降学习率并延长预热llamafactory-cli train qwen2_moe_lora_sft.yaml --learning_rate 1.0e-4 --warmup_ratio 0.1。进阶方向与延伸阅读单卡跑通之后有三个自然的延伸方向。多卡专家并行方面可以把专家参数经 FSDP2 分片到多张卡直接参考 FSDP2 MoE 配置多模态 MoE 方面GLM-4V-MoE、Qwen3-VL-MoE 等模型的图文处理走 多模态数据插件配置方式与纯文本一致。建议先在 Qwen2-MoE-7B 上跑通基础配置再扩展到 57B 档位引入多卡时先用 ZeRO-3 分片显存仍然吃紧再考虑专家并行。【免费下载链接】LlamaFactoryUnified Efficient Fine-Tuning of 100 LLMs VLMs (ACL 2024)项目地址: https://gitcode.com/GitHub_Trending/ll/LlamaFactory创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表