Transformers 文件

PEFT

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

PEFT

PEFT 是一個引數高效微調方法庫,它支援在消費級 GPU 上訓練和儲存大型模型。這些方法只對預訓練模型基礎之上的一小部分額外模型引數(也稱為介面卡)進行微調。由於 GPU 不需要儲存預訓練基礎模型的最佳化器狀態和梯度,因此可以節省大量的記憶體。介面卡非常輕量,便於共享、儲存和載入。

本指南簡要介紹了 PEFT 庫以及如何在 Transformers 中使用它進行訓練。有關更多詳細資訊,請參閱 PEFT 文件

使用以下命令安裝 PEFT。

pip
source
pip install -U peft

PEFT 目前支援 Transformers 的 LoRA、IA3 和 AdaLoRA 方法。要使用其他 PEFT 方法,例如 prompt learning 或 prompt tuning,請直接使用 PEFT 庫。

低秩適應 (LoRA) 是一種非常常見的 PEFT 方法,它將權重矩陣分解為兩個較小的可訓練矩陣。首先,定義一個 LoraConfig 物件,其引數如下所示。

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

# create LoRA configuration object
lora_config = LoraConfig(
    task_type=TaskType.CAUSAL_LM, # type of task to train on
    inference_mode=False, # set to False for training
    r=8, # dimension of the smaller matrices
    lora_alpha=32, # scaling factor
    lora_dropout=0.1 # dropout of LoRA layers
)

使用 add_adapter()LoraConfig 新增到模型中。現在模型已準備好傳遞給 Trainer 進行訓練。

model.add_adapter(lora_config, adapter_name="lora_1")
trainer = Trainer(model=model, ...)
trainer.train()

要在已附加現有介面卡的模型之上新增額外的可訓練介面卡,請在 modules_to_save() 中指定要訓練的模組。

例如,要在附加了 LoRA 介面卡的因果語言模型之上訓練 `lm_head` 模組,請設定 `modules_to_save=["lm_head"]`。如下所示將介面卡新增到模型中,然後將其傳遞給 Trainer

from transformers import AutoModelForCausalLM
from peft import LoraConfig

model = AutoModelForCausalLM.from_pretrained("google/gemma-2-2b")

lora_config = LoraConfig(
    target_modules=["q_proj", "k_proj"],
    modules_to_save=["lm_head"],
)

model.add_adapter(lora_config)
trainer = Trainer(model=model, ...)
trainer.train()

使用 save_pretrained() 儲存介面卡以便重複使用。

載入介面卡

要使用 Transformers 載入介面卡,Hub 倉庫或本地目錄必須包含 `adapter_config.json` 檔案和介面卡權重。使用 from_pretrained()load_adapter() 載入介面卡。

from_pretrained
load_adapter
from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("klcsp/gemma7b-lora-alpaca-11-v1")

對於非常大的模型,載入 8 位或 4 位精度的量化版本模型有助於節省記憶體。Transformers 透過與 bitsandbytes 整合支援量化。在 BitsAndBytesConfig 中指定是否要載入 8 位或 4 位精度的模型。

對於多個裝置,新增 `device_map="auto"` 以自動在硬體之間分佈模型。

from transformers import AutoModelForCausalLM, BitsAndBytesConfig

model = AutoModelForCausalLM.from_pretrained(
    "klcsp/gemma7b-lora-alpaca-11-v1",
    quantization_config=BitsAndBytesConfig(load_in_8bit=True),
    device_map="auto",
)

設定介面卡

add_adapter() 為模型新增一個新介面卡。要新增第二個介面卡,新介面卡必須與第一個介面卡型別相同。使用 `adapter_name` 引數為介面卡分配一個名稱。

model.add_adapter(lora_config, adapter_name="lora_2")

新增後,使用 set_adapter() 強制模型使用指定的介面卡並停用其他介面卡。

model.set_adapter("lora_2")

啟用和停用介面卡

enable_adapters() 是一個更廣泛的函式,它啟用模型附加的*所有*介面卡,而 disable_adapters() 則停用*所有*附加介面卡。

model.add_adapter(lora_1)
model.add_adapter(lora_2)
model.enable_adapters()

# disable all adapters
model.disable_adapters()
< > 在 GitHub 上更新

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