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 参数

使用 peftLoraConfig 定义适配器:

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")