PEFT 文件
VeRA:基於向量的隨機矩陣自適應
並獲得增強的文件體驗
開始使用
VeRA:基於向量的隨機矩陣自適應
VeRA 是一種引數高效的微調技術,與 LoRA 類似,但需要的額外引數更少,同時效能承諾相當甚至更好。因此,當引數預算非常有限時,例如在擴充套件到非常大的模型時,它特別有用。可訓練引數數量的減少是透過在所有層之間共享相同的低秩矩陣,並且每層只訓練兩個額外的向量來實現的。
儲存介面卡引數時,可以透過在 `VeraConfig` 上設定 `save_projection=False` 來避免儲存低秩矩陣。在這種情況下,這些矩陣將根據 `projection_prng_key` 引數的固定隨機種子進行恢復。這減少了檢查點的大小,但我們不能保證在所有裝置和所有未來版本的 PyTorch 上的可復現性。如果你想確保可復現性,請設定 `save_projection=True`(這是預設值)。
為了處理不同形狀的適配層,VeRA 會初始化共享的 A 和 B 矩陣,其每個維度都採用所需的最大尺寸。在前向傳播過程中,給定層的子矩陣 A 和 B 會從這些共享矩陣中切片出來,並按論文所述使用。例如,適配兩個形狀為 (100, 20) 和 (80, 50) 的線性層將分別建立形狀為 (rank, 50) 和 (100, rank) 的 A 和 B 矩陣。然後,要適配一個形狀為 (100, 20) 的層,將提取形狀為 (rank, 20) 和 (100, rank) 的子矩陣 A 和 B。
VeRA 目前有以下限制:
- 僅支援 `nn.Linear` 層。
論文摘要如下:
低秩自適應(LoRA)是一種流行的方法,它在微調大型語言模型時減少了可訓練引數的數量,但在擴充套件到更大的模型或部署大量每個使用者或每個任務的自適應模型時,仍然面臨嚴峻的儲存挑戰。在這項工作中,我們提出了基於向量的隨機矩陣自適應(VeRA),它與 LoRA 相比顯著減少了可訓練引數的數量,但保持了相同的效能。它透過使用跨所有層共享的單個低秩矩陣對,並學習小的縮放向量來實現這一點。我們在 GLUE 和 E2E 基準測試、影像分類任務上展示了其有效性,並展示了其在 7B 和 13B 語言模型的指令調優中的應用。
VeRAConfig
class peft.VeraConfig
< 原始檔 >( task_type: typing.Union[str, peft.utils.peft_types.TaskType, NoneType] = None peft_type: typing.Union[str, peft.utils.peft_types.PeftType, NoneType] = None auto_mapping: typing.Optional[dict] = None base_model_name_or_path: typing.Optional[str] = None revision: typing.Optional[str] = None inference_mode: bool = False r: int = 256 target_modules: Optional[Union[list[str], str]] = None projection_prng_key: int = 0 save_projection: bool = True vera_dropout: float = 0.0 d_initial: float = 0.1 fan_in_fan_out: bool = False bias: str = 'none' modules_to_save: Optional[list[str]] = None init_weights: bool = True layers_to_transform: Optional[Union[list[int], int]] = None layers_pattern: Optional[Union[list[str], str]] = None )
引數
- r (
int
, 可選, 預設為256
) — VeRA 引數維度(“秩”)。此處選擇比 LoRA 秩更高的值,因為 VeRA 使用的引數遠少於 LoRA(見表 1)。 - target_modules (
Union[List[str], str]
) — 應用 VeRA 的模組名稱。僅支援線性層。 - projection_prng_key (
int
) — VeRA 偽隨機數生成器初始化金鑰。用於為新模型初始化 vera_A 和 vera_B,或載入未包含這些投影的檢查點時使用。預設為 `0`。 - save_projection (
bool
) — 是否在狀態字典中與每層的 lambda_b / lambda_d 權重一起儲存 vera_A / vera_B 投影。這將增加檢查點的大小,但保證我們可以在所有系統配置上重新載入檢查點。預設為 `True`。 - vera_dropout (
float
) — VeRA 層的 dropout 機率。 - d_initial (
float
, 可選, 預設為 `0.1`) — 初始化 VeRA 引數時 `vera_lambda_d` 向量的初始值。建議使用較小的值(<=0.1)(見論文表 6c)。 - fan_in_fan_out (
bool
) — 如果要替換的層儲存的權重形式為 (fan_in, fan_out),則設定為 True。例如,gpt-2 使用的 `Conv1D` 儲存權重形式為 (fan_in, fan_out),因此應將此設定為 `True`。 - bias (
str
) — VeRA 的偏置型別。可以是 ‘none’、‘all’ 或 ‘vera_only’。如果為 ‘all’ 或 ‘vera_only’,相應的偏置將在訓練期間更新。請注意,這意味著即使停用介面卡,模型的輸出也與未經適配的基礎模型不同。 - modules_to_save (
List[str]
) — 除了 VeRA 層之外,需要設定為可訓練並儲存在最終檢查點中的模組列表。 - init_weights (
bool
) — 是否使用預設初始化來初始化 VeRA 層的權重。除非你確切地知道你在做什麼,否則不要更改此設定。 - layers_to_transform (
Union[List[int],int]
) — 要轉換的層索引,如果指定此引數,它將對此列表中指定的層索引應用 VeRA 轉換。如果傳遞單個整數,它將對該索引處的層應用 VeRA 轉換。 - layers_pattern (
Optional[Union[List[str], str]]
) — 層模式名稱,僅當 `layers_to_transform` 不為 `None` 時使用。這應該針對模型的 `nn.ModuleList`,通常稱為 `'layers'` 或 `'h'`。
這是用於儲存 VeraModel 配置的配置類。
VeRAModel
class peft.VeraModel
< 原始檔 >( model peft_config: Union[PeftConfig, dict[str, PeftConfig]] adapter_name: str low_cpu_mem_usage: bool = False state_dict: Optional[dict[str, torch.Tensor]] = None ) → torch.nn.Module
引數
- model (
PreTrainedModel
) — 要被適配的模型。 - config (VeraConfig) — Vera 模型的配置。
- adapter_name (
str
) — 介面卡的名稱,預設為 `"default"`。 - low_cpu_mem_usage (
bool
,可選
, 預設為 `False`) — 在元裝置上建立空的介面卡權重。有助於加快載入過程。
返回
torch.nn.Module
Vera 模型。
從預訓練的 transformers 模型建立基於向量的隨機矩陣自適應(Vera)模型。
示例
>>> from transformers import AutoModelForCausalLM
>>> from peft import VeraConfig, get_peft_model
>>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
>>> config = VeraConfig(r=128)
>>> model = get_peft_model(base_model, config)
屬性:
- model (
PreTrainedModel
) — 需要被適配的模型。 - peft_config (VeraConfig): Vera 模型的配置。
刪除一個現有的介面卡。
merge_and_unload
< 原始檔 >( progressbar: bool = False safe_merge: bool = False adapter_names: Optional[list[str]] = None )
此方法將 Vera 層合併到基礎模型中。如果有人想將基礎模型用作獨立模型,則需要此方法。
示例
>>> from transformers import AutoModelForCausalLM
>>> from peft import PeftModel
>>> base_model = AutoModelForCausalLM.from_pretrained("tiiuae/falcon-40b")
>>> peft_model_id = "smangrul/falcon-40B-int4-peft-lora-sfttrainer-sample"
>>> model = PeftModel.from_pretrained(base_model, peft_model_id)
>>> merged_model = model.merge_and_unload()
透過移除所有 Vera 模組但不進行合併來恢復基礎模型。這將返回原始的基礎模型。