大模型微调之LoRA
1 大模型微调的动机
对于在开源大模型的基础上进行修改,创建可自用的大模型用于自定义的对话/翻译/推理/做题等业务,微调都是一个绕不开的研究方向。此外,由于个人的经济能力限制,可具备的计算资源也是有限的,且普通机箱的显卡槽位为1个,通常为单张RTX 4090 (24 GB显存)。而4卡槽/6卡槽工作站的显存可达到96 GB - 288GB (采用单张 24 GB 或 单张 48 GB 的显卡,型号包括90系,或A5000/A6000)。上述配置想开发自己的大模型的周期过长,且取得的效果也是有限的,此外目前开源社区 (huggingface 、魔搭社区 和 GitHub) 中也存在大量的不同规格的开源大模型,如 (LLaMA 系列、通义千问 系列 等) 。以通义千问为例,各尺寸模型的微调所需计算资源如下:
微调方法名称 | 方法类别 | 精度 | 7B | 13B | 30B | 72B | 110B |
---|---|---|---|---|---|---|---|
FULL | 全参数微调 | AMP | 120 GB | 240 GB | 600 GB | 1200 GB | 2000 GB |
FULL | 全参数微调 | 16 bit | 60 GB | 120 GB | 300 GB | 600 GB | 900 GB |
Freeze | 部分参数微调 | 16 bit | 20 GB | 40 GB | 80 GB | 200 GB | 360 GB |
LoRA/GaLore/BAdam | 部分参数微调 | 16 bit | 16 GB | 32 GB | 64 GB | 160 GB | 240 GB |
QLoRA | 部分参数微调 | 8 bit | 16 GB | 32 GB | 64 GB | 160 GB | 240 GB |
QLoRA | 部分参数微调 | 4 bit | 10 GB | 20 GB | 40 GB | 80 GB | 140 GB |
QLoRA | 部分参数微调 | 2 bit | 4 GB | 8 GB | 16 GB | 24 GB | 48 GB |
如上表所示,全参数微调所需的计算资源仍然较大,但低精度微调的准确度又较低,因此选取较中间的部分参数微调方式,如LoRA (16 bit),可一定程度上达到精度与计算资源的平衡。本文就将结合原文介绍部分参数微调领域的经典方法: LoRA。
2 微调方法背景介绍
该论文的原文为:
LoRA: Low-Rank Adaptation of Large Language Models
如论文[1]题目所示,LoRA是 Low-Rank Adaptation 的简写,意为低秩自适应。动机为下列假设:
过参数化模型实际上存在于较低的内生性纬度中,在模型参数微调时,若假设其过参数化模型也存在于较低纬度中,则可通过仅对这些纬度进行微调,已达到可在降低计算量的并通知获取与全参数微调相同甚至更好的效果。
根据论文中的结论,使用LoRA可相对于传统方法提高3倍的训练效率。
3 论文主要内容
3.1 问题叙述
论文提出的方法是一般性的,但为了方便叙述,选定了大模型最常见的语言建模任务作为背景:
给定预训练自回归语言模型 (如 GPT,Qwen 等) P Φ ( y ∣ x ) P_\Phi(y|x) PΦ(y∣x) ,带有可训练参数 Φ \Phi Φ 。该模型中的每个下游任务 (downstream task) 由 Z = { ( x i , y i ) } i = 1 , . . . , N \mathcal{Z}=\{(x_{i},y_{i})\}_{i=1,...,N} Z={(xi,yi)}i=1,...,N 构成的数据集来表征(这里是因为大模型的数据驱动性比较强,基本是通过数据集来驱动新的模型业务),其中 x i x_{i} xi 为输入词元(input token), y i y_{i} yi 为输出词元(output token)。
在全参数微调时,上述模型可被初始化为预训练权重 Φ 0 \Phi_0 Φ0 ,并可通过最大化下列条件性语言模型并被更新为 Φ 0 + Δ Φ \Phi_0+\Delta\Phi Φ0