PEFT 文件

OFT

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

OFT

正交微調(OFT)是一種為適應文字到影像擴散模型而開發的方法。它透過用其正交矩陣重新引數化預訓練的權重矩陣來工作,以保留預訓練模型中的資訊。為了減少引數數量,OFT在正交矩陣中引入了塊對角結構。

論文摘要如下:

大型文字到影像擴散模型在從文字提示生成逼真影像方面具有令人印象深刻的能力。如何有效地引導或控制這些強大的模型以執行不同的下游任務成為一個重要的開放問題。為了應對這一挑戰,我們引入了一種有原則的微調方法——正交微調(OFT),用於使文字到影像擴散模型適應下游任務。與現有方法不同,OFT可以可證明地保留超球面能量,該能量表徵了單位超球面上神經元對之間的關係。我們發現這一特性對於保留文字到影像擴散模型的語義生成能力至關重要。為了提高微調的穩定性,我們進一步提出了約束正交微調(COFT),它對超球面施加了額外的半徑約束。具體來說,我們考慮了兩個重要的文字到影像微調任務:主題驅動生成,其目標是給定一個主題的幾張影像和文字提示,生成特定主題的影像;以及可控生成,其目標是使模型能夠接收額外的控制訊號。我們透過實驗表明,我們的OFT框架在生成質量和收斂速度方面優於現有方法。.

OFTConfig

class peft.OFTConfig

< >

( 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 = 0 oft_block_size: int = 32 module_dropout: float = 0.0 target_modules: Optional[Union[list[str], str]] = None fan_in_fan_out: bool = False bias: Literal['none', 'all', 'oft_only'] = 'none' exclude_modules: Optional[Union[list[str], str]] = None init_weights: bool = True layers_to_transform: Optional[Union[list[int], int]] = None layers_pattern: Optional[Union[list[str], str]] = None modules_to_save: Optional[list[str]] = None coft: bool = False eps: float = 6e-05 block_share: bool = False use_cayley_neumann: bool = True num_cayley_neumann_terms: int = 5 )

引數

  • r (int) — OFT 秩,每個注入層的 OFT 塊數。
  • oft_block_size (int) — 不同層間的 OFT 塊大小。
  • module_dropout (float) — 乘法 dropout 機率,透過在訓練期間將 OFT 塊設定為單位矩陣,類似於 LoRA 中的 dropout 層。
  • target_modules (Optional[Union[list[str], str]]) — 應用介面卡的模組名稱。如果指定了此項,則僅替換具有指定名稱的模組。傳遞字串時,將執行正則表示式匹配。傳遞字串列表時,將執行精確匹配,或者檢查模組名稱是否以任何傳遞的字串結尾。如果指定為“all-linear”,則選擇所有線性模組,不包括輸出層。如果未指定,將根據模型架構選擇模組。如果架構未知,將引發錯誤——在這種情況下,您應該手動指定目標模組。
  • fan_in_fan_out (bool) — 如果要替換的層儲存權重的方式是 (fan_in, fan_out),則設定為 True。
  • bias (str) — OFT 的偏置型別。可以是 'none'、'all' 或 'oft_only'。如果為 'all' 或 'oft_only',相應的偏置將在訓練期間更新。請注意,這意味著即使在停用介面卡時,模型也不會產生與未經適配的基礎模型相同的輸出。
  • exclude_modules (Optional[Union[List[str], str]]) — 不應用介面卡的模組名稱。傳遞字串時,將執行正則表示式匹配。傳遞字串列表時,將執行精確匹配,或者檢查模組名稱是否以任何傳遞的字串結尾。
  • init_weights (bool) — 是否執行 OFT 權重的初始化。
  • layers_to_transform (Union[List[int], int]) — 要轉換的層索引。如果傳遞一個整數列表,它將把介面卡應用於此列表中指定的層索引。如果傳遞單個整數,它將對該索引處的層應用轉換。
  • layers_pattern (Optional[Union[List[str], str]]) — 層模式名稱,僅在 `layers_to_transform` 不為 `None` 時使用。這應該針對模型的 `nn.ModuleList`,通常稱為 `'layers'` 或 `'h'`。
  • modules_to_save (List[str]) — 除了介面卡層之外,設定為可訓練並儲存在最終檢查點中的模組列表。
  • coft (bool) — 是否使用 OFT 的約束變體,預設為關閉。
  • eps (float) — COFT 的控制強度。旋轉的自由度。僅在 `coft` 設定為 True 時有效。
  • block_share (bool) — 是否在塊之間共享 OFT 引數。預設為 `False`。

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

check_kwargs

< >

( **kwargs )

引數

  • kwargs (附加關鍵字引數,可選) — 傳遞給子類初始化的附加關鍵字引數。

檢查 kwargs 是否對配置有效。

OFTModel

class peft.OFTModel

< >

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

返回

torch.nn.Module

OFT 模型。

從預訓練模型建立正交微調模型。該方法在 https://huggingface.co/papers/2306.07280 中有描述。

示例

>>> from diffusers import StableDiffusionPipeline
>>> from peft import OFTModel, OFTConfig

>>> config_te = OFTConfig(
...     r=8,
...     target_modules=["k_proj", "q_proj", "v_proj", "out_proj", "fc1", "fc2"],
...     module_dropout=0.0,
...     init_weights=True,
... )
>>> config_unet = OFTConfig(
...     r=8,
...     target_modules=[
...         "proj_in",
...         "proj_out",
...         "to_k",
...         "to_q",
...         "to_v",
...         "to_out.0",
...         "ff.net.0.proj",
...         "ff.net.2",
...     ],
...     module_dropout=0.0,
...     init_weights=True,
... )

>>> model = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
>>> model.text_encoder = OFTModel(model.text_encoder, config_te, "default")
>>> model.unet = OFTModel(model.unet, config_unet, "default")

屬性:

  • model (~torch.nn.Module) — 將要被適配的模型。
  • peft_config (OFTConfig): OFT 模型的配置。

delete_adapter

< >

( adapter_name: str )

引數

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

刪除一個現有的介面卡。

enable_adapter_layers

< >

( )

啟用所有介面卡。

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

merge_and_unload

< >

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

引數

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

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

set_adapter

< >

( adapter_name )

引數

  • 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

< >

( )

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

< > 在 GitHub 上更新

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