LoRA 微调教程:用小数据调整大模型回答风格
LoRA 微调教程:用低秩适配(LoRA)技术微调开源大模型,只需少量数据和消费级显卡,就能让模型学会你的专业领域知识和回答风格。
这篇教程适合你吗
你用开源大模型效果还不错,但希望它能更懂你的领域——比如用你公司的语气说话、理解行业术语、按照你期望的格式输出。LoRA 微调是性价比最高的方式:只需少量数据和一块消费级显卡。
前置知识:了解大模型基本概念。建议先看模型微调是什么。 最终产物:用 LoRA 微调一个开源大模型的完整流程。环境假设
- Python 3.9+
- NVIDIA GPU(至少 16GB 显存,推荐 RTX 4090 24GB)
- 已安装 PyTorch + CUDA
LoRA 的核心思想
大模型有几十亿参数,全部训练不现实。LoRA 的思路是:
原始模型参数(冻结,不训练)
+
低秩适配器(小矩阵,只训练这部分)
=
微调后的模型
类比:你不需要重新装修整个房子,只需要在墙上挂几幅画就能改变房间风格。
第一步:准备训练数据
训练数据是一个 JSONL 文件,每行是一个对话:
{"messages": [{"role": "user", "content": "你好"}, {"role": "assistant", "content": "您好!我是小狐助手,很高兴为您服务。请问有什么可以帮您的?"}]}
{"messages": [{"role": "user", "content": "推荐一本编程书"}, {"role": "assistant", "content": "我推荐《Python 编程:从入门到实践》。这本书适合初学者,前半部分讲基础语法,后半部分是三个实战项目,学完就能动手做东西。"}]}
关键:
- 数据质量决定效果,宁精勿滥
- 回复风格要一致,体现你期望的模型行为
- 每条数据不要太长,控制在 2048 token 以内
第二步:安装依赖
pip install transformers peft accelerate bitsandbytes datasets
第三步:加载基础模型
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
model_name = "Qwen/Qwen2.5-7B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.float16,
device_map="auto"
)
第四步:配置 LoRA
from peft import LoraConfig, get_peft_model
lora_config = LoraConfig(
r=16, # LoRA 秩,越大表达能力越强,但参数越多
lora_alpha=32, # 缩放因子,通常设为 r 的 2 倍
target_modules=["q_proj", "v_proj", "k_proj", "o_proj"], # 应用 LoRA 的层
lora_dropout=0.05, # Dropout 防止过拟合
bias="none",
task_type="CAUSAL_LM"
)
model = get_peft_model(model, lora_config)
# 查看可训练参数量
model.print_trainable_parameters()
# 输出类似:trainable params: 4,194,304 || all params: 7,617,000,000 || trainable%: 0.055%
可训练参数只有 0.055%,这就是 LoRA 的效率。
第五步:准备训练
from datasets import load_dataset
from transformers import TrainingArguments
# 加载数据
dataset = load_dataset("json", data_files="train.jsonl")
# 训练配置
training_args = TrainingArguments(
output_dir="./lora-output",
num_train_epochs=3,
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
learning_rate=2e-4,
warmup_steps=100,
logging_steps=10,
save_steps=500,
fp16=True,
optim="adamw_torch"
)
第六步:开始训练
from transformers import Trainer, DataCollatorForLanguageModeling
# 数据预处理
def preprocess(examples):
texts = []
for msg_list in examples["messages"]:
text = tokenizer.apply_chat_template(msg_list, tokenize=False)
texts.append(text)
return tokenizer(texts, truncation=True, max_length=2048)
tokenized_dataset = dataset.map(preprocess, batched=True, remove_columns=dataset["train"].column_names)
# 训练
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_dataset["train"],
data_collator=DataCollatorForLanguageModeling(tokenizer, mlm=False)
)
trainer.train()
训练时间取决于数据量和硬件。1000 条数据、RTX 4090、3 轮训练大约需要 30 分钟。
第七步:保存和使用
# 保存 LoRA 适配器
model.save_pretrained("./lora-adapter")
tokenizer.save_pretrained("./lora-adapter")
# 推理时加载
from peft import PeftModel
base_model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16, device_map="auto")
model = PeftModel.from_pretrained(base_model, "./lora-adapter")
# 使用
inputs = tokenizer("你好", return_tensors="pt").to(model.device)
outputs = model.generate(inputs, max_new_tokens=100)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
第八步:合并权重(可选)
如果想部署一个完整模型文件:
merged_model = model.merge_and_unload()
merged_model.save_pretrained("./merged-model")
tokenizer.save_pretrained("./merged-model")
合并后的模型可以直接用 Ollama 或 vLLM 部署。
参数调优建议
| 参数 | 推荐值 | 说明 |
|---|---|---|
| r (rank) | 8-64 | 简单任务 8-16,复杂任务 32-64 |
| lora_alpha | r × 2 | 一般设为 r 的 2 倍 |
| learning_rate | 1e-4 ~ 3e-4 | 太大容易过拟合 |
| epochs | 1-3 | 数据少时 1-2 轮就够 |
| batch_size | 4-8 | 显存不够就减小 |
常见问题与排错
训练后模型回答变得不自然
原因:过拟合或学习率太高。
解决:减少训练轮数、降低学习率、增加 dropout、减少 LoRA rank。
显存不够
原因:模型太大或 batch_size 太大。
解决*:使用 4-bit 量化加载(load_in_4bit=True);减小 batch_size;使用 gradient accumulation。
进阶学习
总结
- LoRA 只训练模型参数的 0.05% 左右,消费级显卡就能微调
- 关键是准备高质量的训练数据
- r、learning_rate、epochs 是最重要的调优参数
- 微调后可以合并权重,用 Ollama/vLLM 部署
---
本文最后更新于 2026-07-27。代码示例基于当前常见版本,请根据最新文档调整。*
常见问题
相关推荐
模型微调是什么?Fine-tuning、LoRA 和 RAG 怎么区分
模型微调是什么?解释微调的原理、与 RAG 的区别,以及 LoRA 等高效微调方法的应用场景。
开源大模型是什么?和闭源商业模型怎么选
开源大模型是什么?解释开源大模型的含义、与闭源模型的区别,以及如何根据需求选择合适的模型。
大模型上下文窗口是什么?长文本能力到底影响什么
大模型上下文窗口是什么?解释上下文窗口的概念、大小对模型能力的影响,以及如何根据任务选择合适的上下文长度。
Token 是什么?为什么 AI 按 token 计费
Token 是什么?解释大模型中 Token 的概念、中英文 Token 的差异、以及为什么 API 按 Token 计费。
获取更多 AI 内容
订阅更新,第一时间获取新教程和工具推荐。