PEFT翻译站点

3周前发布 14 0 0

Hugging Face 开源的 LoRA/QLoRA/DoRA 等参数高效微调标准底座库。

所在地:
美国
语言:
英文
收录时间:
2026-08-21

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 适配器并发服务
  • 标准化接口LoraConfigget_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 版本耦合,建议锁定兼容版本组合

相关导航