2026-07-05·13 分钟
用 QLoRA 微调一个垂直领域模型(含可跑代码)
微调LoRAPEFTPyTorch
很多后端同学对「微调」有恐惧,觉得必须 A100 集群。QLoRA 的出现让这件事平民化了:单张 24G 显卡就能微调 7B 模型。它的核心是两件事——把基座量化、只训练一小撮适配参数。
全量微调 vs 参数高效微调
- 全量微调:改所有参数,效果上限高,但显存和时间成本都巨大。
- LoRA:冻结基座,只训练注入的低秩矩阵(通常 <1% 参数),显存友好、可插拔。
- QLoRA = 4-bit 量化基座 + LoRA,把显存再砍一截。
量化关键:NF4 与双重量化
QLoRA 用 NF4(NormalFloat 4-bit,一种针对正态分布权重设计的数据类型)做基础量化,并对量化常数再做一次量化(双重量化),进一步省显存。对精度的影响通常可忽略。
LoRA 的 r 和 alpha 怎么选
- r(秩):8~64 之间。任务越复杂、越偏离预训练分布,r 越大。
- alpha:常取 r 的 2 倍(如 r=16, alpha=32),控制适配强度。
- target_modules:优先 q_proj、v_proj,必要时加 k_proj、o_proj。
一个最小可跑的训练片段
from transformers import AutoModelForCausalLM, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model
bnb = BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_quant_type="nf4",
bnb_4bit_double_quant=True, bnb_4bit_compute_dtype="bfloat16")
model = AutoModelForCausalLM.from_pretrained("Qwen2.5-7B", quantization_config=bnb)
lora = LoraConfig(r=16, lora_alpha=32, target_modules=["q_proj","v_proj"],
lora_dropout=0.05, bias="none", task_type="CAUSAL_LM")
model = get_peft_model(model, lora)
model.print_trainable_parameters() # 通常 < 1%数据集长什么样
{
"instruction": "把用户问题分类到意图",
"input": "帮我查一下上个月的退款记录",
"output": "{"intent": "refund_query", "confidence": 0.9}"
}微调不是炫技。当通用模型在你业务上长期答不准时,QLoRA 是性价比最高的解法。
为什么这能帮你求职
能讲清「为什么用 LoRA 而不是全量」「NF4 解决了什么」,说明你真的碰过模型层,而不只是调 API。这在 AI 应用岗里是稀缺信号——大部分候选人都停在 Prompt + RAG。
想直接问我关于这篇文章或我的经历?
和我聊聊 →