Hugging Face 的 PEFT 库介绍
PEFT(Parameter-Efficient Fine-Tuning)是 Hugging Face 推出的一个专门用于 大语言模型参数高效微调 的库,目标是在 只训练少量参数的同时保持模型性能,显著减少显存消耗和训练成本。
1. PEFT 是什么?
PEFT 的全称是:
Parameter-Efficient Fine-Tuning
它支持以下主流的参数高效微调技术:
技术名称 | 简介说明 |
---|---|
LoRA | Low-Rank Adaptation,冻结原始模型,仅训练额外的低秩矩阵 |
Prefix Tuning | 在每层 Transformer 前添加 prefix vectors,仅训练这些向量 |
Prompt Tuning | 学习虚拟 token 的嵌入作为软提示词,适用于生成类任务 |
P-Tuning v2 | 类似 Prompt Tuning,但更强大,支持更深层的 prompt 注入 |
AdaLoRA | 动态调整 LoRA 的秩(rank)来进一步压缩参数 |
2. 安装 PEFT
pip install peft
3. PEFT 的核心流程
PEFT 的使用流程可总结为以下 4 步:
第一步:加载基础模型(如 LLaMA、GPT、BERT)
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf")
第二步:配置 LoRA 或其他方法
from peft import LoraConfig, TaskType
peft_config = LoraConfig(
task_type=TaskType.CAUSAL_LM, # 任务类型
r=8,
lora_alpha=32,
lora_dropout=0.1,
bias="none"
)
第三步:使用 PEFT 包装原模型
from peft import get_peft_model
peft_model = get_peft_model(model, peft_config)
第四步:训练、保存与加载
peft_model.save_pretrained("./lora_model")
加载:
from peft import PeftModel
base_model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf")
peft_model = PeftModel.from_pretrained(base_model, "./lora_model")
4. 支持任务类型(TaskType)
PEFT 的配置中需要指定 task_type
:
任务类型 (TaskType ) |
描述 |
---|---|
CAUSAL_LM |
自回归生成任务(如 GPT、LLaMA) |
SEQ_2_SEQ_LM |
序列到序列生成任务(如 T5) |
TOKEN_CLS |
Token 分类任务(如 NER) |
SEQ_CLS |
序列分类任务(如情感分析) |
QUESTION_ANSWERING |
问答任务 |
5. 为什么选择 PEFT?
优势 | 描述 |
---|---|
显存更省 | 只训练部分参数,冻结原模型 |
效果接近全量微调 | 在许多任务上性能非常接近 full fine-tuning |
更易部署 | 模型更小、加载更快 |
训练更快 | 特别适合资源有限的开发者和小团队 |
Hugging Face 生态兼容 | 可与 transformers , accelerate , Trainer 等配合使用 |
6. 与 transformers
的集成方式
PEFT 与 transformers
深度集成,适用于:
Trainer
或accelerate
的训练流程- 任何支持
AutoModel
的架构 - 与
datasets
库的无缝对接
7. 示例:LoRA 微调 LLaMA 模型
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model, TaskType
model_name = "meta-llama/Llama-2-7b-hf"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
# 配置 LoRA
lora_config = LoraConfig(
task_type=TaskType.CAUSAL_LM,
r=8,
lora_alpha=32,
lora_dropout=0.05,
bias="none"
)
# 构造 PEFT 模型
model = get_peft_model(model, lora_config)
# 打印可训练参数数量
model.print_trainable_parameters()
# 保存微调权重
model.save_pretrained("./lora_llama")
8. 总结
模块 | 功能说明 |
---|---|
LoraConfig |
配置 LoRA 微调参数 |
get_peft_model |
创建可微调模型 |
PeftModel.from_pretrained |
加载已微调的模型 |
TaskType |
指定任务类型(如文本生成、分类) |
PromptTuningConfig , PrefixTuningConfig 等 |
配置其他类型的微调方法 |
9. 适用人群
- 想用消费级显卡微调大模型的开发者
- 在企业/研究中进行低成本模型定制
- 快速原型验证和实验调优
- 部署轻量级的个性化模型(如私有 ChatGPT)