PEFT 文件
稀疏高秩介面卡
並獲得增強的文件體驗
開始使用
稀疏高秩介面卡
稀疏高秩介面卡(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 模型的配置。
刪除一個現有的介面卡。
merge_and_unload
< 來源 >( progressbar: bool = False safe_merge: bool = False adapter_names: Optional[list[str]] = 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()
透過移除所有 Shira 模組而不進行合併,恢復基礎模型。這將返回原始的基礎模型。