PEFT 文件
MiSS
並獲得增強的文件體驗
開始使用
MiSS
MiSS: Balancing LoRA Performance and Efficiency with Simple Shard Sharing(MiSS) 是一種新穎的 PEFT 方法,它採用低秩結構,僅需要單個可訓練矩陣,並引入了與 LoRA 不同的新更新機制,在效能和效率之間實現了出色的平衡。
論文摘要如下:
引數高效微調 (PEFT) 方法,特別是低秩適配 (LoRA),有效減少了大型語言模型 (LLM) 的可訓練引數數量。然而,隨著模型規模的持續增長,對計算資源的需求仍然是一個重大挑戰。現有的 LoRA 變體通常難以在適應性(模型效能和收斂速度)與效率(計算開銷、記憶體使用和初始化時間)之間達到最佳平衡。本文介紹了 MiSS (Matrix Shard Sharing),一種新穎的 PEFT 方法,透過簡單的分片共享機制解決了這一權衡問題。MiSS 借鑑了這樣一個觀點:透過將權重矩陣分解為多個碎片矩陣並利用一個共享的可訓練公共碎片,可以實現低秩適配。該方法透過複製這些共享的分割槽化分片來構建低秩更新矩陣。我們還為 MiSS 提出了一種硬體高效且廣泛適用的實現方案。在各種任務上進行的大量實驗,以及對計算效能的系統性分析,證明了 MiSS 的優越性。結果表明,MiSS 在模型效能指標和計算效率(包括初始化速度和訓練吞吐量)方面均顯著優於標準 LoRA 及其主要變體。透過有效平衡表達能力和資源利用率,MiSS 為高效適配大規模模型提供了一個引人注目的解決方案。.
MissConfig
class peft.MissConfig
< 原始碼 >( 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 = 64 miss_dropout: float = 0.0 mini_r: int = 1 target_modules: Optional[Union[list[str], str]] = None exclude_modules: Optional[Union[list[str], str]] = None init_weights: bool | Literal['bat', 'mini'] = True layers_to_transform: Optional[Union[list[int], int]] = None layers_pattern: Optional[str] = None bias: str = 'none' modules_to_save: Optional[list[str]] = None )
引數
- r (
int
) — MiSS 在不同層之間的秩。最好將 'r' 設定為偶數;否則,預設的初始化方法將無法工作。MiSS 的秩對應於沿 `in_features` 維度的低秩分解。 - miss_dropout (
float
) — MiSS 層的 dropout 機率。 - mini_r (
int
) — MiSS 的秩對應於沿 `out_features` 維度的低秩分解。當您設定 `init_weights=mini` 時,需要設定 `mini_r`。請確保 `out_features` 可以被 `mini_r` 整除。 - target_modules (
Optional[Union[List[str], str]]
) — 應用介面卡的模組名稱。如果指定此項,則只會替換具有指定名稱的模組。傳遞字串時,將執行正則表示式匹配。傳遞字串列表時,將執行精確匹配,或者檢查模組名稱是否以任何傳遞的字串結尾。如果指定為 'all-linear',則選擇所有線性模組,不包括輸出層。如果未指定,將根據模型架構選擇模組。如果架構未知,將引發錯誤 — 在這種情況下,您應該手動指定目標模組。 - exclude_modules (
Optional[Union[List[str], str]]
) — 不應用介面卡的模組名稱。傳遞字串時,將執行正則表示式匹配。傳遞字串列表時,將執行精確匹配,或者檢查模組名稱是否以任何傳遞的字串結尾。 - init_weights (bool | Literal[“bat”, “mini”]) — 不同的初始化對應不同的 MiSS 變體。預設情況下 (balance),將使用 MiSS 中最有效和通用的方法。'bat':在此模式下,您可以啟用跨不同分片的非線性更新。'mini':在此模式下,您可以設定更小的秩以使用更少的可訓練引數,但建議保持 `out_features % mini_r == 0`。
- layers_to_transform (
Union[List[int], int]
) — 要轉換的層索引。如果傳遞一個整數列表,它將把介面卡應用到此列表中指定的層索引。如果傳遞單個整數,它將在該索引的層上應用轉換。 - layers_pattern (
str
) — 層模式名稱,僅在 `layers_to_transform` 不為 `None` 時使用。 - modules_to_save (
List[str]
) — 除介面卡層外,需要設定為可訓練並在最終檢查點中儲存的模組列表。
這是用於儲存 `MiSSModel` 配置的配置類。
MissModel
class peft.MissModel
< 原始碼 >( 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 (
torch.nn.Module
) — 將要附加介面卡調整層的模型。 - config (MissConfig) — MiSS 模型的配置。
- adapter_name (
str
) — 介面卡的名稱,預設為 `"default"`。 - low_cpu_mem_usage (
bool
,optional
, 預設為False
) — 在元裝置上建立空的介面卡權重。有助於加快載入過程。
返回
torch.nn.Module
MiSS 模型。
從預訓練模型建立 Householder 反射適配 (MiSS) 模型。該方法在 https://huggingface.co/papers/2409.15371 中有詳細描述。
示例
>>> from diffusers import StableDiffusionPipeline
>>> from peft import MissModel, MissConfig
>>> config_te = MissConfig(
... r=8,
... target_modules=["k_proj", "q_proj", "v_proj", "out_proj", "fc1", "fc2"],
... init_weights=True,
... )
>>> config_unet = MissConfig(
... r=8,
... target_modules=[
... "proj_in",
... "proj_out",
... "to_k",
... "to_q",
... "to_v",
... "to_out.0",
... "ff.net.0.proj",
... "ff.net.2",
... ],
... init_weights=True,
... )
>>> model = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
>>> model.text_encoder = MissModel(model.text_encoder, config_te, "default")
>>> model.unet = MissModel(model.unet, config_unet, "default")
屬性:
- model (
~torch.nn.Module
) — 將要被適配的模型。 - peft_config (MissConfig): MiSS 模型的配置。
刪除一個現有的介面卡。
merge_and_unload
< 原始碼 >( progressbar: bool = False safe_merge: bool = False adapter_names: typing.Optional[list[str]] = None )
此方法將 MiSS 層合併到基礎模型中。如果有人希望將基礎模型用作獨立模型,則需要此方法。
透過移除所有 miss 模組而不進行合併,來恢復基礎模型。這將返回原始的基礎模型。