peft(Parameter-Efficient Fine-Tuning)是 Hugging Face 开发的一个高效微调大语言模型的库,核心目标是在不训练完整模型参数的前提下,通过仅调整少量额外参数实现模型的任务适配,从而大幅降低计算资源消耗和内存需求。

一、PEFT 的核心优势

  • 参数效率:仅训练 0.1%~5% 的模型参数,大幅减少计算量和存储需求
  • 低资源友好:支持在消费级 GPU(如单张 RTX 3090)上微调 7B+ 参数的大模型
  • 兼容量化:无缝结合 4/8 位量化技术,进一步降低内存占用
  • 性能接近全量微调:在多数任务上,PEFT 方法的效果与全量微调相当
  • 易于部署:微调后的模型可以高效合并或推理

二、你提到的三个核心组件详解

1. LoraConfig:配置 LoRA 方法的参数

LoRA(Low-Rank Adaptation)是 PEFT 中最常用的方法,通过在原始权重矩阵旁添加低秩分解的矩阵来减少可训练参数。LoraConfig 用于定义 LoRA 的具体配置:

1
2
3
4
5
6
7
8
9
from peft import LoraConfig
lora_config = LoraConfig(
r=8, # LoRA 的秩(低秩矩阵的维度),r 越小效率越高(常见值:4~64)
lora_alpha=32, # LoRA 的缩放因子(通常是 r 的 2~4 倍)
target_modules=["q_proj", "v_proj"], # 应用 LoRA 的目标模块(如注意力层的查询/值投影)
lora_dropout=0.05, # LoRA 层的 dropout 率,避免过拟合
bias="none", # 是否训练偏置参数("none"/"all"/"lora_only")
task_type="CAUSAL_LM" # 任务类型(如因果语言模型、序列分类等)
)

关键参数说明

  • r:决定 LoRA 低秩矩阵的大小,直接影响可训练参数数量(参数量与 r 成正比)
  • target_modules:必须指定应用 LoRA 的模块,LLM 中通常选择注意力层的投影矩阵(如 q_projv_projk_proj

2. prepare_model_for_kbit_training:准备模型进行低精度训练

当使用 4/8 位量化 技术加载模型时(如通过 bitsandbytes),需要调用此函数对模型进行预处理,确保其结构适合低精度训练:

1
2
3
4
from peft import prepare_model_for_kbit_training

# 假设 model 是通过 4 位量化加载的(如 quantization_config=bnb_config)
model = prepare_model_for_kbit_training(model)

核心作用

  • 启用梯度检查点(gradient checkpointing)以减少内存使用
  • 调整模型的嵌入层(embeddings)和语言模型头(lm_head)的参数类型,确保与量化兼容
  • 处理模型的偏置项,使其适合低精度训练

3. get_peft_model:将 PEFT 方法应用到基础模型

最后,通过此函数将配置好的 PEFT 方法(如 LoRA)与基础模型结合,返回可以直接微调的 PEFT 模型:

1
2
3
from peft import get_peft_model

peft_model = get_peft_model(model, lora_config)

核心作用

  • 自动在 target_modules 指定的层旁插入 LoRA 适配器
  • 冻结原始模型的大部分参数,仅保留 LoRA 相关参数可训练
  • 返回的 peft_model 可以像普通模型一样进行训练(如使用 Trainer API)

三、典型使用流程(结合量化 + LoRA)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 1. 4 位量化加载基础模型
model = AutoModelForCausalLM.from_pretrained(
"microsoft/Phi-3-mini-4k-instruct",
quantization_config=bnb_config, # 4 位量化配置
device_map="cuda:0"
)

# 2. 准备模型进行低精度训练
model = prepare_model_for_kbit_training(model)

# 3. 配置 LoRA 参数
lora_config = LoraConfig(
r=16,
lora_alpha=32,
target_modules=["q_proj", "v_proj"],
bias="none",
task_type="CAUSAL_LM"
)

# 4. 应用 LoRA 到模型
peft_model = get_peft_model(model, lora_config)

# 5. 查看可训练参数比例(通常 < 1%)
peft_model.print_trainable_parameters()

四、PEFT 支持的其他方法

除了 LoRA,PEFT 还支持多种高效微调方法:

  • Prefix Tuning:仅调整输入序列的前缀嵌入
  • Prompt Tuning:学习软提示(soft prompt)嵌入
  • P-Tuning v2:结合前缀调整和多层适配
  • Adapter:在模型层间插入小型适配器模块

总结

PEFT 库通过 LoraConfigprepare_model_for_kbit_trainingget_peft_model 等核心组件,实现了大模型的高效微调。它特别适合在资源受限的环境下(如单张 GPU)微调 7B+ 参数的大模型,同时保持接近全量微调的性能。