LoRA 微调:低秩适配大型语言模型
FreeGuideOnline
最新
2026-07-02
bash pip install transformers peft accelerate datasets torch
### 加载基座模型与分词器
以 GPT-2 为例:
```python
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "gpt2"
model = AutoModelForCausalLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
tokenizer.pad_token = tokenizer.eos_token
配置 LoRA 参数
使用 peft 的 LoraConfig 定义适配器:
from peft import LoraConfig, get_peft_model
lora_config = LoraConfig(
r=8, # 秩
lora_alpha=16, # 缩放因子
target_modules=["c_attn"], # GPT-2 中注意力投影的命名
lora_dropout=0.1, # dropout 防止过拟合
bias="none", # 是否训练偏置
task_type="CAUSAL_LM" # 任务类型
)
lora_model = get_peft_model(model, lora_config)
lora_model.print_trainable_parameters() # 查看可训练参数量
准备数据集
使用任何文本数据集,并 tokenize 为模型需要的格式。这里以简单示例演示:
from datasets import Dataset
texts = ["示例句子 1", "示例句子 2"]
dataset = Dataset.from_dict({"text": texts})
def tokenize_function(examples):
return tokenizer(examples["text"], truncation=True, padding="max_length", max_length=256)
tokenized_dataset = dataset.map(tokenize_function, batched=True)
训练与保存
利用 transformers.Trainer 进行训练:
from transformers import TrainingArguments, Trainer
training_args = TrainingArguments(
output_dir="./lora_gpt2",
per_device_train_batch_size=4,
num_train_epochs=3,
logging_steps=10,
save_strategy="epoch",
evaluation_strategy="no",
)
trainer = Trainer(
model=lora_model,
args=training_args,
train_dataset=tokenized_dataset,
)
trainer.train()
# 保存 LoRA 权重(仅几 MB)
lora_model.save_pretrained("my_lora_model")
加载 LoRA 权重并推理
加载基座模型后,通过 PeftModel 载入适配器:
from peft import PeftModel
base_model = AutoModelForCausalLM.from_pretrained("gpt2")
inference_model = PeftModel.from_pretrained(base_model, "my_lora_model")
inputs = tokenizer("今天天气", return_tensors="pt")
outputs = inference_model.generate(**inputs, max_length=50)
print(tokenizer.decode(outputs[0]))
若要消除推理时额外计算,可将 LoRA 合并到基础模型:
merged_model = inference_model.merge_and_unload()
merged_model.save_pretrained("merged_model")