PEFT 文件
PEFT 配置和模型
並獲得增強的文件體驗
開始使用
PEFT 配置和模型
當今的大型預訓練模型通常擁有數十億個引數,其龐大的規模給訓練帶來了巨大的挑戰,因為它們需要更多的儲存空間和更強大的計算能力來處理所有這些計算。您需要使用昂貴的、並非人人都能獲得的、不環保且不切實際的強大 GPU 或 TPU 來訓練這些大型預訓練模型。PEFT 方法解決了其中的許多挑戰。PEFT 方法有多種型別(軟提示、矩陣分解、介面卡),但它們的重點都是相同的:減少可訓練引數的數量。這使得在消費級硬體上訓練和儲存大型模型變得更加容易。
PEFT 庫旨在幫助您在免費或低成本的 GPU 上快速訓練大型模型。在本教程中,您將學習如何設定配置,以將 PEFT 方法應用於預訓練的基礎模型進行訓練。一旦 PEFT 配置設定完成,您可以使用任何您喜歡的訓練框架(Transformer 的 Trainer
類、Accelerate 或自定義的 PyTorch 訓練迴圈)。
PEFT 配置
在它們各自的 API 參考頁面中瞭解更多關於您可以為每種 PEFT 方法配置的引數。
配置儲存了指定如何應用特定 PEFT 方法的重要引數。
例如,看看下面這個用於應用 LoRA 的 LoraConfig
和用於應用 p-tuning 的 PromptEncoderConfig
(這些配置檔案已經是 JSON 序列化的)。當您載入 PEFT 介面卡時,最好檢查一下它是否有關聯的 `adapter_config.json` 檔案,這是必需的。
{
"base_model_name_or_path": "facebook/opt-350m", #base model to apply LoRA to
"bias": "none",
"fan_in_fan_out": false,
"inference_mode": true,
"init_lora_weights": true,
"layers_pattern": null,
"layers_to_transform": null,
"lora_alpha": 32,
"lora_dropout": 0.05,
"modules_to_save": null,
"peft_type": "LORA", #PEFT method type
"r": 16,
"revision": null,
"target_modules": [
"q_proj", #model modules to apply LoRA to (query and value projection layers)
"v_proj"
],
"task_type": "CAUSAL_LM" #type of task to train model on
}
您可以透過初始化 LoraConfig 來為訓練建立您自己的配置。
from peft import LoraConfig, TaskType
lora_config = LoraConfig(
r=16,
target_modules=["q_proj", "v_proj"],
task_type=TaskType.CAUSAL_LM,
lora_alpha=32,
lora_dropout=0.05
)
PEFT 模型
有了 PEFT 配置後,您現在可以將其應用於任何預訓練模型來建立一個 PeftModel。您可以從 Transformers 庫中的任何最新模型、自定義模型,甚至新的和不受支援的 transformer 架構中進行選擇。
在本教程中,載入一個基礎的 facebook/opt-350m 模型進行微調。
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("facebook/opt-350m")
使用 get_peft_model() 函式從基礎的 facebook/opt-350m 模型和您之前建立的 lora_config
來建立一個 PeftModel。
from peft import get_peft_model
lora_model = get_peft_model(model, lora_config)
lora_model.print_trainable_parameters()
"trainable params: 1,572,864 || all params: 332,769,280 || trainable%: 0.472659014678278"
當呼叫 get_peft_model() 時,基礎模型將被 *就地* 修改。這意味著,當對一個之前已經以相同方式修改過的模型呼叫 get_peft_model() 時,該模型將被進一步改變。因此,如果您想在之前呼叫過 get_peft_model()
後修改您的 PEFT 配置,您需要首先使用 unload() 解除安裝模型,然後用您的新配置呼叫 get_peft_model()
。或者,您可以重新初始化模型,以確保在應用新的 PEFT 配置之前,模型處於一個全新的、未被修改的狀態。
現在您可以使用您偏好的訓練框架來訓練 PeftModel 了!訓練後,您可以使用 save_pretrained() 將模型儲存在本地,或者使用 push_to_hub
方法將其上傳到 Hub。
# save locally
lora_model.save_pretrained("your-name/opt-350m-lora")
# push to Hub
lora_model.push_to_hub("your-name/opt-350m-lora")
要載入一個 PeftModel 用於推理,您需要提供建立它時使用的 PeftConfig 以及它所基於的基礎模型。
from peft import PeftModel, PeftConfig
config = PeftConfig.from_pretrained("ybelkada/opt-350m-lora")
model = AutoModelForCausalLM.from_pretrained(config.base_model_name_or_path)
lora_model = PeftModel.from_pretrained(model, "ybelkada/opt-350m-lora")
預設情況下,PeftModel 被設定為用於推理,但如果您想繼續訓練介面卡,可以設定 is_trainable=True
。
lora_model = PeftModel.from_pretrained(model, "ybelkada/opt-350m-lora", is_trainable=True)
PeftModel.from_pretrained() 方法是載入 PeftModel 最靈活的方式,因為它不關心使用了什麼模型框架(Transformers、timm 還是通用的 PyTorch 模型)。其他類,如 AutoPeftModel,只是基礎 PeftModel 的一個方便的包裝器,它使得直接從 Hub 或儲存 PEFT 權重的本地載入 PEFT 模型變得更容易。
from peft import AutoPeftModelForCausalLM
lora_model = AutoPeftModelForCausalLM.from_pretrained("ybelkada/opt-350m-lora")
檢視 AutoPeftModel API 參考以瞭解更多關於 AutoPeftModel 類的資訊。
後續步驟
有了合適的 PeftConfig,您可以將其應用於任何預訓練模型來建立一個 PeftModel,並在免費的 GPU 上更快地訓練大型強大的模型!要了解更多關於 PEFT 配置和模型的資訊,以下指南可能會有所幫助:
- 在使用自定義模型指南中,瞭解如何為非 Transformers 的模型配置 PEFT 方法。