英文原文正文为项目原始 README(英文),本站后续会翻译为中文,当前仅剔除图片与无关章节并统一排版。
版权所有 2023 HuggingFace 团队。保留所有权利。
根据 Apache 许可证 2.0 版(“许可证”)获得许可;除非遵守许可证,否则您不得使用此文件。您可以在以下位置获得许可证副本
https://www.apache.org/licenses/LICENSE-2.0
除非适用法律要求或书面同意,否则按照本许可证分发的软件是按“原样”基础分发的,不附带任何明示或暗示的保证或条件。有关许可证下管理权限和限制的具体语言,请参阅许可证。
-->
🤗 PEFT
最先进的参数高效微调(PEFT)方法
由于规模庞大,对大型预训练模型进行微调往往成本高昂。参数高效微调(PEFT)方法通过只微调少量(额外的)模型参数,而不是模型的全部参数,使大型预训练模型能够高效地适应各种下游应用。这显著降低了计算和存储成本。近期的先进 PEFT 技术实现的性能可与完全微调的模型相媲美。
PEFT 与 Transformers 集成,以便轻松进行模型训练和推理,与 Diffusers 集成,便于管理不同的适配器,并与 Accelerate 集成,实现对超大型模型的分布式训练和推理。
[!提示]
访问 PEFT 组织,以了解库中实现的 PEFT 方法,并查看展示如何将这些方法应用于各种下游任务的笔记本。在组织页面点击“Watch repos”按钮,可在新方法和笔记本发布时收到通知!
查看 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 数据集上使用拥有超过 64GB CPU 内存的 A100 80GB GPU 训练以下模型所需的内存。
| 模型 | 全量微调 | PEFT-LoRA PyTorch | PEFT-LoRA DeepSpeed(带 CPU 卸载) |
|---|---|---|---|
| bigscience/T0_3B(3B 参数) | 47.14GB GPU / 2.96GB CPU | 14.4GB GPU / 2.96GB CPU | 9.8GB GPU / 17.8GB CPU |
| bigscience/mt0-xxl(12B 参数) | GPU 内存不足 | 56GB GPU / 3GB CPU | 22GB GPU / 52GB CPU |
| bigscience/bloomz-7b1(7B 参数) | GPU 内存不足 | 32GB GPU / 3.8GB CPU | 18.1GB GPU / 35GB CPU |
使用 LoRA,您可以完全微调一个 12B 参数的模型,否则在 80GB GPU 上会出现内存不足,同时可以轻松地适配和训练 3B 参数的模型。当您查看 3B 参数模型的性能时,它与完全微调的模型相比,在 GPU 内存使用量上只占一小部分。
| 提交名称 | 准确率 |
|---|---|
| 人类基线(众包) | 0.897 |
| 法兰-T5 | 0.892 |
| 洛拉-T0-3b | 0.863 |
[!提示]
上表中的 bigscience/T0_3B 模型性能尚未优化。通过调整输入指令模板、LoRA 超参数以及其他训练相关超参数,你可以进一步提升其性能。相比完整 bigscience/T0_3B 模型的 11GB,最终的检查点大小仅为 19MB。想了解使用 PEFT 微调的优势,请阅读这篇 博客文章。
量子化
量化是另一种通过降低精度表示数据来减少模型内存需求的方法。它可以与PEFT方法结合,使训练和加载LLM进行推断变得更加简单。
- 学习如何使用 QLoRA 和 TRL 库,在 16GB GPU 上微调 meta-llama/Llama-2-7b-hf,详细内容请参考 在你自己的消费级硬件上使用 PyTorch 和 Hugging Face 生态系统工具微调 LLM 博客文章。
- 了解如何在本 notebook 中使用 LoRA 和 8 位量化微调 openai/whisper-large-v2 模型以进行多语言自动语音识别(如需查看流式处理数据集的示例,请参见此 notebook)。
保存计算和存储
PEFT可以帮助你节省存储空间,避免对下游任务或数据集的模型进行完全微调。在许多情况下,你只需微调模型参数的极小部分,每个检查点的大小也只有几MB(而非GB)。这些较小的PEFT适配器的性能可与完全微调模型相当。如果你有大量数据集,使用PEFT模型可以节省大量存储空间,而不用担心骨干或基础模型的严重遗忘或过度拟合。
PEFT积分
PEFT因其在培训和推理方面的巨大效率而广受拥抱面生态系统支持。
扩散器
迭代扩散过程消耗大量内存,这可能使训练变得困难。PEFT可以帮助降低内存需求,并减少最终模型检查点的存储容量。例如,考虑在配备超过64GB CPU内存的A100 80GB GPU上用LoRA训练稳定扩散模型所需的内存。最终模型检查点大小仅为8.8MB!
| 模型 | 全五调 | PEFT-LoRA | 带梯度检查点的 PEFT-LoRA |
|---|---|---|---|
| CompVis/stable-diffusion-v1-4 | 27.5GB GPU / 3.97GB CPU | 15.5GB GPU / 3.84GB CPU | 8.12GB GPU / 3.77GB CPU |
[!提示]
查看 examples/lora_dreambooth/train_dreambooth.py 训练脚本,尝试使用 LoRA 训练你自己的 Stable Diffusion 模型,并尝试运行在 T4 实例上的 smangrul/peft-lora-sd-dreambooth Space。通过这个 教程 学习更多关于 Diffusers 中 PEFT 集成的内容。
变形金刚
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 是一个用于在各种训练设置和硬件(GPU、TPU、Apple Silicon 等)上进行分布式训练和推理的库。PEFT 模型可以开箱即用地与 Accelerate 配合使用,这使得在资源有限的消费者硬件上训练大模型或进行推理非常方便。
技术就绪水平
PEFT 也可以应用于具有 RLHF 组件(如排序器和策略)的 LLM 训练。入门请阅读:
- 使用 PEFT 和 TRL 库 用直接偏好优化微调 Mistral-7b 模型,以了解直接偏好优化(DPO)方法以及如何将其应用于 LLM。
- 使用 PEFT 和 TRL 库 在 24GB 消费级 GPU 上使用 RLHF 微调 20B LLM,然后尝试 gpt2-sentiment_peft.ipynb 笔记本,将 GPT2 优化为生成积极的电影评论。
- StackLLaMA: 使用 RLHF 训练 LLaMA 的动手指南 使用 PEFT,然后尝试 stack_llama/scripts 进行监督微调、奖励建模和 RL 微调。
模型支持
使用此 Space 或查看 文档 以找到哪些模型开箱即用支持 PEFT 方法。即使未在下方列出模型,也可以手动配置模型配置以启用 PEFT。阅读 新 Transformers 架构 指南了解方法。
贡献
如果您想为 PEFT 做贡献,请查看我们的 贡献指南。
引用 🤗 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}
}- 本文标题:peft - 🤗 PEFT:最先进的参数高效微调
- 本文链接:https://cn121.com/llm/huggingface-peft.html
- 原项目:huggingface/peft 版权归原作者 huggingface 及贡献者所有
- 收录信息:本站于 2026-09-26 收录本项目,本页所列协议与仓库指标均为收录当时的状态;该日期之后原项目的版本更新与协议变更,本页不作同步。
- 开源协议:收录时本项目采用 Apache-2.0(查看 LICENSE 原文),本站转载其原始文档(未改动文字,仅剔除图片与无关章节);使用、修改、分发请以该仓库 LICENSE 原文为准。本站对原文仅作排版与图片地址适配, 并保留原项目的 NOTICE 与署名要求。
- 站点出处:本文首发于 OneTwoOne,收录自 GitHub 开源项目 huggingface/peft。
- 内容说明:本页正文为原项目 README 原文(英文),本站后续会翻译为中文(当前尚未译出),仅剔除了图片与赞助等无关章节、并把相对链接改为绝对地址;页首简介为机器翻译自仓库描述。
- 引用声明:商业转载、第三方聚合或 AI 检索训练引用时,请务必保留以上来源出处、本文永久链接,以及原项目的版权声明与许可信息。
- 下架通道:若原项目此后变更或收紧了许可协议、或作者/权利人认为本站的收录方式(译文、排版适配、简介翻译等)超出其授权范围,请通过 xyd3302001@163.com 发送下架通知,并附上项目地址与本页链接。本站核实后将第一时间删除本页内容,或改为不复制原文的目录性收录;署名更正等其他要求可一并提出。