一、为什么需要微调?
预训练大模型(如GPT、Llama、Qwen)具备强大的通用能力,但在垂直领域往往表现不佳。微调(Fine-tuning)通过在特定领域数据上继续训练,让模型”学会”你的业务知识、术语和风格。
二、LoRA为什么是最佳选择?
LoRA(Low-Rank Adaptation)的核心思想是:冻结预训练模型的原始权重,只训练两个低秩矩阵(A和B)。这将可训练参数量大幅降低,成本大幅减少。
三、环境准备
安装依赖:
pip install transformers peft datasets accelerate bitsandbytes
四、完整实战代码
4.1 数据准备
from datasets import load_dataset
train_data = [
{"instruction": "请用Java实现一个线程池", "input": "", "output": "..."},
]
4.2 配置LoRA
from peft import LoraConfig, get_peft_model, TaskType
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.2-3B-Instruct", device_map="auto", load_in_4bit=True)
lora_config = LoraConfig(
r=8,
lora_alpha=16,
target_modules=["q_proj", "v_proj"],
lora_dropout=0.05,
bias="none",
task_type=TaskType.CAUSAL_LM
)
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
4.3 训练配置
training_args = TrainingArguments(
output_dir="./lora_output",
num_train_epochs=3,
per_device_train_batch_size=4,
learning_rate=2e-4,
fp16=True,
)
trainer = Trainer(model=model, args=training_args, train_dataset=train_dataset)
trainer.train()
model.save_pretrained("./lora_weights")
4.4 推理
from peft import PeftModel
model = PeftModel.from_pretrained(base_model, "./lora_weights")
model.eval()
def chat(prompt):
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
outputs = model.generate(**inputs, max_new_tokens=512)
return tokenizer.decode(outputs[0], skip_special_tokens=True)
五、实战效果对比
| 场景 | 微调前 | LoRA微调后 |
|---|---|---|
| 专业术语准确率 | ~45% | ~92% |
| 显存占用 | 28GB+ | ~6GB |
| 训练时间(3B模型) | 数周(不可行) | ~4小时 |
六、总结
LoRA是当前性价比最高的LLM微调方案:
- 参数高效:仅训练0.1%~1%的参数
- 显存友好:消费级GPU即可训练7B模型
- 可插拔:不同场景可切换不同LoRA权重
- 效果显著:垂直领域效果大幅提升
赶紧动手试试吧,让你的大模型真正成为”领域专家”!
文章摘自:https://www.cnblogs.com/czlws/p/19836179/lora-llm-fine-tuning-peft-jiqixuexi
