Files
huggingface--peft/README.md
T
wehub-resource-sync 06de7fb9cc
Build documentation / build (push) Failing after 0s
Secret Leaks / trufflehog (push) Has been cancelled
tests on transformers main / tests (push) Has been cancelled
CI security linting / zizmor latest via Cargo (push) Has been cancelled
docs: make Chinese README the default
2026-07-13 10:36:39 +00:00

12 KiB
Raw Blame History

Note

本文档由 WeHub 基于上游 README 翻译整理,属于社区翻译,非官方中文文档。
English · 原始项目 · 上游 README
原作者、版权与许可证归属以原始项目及本仓库 LICENSE 文件为准。

🤗 PEFT

先进的参数高效微调(Parameter-Efficient Fine-TuningPEFT)方法

微调大型预训练模型往往因其规模而成本过高。参数高效微调(PEFT)方法通过只微调少量(额外)模型参数,而非全部模型参数,使大型预训练模型能够高效适应各种下游应用。这显著降低了计算和存储成本。近期最先进的 PEFT 技术可达到与全量微调模型相当的性能。

PEFT 已与 Transformers 集成,便于模型训练与推理;与 Diffusers 集成,便于管理不同的适配器;与 Accelerate 集成,支持超大模型的分布式训练与推理。

Tip

访问 PEFT 组织页面,了解库中实现的 PEFT 方法,并查看演示如何将这些方法应用于各类下游任务的 notebook。点击组织页面的「Watch repos」按钮,以便在新方法和新 notebook 发布时收到通知!

查看 PEFT Adapters API Reference 部分以获取支持的 PEFT 方法列表,并阅读 Adapters,、Soft prompts, 和 IA3 概念指南,进一步了解这些方法的工作原理。

快速入门

通过 pip 安装 PEFT

pip install peft

使用 get_peft_model 将基础模型与 PEFT 配置包装起来,即可用 LoRA 等 PEFT 方法为训练准备模型。对于 bigscience/mt0-large 模型,你只需训练 0.19% 的参数!

import torch
from transformers import AutoModelForCausalLM
from peft import LoraConfig, TaskType, get_peft_model

device = torch.accelerator.current_accelerator().type if hasattr(torch, "accelerator") else "cuda"
model_id = "Qwen/Qwen2.5-3B-Instruct"
model = AutoModelForCausalLM.from_pretrained(model_id, device_map=device)
peft_config = LoraConfig(
    r=16,
    lora_alpha=32,
    task_type=TaskType.CAUSAL_LM,
    # target_modules=["q_proj", "v_proj", ...]  # optionally indicate target modules
)
model = get_peft_model(model, peft_config)
model.print_trainable_parameters()
# prints: trainable params: 3,686,400 || all params: 3,089,625,088 || trainable%: 0.1193

# now perform training on your dataset, e.g. using transformers Trainer, then save the model
model.save_pretrained("qwen2.5-3b-lora")

加载 PEFT 模型进行推理:

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel

device = torch.accelerator.current_accelerator().type if hasattr(torch, "accelerator") else "cuda"
model_id = "Qwen/Qwen2.5-3B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id, device_map=device)
model = PeftModel.from_pretrained(model, "qwen2.5-3b-lora")

inputs = tokenizer("Preheat the oven to 350 degrees and place the cookie dough", return_tensors="pt")
outputs = model.generate(**inputs.to(device), max_new_tokens=50)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))

# prints something like: Preheat the oven to 350 degrees and place the cookie dough in a baking dish [...]

为何应使用 PEFT

使用 PEFT 有许多优势,但最主要的是在计算和存储方面的大幅节省,使 PEFT 适用于许多不同的用例。

在消费级硬件上实现高性能

以下是在 ought/raft/twitter_complaints 数据集上、使用配备 80GB 显存的 A100 GPU 且 CPU RAM 超过 64GB 时,训练下列模型的内存需求。

模型 全量微调 PEFT-LoRA PyTorch 带 CPU Offloading 的 PEFT-LoRA DeepSpeed
bigscience/T0_3B (3B params) 47.14GB GPU / 2.96GB CPU 14.4GB GPU / 2.96GB CPU 9.8GB GPU / 17.8GB CPU
bigscience/mt0-xxl (12B params) OOM GPU 56GB GPU / 3GB CPU 22GB GPU / 52GB CPU
bigscience/bloomz-7b1 (7B params) OOM GPU 32GB GPU / 3.8GB CPU 18.1GB GPU / 35GB CPU

借助 LoRA,你可以全量微调一个 12B 参数模型——否则在 80GB GPU 上会显存不足(OOM)——并能舒适地容纳并训练 3B 参数模型。若观察 3B 参数模型的性能,其在仅占全量微调模型一小部分 GPU 显存的情况下,表现与之相当。

提交名称 准确率
Human baseline (crowdsourced) 0.897
Flan-T5 0.892
lora-t0-3b 0.863

Tip

上表中 bigscience/T0_3B 模型的性能尚未优化。你可以通过调整输入指令模板、LoRA 超参数及其他训练相关超参数,进一步榨取性能。该模型的最终 checkpoint 大小仅为 19MB,而完整的 bigscience/T0_3B 模型为 11GB。在这篇博客文章. 中了解更多使用 PEFT 进行微调的优势。

量化

量化是另一种通过以较低精度表示数据来降低模型内存需求的方法。它可以与 PEFT 方法结合使用,使训练和加载 LLM 进行推理更加容易。

  • 在这篇博客文章 中学习如何在 16GB GPU 上使用 QLoRA 和 TRL 库微调 meta-llama/Llama-2-7b-hf——参见《使用 PyTorch 和 Hugging Face 生态工具在你自己的消费级硬件上微调 LLM》。
  • 在这份 notebook 中学习如何使用 LoRA 和 8-bit 量化微调 openai/whisper-large-v2 模型以实现多语言自动语音识别(若要查看流式传输数据集的示例,请参阅这份 notebook)。

节省计算与存储

PEFT 可帮助你在每个下游任务或数据集上避免全量微调模型,从而节省存储空间。在许多情况下,你只需微调模型参数的极小一部分,每个 checkpoint 仅几 MB(而非 GB)。这些更小的 PEFT 适配器可达到与全量微调模型相当的性能。若你有许多数据集,使用 PEFT 模型可节省大量存储,且无需担心灾难性遗忘或对骨干/基础模型过拟合。

PEFT 集成

PEFT 在 Hugging Face 生态系统中得到广泛支持,因为它为训练与推理带来了巨大的效率提升。

Diffusers

迭代扩散过程会消耗大量内存,使训练变得困难。PEFT 可帮助降低内存需求并减小最终模型 checkpoint 的存储体积。例如,在配备 80GB 显存的 A100 GPU 且 CPU RAM 超过 64GB 的条件下,考虑使用 LoRA 训练 Stable Diffusion 模型所需的内存。最终模型 checkpoint 大小仅为 8.8MB

Model Full Finetuning PEFT-LoRA PEFT-LoRA with Gradient Checkpointing
CompVis/stable-diffusion-v1-4 27.5GB GPU / 3.97GB CPU 15.5GB GPU / 3.84GB CPU 8.12GB GPU / 3.77GB CPU

Tip

查看 examples/lora_dreambooth/train_dreambooth.py 训练脚本,尝试使用 LoRA 训练你自己的 Stable Diffusion 模型,还可以在运行在 T4 实例上的 smangrul/peft-lora-sd-dreambooth Space 中进行体验。阅读这篇 tutorial. 了解更多关于 Diffusers 中 PEFT 集成的内容。

Transformers

PEFT 已与 Transformers. 直接集成。加载模型后,调用 add_adapter 可为模型添加新的 PEFT 适配器:

from peft import LoraConfig
model = ...  # transformers model
peft_config = LoraConfig(...)
model.add_adapter(peft_config, adapter_name="lora_1")

要加载已训练的 PEFT 适配器,请调用 load_adapter

model = ...  # transformers model
model.load_adapter(<path-to-adapter>, adapter_name="lora_1")

要在不同适配器之间切换,请调用 set_adapter

model.set_adapter("lora_2")

Transformers 集成并未包含 PEFT 提供的全部功能,例如将适配器合并到基础模型中的方法。

Accelerate

Accelerate 是一个用于在各种训练配置和硬件(GPU、TPU、Apple Silicon 等)上进行分布式训练与推理的库。PEFT 模型可与 Accelerate 开箱即用(out of the box)协同工作,让你能够非常方便地训练超大规模模型,或在资源有限的消费级硬件上进行推理。

TRL

PEFT 也可用于训练包含 RLHF 组件(如 ranker 和 policy)的 LLM。可通过阅读以下内容入门:

Model support

使用此 Space 或查看 docs,了解哪些模型开箱即支持 PEFT 方法。即使下方列表中没有某个模型,你也可以手动配置模型 config 以为其启用 PEFT。阅读 New transformers architecture 指南了解具体做法。

Contribute

如果你想为 PEFT 做出贡献,请查看我们的 contribution guide.

Citing 🤗 PEFT

若要在出版物中使用 🤗 PEFT,请使用以下 BibTeX 条目进行引用。

@Misc{peft,
  title =        {{PEFT}: State-of-the-art Parameter-Efficient Fine-Tuning methods},
  author =       {Sourab Mangrulkar and Sylvain Gugger and Lysandre Debut and Younes Belkada and Sayak Paul and Benjamin Bossan and Marian Tietz},
  howpublished = {\url{https://github.com/huggingface/peft}},
  year =         {2022}
}