🍋🍋AI学习🍋🍋
🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。
💖如果觉得博主的文章还不错的话,请点赞👍+收藏⭐️+留言📝支持一下博主哦🤞
一、LoRA微调
✅ 核心思想
- 不更新原始大模型的所有参数(7B 参数 ≈ 14GB 显存)
- 而是在某些层(如 attention 的 Q/V 投影)插入低秩矩阵:
- 只训练 A 和 B(可减少 99%+ 可训练参数)
✅ 优势
| 项目 | 传统全参数微调 | LoRA |
|---|---|---|
| 显存占用 | 极高(需多卡) | 极低(单卡 24G 可训 70B) |
| 训练速度 | 慢 | 快 2~5 倍 |
| 存储成本 | 每个任务存完整模型 | 只存 ~100MB 的 adapter |
| 多任务切换 | 需加载不同模型 | 动态切换 LoRA 权重 |
💡适用场景:SFT、DPO、甚至部分 RLHF(策略模型)
二、准备工作
1. 环境安装(推荐使用unsloth加速)
# 基础依赖 pip install torch transformers datasets accelerate peft bitsandbytes # (可选但强烈推荐)Unsloth:加速 LoRA 训练 2~5 倍 pip install "unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git"2. 选择基础模型
- 中文推荐:
Qwen/Qwen-1.5-7B-Chat,THUDM/chatglm3-6b - 英文推荐:
meta-llama/Meta-Llama-3-8B-Instruct,mistralai/Mistral-7B-Instruct-v0.3 - 注意:不要用 base 模型做对话任务!优先选
-Instruct或-Chat版本
3. 准备 SFT 数据集(Alpaca 格式)
[ { "instruction": "将以下英文翻译成中文", "input": "The future is already here — it's just not evenly distributed.", "output": "未来已来,只是尚未均匀分布。" }, // ... 更多样本 ]三、LoRA 微调代码(Hugging Face + PEFT)
使用 Unsloth(更快更省显存)
from unsloth import FastLanguageModel model, tokenizer = FastLanguageModel.from_pretrained( model_name="Qwen/Qwen-1.5-7B-Chat", max_seq_length=2048, dtype=None, # 自动选 float16/bfloat16 load_in_4bit=True, ) model = FastLanguageModel.get_peft_model( model, r=64, target_modules=["q_proj", "k_proj", "v_proj", "o_proj"], lora_alpha=128, lora_dropout=0, bias="none", use_gradient_checkpointing=True, random_state=3407, ) # 后续训练流程类似,但速度提升 2~5 倍Unsloth 优势:自动融合 kernels、支持梯度检查点、内存优化,单卡 24G 可训 70B 模型
四、关键超参数调优指南
| 参数 | 推荐值 | 说明 |
|---|---|---|
r(rank) | 32 ~ 128 | 越大拟合能力越强,但过大会过拟合;7B 模型常用 64 |
lora_alpha | 2×r | 控制 LoRA 更新幅度,通常设为 2*r |
lora_dropout | 0.0 ~ 0.1 | 小模型可设 0,大模型可加 0.05 防过拟合 |
target_modules | 见下表 | 必须匹配模型架构 |
learning_rate | 1e-4 ~ 5e-4 | 比全参数微调高 10 倍 |
batch_size | 越大越好 | 通过gradient_accumulation_steps模拟大 batch |
🔧 常见模型的target_modules
| 模型家族 | target_modules |
|---|---|
| Llama / Mistral | ["q_proj", "k_proj", "v_proj", "o_proj"] |
| Qwen | ["q_proj", "k_proj", "v_proj", "o_proj"] |
| ChatGLM | ["query_key_value"] |
| Phi-3 | ["q_proj", "k_proj", "v_proj"] |
💡 不确定?用
print(model)查看模块名,或设target_modules="all-linear"(PEFT ≥ 0.10)
五、微调后如何推理?
方式 1:合并 LoRA 权重(推荐用于部署)
→ 合并后可用vLLM / TGI / Transformers直接加载
方式 2:动态加载 LoRA(适合多 adapter 切换)
from peft import PeftModel model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen-1.5-7B-Chat", ...) model = PeftModel.from_pretrained(model, "./qwen-lora") # 推理时自动应用 LoRA⚠️ 注意:vLLM 从 v0.4.0 开始实验性支持 LoRA 推理,但生产环境仍建议合并。