PEFT 文件

VB-LoRA:使用向量庫實現極致引數效率的微調

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

VB-LoRA:使用向量庫實現極致引數效率的微調

概述

VB-LoRA 是一種引數高效微調技術,它透過學習子向量級別的細粒度引數共享方案來擴充套件 LoRA,從而顯著提高了引數效率。這使得 VB-LoRA 在儲存和傳輸成本至關重要的場景中尤其有用。它的工作原理是將來自不同層和模組(如 K、Q、V 和 FFN)的低秩矩陣分解為子向量,然後透過向量庫進行全域性共享。

論文摘要如下:

隨著大型語言模型的普及以及對每個使用者或每個任務模型定製化需求的增長,引數高效微調(PEFT)方法,如低秩適應(LoRA)及其變體,產生了巨大的儲存和傳輸成本。為了進一步減少儲存引數,我們引入了一種“分而治之”的正規化,透過向量庫全域性共享引數,打破了跨矩陣維度、模組和層的低秩分解障礙。作為該正規化在 LoRA 上的一個例項,我們提出的 VB-LoRA 透過一個可微分的 top-k 混合模組,從一個共享的向量庫中合成了 LoRA 的所有低秩矩陣。與最先進的 PEFT 方法相比,VB-LoRA 實現了極高的引數效率,同時保持了相當或更好的效能。大量的實驗證明了 VB-LoRA 在自然語言理解、自然語言生成和指令微調任務上的有效性。在微調 Llama2-13B 模型時,VB-LoRA 僅使用 LoRA 儲存引數的 0.4%,卻取得了更優異的結果。

使用技巧

  • VB-LoRA 利用一個稀疏的 top-k 模組來學習共享機制。在儲存介面卡引數時,您可以透過在 `VBLoRAConfig` 中設定 `save_only_topk_weights = True` 來僅儲存 top-k 權重及其索引,或者透過將其設定為 `False` 來儲存所有可訓練的 logits。啟用 `save_only_topk_weights = True` 可以顯著減少儲存空間;例如,在 Llama2-7B 中,儲存檔案大小從 308MB 減少到 2.5MB。請注意,使用 `save_only_topk_weights = True` 儲存的模型僅用於合併或推理,不能用於恢復訓練。

  • VB-LoRA 有兩組訓練引數:向量庫引數和 logit 引數。在實踐中,我們發現 logit 引數需要更高的學習率,而向量庫引數需要更低的學習率。當使用 AdamW 最佳化器時,logits 的典型學習率為 0.01,向量庫引數的典型學習率為 0.001。

VBLoRAConfig

class peft.VBLoRAConfig

< >

( 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 = 4 num_vectors: int = 256 vector_length: int = 256 topk: int = 2 target_modules: Optional[Union[list[str], str]] = None exclude_modules: Optional[Union[list[str], str]] = None save_only_topk_weights: bool = False vblora_dropout: float = 0.0 fan_in_fan_out: bool = False bias: str = 'none' modules_to_save: Optional[list[str]] = None init_vector_bank_bound: float = 0.02 init_logits_std: float = 0.1 layers_to_transform: Optional[Union[list[int], int]] = None layers_pattern: Optional[Union[list[str], str]] = None )

引數

  • r (int) — 增量矩陣的秩。
  • num_vectors (int) — 向量庫中的向量數量。當模型尺寸增加時,使用更高的值。
  • vector_length (int) — 向量庫中向量的長度。向量長度應能被模型的隱藏維度整除。
  • topk (int) — top-K 選擇的 K 值。較大的 K 值會增加儲存模型的大小。在實踐中,設定 K=2 通常能提供最佳效能和引數效率。更多詳情請參閱論文中的討論。
  • target_modules (Union[List[str], str]) — 要應用介面卡的模組名稱。如果指定此項,只有指定名稱的模組將被替換。當傳遞字串時,將執行正則表示式匹配。當傳遞字串列表時,將執行精確匹配,或者檢查模組名稱是否以任何傳遞的字串結尾。如果指定為“all-linear”,則選擇所有線性/Conv1D 模組,不包括輸出層。如果未指定,將根據模型架構選擇模組。如果架構未知,將引發錯誤 — 在這種情況下,您應手動指定目標模組。
  • exclude_modules (Optional[Union[List[str], str]]) — 不應用介面卡的模組名稱。當傳遞字串時,將執行正則表示式匹配。當傳遞字串列表時,將執行精確匹配,或者檢查模組名稱是否以任何傳遞的字串結尾。
  • save_only_topk_weights (bool) — 是否僅儲存 topk 權重。設定 `save_only_topk_weights = True` 可顯著減少儲存空間。但是,以此模式儲存的模型僅可用於合併或推理,不能用於恢復訓練。
  • vblora_dropout (float) — VBLoRA 層的 dropout 機率。
  • fan_in_fan_out (bool) — 如果要替換的層儲存權重的方式為 (fan_in, fan_out),則設定為 True。例如,gpt-2 使用 `Conv1D`,其權重儲存方式為 (fan_in, fan_out),因此此項應設定為 `True`。
  • bias (str) — VBLoRA 的偏置型別。可以是 'none'、'all' 或 'vblora_only'。如果為 'all' 或 'vblora_only',相應的偏置將在訓練期間更新。請注意,這意味著即使停用介面卡,模型的輸出也不會與未經適應的基礎模型相同。
  • modules_to_save (List[str]) — 除 VBLoRA 層外,要設定為可訓練並儲存在最終檢查點中的模組列表。
  • init_vector_bank_bound (float) — 向量庫使用在 -init_vector_bank_bound 和 init_vector_bank_bound 之間的均勻分佈進行初始化。避免用全零初始化向量庫以防止零梯度。一個較小的值,如 0.02,通常是有效的。用較大的值初始化可能會導致訓練不穩定。
  • init_logits_std (float) — logits 使用標準差為 init_logits_std 的正態分佈進行初始化。預設為 0.1。
  • layers_to_transform (Union[List[int],int]) — 要轉換的層索引。如果傳遞一個整數列表,它將對列表中指定的層索引應用介面卡。如果傳遞單個整數,它將對該索引處的層應用轉換。
  • layers_pattern (Optional[Union[List[str], str]]) — 層的模式名稱,僅在 `layers_to_transform` 不為 `None` 時使用。這應該針對模型的 `nn.ModuleList`,通常稱為 `'layers'` 或 `'h'`。

這是用於儲存 VBLoRAConfig 配置的配置類。

論文:https://huggingface.co/papers/2405.15179

VBLoRAModel

class peft.VBLoRAModel

< >

( 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 (VBLoRAConfig) — VBLoRA 模型的配置。
  • adapter_name (str) — 介面卡的名稱,預設為 `"default"`。
  • low_cpu_mem_usage (bool, optional, defaults to False) — 在元裝置上建立空的介面卡權重。有助於加快載入過程。

返回

torch.nn.Module

VBLoRA 模型。

從預訓練的 transformers 模型建立 VBLoRA 模型。

該方法在 https://huggingface.co/papers/2405.15179 中有詳細描述。

示例

>>> from transformers import AutoModelForCausalLM
>>> from peft import VBLoRAConfig, get_peft_model

>>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
>>> config = VBLoRAConfig(
...     task_type="SEQ_CLS",
...     r=4,
...     target_modules=["fc1", "fc2", "k_proj", "out_proj", "q_proj", "v_proj"],
...     num_vectors=60,
...     vector_length=256,
...     save_only_topk_weights=True,
... )
>>> model = get_peft_model(base_model, config)

屬性:

  • model (PreTrainedModel) — 需要被適配的模型。
  • peft_config (VBLoRAConfig):VBLoRAConfig 模型的配置。

delete_adapter

< >

( adapter_name: str )

引數

  • adapter_name (str) — 要刪除的介面卡名稱。

刪除一個現有的介面卡。

disable_adapter_layers

< >

( )

停用所有介面卡。

停用所有介面卡後,模型輸出對應於基礎模型的輸出。

enable_adapter_layers

< >

( )

啟用所有介面卡。

如果您之前停用了所有介面卡並希望重新啟用它們,請呼叫此函式。

get_nb_savable_parameters

< >

( adapter = 'default' )

返回可儲存的 VB-LoRA 引數和其他可儲存引數的數量。

merge_and_unload

< >

( progressbar: bool = False safe_merge: bool = False adapter_names: Optional[list[str]] = None )

引數

  • progressbar (bool) — 是否顯示錶示解除安裝和合並過程的進度條
  • safe_merge (bool) — 是否啟用安全合併檢查,以檢查介面卡權重中是否存在潛在的 Nan 值
  • adapter_names (list[str], optional) — 應合併的介面卡名稱列表。如果為 None,則所有活動的介面卡都將被合併。預設為 `None`。

此方法將 VBLoRA 層合併到基礎模型中。如果有人想將基礎模型用作獨立模型,則需要此方法。

示例

>>> 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()

print_savable_parameters

< >

( )

列印可儲存的 VB-LoRA 引數數量和總可儲存引數數量。

set_adapter

< >

( adapter_name: str | list[str] )

引數

  • adapter_name (str or list[str]) — 要啟用的介面卡名稱。

設定活動的介面卡。

此外,此函式將把指定的介面卡設定為可訓練的(即 requires_grad=True)。如果不希望如此,請使用以下程式碼。

>>> for name, param in model_peft.named_parameters():
...     if ...:  # some check on name (ex. if 'lora' in name)
...         param.requires_grad = False

unload

< >

( )

透過移除所有 VBLoRA 模組來恢復基礎模型,而不進行合併。這會返回原始的基礎模型。

< > 在 GitHub 上更新

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