FFengPT
← 返回博客
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。

想直接问我关于这篇文章或我的经历?

和我聊聊 →