【大模型】peft库(parameter efficient fine tune)
一、PEFT库是什么?
PEFT(Parameter-Efficient Fine-Tuning)是Hugging Face推出的一个轻量级库,中文直译是参数高效微调。它的核心目标是:在微调大语言模型(LLM)、视觉模型等大模型时,只更新模型的一小部分参数,而非全部参数,从而大幅降低显存占用、训练时间和计算成本,同时还能保持不错的微调效果。
简单来说,传统微调需要更新模型所有参数(比如千亿参数的模型微调时,显存根本撑不住),而PEFT只微调几百上千万个新增的“小参数”,就能让模型适配特定任务,这对普通开发者来说是“降维打击”——用消费级显卡就能微调大模型。
二、PEFT的核心优势
- 极低的资源消耗:相比全量微调,显存占用可降低90%以上,训练速度提升数倍;
- 通用性强:支持Hugging Face生态的几乎所有模型(如LLaMA、GPT-2、BERT、ViT等);
- 多种微调方法:内置了业界主流的参数高效微调算法,开箱即用;
- 无缝集成:和Transformers、Accelerate、BitsAndBytes等库完美兼容,无需复杂适配。
三、PEFT支持的主流微调方法
PEFT封装了多种经典的参数高效微调技术,新手先掌握最常用的2种即可:
| 方法名称 | 核心原理 | 适用场景 |
|---|---|---|
| LoRA(Low-Rank Adaptation) | 在模型的注意力层插入低秩矩阵,只训练这些矩阵,原模型参数冻结 | 绝大多数LLM微调场景(最常用) |
| IA³(Infused Adapter by Inhibiting and Amplifying Inner Activations) | 对模型激活值进行缩放,仅训练缩放系数 | 显存极其有限的场景(参数更少) |
| P-Tuning v2 | 将Prompt转化为可训练的嵌入层,插入到模型各层 | 少样本、Prompt Tuning场景 |
| AdaLoRA | LoRA的升级版,动态调整低秩矩阵的重要性 | 追求更高微调效果的场景 |
四、PEFT的基本使用示例(以LoRA微调LLM为例)
下面用一个极简示例展示PEFT的核心使用流程,帮你直观理解它的用法:
1. 前置依赖安装
首先需要安装必要的库:
pip install peft transformers datasets torch accelerate bitsandbytes
2. 核心代码示例(LoRA微调)
import torch
from peft import LoraConfig, get_peft_model
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer
# 1. 加载基础模型和分词器(以开源的小模型为例,新手可先用这个测试)
model_name = "facebook/opt-125m" # 轻量级测试模型,显存占用低
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.float16, # 半精度,降低显存占用
device_map="auto" # 自动分配模型到GPU/CPU
)
# 2. 配置LoRA参数(核心PEFT配置)
lora_config = LoraConfig(
r=8, # 低秩矩阵的秩,越小参数越少(常用4/8/16)
lora_alpha=32, # 缩放系数,一般是r的4倍
target_modules=["q_proj", "v_proj"], # 要微调的模块(不同模型模块名不同,需对应)
lora_dropout=0.05, # dropout率,防止过拟合
bias="none", # 不微调bias参数
task_type="CAUSAL_LM" # 任务类型:因果语言模型(生成式任务)
)
# 3. 将PEFT配置应用到基础模型
peft_model = get_peft_model(model, lora_config)
# 打印可训练参数占比(关键!能看到只微调极少参数)
peft_model.print_trainable_parameters()
# 输出示例:trainable params: 196,608 || all params: 125,235,456 || trainable%: 0.1570
# 4. 准备训练数据(极简示例,实际需替换为你的任务数据)
def prepare_data():
texts = ["你好,PEFT!", "参数高效微调真好用", "大模型微调成本大幅降低"]
# 分词并处理成模型需要的格式
encodings = tokenizer(texts, truncation=True, padding="max_length", max_length=32, return_tensors="pt")
# 生成式任务中,标签和输入一致(自回归训练)
encodings["labels"] = encodings["input_ids"].clone()
return encodings
dataset = prepare_data()
# 封装成Dataset格式
from datasets import Dataset
dataset = Dataset.from_dict(dataset)
# 5. 训练配置
training_args = TrainingArguments(
output_dir="./peft_output", # 输出目录
per_device_train_batch_size=2, # 批次大小(根据显存调整)
learning_rate=1e-4, # 学习率(PEFT微调学习率可稍大)
num_train_epochs=3, # 训练轮数
logging_steps=10, # 日志打印步数
fp16=True, # 半精度训练
save_strategy="epoch" # 按轮数保存模型
)
# 6. 开始训练
trainer = Trainer(
model=peft_model,
args=training_args,
train_dataset=dataset
)
trainer.train()
# 7. 保存PEFT模型(只保存微调的LoRA参数,体积极小,一般几MB)
peft_model.save_pretrained("./lora_model")
# 8. 加载PEFT模型推理(实际使用时)
from peft import PeftModel, PeftConfig
# 加载LoRA配置和基础模型
peft_config = PeftConfig.from_pretrained("./lora_model")
base_model = AutoModelForCausalLM.from_pretrained(
peft_config.base_model_name_or_path,
torch_dtype=torch.float16,
device_map="auto"
)
# 合并LoRA参数到基础模型
inference_model = PeftModel.from_pretrained(base_model, "./lora_model")
# 推理测试
inputs = tokenizer("你好,", return_tensors="pt").to("cuda")
outputs = inference_model.generate(**inputs, max_new_tokens=20)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
代码关键部分解释
LoraConfig:核心配置类,定义LoRA的核心参数(r、alpha、目标模块等);get_peft_model:将PEFT配置应用到基础模型,冻结原模型参数,只保留LoRA参数可训练;print_trainable_parameters:打印可训练参数占比,直观看到PEFT的“参数高效”特性;- 保存的PEFT模型:只包含LoRA的微调参数(几MB),而非完整模型(数GB),方便部署和分享。
五、PEFT的实际应用场景
- 大模型适配特定任务:比如将通用LLM微调为客服机器人、代码生成器、翻译模型等;
- 低资源环境微调:用消费级显卡(如RTX 3090/4090)微调7B/13B规模的LLM;
- 多任务微调:在一个基础模型上,为不同任务训练多个PEFT适配器,切换任务只需加载对应适配器;
- 工业级部署:PEFT适配器体积小,可快速加载到基础模型上,降低部署成本。
总结
- PEFT是参数高效微调库,核心是只微调模型一小部分参数,大幅降低显存/计算成本;
- 最常用的方法是LoRA,新手入门优先掌握LoRA的配置和使用;
- PEFT无缝兼容Hugging Face生态,是普通开发者微调大模型的首选工具。

浙公网安备 33010602011771号