跳转到正文
技术教程·

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_alphar × 2一般设为 r 的 2 倍
learning_rate1e-4 ~ 3e-4太大容易过拟合
epochs1-3数据少时 1-2 轮就够
batch_size4-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。代码示例基于当前常见版本,请根据最新文档调整。*

常见问题

相关推荐

获取更多 AI 内容

订阅更新,第一时间获取新教程和工具推荐。