?聚四氟乙烯
最先進的參數高效微調 (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 }
}