参数高效微调 (PEFT)
项目描述
🤗 PEFT
最先进的参数高效微调 (PEFT) 方法
由于规模庞大,微调大型预训练模型通常成本高昂。参数高效微调 (PEFT) 方法通过仅微调少量(额外)模型参数而不是所有模型参数,使得大型预训练模型能够高效地适应各种下游应用。这显著降低了计算和存储成本。最近最先进的PEFT技术实现了与完全微调模型相当的性能。
PEFT已集成到Transformers中,以便于模型训练和推理,Diffusers方便地管理不同的适配器,Accelerate支持大规模模型的分布式训练和推理。
[!TIP] 访问 PEFT 组织,了解库中实现的PEFT方法,并查看如何将这些方法应用于各种下游任务的笔记本。点击组织页面上的“观看仓库”按钮,以接收新实现的方法和笔记本通知!
请检查PEFT适配器API参考部分以获取支持的PEFT方法列表,并阅读有关这些方法如何工作的适配器、软提示和IA3概念指南。
快速入门
使用pip安装PEFT
pip install peft
使用get_peft_model
将基模型和PEFT配置包装起来,为训练准备一个模型,例如使用LoRA。对于bigscience/mt0-large模型,你只需训练0.19%的参数!
from transformers import AutoModelForSeq2SeqLM
from peft import get_peft_config, get_peft_model, LoraConfig, TaskType
model_name_or_path = "bigscience/mt0-large"
tokenizer_name_or_path = "bigscience/mt0-large"
peft_config = LoraConfig(
task_type=TaskType.SEQ_2_SEQ_LM, inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1
)
model = AutoModelForSeq2SeqLM.from_pretrained(model_name_or_path)
model = get_peft_model(model, peft_config)
model.print_trainable_parameters()
"trainable params: 2359296 || all params: 1231940608 || trainable%: 0.19151053100118282"
加载PEFT模型进行推理
from peft import AutoPeftModelForCausalLM
from transformers import AutoTokenizer
import torch
model = AutoPeftModelForCausalLM.from_pretrained("ybelkada/opt-350m-lora").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])
"Preheat the oven to 350 degrees and place the cookie dough in the center of the oven. In a large bowl, combine the flour, baking powder, baking soda, salt, and cinnamon. In a separate bowl, combine the egg yolks, sugar, and vanilla."
为什么你应该使用PEFT
使用PEFT有许多好处,但主要好处是计算和存储的巨大节省,这使得PEFT适用于许多不同的用例。
在消费级硬件上的高性能
考虑在具有超过64GB CPU RAM的A100 80GB GPU上训练以下模型在ought/raft/twitter_complaints数据集时的内存需求。
模型 | 全微调 | PEFT-LoRA PyTorch | PEFT-LoRA DeepSpeed with CPU Offloading |
---|---|---|---|
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参数) | OOM GPU | 56GB GPU / 3GB CPU | 22GB GPU / 52GB CPU |
bigscience/bloomz-7b1 (7B参数) | OOM GPU | 32GB GPU / 3.8GB CPU | 18.1GB GPU / 35GB CPU |
使用LoRA,你可以完全微调一个12B参数的模型,否则在80GB GPU上将无法运行,并且可以舒适地拟合和训练一个3B参数的模型。当你查看3B参数模型的表现时,它的性能与全微调模型相当,但GPU内存的使用量却少得多。
提交名称 | 准确率 |
---|---|
人工基线(众包) | 0.897 |
Flan-T5 | 0.892 |
lora-t0-3b | 0.863 |
[!TIP] 上表中的bigscience/T0_3B模型性能未经优化。你可以通过调整输入指令模板、LoRA超参数和其他与训练相关的超参数来进一步提高性能。该模型的最终检查点大小仅为19MB,而完整bigscience/T0_3B模型的大小为11GB。在这篇博客文章中了解更多关于使用PEFT微调的优势。
量化
量化是一种通过以更低的精度表示数据来降低模型内存需求的方法。它可以与PEFT方法结合使用,使训练和加载LLMs进行推理变得更加容易。
- 在使用PyTorch和Hugging Face生态系统中的工具在自己的消费级硬件上微调LLMs博客文章中学习如何使用QLoRA和TRL库在16GB GPU上微调meta-llama/Llama-2-7b-hf。
- 在这篇笔记本中学习如何使用LoRA和8位量化对openai/whisper-large-v2模型进行多语言语音识别的微调(请参阅此笔记本以获取数据流的示例)。
节省计算和存储
PEFT可以帮助你通过避免在每个下游任务或数据集上对模型进行全微调来节省存储。在许多情况下,你只需微调模型的一小部分参数,并且每个检查点的大小只有几MB(而不是GB)。这些较小的PEFT适配器展示了与全微调模型相当的性能。如果你有大量数据集,你可以使用PEFT模型节省大量存储,而不用担心灾难性遗忘或过拟合骨干或基模型。
PEFT集成
PEFT因其为训练和推理带来的巨大效率而广泛受到Hugging Face生态系统的支持。
扩散器
迭代扩散过程消耗大量内存,这可能会使训练变得困难。PEFT可以帮助减少内存需求,并减小最终模型检查点的存储大小。例如,考虑在A100 80GB GPU上使用LoRA训练Stable Diffusion模型所需的内存,CPU RAM超过64GB。最终模型检查点的大小仅为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 |
[!TIP] 查看示例训练脚本 examples/lora_dreambooth/train_dreambooth.py 尝试使用LoRA训练自己的Stable Diffusion模型,并尝试运行在T4实例上的 smangrul/peft-lora-sd-dreambooth 空间。关于Diffusers中的PEFT集成,请参阅此 教程。
加速
Accelerate 是一个用于在各种训练设置和硬件(GPU、TPU、Apple Silicon等)上进行分布式训练和推理的库。PEFT模型与Accelerate配合使用,使得训练非常大的模型或在使用资源有限的消费硬件上进行推理变得非常方便。
TRL
PEFT还可以应用于具有RLHF组件(如ranker和policy)的LLM训练。通过阅读以下内容开始:
- 使用PEFT和TRL库微调Mistral-7b模型 了解更多关于直接偏好优化(DPO)方法和如何将其应用于LLM的信息。
- 使用PEFT和TRL库在24GB消费GPU上微调20B LLM,然后尝试gpt2-sentiment_peft.ipynb 笔记本以优化GPT2生成正面电影评论。
- StackLLaMA:使用PEFT训练LLaMA的实战指南,然后尝试stack_llama/scripts 进行监督微调、奖励建模和RL微调。
模型支持
使用此 空间 或查看 文档 以找到哪些模型默认支持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},
howpublished = {\url{https://github.com/huggingface/peft}},
year = {2022}
}
项目详情
下载文件
下载适用于您平台的应用程序文件。如果您不确定选择哪个,请了解更多关于安装软件包的信息。