LoRA 的思路是把原始权重冻结,在注意力层的投影上加一对低秩矩阵 A 和 B, 只训练这两个小矩阵。rank 越大,可训练参数量越多,表达空间越大,显存和计算也随之增加。 这篇记录是单卡环境下的实测。
实验设置
24GB 显存的单卡,基座是 7B 量级的模型,使用同一份约两万条的指令数据, 分别测试 rank 为 4、8、16、32、64 的情况。保持 batch size 和学习率策略一致, 只改变 rank。
显存占用
可训练参数大致随 rank 线性增长,但训练显存的大头仍然是基座权重、梯度和激活值。 从 rank 4 到 64,优化器状态带来的增量是可见的,但没有想象中那么夸张; 真正把显存撑爆的往往是序列长度和 batch size。
效果差异
- 任务是格式对齐、风格模仿这类接近预训练分布的目标时,rank 8 和 rank 64 的差距很小。
- 领域偏移较大、需要学习新知识结构时,rank 16 到 32 才有比较明显的提升。
- rank 再往上,收益开始递减,过拟合的迹象也更早出现。
关于 gradient checkpointing
打开 gradient checkpointing 能明显降低激活值占用的显存,代价是训练速度下降大约两成到三成。 在显存吃紧时它是必要的,但如果显存够用,关掉它换速度更划算。
小结
一般先从 rank 8 或 16 开始试。如果效果不够再往上加,同时观察验证集是否开始过拟合。 不要一上来就用很大的 rank,那样既不省显存,也未必更好。