LLaMA-Factory 微调提速:3 个开关压缩 7B 模型训练时间与显存
【免费下载链接】LlamaFactoryUnified Efficient Fine-Tuning of 100+ LLMs & VLMs (ACL 2024)项目地址: https://gitcode.com/GitHub_Trending/ll/LlamaFactory
用一张 24GB 的卡微调 7B 模型,刚跑两步就爆显存,这是很多人做 LLM 微调时最常见的起点。原因不复杂:7B 参数的权重用 fp16 存储约 14GB(7×10⁹ 参数 × 2 字节),Adam 优化器的动量和方差两份状态还要再加约 56GB。LLaMA-Factory 是一个支持 100+ LLM 与多模态模型统一微调的框架(ACL 2024 论文项目),它把这些优化做成了配置文件里的开关:不用写代码,改几行配置就能让训练更快、占显存更少。
先看结论:四点了解
- 解决什么问题:LLM 微调最现实的两个瓶颈——显存不够、训练太慢,LLaMA-Factory 把应对方案打包成可勾选的配置项
- 提速:
enable_liger_kernel: true启用 Liger Kernel,把 LayerNorm、SwiGLU、交叉熵等操作融合成单个 GPU 内核(Liger Kernel 是一套专门重写过的 Transformer 计算内核) - 省显存:
bf16: true用半精度计算;梯度检查点让前向传播不保存全部中间激活值,反向传播时重算,用少量时间换显存 - 多卡扩展:
deepspeed: examples/deepspeed/ds_z3_config.json启用 ZeRO-3,把权重、梯度、优化器状态切分到多张 GPU - 适合谁:在 NVIDIA 或昇腾卡上做 SFT/DPO 等训练任务的人;纯聊天、导出模型这类推理场景不受影响
原理说人话:三种"省"
Liger Kernel 的思路类似超市"合并结账":GPU 原本要依次跑 LayerNorm、SwiGLU、交叉熵这些小操作,每次都要从显存把数据读进寄存器再写回去;融合后一次读入、一次写回,省掉的是来回搬运的时间。
梯度检查点像"菜谱写下来,食材不备齐":前向传播时只记下一部分层的输入,反向传播时把中间结果重算出来。省了大量显存,代价是多算一遍,训练时间会略增。LLaMA-Factory 另提供use_unsloth_gc选项,把中间激活值异步挪到内存(RAM)里暂存,相当于"把暂时不用的食材放冰箱",进一步省显存。
ZeRO-3 则像"大箱子拆给几个人抬":每张卡只放一部分权重和优化器状态,需要时临时组装。单卡显存放不下的模型,多卡就能跑。
| 开关 | 做什么 | 大白话 |
|---|---|---|
| enable_liger_kernel | 算子融合,减少显存读写 | 合并结账,不重复排队 |
| bf16 | 计算与存储精度减半 | 高精度换半精度 |
| 梯度检查点 | 反向传播时重算激活值 | 菜谱记下来,食材不备齐 |
| ZeRO-3 | 权重与优化器状态切分到多卡 | 大箱子拆开几个人抬 |
三步开启提速开关
安装与依赖
git clone https://gitcode.com/GitHub_Trending/ll/LlamaFactory cd LlamaFactory && pip install .再执行pip install -r requirements/liger-kernel.txt装上 Liger Kernel(仓库要求版本 ≥0.6.3)。用标准模式安装是因为所有示例配置、基准脚本都随仓库提供,装完即可用。
只改三行配置
在训练配置(YAML)中加入:
enable_liger_kernel: true bf16: true deepspeed: examples/deepspeed/ds_z3_config.json第一行管算子融合提速,第二行管半精度省显存,第三行管多卡切分状态,三者各管一件事、互不冲突,可以按需只开其中几项。
启动训练
llamafactory-cli train examples/train_lora/qwen3_lora_sft.yaml。选这个自带示例是因为它是完整的 Qwen3 LoRA SFT 配置(lora_rank: 8),跑通它就能验证整条链路没问题。
官方 README 中给出的终端操作示意:
效果验证与边界速查
提速比例不要照抄任何固定数字,因为结果随显卡、序列长度、batch size 变化。仓库自带基准脚本 scripts/bench_qwen.py:它用 Qwen2-VL-7B 构造 10000 条、序列长 1024 的模拟多模态数据,支持--liger_kernel True/False和 ZeRO-2/3 对比,你在自己的卡上跑一遍就能拿到属于自己的 A/B 数据。
以下情况不建议启用:
- 模型架构不在 Liger Kernel 支持列表内(代码确认支持 llama、mistral/mixtral、qwen2/qwen2.5-VL/qwen3、gemma2/3、glm4、phi3、olmo2 等),日志会提示 "Current model does not support liger kernel" 并自动跳过
- 非训练场景:代码在模型加载前直接检查是否处于训练阶段,聊天、导出模型不受影响
- 单卡且显存本来就够:ZeRO-3 的通信是额外负担,用 bf16 + Liger Kernel 即可
- 对训练时长极敏感:梯度检查点有重算开销,纯耗时会增加
常见踩坑速查
- 开了 Liger Kernel 却没提速:先看日志是否提示模型不支持,不支持就关掉,不要硬开
- 全参微调爆显存:先换 LoRA(参考 examples/train_lora/qwen3_lora_sft.yaml),或挂 ZeRO-3 配置;单卡场景可再启用 CPU offload
- QLoRA 量化训练 loss 不稳:仓库参数校验里明确建议量化训练时开启
upcast_layernorm,把 LayerNorm 权重升回 fp32 - use_unsloth_gc 和 enable_liger_kernel 的区别:前者把激活值挪到内存省显存,后者融合算子提速,两者互补可同开
收尾
LLaMA-Factory 把"算子融合、混合精度、检查点重算、状态切分"这四件又快又省显存的事,收敛成配置文件里的几个开关。你可以 clone 仓库,先在自己的卡上跑一遍 scripts/bench_qwen.py,得到一组真实可用的提速数据再决定开哪些开关。
【免费下载链接】LlamaFactoryUnified Efficient Fine-Tuning of 100+ LLMs & VLMs (ACL 2024)项目地址: https://gitcode.com/GitHub_Trending/ll/LlamaFactory
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考