PEFT 文件

快速教程

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

快速入門

PEFT 提供了引數高效的方法來微調大型預訓練模型。傳統的正規化是為每個下游任務微調模型的所有引數,但由於當今模型中引數數量巨大,這種方法變得極其昂貴且不切實際。相反,訓練更少量的提示引數,或者使用像低秩適應(LoRA)這樣的重引數化方法來減少可訓練引數的數量會更高效。

本快速入門將向您展示 PEFT 的主要功能,以及如何訓練或在通常無法在消費級裝置上執行的大型模型上進行推理。

訓練

每種 PEFT 方法都由一個 PeftConfig 類定義,該類儲存了構建 PeftModel 所需的所有重要引數。例如,要使用 LoRA 進行訓練,載入並建立一個 LoraConfig 類,並指定以下引數:

  • task_type:訓練任務的型別(本例中為序列到序列語言建模)
  • inference_mode:是否將模型用於推理
  • r:低秩矩陣的維度
  • lora_alpha:低秩矩陣的縮放因子
  • lora_dropout:LoRA 層的 dropout 機率
from peft import LoraConfig, TaskType

peft_config = LoraConfig(task_type=TaskType.SEQ_2_SEQ_LM, inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1)

有關您可以調整的其他引數的更多詳細資訊,例如目標模組或偏置型別,請參閱 LoraConfig 參考。

一旦設定好 LoraConfig,就可以使用 get_peft_model() 函式建立一個 PeftModel。它接受一個基礎模型——您可以從 Transformers 庫載入——以及一個包含如何配置模型以進行 LoRA 訓練的引數的 LoraConfig

載入您想要微調的基礎模型。

from transformers import AutoModelForSeq2SeqLM

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

使用 get_peft_model() 函式將基礎模型和 `peft_config` 包裝起來,以建立一個 PeftModel。要了解模型中可訓練引數的數量,請使用 `print_trainable_parameters` 方法。

from peft import get_peft_model

model = get_peft_model(model, peft_config)
model.print_trainable_parameters()
"output: trainable params: 2359296 || all params: 1231940608 || trainable%: 0.19151053100118282"

bigscience/mt0-large 的 12 億個引數中,您只訓練了其中的 0.19%!

就是這樣 🎉!現在您可以使用 Transformers 的 `Trainer`、Accelerate 或任何自定義的 PyTorch 訓練迴圈來訓練模型。

例如,要使用 `Trainer` 類進行訓練,需要設定一個包含一些訓練超引數的 `TrainingArguments` 類。

training_args = TrainingArguments(
    output_dir="your-name/bigscience/mt0-large-lora",
    learning_rate=1e-3,
    per_device_train_batch_size=32,
    per_device_eval_batch_size=32,
    num_train_epochs=2,
    weight_decay=0.01,
    eval_strategy="epoch",
    save_strategy="epoch",
    load_best_model_at_end=True,
)

將模型、訓練引數、資料集、分詞器以及任何其他必要元件傳遞給 `Trainer`,然後呼叫 `train` 開始訓練。

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=tokenized_datasets["train"],
    eval_dataset=tokenized_datasets["test"],
    processing_class=tokenizer,
    data_collator=data_collator,
    compute_metrics=compute_metrics,
)

trainer.train()

儲存模型

模型訓練完成後,您可以使用 `save_pretrained` 函式將模型儲存到目錄中。

model.save_pretrained("output_dir")

您也可以使用 `push_to_hub` 函式將模型儲存到 Hub(首先請確保您已登入您的 Hugging Face 賬戶)。

from huggingface_hub import notebook_login

notebook_login()
model.push_to_hub("your-name/bigscience/mt0-large-lora")

這兩種方法都只儲存經過訓練的額外 PEFT 權重,這意味著儲存、傳輸和載入都非常高效。例如,這個用 LoRA 訓練的 facebook/opt-350m 模型只包含兩個檔案:`adapter_config.json` 和 `adapter_model.safetensors`。`adapter_model.safetensors` 檔案僅為 6.3MB!

儲存在 Hub 上的 opt-350m 模型的介面卡權重只有約 6MB,而完整模型權重的大小可能約為 700MB。

推理

有關可用 `AutoPeftModel` 類的完整列表,請參閱 AutoPeftModel API 參考。

使用 AutoPeftModel 類和 `from_pretrained` 方法,可以輕鬆載入任何經過 PEFT 訓練的模型進行推理。

from peft import AutoPeftModelForCausalLM
from transformers import AutoTokenizer
import torch

model = AutoPeftModelForCausalLM.from_pretrained("ybelkada/opt-350m-lora")
tokenizer = AutoTokenizer.from_pretrained("facebook/opt-350m")

model = model.to("cuda")
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.detach().cpu().numpy(), 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."

對於其他未被 `AutoPeftModelFor` 類明確支援的任務——例如自動語音識別——您仍然可以使用基礎的 AutoPeftModel 類來為該任務載入模型。

from peft import AutoPeftModel

model = AutoPeftModel.from_pretrained("smangrul/openai-whisper-large-v2-LORA-colab")

後續步驟

現在您已經瞭解瞭如何使用其中一種 PEFT 方法訓練模型,我們鼓勵您嘗試其他一些方法,比如提示微調。步驟與本快速入門中展示的非常相似:

  1. 為 PEFT 方法準備一個 PeftConfig
  2. 使用 get_peft_model() 方法從配置和基礎模型中建立一個 PeftModel

然後您可以隨心所欲地訓練它!要載入 PEFT 模型進行推理,您可以使用 AutoPeftModel 類。

如果您有興趣為特定任務(如語義分割、多語言自動語音識別、DreamBooth、詞元分類等)使用另一種 PEFT 方法訓練模型,也歡迎查閱任務指南。

< > 在 GitHub 上更新

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