🤗 PEFT 函式庫發布,實現千億規模模型的參數高效微調

TL;DR

Hugging Face 發布了 🤗 PEFT 函式庫,允許以參數高效的方式微調大型語言模型,只需幾兆位元組的可訓練權重,從而使在消費級 GPU 上適配千億規模模型成為可能。

動機:為何 PEFT 重要

PEFT 方法在凍結大部分預訓練模型的同時,只訓練一小部分額外參數。這同時降低了計算與儲存成本,避免災難性遺忘,且在資料稀少的情境下常常優於完整微調。此方法適用於多種模態(文字、視覺、音訊),並使單一基礎模型能透過極小的 adapter 檢查點服務眾多下游任務。

支援的 PEFT 技術

🤗 PEFT 函式庫目前實作了四種廣為引用的方法:

  1. LoRA – 大型語言模型的低秩適應(Low‑Rank Adaptation of Large Language Models,Hu 等,2021)。
  2. Prefix Tuning – P‑Tuning v2,將可學習向量前置於每個 transformer 層。
  3. Prompt Tuning – 在多任務間擴展基於提示的適應能力。
  4. P‑Tuning – 直接優化 GPT 類模型的連續提示。

未來版本將加入更多方法。

代表性使用案例

  • 在筆記型電腦 GPU(11 GB 記憶體)上微調 3 B 參數的 T0 模型,使用 LoRA 與 🤗 Accelerate 的 DeepSpeed 整合。示例腳本 peft_lora_seq2seq_accelerate_ds_zero3_offload.py 可在 Google Colab 上執行。
  • 在 Colab 中使用 bitsandbytes 套件對 OPT‑6.7B 進行 INT8 LoRA 微調,展示 8 位元量化結合 PEFT 後即可在一般 GPU 記憶體內運行。
  • 在消費級 GPU(RTX 2080 Ti、RTX 3080)上使用 LoRA 進行 Stable Diffusion DreamBooth,並提供可在 T4(16 GB)實例上執行的公開 Gradio 示範。

這些範例說明,以前需要數十 GB VRAM 的模型,如今可以在大多數實務工作者可取得的硬體上完成適配。

快速開始:使用 LoRA 微調 bigscience/mt0-large

from transformers import AutoModelForSeq2SeqLM
from peft import get_peft_model, LoraConfig, TaskType

model_name = "bigscience/mt0-large"
model = AutoModelForSeq2SeqLM.from_pretrained(model_name)

peft_cfg = LoraConfig(
    task_type=TaskType.SEQ_2_SEQ_LM,
    inference_mode=False,
    r=8,
    lora_alpha=32,
    lora_dropout=0.1,
)
model = get_peft_model(model, peft_cfg)
model.print_trainable_parameters()
# → trainable params: 2,359,296 | all params: 1,231,940,608 | trainable %: 0.19

其餘的訓練迴圈保持不變。訓練完成後,只會儲存 adapter 檔案:

model.save_pretrained("output_dir")  # creates adapter_config.json + adapter_model.bin (~19 MB)

若要載入進行推論:

from transformers import AutoModelForSeq2SeqLM, AutoTokenizer
from peft import PeftModel, PeftConfig

peft_id = "smangrul/twitter_complaints_bigscience_T0_3B_LORA_SEQ_2_SEQ_LM"
cfg = PeftConfig.from_pretrained(peft_id)
base = AutoModelForSeq2SeqLM.from_pretrained(cfg.base_model_name_or_path)
model = PeftModel.from_pretrained(base, peft_id)
 tokenizer = AutoTokenizer.from_pretrained(cfg.base_model_name_or_path)

model.eval().to("cuda")
inputs = tokenizer("Tweet text : @HondaCustSvc ...", return_tensors="pt")
with torch.no_grad():
    out = model.generate(inputs["input_ids"].to("cuda"), max_new_tokens=10)
    print(tokenizer.decode(out[0], skip_special_tokens=True))
# → "complaint"

Adapter 檢查點僅佔數兆位元組,卻能提供與完整微調相當的效能。

未來方向

Hugging Face 計畫加入更多 PEFT 變體,例如 IA³ 與 bottleneck adapters。即將推出的使用案例包括在 Colab 中對 whisper-large 進行 INT8 訓練,以及將 PEFT 套用於 RLHF 組件(策略與排序模型)。歡迎透過 GitHub 倉庫貢獻社群力量。

結論

🤗 PEFT 透過大幅降低硬體、計算與儲存門檻,讓千億規模模型的適配變得民主化,同時保持精度。函式庫與 🤗 Transformers 以及 🤗 Accelerate 的無縫整合,使得將 PEFT 插入既有流水線變得簡單,且能在任務間共享輕量級 adapter。

Sources