?聚四氟乙烯
最先进的参数高效微调 (PEFT) 方法
由于其规模,对大型预训练模型进行微调的成本通常过高。参数高效微调 (PEFT) 方法只需微调少量(额外)模型参数而不是所有模型参数,即可使大型预训练模型高效适应各种下游应用。这显着降低了计算和存储成本。最近最先进的 PEFT 技术的性能可与完全微调的模型相媲美。
PEFT 与 Transformers 集成,可轻松进行模型训练和推理;与 Diffusers 集成,可方便管理不同的适配器;与 Accelerate 集成,可实现大型模型的分布式训练和推理。
提示
访问 PEFT 组织,了解库中实施的 PEFT 方法,并查看演示如何将这些方法应用于各种下游任务的笔记本。单击组织页面上的“观看存储库”按钮即可收到新实施的方法和笔记本的通知!
查看 PEFT 适配器 API 参考部分以获取支持的 PEFT 方法列表,并阅读适配器、软提示和 IA3 概念指南以了解有关这些方法如何工作的更多信息。
从 pip 安装 PEFT:
pip install peft
通过使用get_peft_model
包装基本模型和 PEFT 配置,准备使用 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 适用于许多不同的用例。
考虑使用具有超过 64GB CPU RAM 的 A100 80GB GPU 在 ought/raft/twitter_complaints 数据集上训练以下模型的内存要求。
模型 | 全面微调 | PEFT-LoRA PyTorch | 具有 CPU 卸载功能的 PEFT-LoRA DeepSpeed |
---|---|---|---|
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 超参数和其他与训练相关的超参数来榨取更多性能。该模型的最终检查点大小仅为 19MB,而完整的 bigscience/T0_3B 模型为 11GB。在此博文中详细了解使用 PEFT 进行微调的优势。
量化是另一种通过以较低精度表示数据来减少模型内存需求的方法。它可以与 PEFT 方法结合使用,使训练和加载 LLM 进行推理变得更加容易。
PEFT 可以避免对每个下游任务或数据集的模型进行全面微调,从而帮助您节省存储空间。在许多情况下,您仅微调模型参数的一小部分,并且每个检查点的大小仅为几 MB(而不是 GB)。这些较小的 PEFT 适配器的性能可与完全微调的模型相媲美。如果您有许多数据集,则可以使用 PEFT 模型节省大量存储空间,而不必担心灾难性遗忘或过度拟合主干或基础模型。
PEFT 在 Hugging Face 生态系统中得到了广泛支持,因为它为训练和推理带来了巨大的效率。
迭代扩散过程消耗大量内存,这使得训练变得困难。 PEFT可以帮助减少内存需求并减少最终模型检查点的存储大小。例如,考虑在具有超过 64GB CPU RAM 的 A100 80GB GPU 上使用 LoRA 训练稳定扩散模型所需的内存。最终模型检查点大小仅为 8.8MB!
模型 | 全面微调 | PEFT-LoRA | 具有梯度检查点的 PEFT-LoRA |
---|---|---|---|
CompVis/稳定扩散-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 训练您自己的稳定扩散模型,并使用在 T4 实例上运行的 smangrul/peft-lora-sd-dreambooth Space。在本教程中了解有关扩散器中 PEFT 集成的更多信息。
Accelerate 是一个用于在各种训练设置和硬件(GPU、TPU、Apple Silicon 等)上进行分布式训练和推理的库。 PEFT 模型与开箱即用的 Accelerate 配合使用,使得训练大型模型或使用它们在资源有限的消费类硬件上进行推理变得非常方便。
PEFT 还可以应用于使用 RLHF 组件(例如排序器和策略)来训练法学硕士。开始阅读:
使用此空间或查看文档来查找哪些模型正式支持开箱即用的 PEFT 方法。即使您没有看到下面列出的模型,您也可以手动配置模型配置以启用模型的 PEFT。请阅读新的 Transformers 架构指南以了解具体操作方法。
如果您想为 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 }
}