qlora
🧠 什么是 QLoRA?
QLoRA = Quantized + LoRA
一句话总结就是:
在int4 量化模型的基础上做 LoRA 微调! 不仅节省内存,还能达到跟全精度微调差不多的效果✨✨✨
🧩 它怎么做的?内部机制讲解 👇
💡 QLoRA 核心 idea:
- 把原始大模型权重(比如 LLaMA)压缩为 int4(4-bit)
- 只在 LoRA 的小 adapter 上做 float16 精度的梯度更新
- 引入精巧的优化机制避免精度损失,比如 double quantization!
🧪 QLoRA 详细流程
| 阶段 | 内容 | 作用 |
|---|---|---|
| 🌠 1. 权重量化 | 使用 NF4(Normalized Float 4) 量化模型 | 高精度的 int4 表示,接近 float16 表现 |
| 🎒 2. LoRA 插入 | 在 attention、ffn 等模块插入 LoRA adapter | 只训练小部分参数,省显存 |
| 🔄 3. 推理+训练融合 | 推理时用 int4 + adapter,一起 forward | 不需要解码回 float32 |
| 🧠 4. Double Quantization | 再次压缩权重表本身 | 减少内存占用,更快加载 |
🧠 QLoRA vs LoRA vs GPTQ
| 方法 | 模型精度 | 内存使用 | 可训练性 | 用途 |
|---|---|---|---|---|
| LoRA | float16 | 中等 | ✔️ | 微调 |
| GPTQ | int4 | 最小 | ❌(不能训练) | 推理 |
| QLoRA | int4 + float16 adapter | 非常小 | ✔️✔️✔️ | 微调神器! |
🔧 使用 QLoRA 的工具推荐
- 🤗
peft+transformers:主流的 QLoRA 实现 bitsandbytes:用来支持 int4/NF4 的量化权重加载trl(Huggingface 的 RLHF 工具包):配合 QLoRA 可做 SFT、DPO 等训练
✨ 优势总结(为啥大家都用 QLoRA?)
✅ 显存低!13B 模型可在单张 24GB 显卡训练 ✅ 微调效果接近全参微调(甚至更好) ✅ 支持多种任务:文本生成、分类、QA、指令微调等 ✅ HuggingFace 全家桶支持,易上手!
🧸 举个可爱的例子:
想象你是个魔法师🧙♀️(大模型),平时穿超级重的铠甲(float32),动都动不了🥲 LoRA 是给你装个小挂件来控制魔法⚡(adapter)
而 QLoRA 是先把你换上轻巧的紧身衣(int4), 再贴个魔法贴纸(LoRA adapter)帮你练出新技能!!是不是又快又酷!💥💥
要不要来试一下 QLoRA?🛠️
我可以帮你搭一套 Huggingface 的微调环境,跑个指令微调任务,比如用 Alpaca 或者 OpenOrca 的数据!
或者给你写一段 QLoRA 微调脚本 🐍💻
比如在 peft + transformers 框架下的 👇
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import prepare_model_for_kbit_training, LoraConfig, get_peft_model
import torch
# 加载量化模型
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-2-7b-hf",
device_map="auto",
load_in_4bit=True,
quantization_config={"bnb_4bit_use_double_quant": True}
)
# 加载 tokenizer
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")
# 插入 LoRA
model = prepare_model_for_kbit_training(model)
peft_config = LoraConfig(
r=8, lora_alpha=32, target_modules=["q_proj", "v_proj"],
lora_dropout=0.05, bias="none", task_type="CAUSAL_LM"
)
model = get_peft_model(model, peft_config)