LoRA、QLoRA是什么
一:
LoRA(Low-Rank Adaptation,低秩适应)是一种高效的大模型参数微调技术,由Meta在2021年提出。它通过冻结预训练模型参数,仅训练少量新增的低秩矩阵,大幅减少了需要训练的参数量,同时保持接近全参数微调的效果。
为什么需要LoRA?
传统的全参数微调(Fine-tuning)需要更新大型语言模型的所有参数(如GPT-3有1750亿参数),这带来两个核心问题:
- 计算资源需求极高:需要大量GPU内存和长时间训练。
- 容易过拟合:对于小数据集,全参数微调可能导致模型忘记预训练知识(灾难性遗忘)。
而LoRA通过只训练少量新增参数,解决了这些问题。
LoRA的核心原理
LoRA的核心思想是:用两个低秩矩阵的乘积代替传统的权重更新矩阵。
对于预训练模型中的权重矩阵 W 0 W_0 W0(通常维度很高,如768×768),LoRA不直接更新它,而是添加一个可训练的分解矩阵:
W = W 0 + Δ W = W 0 + B ⋅ A W = W_0 + \Delta W = W_0 + B \cdot A W=W0+ΔW=W0+B⋅A
其中:
- B B B 和 A A A 是两个低秩矩阵,秩为 r r r(通常 r ≪ 维度 r \ll \text{维度} r≪维度,如 r = 8 r=8 r=8 或 r = 16 r=16 r=16)。
- A A A 是随机初始化的矩阵, B B B 初始化为零矩阵。
- 只有 B B B 和 A A A 需要训练, W 0 W_0 W0 保持冻结。
LoRA的优势
-
参数量显著减少:
- 对于13B参数的CodeLlama模型,全参数微调需要训练130亿参数;
- 而LoRA只需要训练约0.5%的参数(例如 r = 8 r=8 r=8 时,仅需约650万参数)。
-
内存和计算效率提升:
- 训练时GPU内存需求降低,可使用更小的GPU训练大模型。
- 推理时不需要额外内存,因为LoRA权重可以与原始权重合并。
-
训练速度加快:
- 由于需要计算梯度的参数大幅减少,训练速度显著提升。
-
可并行训练多个任务:
- 可以为不同任务保存不同的LoRA权重,共享同一个预训练模型。
在你的代码中的应用
在你提供的代码中,LoRA的配置如下:
train_args = {"finetuning_type": "lora", # 使用LoRA微调"lora_target": "q_proj,v_proj", # 只对Attention层的query和value投影矩阵应用LoRA"lora_rank": 64, # 低秩矩阵的秩r"lora_alpha": 32, # 缩放因子,用于调整LoRA权重的大小
}
这意味着代码只会微调模型中Attention层的query和value投影矩阵,使用秩为64的低秩分解,从而大幅降低训练成本。
LoRA vs 全参数微调
对比项 | 全参数微调 | LoRA微调 |
---|---|---|
训练参数量 | 所有参数(如13B) | 仅LoRA参数(如650K) |
GPU内存需求 | 高(需保存所有梯度) | 低(仅保存LoRA梯度) |
训练时间 | 长 | 短 |
模型效果 | 可能更好(数据充足时) | 接近全参数微调 |
多任务支持 | 需要为每个任务保存完整模型 | 共享预训练模型,仅保存LoRA权重 |
总结
LoRA是一种轻量级微调技术,特别适合在资源有限的情况下微调大型语言模型。通过冻结预训练权重并引入低秩适应矩阵,LoRA在大幅减少训练成本的同时,保持了接近全参数微调的效果。这使得即使是个人开发者也能在消费级GPU上微调13B甚至更大的模型。
QLoRA(Quantized Low-Rank Adaptation)是LoRA的升级版,由Meta在2023年提出。它通过量化预训练模型权重(如将权重压缩至4位或更少)并结合LoRA微调,进一步降低了大模型微调的资源门槛,让普通人也能在消费级GPU上微调百亿级参数模型。
二:
QLoRA的核心创新
1. 4位量化预训练模型
- 传统LoRA:虽然只训练少量LoRA参数,但预训练模型权重仍需以FP16(16位浮点)或BF16(Brain Floating Point)格式存储,占用大量内存。例如,13B参数模型需约26GB显存。
- QLoRA:将预训练模型权重压缩至4位(仅需约3.25GB),同时引入双量化技术进一步减少量化误差,几乎不损失模型性能。
2. Paged Optimizers
- 设计了特殊的优化器,解决量化模型训练时的内存碎片问题,大幅减少内存峰值。
3. 高秩适应
- 支持更高的LoRA秩(如 r = 64 r=64 r=64 或 r = 128 r=128 r=128),在低精度下仍能保持良好的表达能力。
QLoRA的优势
-
显存需求极低:
- 13B模型只需约7GB显存即可微调(相比传统LoRA的26GB)。
- 70B模型可在单张48GB GPU上微调(传统方法需多张A100)。
-
接近全参数微调的效果:
- 在多个基准测试中,QLoRA微调的模型性能接近甚至超过全参数微调的结果。
-
训练效率提升:
- 由于权重存储量减少,内存带宽压力降低,训练速度略有提升。
QLoRA vs LoRA
对比项 | LoRA | QLoRA |
---|---|---|
预训练模型精度 | FP16/BF16 (16位) | 4位量化 |
13B模型显存需求 | ~26GB | ~7GB |
70B模型显存需求 | ~140GB | ~18GB |
参数量 | 仅LoRA参数 | 仅LoRA参数(量化权重不占训练内存) |
硬件要求 | 需要高端GPU(如A100) | 可在消费级GPU(如RTX 4090)上运行 |
在你的代码中如何使用QLoRA?
如果要将你的代码从LoRA切换到QLoRA,需要:
-
安装额外依赖:
pip install bitsandbytes # 用于权重量化
-
修改训练参数:
from transformers import BitsAndBytesConfig# 配置4位量化 quantization_config = BitsAndBytesConfig(load_in_4bit=True, # 加载4位量化模型bnb_4bit_compute_dtype=torch.bfloat16, # 计算精度bnb_4bit_use_double_quant=True, # 双量化bnb_4bit_quant_type="nf4", # 量化类型 )train_args = {"model_name_or_path": "codellama/CodeLlama-13b-Instruct-hf","quantization_config": quantization_config, # 添加量化配置"do_train": True,"finetuning_type": "lora","lora_target": "q_proj,v_proj",# 其他参数保持不变... }
QLoRA的局限性
- 初始加载时间较长:量化模型需要额外时间加载和准备。
- 特定硬件依赖:需要GPU支持BF16或FP16计算(大多数现代GPU都支持)。
- 极端低精度可能影响性能:在某些任务上,4位量化可能略微降低模型表现,但通常影响较小。
总结
QLoRA是当前最先进的大模型微调技术之一,它通过量化预训练权重+LoRA微调的组合,将百亿级参数模型的微调门槛降低到消费级硬件水平。对于个人开发者或资源有限的团队,QLoRA是实现低成本、高效率模型微调的理想选择。