PEFT 文件
LoRA
並獲得增強的文件體驗
開始使用
LoRA
低秩自適應(Low-Rank Adaptation,LoRA)是一種 PEFT 方法,它將注意力層中的一個大矩陣分解為兩個較小的低秩矩陣。這極大地減少了需要微調的引數數量。
論文摘要如下:
我們提出了一種基於低秩自適應(LoRA)的神經語言建模系統,用於語音識別輸出的重打分。儘管像 BERT 這樣的預訓練語言模型(LM)在第二遍重打分中表現出優越的效能,但擴充套件預訓練階段和將預訓練模型適應特定領域的高計算成本限制了它們在重打分中的實際應用。在這裡,我們提出一種基於低秩分解的方法來訓練重打分 BERT 模型,並僅使用一小部分(0.08%)的預訓練引數將其適應到新領域。這些插入的矩陣透過一個判別式訓練目標和一個基於相關性的正則化損失進行最佳化。所提出的低秩自適應重打分 BERT(LoRB)架構在 LibriSpeech 和內部資料集上進行了評估,訓練時間分別減少了 5.4 到 3.6 倍。.
LoraConfig
class peft.LoraConfig
< 原始碼 >( 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 = 8 target_modules: Optional[Union[list[str], str]] = None exclude_modules: Optional[Union[list[str], str]] = None lora_alpha: int = 8 lora_dropout: float = 0.0 fan_in_fan_out: bool = False bias: Literal['none', 'all', 'lora_only'] = 'none' use_rslora: bool = False modules_to_save: Optional[list[str]] = None init_lora_weights: bool | Literal['gaussian', 'eva', 'olora', 'pissa', 'pissa_niter_[number of iters]', 'corda', 'loftq', 'orthogonal'] = True layers_to_transform: Optional[Union[list[int], int]] = None layers_pattern: Optional[Union[list[str], str]] = None rank_pattern: Optional[dict] = <factory> alpha_pattern: Optional[dict] = <factory> megatron_config: Optional[dict] = None megatron_core: Optional[str] = 'megatron.core' trainable_token_indices: Optional[Union[list[int], dict[str, list[int]]]] = None loftq_config: Union[LoftQConfig, dict] = <factory> eva_config: Optional[EvaConfig] = None corda_config: Optional[CordaConfig] = None use_dora: bool = False use_qalora: bool = False qalora_group_size: int = 16 layer_replication: Optional[list[tuple[int, int]]] = None runtime_config: LoraRuntimeConfig = <factory> lora_bias: bool = False target_parameters: Optional[list[str]] = None )
引數
- r (
int
) — LoRA 注意力維度(即“秩”)。 - target_modules (
Optional[Union[List[str], str]]
) — 應用介面卡的模組名稱。如果指定,只有具有指定名稱的模組將被替換。當傳入字串時,將執行正則表示式匹配。當傳入字串列表時,將執行精確匹配,或者檢查模組名稱是否以任何傳入的字串結尾。如果指定為 'all-linear',則選擇所有線性/Conv1D 模組(如果模型是 PreTrainedModel,則排除輸出層)。如果未指定,將根據模型架構選擇模組。如果架構未知,將引發錯誤——在這種情況下,您應該手動指定目標模組。要避免定位任何模組(因為您想應用 `target_parameters`),請設定 `target_modules=[]`。 - exclude_modules (
Optional[Union[List[str], str]]
) — 不應用介面卡的模組名稱。當傳入字串時,將執行正則表示式匹配。當傳入字串列表時,將執行精確匹配,或者檢查模組名稱是否以任何傳入的字串結尾。 - lora_alpha (
int
) — LoRA 縮放的 alpha 引數。 - lora_dropout (
float
) — LoRA 層的 dropout 機率。 - fan_in_fan_out (
bool
) — 如果要替換的層儲存的權重形式為(fan_in, fan_out),則將其設定為 True。例如,gpt-2 使用 `Conv1D`,它儲存權重的方式是(fan_in, fan_out),因此應將其設定為 `True`。 - bias (
str
) — LoRA 的偏置型別。可以是 ‘none’、‘all’ 或 ‘lora_only’。如果為 ‘all’ 或 ‘lora_only’,相應的偏置將在訓練期間更新。請注意,這意味著即使停用介面卡,模型的輸出也不會與未進行自適應的基礎模型相同。 - use_rslora (
bool
) — 當設定為 True 時,使用 Rank-Stabilized LoRA,它將介面卡縮放因子設定為 `lora_alpha/math.sqrt(r)`,因為這被證明效果更好。否則,它將使用原始的預設值 `lora_alpha/r`。 - modules_to_save (
List[str]
) — 除了介面卡層之外,要設定為可訓練並儲存在最終檢查點中的模組列表。 - init_lora_weights (
bool
|Literal["gaussian", "eva", "olora", "pissa", "pissa_niter_[number of iters]", "corda", "loftq", "orthogonal"]
) — 如何初始化介面卡層的權重。傳入 True(預設值)會使用微軟參考實現中的預設初始化,LoRA B 權重設定為 0。這意味著在沒有進一步訓練的情況下,LoRA 介面卡將是一個空操作。將初始化設定為 False 會導致 LoRA A 和 B 的隨機初始化,意味著在訓練前 LoRA 不是空操作;此設定用於除錯目的。傳入 'gaussian' 會導致高斯初始化,並按 LoRA 秩進行縮放。傳入 `'loftq'` 以使用 LoftQ 初始化。傳入 `'eva'` 會導致 可解釋方差自適應(Explained Variance Adaptation) 的資料驅動初始化。EVA 基於層輸入啟用的 SVD 初始化 LoRA,並因其能適應微調資料而達到 SOTA 效能。傳入 `'olora'` 以使用 OLoRA 初始化。傳入 `'pissa'` 會導致 https://huggingface.co/papers/2404.02948’主奇異值和奇異向量自適應(Principal Singular values and Singular vectors Adaptation, PiSSA)的初始化,它比 LoRA 收斂更快,並最終實現更優異的效能。此外,PiSSA 與 QLoRA 相比減少了量化誤差,從而進一步提升了效能。傳入 `'pissa_niter_[number of iters]'` 會啟動基於快速 SVD 的 PiSSA 初始化,其中 `[number of iters]` 表示執行 FSVD 的子空間迭代次數,並且必須是一個非負整數。當 `[number of iters]` 設定為 16 時,可以在幾秒內完成一個 7B 模型的初始化,並且訓練效果約等於使用 SVD。傳入 `'corda'` 會導致 面向上下文的分解自適應(Context-Oriented Decomposition Adaptation) 的初始化,在指令預覽模式下比 PiSSA 收斂更快,並且在知識保留模式下比 LoRA 更好地保留世界知識。傳入 `"orthogonal"` 會導致 LoRA A 和 B 被正交初始化;在這方面,它類似於 `"olora"`,但基礎權重保持不變(要求 `r` 為偶數,目前僅支援線性層)。
- layers_to_transform (
Union[List[int], int]
) — 要轉換的層索引。如果傳入一個整數列表,它將把介面卡應用於此列表中指定的層索引。如果傳入單個整數,它將對此索引處的層應用轉換。 - layers_pattern (
Optional[Union[List[str], str]]
) — 層模式名稱,僅在 `layers_to_transform` 不為 `None` 時使用。這應該針對模型的 `nn.ModuleList`,通常稱為 `'layers'` 或 `'h'`。 - rank_pattern (
dict
) — 從層名稱或正則表示式到秩的對映,這些秩與 `r` 指定的預設秩不同。例如,`{'^model.decoder.layers.0.encoder_attn.k_proj': 16}`。 - alpha_pattern (
dict
) — 從層名稱或正則表示式到 alpha 值的對映,這些 alpha 值與 `lora_alpha` 指定的預設 alpha 值不同。例如,`{'^model.decoder.layers.0.encoder_attn.k_proj': 16}`。 - megatron_config (
Optional[dict]
) — Megatron 的 TransformerConfig 引數。它用於建立 LoRA 的並行線性層。您可以像這樣獲取它:`core_transformer_config_from_args(get_args())`,這兩個函式都來自 Megatron。這些引數將用於初始化 Megatron 的 TransformerConfig。當您想將 LoRA 應用於 megatron 的 ColumnParallelLinear 和 RowParallelLinear 層時,需要指定此引數。 - megatron_core (
Optional[str]
) — 要使用的 Megatron 核心模組,預設為 `"megatron.core"`。 - trainable_token_indices (
Optional[Union[List[int], dict[str, List[int]]]]
) — 允許您使用 `peft.TrainableTokensModel` 方法選擇性地微調特定的詞元索引,而無需重新訓練整個嵌入矩陣。您可以透過兩種方式指定詞元索引。可以指定一個索引列表,這將針對模型的輸入嵌入層(如果未找到,則為 `embed_tokens`)。或者,您可以指定一個字典,其中鍵是嵌入模組的名稱,值是詞元索引列表,例如 `{'embed_tokens': [0, 1, ...]}`。請注意,使用 FSDP 進行訓練需要 `use_orig_params=True` 以避免 `requires_grad` 不均勻導致的問題。 - loftq_config (
Optional[LoftQConfig]
) — LoftQ 的配置。如果此項不為 None,則將使用 LoftQ 來量化主幹權重並初始化 Lora 層。同時也要傳遞 `init_lora_weights='loftq'`。請注意,在這種情況下,您不應傳入已量化的模型,因為 LoftQ 將自行對模型進行量化。 - eva_config (
Optional[EvaConfig]
) — EVA 的配置。至少需要設定資料集引數(使用與微調相同的資料集)。 - corda_config (
Optional[CordaConfig]
) — CorDA 的配置。如果此項不為 None,則將使用 CorDA 來構建介面卡層。同時也要傳遞 `init_lora_weights='corda'`。 - use_dora (
bool
) — 啟用‘權重分解低秩自適應’(DoRA)。該技術將權重的更新分解為幅度和方向兩部分。方向由普通的 LoRA 處理,而幅度由一個單獨的可學習引數處理。這可以提高 LoRA 的效能,尤其是在低秩時。目前,DoRA 僅支援線性和 Conv2D 層。DoRA 引入的開銷比純 LoRA 大,因此建議在推理時合併權重。更多資訊,請參閱 https://huggingface.co/papers/2402.09353。 - layer_replication (
List[Tuple[int, int]]
) — 透過根據指定的範圍堆疊原始模型層來構建新的層堆疊。這允許在不復制基礎模型權重的情況下擴充套件(或縮小)模型。新層都將附加獨立的 LoRA 介面卡。 - runtime_config (
LoraRuntimeConfig
) — 執行時配置(不儲存或恢復)。 - lora_bias (
bool
) — 預設為 `False`。是否為 LoRA B 引數啟用偏置項。通常,這應該被停用。其主要用途是當 LoRA 權重是從完全微調的引數中提取時,可以考慮這些引數的偏置。 - target_parameters (
List[str]
, *可選*) — 要用 LoRA 替換的引數名稱列表或引數名稱的正則表示式。此引數的行為類似於 `target_modules`,但應傳遞引數名稱。通常,您應該使用 `target_modules` 來定位模組(例如 `nn.Linear`)。然而,在某些情況下,這是不可能的。例如,在 HF Transformers 的許多專家混合(MoE)層中,使用的是 `nn.Parameter` 而不是 `nn.Linear`。PEFT 通常會為 LoRA 重寫 `forward` 方法,但 `nn.Parameter` 沒有 `forward` 方法。因此,要將 LoRA 應用於該引數,需要使用 `target_parameters` 來定位它。例如,對於 Llama4,您可以傳遞:`target_parameters=['feed_forward.experts.gate_up_proj', 'feed_forward.experts.down_proj]`。尚未實現傳遞字串進行正則表示式匹配。
這是用於儲存 LoraModel 配置的配置類。
以字典形式返回介面卡模型的配置。移除執行時配置。
LoraModel
class peft.LoraModel
< 原始碼 >( 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 (LoraConfig) — Lora 模型的配置。
- adapter_name (
str
) — 介面卡的名稱,預設為 `"default"`。 - low_cpu_mem_usage (
bool
, `可選`, 預設為 `False`) — 在元裝置上建立空的介面卡權重。有助於加快載入過程。
返回
torch.nn.Module
LoRA 模型。
從預訓練的 transformers 模型建立低秩介面卡(LoRA)模型。
該方法在 https://huggingface.co/papers/2106.09685 中有詳細描述。
示例
>>> from transformers import AutoModelForSeq2SeqLM
>>> from peft import LoraModel, LoraConfig
>>> config = LoraConfig(
... task_type="SEQ_2_SEQ_LM",
... r=8,
... lora_alpha=32,
... target_modules=["q", "v"],
... lora_dropout=0.01,
... )
>>> model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")
>>> lora_model = LoraModel(model, config, "default")
>>> import torch
>>> import transformers
>>> from peft import LoraConfig, PeftModel, get_peft_model, prepare_model_for_kbit_training
>>> rank = ...
>>> target_modules = ["q_proj", "k_proj", "v_proj", "out_proj", "fc_in", "fc_out", "wte"]
>>> config = LoraConfig(
... r=4, lora_alpha=16, target_modules=target_modules, lora_dropout=0.1, bias="none", task_type="CAUSAL_LM"
... )
>>> quantization_config = transformers.BitsAndBytesConfig(load_in_8bit=True)
>>> tokenizer = transformers.AutoTokenizer.from_pretrained(
... "kakaobrain/kogpt",
... revision="KoGPT6B-ryan1.5b-float16", # or float32 version: revision=KoGPT6B-ryan1.5b
... bos_token="[BOS]",
... eos_token="[EOS]",
... unk_token="[UNK]",
... pad_token="[PAD]",
... mask_token="[MASK]",
... )
>>> model = transformers.GPTJForCausalLM.from_pretrained(
... "kakaobrain/kogpt",
... revision="KoGPT6B-ryan1.5b-float16", # or float32 version: revision=KoGPT6B-ryan1.5b
... pad_token_id=tokenizer.eos_token_id,
... use_cache=False,
... device_map={"": rank},
... torch_dtype=torch.float16,
... quantization_config=quantization_config,
... )
>>> model = prepare_model_for_kbit_training(model)
>>> lora_model = get_peft_model(model, config)
屬性:
- model (
PreTrainedModel
) — 需要被適配的模型。 - peft_config (LoraConfig):LoRA 模型的配置。
add_weighted_adapter
< 原始碼 >( adapters: list[str] weights: list[float] adapter_name: str combination_type: str = 'svd' svd_rank: int | None = None svd_clamp: int | None = None svd_full_matrices: bool = True svd_driver: str | None = None density: float | None = None majority_sign_method: Literal['total', 'frequency'] = 'total' )
引數
- adapters (
list
) — 要合併的介面卡名稱列表。 - weights (
list
) — 每個介面卡的權重列表。 - adapter_name (
str
) — 新介面卡的名稱。 - combination_type (
str
) — 合併型別可以是 [svd
,linear
,cat
,ties
,ties_svd
,dare_ties
,dare_linear
,dare_ties_svd
,dare_linear_svd
,magnitude_prune
,magnitude_prune_svd
] 中的一種。當使用 `cat` 合併型別時,結果介面卡的秩等於所有介面卡秩的總和(混合介面卡可能太大並導致 OOM 錯誤)。 - svd_rank (
int
, 可選) — 用於 svd 的輸出介面卡的秩。如果未提供,將使用合併介面卡的最大秩。 - svd_clamp (
float
, 可選) — 用於限制 SVD 分解輸出的分位數閾值。如果提供 None,則不執行限制操作。預設為 None。 - svd_full_matrices (
bool
, 可選) — 控制是計算完整 SVD 還是簡化 SVD,並因此決定返回的張量 U 和 Vh 的形狀。預設為 True。 - svd_driver (
str
, 可選) — 要使用的 cuSOLVER 方法的名稱。此關鍵字引數僅在 CUDA 上合併時有效。可以是 [None,gesvd
,gesvdj
,gesvda
] 之一。更多資訊請參考torch.linalg.svd
文件。預設為 None。 - density (
float
, 可選) — 介於 0 和 1 之間的值。0 表示所有值都被修剪,1 表示沒有值被修剪。應與 [ties
,ties_svd
,dare_ties
,dare_linear
,dare_ties_svd
,dare_linear_svd
,magnintude_prune
,magnitude_prune_svd
] 一起使用 - majority_sign_method (
str
) — 獲取符號值量級的方法,應為 [“total”, “frequency”] 之一。應與 [ties
,ties_svd
,dare_ties
,dare_ties_svd
] 一起使用
此方法透過將給定的介面卡與給定的權重合並來新增一個新的介面卡。
當使用 `cat` 組合型別時,您應注意,生成的介面卡的秩將等於所有介面卡秩的總和。因此,混合後的介面卡可能會變得過大,導致 OOM 錯誤。
刪除一個現有的介面卡。
merge_and_unload
< 原始碼 >( progressbar: bool = False safe_merge: bool = False adapter_names: Optional[list[str]] = None )
此方法將 LoRa 層合併到基礎模型中。如果有人想將基礎模型用作獨立模型,則需要此操作。
示例
>>> from transformers import AutoModelForCausalLM
>>> from peft import PeftModel
>>> base_model = AutoModelForCausalLM.from_pretrained("tiiuae/falcon-40b")
>>> peft_model_id = "smangrul/falcon-40B-int4-peft-lora-sfttrainer-sample"
>>> model = PeftModel.from_pretrained(base_model, peft_model_id)
>>> merged_model = model.merge_and_unload()
set_adapter
< 原始碼 >( adapter_name: str | list[str] )
設定活動的介面卡。
此外,此函式將把指定的介面卡設定為可訓練的(即 requires_grad=True)。如果不希望如此,請使用以下程式碼。
subtract_mutated_init
< 原始碼 >( output_state_dict: dict[str, torch.Tensor] adapter_name: str kwargs = None )
此函式透過比較 `output_state_dict` 中 PiSSA/CorDA/OLoRA 介面卡的引數與 `adapter_name` 中 PiSSA/CorDA/OLoRA 的初始值,可以計算出 PiSSA/CorDA/OLoRA 的更新量,從而將 PiSSA/CorDA/OLoRA 轉換為 LoRA。
透過移除所有 lora 模組而不進行合併,來恢復基礎模型。這將返回原始的基礎模型。
實用工具
LoftQ
peft.replace_lora_weights_loftq
< 原始碼 >( peft_model model_path: Optional[str] = None adapter_name: str = 'default' callback: Optional[Callable[[torch.nn.Module, str], bool]] = None )
引數
- peft_model (
PeftModel
) — 需要替換權重的模型。必須是帶有 LoRA 層的量化 PEFT 模型。 - model_path (
Optional[str]
) — 模型 safetensors 檔案的路徑。如果模型是 Hugging Face 模型,將從模型的配置中推斷。否則,必須提供此路徑。 - adapter_name (
str
) — 要替換其權重的介面卡的名稱。預設介面卡名稱為“default”。 - callback (
Optional[Callable[[PeftModel, str], bool]]
) — 每個模組被替換後將呼叫的回撥函式。回撥函式應以模型和當前模組的名稱作為輸入,並返回一個布林值,指示是否應保留替換。如果回撥返回 False,替換將被回滾。這對於確認 LoftQ 初始化是否確實減少了模型的量化誤差非常有用。例如,此回撥可以為給定輸入生成 logits,並將其與來自原始非量化模型使用相同輸入的 logits 進行比較,僅在有改進時返回 `True`。由於這是一種貪婪最佳化,多次呼叫此函式可能會產生增量改進。
使用 LoftQ 技術替換使用 bitsandbytes 量化的模型的 LoRA 權重。
替換是透過從本地儲存的 safetensors 模型檔案中載入非量化權重,並初始化 LoRA 權重,以最小化原始權重和量化權重之間的量化誤差來動態完成的。
由於 pickle 不支援惰性載入,因此不支援普通的 PyTorch 檢查點檔案。
根據模型大小,呼叫此函式可能需要一些時間才能完成。
Eva
EvaConfig
class peft.EvaConfig
< 原始碼 >( rho: float = 2.0 tau: float = 0.99 use_label_mask: bool = True label_mask_value: int = -100 whiten: bool = False adjust_scaling_factors: bool = True )
引數
- rho (
float
) — 用於 EVA 重分佈的 Rho 值 (>= 1.0)。層的最大秩為 lora_r * rho。預設為 2.0,意味著層的最大允許秩為 2r。增加 rho 將允許在各層之間進行更大程度的秩重分佈。一些預訓練模型可能對秩重分佈更敏感。因此,如果效能低於預期,嘗試 rho=1.0(無重分佈)可能會有益。 - tau (
float
) — 用於提前停止的餘弦相似度閾值。比較兩個連續 SVD 步驟之間右奇異向量的餘弦相似度。如果餘弦相似度高於此閾值,則停止 SVD 迭代。預設為 0.99。 - use_label_mask (
bool
) — 為 EVA 初始化使用標籤掩碼。這意味著 labels=label_mask_value 的位置在 SVD 計算中被忽略。在大多數情況下,首選設定 use_label_mask=True,並且對於多輪對話尤其有益。預設值為 True。根據標籤掩碼過濾專案有時會導致批次大小過小,從而導致 SVD 計算不穩定。對於大量批次專案會被過濾掉的情況,請設定 use_label_mask=False。 - label_mask_value (
int
) — 如果 use_label_mask=True,則用於查詢要遮蔽的被忽略的標記的值。預設為 -100。 - whiten (
bool
) — 對奇異向量應用白化處理。預設為 False。白化已被證明在視覺領域對 EVA 有益。 - adjust_scaling_factors (
bool
) — 在秩重分佈後調整 LoRA 縮放因子。將其設定為 True 意味著調整縮放因子,使得所有 LoRA 梯度的尺度都相同,無論其秩如何。預設為 True。
這是用於儲存透過 EVA 進行資料驅動初始化的配置的子配置類。EVA 在 Explained Variance Adaptation 中被引入。
initialize_lora_eva_weights
peft.initialize_lora_eva_weights
< 原始碼 >( model: Module dataloader: typing.Optional[collections.abc.Iterable] = None eva_state_dict: typing.Optional[dict] = None forward_fn: typing.Optional[<built-in function callable>] = <function forward_fn_dict at 0x7f538e0951b0> prepare_model_inputs_fn: typing.Optional[<built-in function callable>] = <function prepare_model_inputs_fn_language_modeling at 0x7f538e095090> prepare_layer_inputs_fn: typing.Union[<built-in function callable>, dict[str, callable], NoneType] = <function prepare_layer_inputs_fn_language_modeling at 0x7f538e095120> adapter_name: str = 'default' gather_distributed_inputs: bool = True show_progress_bar: bool = True ) → model (torch.nn.Module)
引數
- model (PeftModel) — 用於計算 SVD 的 peft 模型。
- dataloader (Optional[Iterable]) — 用於前向傳播的資料載入器。如果為 None,則需要提供 eva_state_dict。
- eva_state_dict (Optional[dict]) — 要載入到模型中的 state_dict。如果為 None,則需要提供資料載入器,並且將使用 `get_eva_state_dict` 計算 state_dict。
- forward_fn (callable) — 用於前向傳播的前向函式。接受兩個引數:`model` 和 `inputs`。預設行為是 `return model(**inputs)`
- prepare_model_inputs_fn (Optional[callable]) — 此函式接收模型輸入和 peft_config,並將輸出傳遞給 `prepare_layer_inputs_fn`。可用於根據原始模型輸入修改 SVD 計算的輸入。例如,對於語言建模,注意力掩碼用於確定哪些索引是填充標記,不應用於 SVD。此處定義的任何函式都期望兩個引數:`model_input` 和 `peft_config`。預設使用 `peft.tuners.lora.eva.prepare_model_inputs_fn_language_modeling`。
- prepare_layer_inputs_fn (Union[callable, Dict[str, callable], None]) — 此函式接收層輸入、模型輸入(可能由 `prepare_model_inputs_fn` 修改)和層的名稱,並返回該特定層應用於 SVD 的輸入。此處定義的任何自定義函式都期望三個引數:`layer_input`、`model_input` 和 `layer_name`,並應返回一個 2d 張量。預設邏輯可在 peft.tuners.lora.eva.prepare_layer_inputs_fn_language_modeling 中找到,適用於語言建模。在這種情況下,model_inputs 是用於確定哪些索引應用於 SVD 的掩碼(由 `prepare_model_inputs_fn_language_modeling` 建立)。
- adapter_name (str) — 要初始化權重的介面卡的名稱。
- gather_distributed_inputs (bool) — 是否從所有 ranks 收集層輸入。預設為 True,意味著在分散式設定中,將從所有 ranks 收集層輸入用於 SVD 計算。對於非分散式設定,此引數被忽略。如果您在分散式設定中使用非分散式資料載入器,請設定為 False。
- show_progress_bar (bool) — 是否顯示進度條。預設為 True。
返回
model (torch.nn.Module)
已初始化 LoRA 權重的模型。
使用 EVA 方法初始化 LoRA 層的權重。
此函式使用 EVA 方法初始化 LoRA 層的權重。它為每個介面卡層計算 SVD 並相應地更新權重。
get_eva_state_dict
peft.get_eva_state_dict
< 原始碼 >( model: Module dataloader: Iterable peft_config: typing.Optional[peft.tuners.lora.config.LoraConfig] = None forward_fn: typing.Optional[<built-in function callable>] = <function forward_fn_dict at 0x7f538e0951b0> prepare_model_inputs_fn: typing.Optional[<built-in function callable>] = <function prepare_model_inputs_fn_language_modeling at 0x7f538e095090> prepare_layer_inputs_fn: typing.Union[<built-in function callable>, dict[str, callable], NoneType] = <function prepare_layer_inputs_fn_language_modeling at 0x7f538e095120> adapter_name: str = 'default' gather_distributed_inputs: bool = True show_progress_bar: bool = True ) → eva_state_dict (dict)
引數
- model (torch.nn.Module) — 用於計算 SVD 的模型。不需要是 PeftModel。
- dataloader (Iterable) — 用於前向傳播的資料載入器。
- peft_config (Optional[LoraConfig]) — LoRA 層的配置。僅當 `model` 不是 PeftModel 時需要。
- forward_fn (callable) — 用於前向傳播的前向函式。接收兩個引數:`model` 和 `inputs`。預設行為是 `return model(**inputs)`
- prepare_model_inputs_fn (Optional[callable]) — 此函式接收模型輸入和 peft_config,並將其輸出傳遞給 `prepare_layer_inputs_fn`。可用於根據原始模型輸入修改 SVD 計算的輸入。例如,對於語言模型,注意力掩碼(attention mask)用於確定哪些索引是填充標記(padding token),不應用於 SVD。此處定義的任何函式都應接收兩個引數:`model_input` 和 `peft_config`。預設使用 `peft.tuners.lora.eva.prepare_model_inputs_fn_language_modeling`。
- prepare_layer_inputs_fn (Union[callable, Dict[str, callable], None]) — 此函式接收層輸入、模型輸入(可能由 `prepare_model_inputs_fn` 修改過)和層名稱,並返回該特定層應用於 SVD 的輸入。此處定義的任何自定義函式都應接收三個引數:`layer_input`、`model_input` 和 `layer_name`,並應返回一個二維張量。預設邏輯可在 peft.tuners.lora.eva.prepare_layer_inputs_fn_language_modeling 中找到,適用於語言模型。在這種情況下,model_inputs 是用於確定哪些索引應用於 SVD 的掩碼(由 `prepare_model_inputs_fn_language_modeling` 建立)。
- adapter_name (str) — 要為其計算 SVD 的介面卡名稱。
- gather_distributed_inputs (bool) — 是否從所有排名(rank)中收集層輸入。預設為 True,表示在分散式設定中,將從所有排名中收集層輸入用於 SVD 計算。對於非分散式設定,此引數將被忽略。如果在分散式設定中使用非分散式資料載入器,則設定為 False。
- show_progress_bar (bool) — 是否顯示進度條。預設為 True。
返回
eva_state_dict (dict)
包含每層 SVD 分量的狀態字典。
計算模型中每層的 SVD。
此函式計算模型中每層的奇異值分解(SVD)。它使用增量 PCA 方法來計算 SVD 分量。該函式還使用餘弦相似度檢查計算出的分量是否收斂。每層的秩分佈是根據解釋方差比確定的。