
PEFT 是 Hugging Face 开源的参数高效微调底层库,Apache-2.0 许可。通过冻结预训练模型、仅训练轻量适配器(adapter),让消费级 GPU 也能微调大模型。支持 LoRA/QLoRA/DoRA/IA3/AdaLoRA/Prompt Tuning 等 30+ 方法,是 LlamaFactory、MS-SWIFT、Axolotl、TRL、Unsloth 的共同底层依赖。
项目概述
PEFT(Parameter-Efficient Fine-Tuning)由 Hugging Face 于 2023 年初发布,主导开发者 Sourab Mangrulkar,贡献者包括 Younes Belkada、Sayak Paul、Benjamin Bossan、Marc Sun 等 ,是参数高效微调领域的开源标准实现。截至 2026 年 8 月,GitHub Star 16.2K+ ,是大模型微调生态中不可或缺的底层库。
核心设计哲学:PEFT 解决一个朴素却关键的问题——”微调大模型太贵了” 。它通过冻结预训练模型参数、仅在其顶部添加少量可训练参数(adapters)的方式,使:
- GPU 无需为庞大的基座模型存储优化器状态与梯度,显存大幅节省
- 适配器(adapters)极其轻量(通常几 MB),方便共享、存储与加载
- 多个任务可共用同一个基座模型,通过动态加载/切换不同适配器实现多租户服务
经典数据:对 bigscience/mt0-large 模型应用 LoRA 后,仅训练 0.19% 的参数(2,359,296 / 1,231,940,608) 。
支持的微调方法(30+ 种,按家族分类) :
LoRA 家族(最庞大):
- LoRA:低秩适配,将权重更新分解为两个小矩阵
- DoRA:权重分解的 LoRA,分离幅度与方向
- VeRA:向量化 LoRA
- LoHa:低秩 Hadamard 积
- LoKr:低秩 Kronecker 积
- AdaLoRA:基于 SVD 的动态秩分配
- OFT / BOFT:正交微调(蝴蝶矩阵)
- FourierFT / WaveFT:频域/小波变换适配
- IA3:对 key/value/FFN 激活进行元素级缩放
Prompt Learning 家族:
- Prompt Tuning:在输入添加可学习 embedding
- Prefix Tuning:在每层隐藏状态前添加可学习向量
- P-Tuning:通过 Prompt Encoder 生成 prompt embedding
- Multitask Prompt Tuning:跨任务共享 prompt
量化组合:
- QLoRA:与 bitsandbytes 集成,4-bit 量化基座 + LoRA 适配器
- LoftQ:量化感知的 LoRA 初始化
与 Transformers 的原生集成:
PEFT 与 Hugging Face Transformers 深度集成——所有 PreTrainedModel 都通过 PeftAdapterMixin 原生支持 add_adapter()、load_adapter()、set_adapter() 等方法 。这意味着用户可以直接在 Transformers 模型上调用 PEFT,而无需显式包装为 PeftModel。
多适配器组合:
PEFT 支持 PeftMixedModel 与适配器合并策略,可将多个异构适配器组合使用 。
跨模态支持:
除 LLM 外,PEFT 还与 Diffusers(扩散模型 LoRA)、Accelerate(分布式训练)、TRL(SFT/DPO/PPO 训练)、bitsandbytes(8-bit/4-bit 量化)深度集成 。
许可策略:Apache-2.0 许可 ,允许商用、修改、再分发。
💡 PEFT 的独特定位:它是”训练&微调”子分类的底层标准库。与 LlamaFactory、MS-SWIFT、Axolotl(综合型框架)、TRL(后训练算法库)、Unsloth(加速库)形成清晰的层级关系——后四者都在底层调用 PEFT 来实现 LoRA/QLoRA/DoRA 等参数高效微调方法 。PEFT 本身不提供端到端训练流水线、Web UI 或 CLI,而是作为可被任意上层框架组合的”适配器插入工具”。虽然 PEFT 训练的适配器可被 vLLM、Lorax、TGI 等推理引擎用于多适配器服务 ,但 PEFT 核心职责是训练阶段的适配器管理,不应归入”推理引擎”或”API 封装”子分类。其 Apache-2.0 许可与 LlamaFactory、MS-SWIFT、Axolotl、TRL、veRL、OpenRLHF、Unsloth 并列”最干净许可”阵营。
核心能力
- 30+ 参数高效微调方法:LoRA/DoRA/QLoRA/IA3/AdaLoRA/OFT/BOFT/FourierFT/Prompt Tuning/Prefix Tuning/P-Tuning 等全覆盖
- 适配器极轻量:通常仅几 MB(OPT-350M 的适配器仅 ~6MB,而完整模型 ~700MB)
- 动态适配器切换:
load_adapter()+set_adapter()实现多任务单基座动态路由 - Transformers 原生集成:通过
PeftAdapterMixin,所有PreTrainedModel直接支持add_adapter() - QLoRA 4-bit 微调:与 bitsandbytes 集成,消费级 GPU 微调大模型
- 多适配器组合:
PeftMixedModel异构适配器组合与合并 - 跨模态支持:LLM(Transformers)+ 扩散模型(Diffusers)统一微调接口
- 分布式训练:与 Accelerate 深度集成,支持 DDP/DeepSpeed ZeRO/FSDP
- RL 训练集成:TRL 的 SFTTrainer/DPOTrainer/GRPOTrainer 原生支持 PEFT 模型
- 推理引擎兼容:vLLM、Lorax、TGI 支持多 LoRA 适配器并发服务
- 标准化接口:
LoraConfig→get_peft_model()→save_pretrained()→from_pretrained()四步法 - 自定义方法扩展:通过
PeftType注册新 PEFT 方法,社区贡献友好
优势亮点
- 参数高效微调标准实现:Hugging Face 官方出品,是 LoRA/QLoRA/DoRA 的开源参考实现
- Apache-2.0 最干净许可:商用、修改、再分发无门槛,与整个 HF 生态许可一致
- 显存革命:仅训练 0.19% 参数(mt0-large 示例),消费级 GPU 可微调大模型
- 适配器可移植:几 MB 的适配器方便分享、存储、版本控制,Hub 上直接托管
- 多租户服务基石:单基座 + 多适配器的架构,是 vLLM/Lorax/TGI 多 LoRA 并发服务的底层支撑
- 上层框架的共同依赖:LlamaFactory、MS-SWIFT、Axolotl、TRL、Unsloth 均在底层调用 PEFT
- 与 Transformers 深度融合:
PeftAdapterMixin让任意 HF 模型原生支持适配器操作 - 方法覆盖最广:30+ PEFT 方法,从 LoRA 到 OFT、从 Prompt Tuning 到 FourierFT
- QLoRA 4-bit 平民化:消费级 GPU(RTX 3060 8GB)通过 QLoRA 微调 7B-8B 模型
- 跨模态统一:LLM 与扩散模型共享同一套 PEFT 接口,AIGC 训练统一体验
局限
- 非端到端框架:PEFT 是底层库,不提供数据预处理、训练循环、评估、部署等完整流水线,需配合 Transformers Trainer/TRL 或上层框架使用
- 仅支持参数高效微调:全参数微调(Full Fine-tuning)不在 PEFT 范畴,需直接使用 Transformers 或 Megatron-Core/DeepSpeed
- 方法间性能差异大:不同 PEFT 方法在不同任务上表现不一,需要实验选择最优方法
- 适配器合并损耗:虽然支持适配器权重合并到基座以消除推理延迟,但合并过程可能有精度损失
- Prompt Learning 方法训练不稳定:Prompt Tuning/Prefix Tuning 等方法在小型数据集上可能收敛困难
- 版本兼容性强依赖:PEFT 与 Transformers、bitsandbytes、TRL 等版本耦合紧密,需注意版本匹配
- 超大规模预训练非目标:PEFT 定位是微调阶段的参数高效化,从零预训练需 Megatron-Core 等更专业工具
- 生产推理需外部工具:PEFT 训练的适配器需配合 vLLM、Lorax、TGI 等推理引擎部署,PEFT 本身不提供推理服务
适用人群
- 所有 Hugging Face 生态用户:使用 Transformers 训练模型的工程师,PEFT 是自然选择
- 消费级硬件玩家:RTX 3060/4090 用户通过 QLoRA 4-bit 微调 7B-70B 模型
- 多任务适配需求:单基座 + 多适配器架构,适合多租户、多任务服务场景
- LoRA/DoRA/QLoRA 研究者:需要实现或实验新的参数高效微调方法
- Diffusion 模型微调:Stable Diffusion 等扩散模型的 LoRA 训练标配
- 上层框架开发者:构建 LlamaFactory、MS-SWIFT 等综合框架时作为底层依赖
- RL 训练场景:TRL 的 SFT/DPO/GRPO 训练中使用 PEFT 模型
- 边缘部署:适配器轻量特性适合边缘设备的任务适配
安装与部署
1. 环境要求
- Python 3.10+
- PyTorch 2.x
- Transformers(建议最新版)
- bitsandbytes(QLoRA 4-bit 需要)
- CUDA 12.x(GPU 训练)
2. 安装
# pip 安装 pip install peft # 安装最新特性 pip install git+https://github.com/huggingface/peft.git # 安装 QLoRA 依赖 pip install peft bitsandbytes transformers accelerate # 源码安装 git clone https://github.com/huggingface/peft.git cd peft pip install -e .
3. LoRA 微调(经典四步法)
from transformers import AutoModelForSeq2SeqLM
from peft import get_peft_config, get_peft_model, LoraConfig, TaskType
# 1. 定义 LoRA 配置
peft_config = LoraConfig(
task_type=TaskType.SEQ_2_SEQ_LM,
inference_mode=False,
r=8, # LoRA 秩
lora_alpha=32, # 缩放因子
lora_dropout=0.1,
)
# 2. 包裹基座模型
model = AutoModelForSeq2SeqLM.from_pretrained("bigscience/mt0-large")
model = get_peft_model(model, peft_config)
# 3. 查看可训练参数比例
model.print_trainable_parameters()
# "trainable params: 2359296 || all params: 1231940608 || trainable%: 0.19%"
# 4. 训练...(使用 Transformers Trainer 或自定义循环)
# 训练后保存适配器
model.save_pretrained("./lora_adapter")
4. QLoRA 4-bit 微调(消费级硬件)
import torch
from transformers import AutoModelForCausalLM, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model
# 4-bit 量化配置
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_use_double_quant=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16,
)
# 加载 4-bit 量化基座
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-3.1-8B",
quantization_config=bnb_config,
device_map="auto",
)
# LoRA 配置
lora_config = LoraConfig(
r=16,
lora_alpha=32,
lora_dropout=0.05,
target_modules=["q_proj", "v_proj"],
bias="none",
task_type="CAUSAL_LM",
)
# 包裹为 PEFT 模型
model = get_peft_model(model, lora_config)
model.print_trainable_parameters() # 仅训练约 1-2% 参数
# 训练后保存(仅适配器,几 MB)
model.save_pretrained("./llama3.1-8b-qlora-adapter")
5. Transformers 原生 add_adapter 方式
from transformers import AutoModelForCausalLM
from peft import LoraConfig, TaskType
model = AutoModelForCausalLM.from_pretrained("google/gemma-2-2b")
lora_config = LoraConfig(
task_type=TaskType.CAUSAL_LM,
inference_mode=False,
r=8,
lora_alpha=32,
lora_dropout=0.1,
)
# 直接在模型上添加适配器(Transformers + PEFT 原生集成)
model.add_adapter(lora_config, adapter_name="lora_1")
# 训练(使用 Transformers Trainer)
from transformers import Trainer
trainer = Trainer(model=model, ...)
trainer.train()
# 如需同时训练 lm_head
lora_config = LoraConfig(
modules_to_save=["lm_head"], # 额外全参训练 lm_head
...
)
6. 多适配器动态切换
from transformers import AutoModelForCausalLM
from peft import LoraConfig
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.1-8B")
# 添加任务 A 适配器
model.add_adapter(LoraConfig(...), adapter_name="task_a")
# 添加任务 B 适配器
model.add_adapter(LoraConfig(...), adapter_name="task_b")
# 动态切换
model.set_adapter("task_a") # 激活 task_a
output_a = model.generate(...)
model.set_adapter("task_b") # 切换到 task_b
output_b = model.generate(...)
# 单基座多适配器服务:这是 vLLM/Lorax/TGI 多 LoRA 并发的底层机制
7. 加载 PEFT 适配器推理
from peft import AutoPeftModelForCausalLM
from transformers import AutoTokenizer
import torch
# 加载 PEFT 模型(自动加载基座 + 适配器)
model = AutoPeftModelForCausalLM.from_pretrained("./lora_adapter").to("cuda")
tokenizer = AutoTokenizer.from_pretrained("facebook/opt-350m")
model.eval()
inputs = tokenizer("Preheat the oven to 350 degrees and place the cookie dough",
return_tensors="pt")
outputs = model.generate(input_ids=inputs["input_ids"].to("cuda"), max_new_tokens=50)
print(tokenizer.batch_decode(outputs, skip_special_tokens=True)[0])
8. DoRA 训练(权重分解 LoRA)
from peft import LoraConfig
dora_config = LoraConfig(
r=16,
lora_alpha=32,
lora_dropout=0.05,
use_dora=True, # 启用 DoRA
target_modules=["q_proj", "v_proj"],
bias="none",
task_type="CAUSAL_LM",
)
9. Prompt Tuning(软提示微调)
from peft import PromptTuningConfig, PromptTuningInit, get_peft_model
from transformers import AutoModelForCausalLM
peft_config = PromptTuningConfig(
task_type="CAUSAL_LM",
prompt_tuning_init=PromptTuningInit.TEXT,
prompt_tuning_init_text="Classify the following as good or bad.",
num_virtual_tokens=8,
)
model = AutoModelForCausalLM.from_pretrained("gpt2")
model = get_peft_model(model, peft_config)
10. 与 TRL 集成(RL 训练中使用 PEFT)
from trl import SFTTrainer, SFTConfig
from peft import LoraConfig
# TRL 的 SFTTrainer 原生支持 PEFT 模型
peft_config = LoraConfig(
r=16,
lora_alpha=32,
target_modules=["q_proj", "v_proj"],
task_type="CAUSAL_LM",
)
# 在 SFTConfig 中指定 peft_config 即可
sft_config = SFTConfig(
output_dir="./output",
per_device_train_batch_size=2,
)
# SFTTrainer 会自动识别并应用 PEFT 配置
11. 适配器合并(消除推理延迟)
from peft import PeftModel
from transformers import AutoModelForCausalLM
# 加载基座模型
base_model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.1-8B")
# 加载 PEFT 适配器
peft_model = PeftModel.from_pretrained(base_model, "./lora_adapter")
# 合并适配器到基座
merged_model = peft_model.merge_and_unload()
# 保存合并后的模型(消除推理延迟)
merged_model.save_pretrained("./merged_model")
12. 部署前必检清单
- 确认仓库位于
github.com/huggingface/peft(官方 Hugging Face 组织) - 许可:Apache-2.0,商用友好
- PEFT 是底层库,非端到端框架——完整训练流水线需配合 Transformers Trainer/TRL 或 LlamaFactory/MS-SWIFT/Axolotl
- QLoRA 4-bit 需安装 bitsandbytes 并匹配 CUDA 版本
- 消费级硬件推荐:RTX 3060 8GB 可 QLoRA 微调 7B-8B 模型,RTX 4090 24GB 可 QLoRA 微调 14B 模型
- 适配器仅几 MB,便于在 Hugging Face Hub 上托管与分享
- 多适配器动态切换是 vLLM/Lorax/TGI 多 LoRA 并发服务的底层机制
- 生产环境推理部署需配合 vLLM、Lorax、TGI 等推理引擎——PEFT 核心职责是训练阶段的适配器管理
- 严格属于”训练&微调”子分类,不应归入”推理引擎”、”API 封装”或”交互前端”
- 版本兼容性:PEFT 与 Transformers、bitsandbytes、TRL 版本耦合,建议锁定兼容版本组合
相关导航


LlamaFactory

TRL

MS-SWIFT

DeepSpeed

TorchTune

