Unsloth微调教程:用LoRA训练自己的AI模型
🩺 摘要
想让AI懂你的业务——客服回复风格、代码规范、产品知识。但微调(fine-tuning)又慢又贵,听说一个模型要几万块。Unsloth说:几百块、几张图搞定。
📝 详情
Unsloth是什么
Unsloth是一个让大模型微调变得又快又省显存的开源工具。
它的核心卖点: - 2倍速度提升(比原生HuggingFace) - 内存减少50%(同样显存能微调更大的模型) - 质量不降(精度几乎无损)
GitHub 28000+星,是目前最流行的微调工具。
环境准备
pip install unsloth
# 或者用conda(推荐)
conda create -n unsloth python=3.11
conda activate unsloth
pip install unsloth
需要一块至少12GB显存的显卡。没有的话可以用Google Colab免费版。
准备数据
微调数据格式是JSONL,每条一个对话:
{"instruction": "用客服语气回复客户投诉", "input": "我买的手机用了三天就死机了,气死了!", "output": "非常抱歉给您带来不好的体验!请私信我您的订单号,我会尽快为您安排换货处理。"}
{"instruction": "用客服语气回复客户投诉", "input": "快递还没到,都等了五天了", "output": "让您久等了!我马上帮您查询物流进度。方便提供订单号吗?"}
至少准备50-100条高质量的对话。数据质量决定模型效果。
开始微调
from unsloth import FastLanguageModel
import torch
# 加载模型(自动应用优化)
model, tokenizer = FastLanguageModel.from_pretrained(
model_name="unsloth/Qwen2.5-7B-bnb-4bit",
max_seq_length=2048,
dtype=None,
load_in_4bit=True,
)
# 添加LoRA适配器(只训练一小部分参数)
model = FastLanguageModel.get_peft_model(
model,
r=16,
target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
lora_alpha=16,
lora_dropout=0,
bias="none",
use_gradient_checkpointing="unsloth",
)
# 开始训练
from transformers import TrainingArguments
from trl import SFTTrainer
trainer = SFTTrainer(
model=model,
tokenizer=tokenizer,
train_dataset=dataset,
args=TrainingArguments(
per_device_train_batch_size=2,
gradient_accumulation_steps=4,
num_train_epochs=3,
learning_rate=2e-4,
output_dir="./outputs",
),
)
trainer.train()
# 保存模型
model.save_pretrained("./my-custom-model")
tokenizer.save_pretrained("./my-custom-model")
在RTX 4090上,7B模型全流程大约跑1-2小时。
测试效果
model, tokenizer = FastLanguageModel.from_pretrained("./my-custom-model")
prompt = "用客服语气回复:我要退货!"
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
outputs = model.generate(**inputs, max_new_tokens=128)
print(tokenizer.decode(outputs[0]))
踩坑总结
- 数据治理比训练更重要 — 100条高质量数据 > 10000条低质量数据
- 不要期待奇迹 — 微调是让模型更懂某个领域,不是让模型学会它本来不会的东西
- 过拟合很常见 — 如果训练集只有几十条,模型可能会背答案而不是理解。用evaluation数据验证
- LoRA就够了 — 大部分场景不用全量微调。LoRA效果好、速度快、文件小
💬 评论 (0)