PEFT 文件
C3A: 透過迴圈卷積實現引數高效微調
並獲得增強的文件體驗
開始使用
C3A: 透過迴圈卷積實現引數高效微調
C3A 是一種引數高效的微調技術,它利用迴圈卷積在合理的資源限制內實現高秩適應。
請注意,你應該為 C3A 使用比其他方法大得多的學習率 (LR)。例如,1e-1 的學習率是 C3A 的一個良好起點。此外,應使用小得多的權重衰減。你可以參考 method_comparison
檔案夾了解更多詳情。
對於 block_size
,它會影響可調引數和效能。作為開始,你可以選擇一個接近 $\frac{\sqrt{d_1\times d_2}}{r}$ 的 $\mathrm{gcd}(d_1,d_2)$,其中 $r$ 是你將為此任務使用的 LoRA 秩。
C3A 目前有以下限制:
- 僅支援 `nn.Linear` 層。
- 不支援量化層。
- 塊大小應該是目標層輸入和輸出大小的公約數。
如果這些限制不適用於你的用例,請考慮使用其他方法。
論文摘要如下:
低秩適應 (LoRA) 因其在微調大型基礎模型方面的應用而廣受歡迎,它利用低秩矩陣 $\mathbf{A}$ 和 $\mathbf{B}$ 來表示權重變化(即 $\Delta \mathbf{W} = \mathbf{B} \mathbf{A}$)。該方法透過將 $\mathbf{A}$ 和 $\mathbf{B}$ 與啟用值依次相乘,減少了可訓練引數,並減輕了與完整增量矩陣相關的大量記憶體消耗。儘管取得了成功,但其固有的低秩特性可能會限制其效能。雖然已經提出了幾種變體來解決這個問題,但它們往往忽略了 LoRA 帶來的關鍵計算和記憶體效率。在本文中,我們提出了迴圈卷積適應 (C3A),它不僅以增強的效能實現了高秩適應,而且在計算能力和記憶體利用方面也表現出色。大量的實驗表明,C3A 在各種微調任務中始終優於 LoRA 及其變體。
C3AConfig
class peft.C3AConfig
< 來源 >( 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 block_size: int = 256 target_modules: Optional[Union[list[str], str]] = None bias: str = 'none' modules_to_save: Optional[list[str]] = None layers_to_transform: Optional[Union[list[int], int]] = None layers_pattern: Optional[Union[list[str], str]] = None block_size_pattern: Optional[dict] = <factory> init_weights: Optional[Union[bool, Literal['gaussian', 'kaiming_uniform', 'xavier_uniform']]] = 'xavier_uniform' )
引數
- block_size (
int
) — C3A 的塊大小,必須能被目標層的輸入大小和輸出大小整除。如果你不知道該使用什麼塊大小,請將其設定為目標層所有輸入和輸出大小的最大公約數。增加此值將導致引數減少。 - target_modules (
Union[list[str],str]
) — 應用 C3A 的模組名稱。 - bias (
str
) — C3A 的偏置型別。可以是 ‘none’、‘all’ 或 ‘c3a_only’。如果為 ‘all’ 或 ‘c3a_only’,則相應的偏置將在訓練期間更新。請注意,這意味著即使停用介面卡,模型也不會產生與未經適應的基礎模型相同的輸出。 - modules_to_save (
list[str]
) — 除了 C3A 層之外,需要設定為可訓練並儲存在最終檢查點中的模組列表。 - layers_to_transform (
Union[list[int],int]
) — 要轉換的層索引,如果指定此引數,它將在該列表中指定的層索引上應用 C3A。如果傳入單個整數,它將在該索引的層上應用 C3A。 - layers_pattern (
str
) — 層模式名稱,僅當 `layers_to_transform` 不為 `None` 且層模式不在常見層模式中時使用。 - block_size_pattern (
dict
) — 從層名稱或正則表示式到與預設指定值不同的 block_size 的對映。例如,`{"model.decoder.layers.0.encoder_attn.k_proj": 1280}`。 - init_weights (
Union[bool, Literal["gaussian", "kaiming_uniform", "xavier_uniform"]]
) — C3A 權重的初始化。如果權重應初始化為常用分佈,則將其設定為 False。如果權重應初始化為零,則將其設定為 True。
這是用於儲存 C3AModel 配置的配置類。
C3AModel
class peft.C3AModel
< 來源 >( 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 (C3AConfig) — C3A 模型的配置。
- adapter_name (
str
) — 介面卡的名稱,預設為 `"default"`。
返回
torch.nn.Module
C3A 模型。
從預訓練的 transformers 模型建立 C3A 模型。
該方法在 [待辦] 中有詳細描述。
屬性:
- model (
PreTrainedModel
) — 需要被適配的模型。 - peft_config (C3AConfig): C3A 模型的配置。
merge_and_unload
< 來源 >( progressbar: bool = False safe_merge: bool = False adapter_names: Optional[list[str]] = None )
此方法將 C3A 層合併到基礎模型中。如果有人想將基礎模型用作獨立模型,則需要此方法。
set_adapter
< 來源 >( adapter_name: str | list[str] )
設定活動的介面卡。
透過移除所有 C3A 模組而不進行合併,恢復基礎模型。這將返回原始的基礎模型。