Transformers 文件
PEFT
並獲得增強的文件體驗
開始使用
PEFT
PEFT 是一個引數高效微調方法庫,它支援在消費級 GPU 上訓練和儲存大型模型。這些方法只對預訓練模型基礎之上的一小部分額外模型引數(也稱為介面卡)進行微調。由於 GPU 不需要儲存預訓練基礎模型的最佳化器狀態和梯度,因此可以節省大量的記憶體。介面卡非常輕量,便於共享、儲存和載入。
本指南簡要介紹了 PEFT 庫以及如何在 Transformers 中使用它進行訓練。有關更多詳細資訊,請參閱 PEFT 文件。
使用以下命令安裝 PEFT。
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 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()