·
LLM AI 微调

LLM 微调实战:从 LoRA 到 QLoRA

手把手教你如何使用 LoRA 和 QLoRA 技术在消费级 GPU 上微调大语言模型,降低训练成本。

为什么需要参数高效微调?

全量微调一个 7B 参数的模型需要至少 28GB 显存(FP32),而 LoRA 只需要约 16GB。这使得在消费级 GPU 上微调大模型成为可能。

LoRA 原理

LoRA (Low-Rank Adaptation) 通过在预训练权重旁添加低秩矩阵来实现微调:

W' = W + BA

其中 W 是冻结的预训练权重,B 和 A 是可训练的低秩矩阵。

使用 PEFT 进行 LoRA 微调

from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model, TaskType

model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-2-7b-hf",
    torch_dtype=torch.float16,
    device_map="auto"
)

lora_config = LoraConfig(
    task_type=TaskType.CAUSAL_LM,
    r=16,
    lora_alpha=32,
    lora_dropout=0.05,
    target_modules=["q_proj", "v_proj"]
)

model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
# 输出: trainable params: 4,194,304 || all params: 6,742,609,920 || trainable%: 0.06%

QLoRA:更极致的节省

QLoRA 通过 4-bit 量化进一步降低显存需求:

from transformers import BitsAndBytesConfig

bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.float16,
    bnb_4bit_use_double_quant=True,
)

model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-2-7b-hf",
    quantization_config=bnb_config,
    device_map="auto"
)

完整训练流程

from transformers import TrainingArguments, Trainer
from datasets import load_dataset

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,
    fp16=True,
    logging_steps=10,
    save_strategy="epoch",
)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=dataset["train"],
)

trainer.train()

合并与导出

训练完成后,合并 LoRA 权重:

from peft import PeftModel

base_model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-2-7b-hf",
    torch_dtype=torch.float16,
)

model = PeftModel.from_pretrained(base_model, "./lora-output")
merged_model = model.merge_and_unload()

merged_model.save_pretrained("./merged-model")

性能对比

方法显存需求 (7B)训练速度效果
全量微调~28GB最佳
LoRA~16GB接近全量
QLoRA~6GB中等略低于 LoRA

总结

LoRA 和 QLoRA 让个人开发者也能参与 LLM 微调。选择哪种方法取决于你的硬件条件和对效果的要求。建议从 QLoRA 开始实验,效果不满意再尝试 LoRA。