🤗 PEFT:在低資源硬體上對十億規模模型進行引數高效微調

釋出於 2023 年 2 月 10 日
在 GitHub 上更新

動機

基於 Transformer 架構的大型語言模型 (LLMs),如 GPT、T5 和 BERT,在各種自然語言處理 (NLP) 任務中取得了最先進的成果。它們也開始涉足其他領域,例如計算機視覺 (CV) (VIT、Stable Diffusion、LayoutLM) 和音訊 (Whisper、XLS-R)。傳統的正規化是在通用網路規模資料上進行大規模預訓練,然後針對下游任務進行微調。與開箱即用的預訓練 LLM(例如零樣本推理)相比,在下游資料集上微調這些預訓練 LLM 可帶來巨大的效能提升。

然而,隨著模型變得越來越大,在消費級硬體上進行完全微調變得不可行。此外,為每個下游任務獨立儲存和部署微調模型變得非常昂貴,因為微調模型與原始預訓練模型大小相同。引數高效微調 (PEFT) 方法旨在解決這兩個問題!

PEFT 方法僅微調少量(額外)模型引數,同時凍結預訓練 LLM 的大部分引數,從而大大降低了計算和儲存成本。這還克服了災難性遺忘問題,這是一種在 LLM 全量微調過程中觀察到的行為。PEFT 方法還被證明在低資料狀態下優於微調,並且對域外場景具有更好的泛化能力。它可以應用於各種模態,例如影像分類Stable Diffusion Dreambooth

它還有助於可移植性,使用者可以使用 PEFT 方法調整模型,以獲得僅幾 MB 的微小檢查點,而完全微調會產生大型檢查點,例如,`bigscience/mt0-xxl` 佔用 40GB 儲存空間,完全微調將導致每個下游資料集生成 40GB 檢查點,而使用 PEFT 方法,每個下游資料集僅需幾 MB,同時達到與完全微調相當的效能。PEFT 方法訓練得到的小權重會新增到預訓練 LLM 的頂部。因此,同一個 LLM 可以透過新增小權重用於多個任務,而無需替換整個模型。

簡而言之,PEFT 方法使您能夠以少量可訓練引數獲得與完全微調相當的效能。

今天,我們很高興推出 🤗 PEFT 庫,該庫提供最新引數高效微調技術,並與 🤗 Transformers 和 🤗 Accelerate 無縫整合。這使得使用 Transformers 中最流行、效能最佳的模型,同時結合 Accelerate 的簡單性和可擴充套件性成為可能。以下是目前支援的 PEFT 方法,更多方法即將推出:

  1. LoRA:LORA:大型語言模型的低秩適應
  2. 字首調整:P-Tuning v2:Prompt Tuning 可以與在各種規模和任務上的微調普遍媲美
  3. Prompt Tuning:規模對於引數高效 Prompt Tuning 的力量
  4. P-Tuning:GPT 也理解

用例

我們在此探索了許多有趣的用例。以下是一些最有趣的:

  1. 使用 🤗 PEFT LoRA,在具有 11GB 記憶體的消費級硬體(例如 Nvidia GeForce RTX 2080 Ti、Nvidia GeForce RTX 3080 等)上,使用 🤗 Accelerate 的 DeepSpeed 整合微調 `bigscience/T0_3B` 模型(30 億引數):peft_lora_seq2seq_accelerate_ds_zero3_offload.py。這意味著您可以在 Google Colab 中微調如此大型的 LLM。

  2. 透過使用 🤗 PEFT LoRA 和 bitsandbytes 在 Google Colab 中啟用 `OPT-6.7b` 模型(67 億引數)的 INT8 微調,將前面的示例提升一個檔次:在 Colab 中開啟

  3. 使用 🤗 PEFT 在具有 11GB 記憶體的消費級硬體(例如 Nvidia GeForce RTX 2080 Ti、Nvidia GeForce RTX 3080 等)上進行 Stable Diffusion Dreambooth 訓練。嘗試 Space 演示,它應該可以在 T4 例項(16GB GPU)上無縫執行:smangrul/peft-lora-sd-dreambooth

peft lora dreambooth gradio space
PEFT LoRA Dreambooth Gradio Space

使用 🤗 PEFT 訓練你的模型

讓我們考慮使用 LoRA 對 `bigscience/mt0-large` 進行微調的案例。

  1. 獲取必要的匯入
  from transformers import AutoModelForSeq2SeqLM
+ from peft import get_peft_model, LoraConfig, TaskType
  model_name_or_path = "bigscience/mt0-large"
  tokenizer_name_or_path = "bigscience/mt0-large"
  1. 建立與 PEFT 方法對應的配置
peft_config = LoraConfig(
    task_type=TaskType.SEQ_2_SEQ_LM, inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1
)
  1. 透過呼叫 `get_peft_model` 封裝基礎 🤗 Transformers 模型
  model = AutoModelForSeq2SeqLM.from_pretrained(model_name_or_path)
+ model = get_peft_model(model, peft_config)
+ model.print_trainable_parameters()
# output: trainable params: 2359296 || all params: 1231940608 || trainable%: 0.19151053100118282

就是這樣!其餘的訓練迴圈保持不變。請參閱示例 peft_lora_seq2seq.ipynb 以獲取端到端示例。

  1. 當您準備好儲存模型以進行推理時,只需執行以下操作。
model.save_pretrained("output_dir") 
# model.push_to_hub("my_awesome_peft_model") also works

這將只儲存訓練過的增量 PEFT 權重。例如,您可以在此處找到使用 LoRA 在 `twitter_complaints` raft 資料集上微調的 `bigscience/T0_3B`:smangrul/twitter_complaints_bigscience_T0_3B_LORA_SEQ_2_SEQ_LM。請注意,它只包含 2 個檔案:adapter_config.json 和 adapter_model.bin,其中後者僅為 19MB。

  1. 要載入它進行推理,請遵循以下程式碼片段
  from transformers import AutoModelForSeq2SeqLM
+ from peft import PeftModel, PeftConfig

  peft_model_id = "smangrul/twitter_complaints_bigscience_T0_3B_LORA_SEQ_2_SEQ_LM"
  config = PeftConfig.from_pretrained(peft_model_id)
  model = AutoModelForSeq2SeqLM.from_pretrained(config.base_model_name_or_path)
+ model = PeftModel.from_pretrained(model, peft_model_id)
  tokenizer = AutoTokenizer.from_pretrained(config.base_model_name_or_path)

  model = model.to(device)
  model.eval()
  inputs = tokenizer("Tweet text : @HondaCustSvc Your customer service has been horrible during the recall process. I will never purchase a Honda again. Label :", return_tensors="pt")

  with torch.no_grad():
      outputs = model.generate(input_ids=inputs["input_ids"].to("cuda"), max_new_tokens=10)
      print(tokenizer.batch_decode(outputs.detach().cpu().numpy(), skip_special_tokens=True)[0])
# 'complaint'

後續步驟

我們釋出了 PEFT,作為一種在下游任務和領域上微調大型 LLM 的高效方式,它節省了大量計算和儲存,同時實現了與完全微調相當的效能。在未來幾個月,我們將探索更多 PEFT 方法,例如 (IA)3 和瓶頸介面卡。此外,我們將重點關注新的用例,例如在 Google Colab 中對 `whisper-large` 模型進行 INT8 訓練,以及使用 PEFT 方法對 RLHF 元件(如策略和排序器)進行微調。

與此同時,我們很高興看到行業從業者如何將 PEFT 應用於他們的用例——如果您有任何問題或反饋,請在我們的 GitHub 倉庫上提出問題 🤗。

祝您引數高效微調愉快!

社群

幹得好👍

image.png
這篇文章有一個錯誤:題為“P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks”的論文是關於 P-Tuning v2 的,而不是字首調整(Prefix Tuning)。因此,字首“Prefix Tuning”是不正確的——它們是不同的方法。

註冊登入 以評論

© . This site is unofficial and not affiliated with Hugging Face, Inc.