最近,我深入研究了用 LoRA 和 QLoRA 进行指令微调,经过几次实验,收获颇丰。我把一些发现和大家分享,希望能对你们有所帮助。
-
LoRA 的秩设置:如果你觉得秩越高模型就会越好,那你错了。高秩会导致过拟合,在大多数情况下,较低的秩(r=8/16)就足够了。
-
Dropout 并不万能:很多人认为在 LoRA 适配器中添加 dropout 能防止过拟合,但事实证明,这并不有效,反而可能会拖累性能。
-
适配器的位置:在模型的所有线性层中添加 LoRA 适配器,能带来最好的性能提升。
-
学习率计划:调整学习率非常关键。恒定的学习率计划和较短的预热期(例如,迭代次数的 2%-5%)效果最佳。余弦衰减的学习率计划并没有显著提高性能,有时还会加重过拟合。
-
权重衰减的作用:添加小的权重衰减(例如 1e-4),有助于防止过拟合,让模型更加稳定。
-
训练周期的选择:两个训练周期通常效果最好,但超过两个周期(例如三个周期)几乎总是导致过拟合。
-
批大小的重要性:批大小决定了训练的稳定性。足够大的批大小(64 或 128)才能确保训练稳定。如果 GPU 内存不足,可以使用梯度累积。小批大小(8 或 16)会导致训练曲线混乱,甚至阻止模型收敛。
-
消费级 GPU 的局限:在消费级 GPU(如 3090)上,即使是使用较小的语言模型,使用 LoRA 进行微调也并不容易。如果你的训练数据集中的数据context过长,你很有可能会爆显存。
-
内存管理的挑战:我不确定其他软件包(如 LitGPT)是否能更好地管理内存,但在 4090 GPU 上用 bfloat16 格式对 7B(8B,9B) 模型进行 LoRA 微调并非易事,这确实出乎我的意料。
-
CompShare平台白嫖算力:Compshare平台目前提供免费的试用。注册和实名完成后可以获得20元的余额。这个平台4090的价格为2.6元每小时,有独立的ip,自动加速github和huggingface(适合小白)。