用 LLaMA-Factory 微调大模型时,显存总是第一道关卡。全参数微调效果确实好,但即便 7B 模型也要近 20GB,13B 直奔 40GB,一般人消费不起。LoRA 和 Adapter 之类的方法就是在参数量和效果之间找平衡。理解它们背后的设计,能在配置时少走弯路。
常用方法显存参考
| 方法/模型 | 7B 模型 | 13B 模型 | 32B 模型 |
|---|---|---|---|
| 全参数微调 | ~20GB | ~40GB | ~100GB |
| LoRA(rank=8) | ~12GB | ~20GB | ~50GB |
| Adapter | ~15GB | ~25GB | ~60GB |
这些数值只是大致参考,实际显存还会被 batch size、序列长度、是否用混合精度等因素影响。所以我习惯先跑一个小规模测试,再根据 nvidia-smi 的反馈调参。
LoRA 与 Adapter 的数学直觉
LoRA(Low-Rank Adaptation)基于一个很直接的观察:模型适应新任务时,权重变化 ΔW 往往是低秩的。于是可以用两个小矩阵 B 和 A 的乘积来近似:
ΔW = BA 其中 B ∈ R^{d×r}, A ∈ R^{r×k}, r ≪ min(d,k)
这样一来,可训练参数从 d×k 降到了 r×(d+k),对显存和计算量都是巨大节省。LLaMA-Factory 里调整 lora_rank 就是在控制这个 r,一般从 8 开始试。
Adapter 的思路更直白:在 Transformer 的子层之间插入小的瓶颈网络,只训练这些新增参数,原模型参数冻住。它的结构是:
h ← h + W_down(W_up(h))
W_down 把维度从 d 降到 r,W_up 再升回来,r 就是瓶须维度。因为原模型不动,部署时还能动态切换不同任务的 adapter,灵活性不错。
基础配置与显存优化
LLaMA-Factory 里启用 LoRA 很简单,在 train.json 里指定:
{
"method": "lora",
"lora_rank": 8,
"batch_size": 4,
"max_length": 512
}
rank 调低能省显存,但太小了可能影响效果,我一般从 8 开始,如果显存还紧张就减到 4 试试。batch_size 和 max_length 对显存影响巨大,尤其长文本任务,max_length 别设得太大,除非真的需要。
另一个省显存的大头是 DeepSpeed。LLaMA-Factory 支持直接挂 DeepSpeed 配置:
deepspeed --num_gpus=1 train.py --deepspeed ds_config.json

