PEFT 文件

稀疏高秩介面卡

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

稀疏高秩介面卡

稀疏高秩介面卡(Sparse High Rank Adapters)或 SHiRA 是一種替代型別的介面卡,已被發現比低秩介面卡具有顯著優勢。具體來說,SHiRA 在各種視覺和語言任務上實現了比 LoRA 更好的準確性。它還透過顯著減少概念損失(低秩介面卡面臨的常見問題)來提供更簡單、更高質量的多介面卡融合。SHiRA 直接微調基礎模型的一小部分引數,以在任何適應任務上微調模型。

SHiRA 目前有以下約束

  • 僅支援 `nn.Linear` 層。

論文摘要如下:

低秩適配(LoRA)在近期的生成式人工智慧研究中獲得了巨大關注。LoRA 的主要優勢之一是它能夠與預訓練模型融合,在推理過程中不增加額外開銷。然而,從移動部署的角度來看,我們要麼在融合模式下避免推理開銷但失去快速切換介面卡的能力,要麼在非融合模式下承受顯著(高達30%)的推理延遲以實現快速切換。當多個介面卡同時使用時,LoRA 還會表現出概念損失。在本文中,我們提出了稀疏高秩介面卡(SHiRA),這是一種新的正規化,它不產生推理開銷,能夠快速切換,並顯著減少概念損失。具體而言,SHiRA 可以透過直接調整基礎模型中僅1-2%的權重進行訓練,而其他權重保持不變。這產生了一個高度稀疏的介面卡,可以在融合模式下直接切換。我們進一步提供了理論和實證見解,說明 SHiRA 的高稀疏性如何透過減少概念損失來輔助多介面卡融合。我們在大型視覺語言模型(LVMs)和大型語言模型(LLMs)上的廣泛實驗表明,僅微調基礎模型中一小部分引數的表現顯著優於 LoRA,同時實現了快速切換和多介面卡融合。最後,我們提供了一個基於引數高效微調(PEFT)庫的延遲和記憶體高效的 SHiRA 實現,其訓練速度與 LoRA 幾乎相同,而峰值 GPU 記憶體消耗降低了高達16%,從而使 SHiRA 易於在實際用例中採用。為了展示推理過程中的快速切換優勢,我們表明在 CPU 上將 SHiRA 載入到基礎模型上比 LoRA 融合快5倍至16倍。

ShiraConfig

class peft.ShiraConfig

< >

( 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 = 32 mask_type: Literal['random'] = 'random' random_seed: Optional[int] = None target_modules: Optional[Union[list[str], str]] = None fan_in_fan_out: bool = False init_weights: bool = True modules_to_save: Optional[list[str]] = None )

引數

  • r (int, 可選, 預設為 32) — 對於給定的目標模組,SHiRA 引數的數量計算為 r(m+n),其中原始張量維度為 m x n。這意味著 SHiRA 引數的數量與 LoRA 介面卡相同。SHiRA 是一個高秩介面卡。設定此 r 引數不會將秩限制在此值。
  • mask_type (str, 預設為 random) — 掩碼函式的型別。預設為隨機稀疏掩碼。也可以透過例項化 `config = ShiraConfig(...)` 然後設定 `config.mask_fn = <your custom mask function>` 來提供可選的使用者自定義 `mask_fn` 來計算掩碼值。對於形狀為 m x n 的預訓練權重,自定義掩碼函式必須只返回一個掩碼(形狀:m x n),該掩碼必須是二元的 0 或 1,對於線性層,`num_shira_parameters = r(m + n)`。掩碼的裝置和資料型別必須與基礎層權重的裝置和資料型別相同。請參閱 mask_functions.py 以獲取更多詳細資訊並檢視預設的隨機稀疏掩碼實現。
  • random_seed (int, 可選, 預設為 None) — 用於 `random_mask` 的 torch 生成器的隨機種子。
  • target_modules (Union[List[str], str]) — 要替換為 SHiRA 的模組名稱列表或模組名稱的正則表示式。例如,['q', 'v'] 或 `'.*decoder.*(SelfAttention|EncDecAttention).*(q|v)$'`。僅支援線性層。
  • fan_in_fan_out (bool) — 如果要替換的層儲存權重的方式是(fan_in, fan_out),則設定為 True。例如,gpt-2 使用 `Conv1D`,它以(fan_in, fan_out)的方式儲存權重,因此此項應設定為 `True`。
  • init_weights (bool, 預設為 True) — 將 SHiRA 權重初始化為零值。如果設定為 False,SHiRA 權重將被初始化為 randn 值而不是零,這僅用於測試。
  • modules_to_save (List[str]) — 除了 SHiRA 層之外,需要設定為可訓練並在最終檢查點中儲存的模組列表。

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

ShiraModel

class peft.ShiraModel

< >

( 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 (ShiraConfig) — SHiRA 模型的配置。
  • adapter_name (str) — 介面卡的名稱,預設為 `"default"`。

返回

torch.nn.Module

SHiRA 模型。

從預訓練模型建立一個稀疏高秩介面卡(SHiRA)模型。

示例

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

>>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
>>> config = ShiraConfig(r=32)
>>> model = get_peft_model(base_model, config)

屬性:

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

delete_adapter

< >

( adapter_name: str )

引數

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

刪除一個現有的介面卡。

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], 可選) — 應合併的介面卡名稱列表。如果為 None,則將合併所有活動的介面卡。預設為 None

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

示例

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

>>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
>>> config = ShiraConfig(r=32)
>>> model = get_peft_model(base_model, config)
>>> ## [Train the adapter] ##
>>> merged_model = model.merge_and_unload()

unload

< >

( )

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

< > 在 GitHub 上更新

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