PEFT 文档
LoRA
并获得增强的文档体验
开始使用
LoRA
低秩自适应 (LoRA) 是一种 PEFT 方法,它将注意力层中的大型矩阵分解为两个较小的低秩矩阵。这大大减少了需要微调的参数数量。
论文摘要如下
我们提出了一种基于低秩自适应 (LoRA) 的神经语言建模系统,用于语音识别输出重评分。尽管像 BERT 这样的预训练语言模型 (LM) 在第二遍重评分中表现出了卓越的性能,但扩展预训练阶段和将预训练模型适应特定领域的高计算成本限制了它们在重评分中的实际应用。在此,我们提出了一种基于低秩分解的方法来训练重评分 BERT 模型,并仅使用一小部分(0.08%)预训练参数将其适应新领域。这些插入的矩阵通过判别训练目标以及基于相关的正则化损失进行优化。所提出的低秩自适应 Rescore-BERT (LoRB) 架构在 LibriSpeech 和内部数据集上进行了评估,训练时间减少了 5.4 到 3.6 倍。.
LoraConfig
class peft.LoraConfig
< source >( 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'] = 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 layer_replication: Optional[list[tuple[int, int]]] = None runtime_config: LoraRuntimeConfig = <factory> lora_bias: bool = False )
参数
- r (
int
) — Lora 注意力维度(“秩”)。 - target_modules (
Optional[Union[List[str], str]]
) — 要应用适配器的模块名称。如果指定了此项,则只会替换具有指定名称的模块。当传递字符串时,将执行正则表达式匹配。当传递字符串列表时,将执行完全匹配,或者检查模块的名称是否以任何传递的字符串结尾。如果指定为“all-linear”,则会选择所有 linear/Conv1D 模块(如果模型是 PreTrainedModel,则排除输出层)。如果未指定,则将根据模型架构选择模块。如果架构未知,则会引发错误——在这种情况下,您应该手动指定目标模块。 - 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 的 Bias 类型。可以是“none”、“all”或“lora_only”。如果为“all”或“lora_only”,则将在训练期间更新相应的 bias。请注意,这意味着即使禁用适配器,模型也不会产生与未进行适配的基础模型相同的输出。 - 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"]
) — 如何初始化适配器层的权重。传递 True(默认值)会导致 Microsoft 参考实现中的默认初始化,其中 LoRA B 权重设置为 0。这意味着在没有进一步训练的情况下,LoRA 适配器将不起作用。将初始化设置为 False 会导致 LoRA A 和 B 的随机初始化,这意味着 LoRA 在训练前不是空操作;此设置旨在用于调试目的。传递“gaussian”会导致高斯初始化,并按线性层和层的 LoRA 秩进行缩放。传递'loftq'
以使用 LoftQ 初始化。传递'eva'
会导致https://arxiv.org/abs/2410.07170’ >Explained Variance Adaptation 的数据驱动初始化。EVA 基于层输入激活的 SVD 初始化 LoRA,并因其适应微调数据的能力而实现了 SOTA 性能。传递 'olora'
以使用 OLoRA 初始化。传递'pissa'
会导致https://arxiv.org/abs/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'
会导致https://arxiv.org/abs/2406.05223’ >Context-Oriented Decomposition Adaptation 的初始化,在指令预览模式下,它比 PiSSA 收敛得更快,并且在知识保留模式下,比 LoRA 更好地保留了世界知识。 - 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]]]]
) — 允许你指定要选择性地微调的 token 索引,而无需使用peft.TrainableTokensModel
方法重新训练整个嵌入矩阵。你可以通过两种方式指定 token 索引。你可以指定一个索引列表,该列表将指向模型的输入嵌入层(或者,如果未找到,则指向embed_tokens
)。或者,你可以指定一个字典,其中键是嵌入模块的名称,值是 token 索引列表,例如{'embed_tokens': [0, 1, ...]}
。请注意,启用此选项后,可能尚不支持使用 FSDP/DeepSpeed 进行训练。 - loftq_config (
Optional[LoftQConfig]
) — LoftQ 的配置。如果这不是 None,则将使用 LoftQ 量化骨干权重并初始化 Lora 层。同时传递init_lora_weights='loftq'
。请注意,在这种情况下,你不应该传递量化模型,因为 LoftQ 将自行量化模型。 - eva_config (
Optional[EvaConfig]
) — EVA 的配置。至少需要设置 dataset 参数(使用与微调相同的数据集)。 - corda_config (
Optional[CordaConfig]
) — CorDA 的配置。如果这不是 None,则将使用 CorDA 构建适配器层。同时传递init_lora_weights='corda'
。 - use_dora (
bool
) — 启用 ‘权重分解低秩适配’ (DoRA)。这项技术将权重的更新分解为幅度部分和方向部分。方向由正常的 LoRA 处理,而幅度由单独的可学习参数处理。这可以提高 LoRA 的性能,尤其是在低秩的情况下。目前,DoRA 仅支持线性层和 Conv2D 层。DoRA 引入了比纯 LoRA 更大的开销,因此建议合并权重以进行推理。有关更多信息,请参阅 https://arxiv.org/abs/2402.09353。 - layer_replication (
List[Tuple[int, int]]
) — 通过根据指定的范围堆叠原始模型层来构建新的层堆栈。这允许扩展(或收缩)模型,而无需复制基础模型权重。新层都将附加单独的 LoRA 适配器。 - runtime_config (
LoraRuntimeConfig
) — 运行时配置(不保存或恢复)。 - lora_bias (
bool
) — 默认为False
。是否为 LoRA B 参数启用偏置项。通常,应禁用此项。此项的主要用例是从完全微调的参数中提取 LoRA 权重时,可以考虑这些参数的偏差。
这是用于存储 LoraModel 配置的配置类。
以字典形式返回适配器模型的配置。移除运行时配置。
LoraModel
class peft.LoraModel
< source >( model config adapter_name low_cpu_mem_usage: bool = False ) → torch.nn.Module
参数
- model (
torch.nn.Module
) — 要适配的模型。 - config (LoraConfig) — Lora 模型的配置。
- adapter_name (
str
) — 适配器的名称,默认为"default"
。 - low_cpu_mem_usage (
bool
,optional
, defaults toFalse
) — 在 meta 设备上创建空的适配器权重。有助于加速加载过程。
返回
torch.nn.Module
Lora 模型。
从预训练的 transformers 模型创建低秩适配器 (LoRA) 模型。
该方法在 https://arxiv.org/abs/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
< source >( 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
combination_type 时,结果适配器的秩等于所有适配器秩的总和(混合适配器可能过大并导致 OOM 错误)。 - svd_rank (
int
, optional) — 用于 SVD 的输出适配器的秩。如果未提供,将使用合并适配器的最大秩。 - svd_clamp (
float
, optional) — 用于钳制 SVD 分解输出的分位数阈值。 如果未提供,则不执行钳制。 默认为 None。 - svd_full_matrices (
bool
, optional) — 控制是否计算完整或简化的 SVD,以及因此返回张量 U 和 Vh 的形状。 默认为 True。 - svd_driver (
str
, optional) — 要使用的 cuSOLVER 方法的名称。 此关键字参数仅在 CUDA 上合并时有效。 可以是 [None,gesvd
,gesvdj
,gesvda
] 之一。 有关更多信息,请参阅torch.linalg.svd
文档。 默认为 None。 - density (
float
, optional) — 介于 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
combination_type 时,您应该注意,结果适配器的秩将等于所有适配器秩的总和。 因此,混合适配器可能变得太大并导致 OOM 错误。
删除现有适配器。
merge_and_unload
< source >( 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
< source >( adapter_name: str | list[str] )
设置活动适配器。
此外,此函数会将指定的适配器设置为可训练(即,requires_grad=True)。 如果不希望这样做,请使用以下代码。
subtract_mutated_init
< source >( 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
< source >( 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
。由于这是一个贪婪优化,因此多次调用此函数可能会产生增量改进。
替换使用 bitsandbytes 量化的模型的 LoRA 权重,使用 LoftQ 技术。
替换是通过从本地存储的 safetensors 模型文件中加载非量化权重,并初始化 LoRA 权重以使原始权重和量化权重之间的量化误差最小化来动态完成的。
由于 pickle 不支持延迟加载,因此不支持正常的 PyTorch 检查点文件。
根据模型大小,调用此函数可能需要一些时间才能完成。
Eva
EvaConfig
class peft.EvaConfig
< source >( 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
< source >( model: Module dataloader: typing.Optional[typing.Iterable] = None eva_state_dict: typing.Optional[dict] = None forward_fn: typing.Optional[<built-in function callable>] = <function forward_fn_dict at 0x7f4b4c0636d0> prepare_model_inputs_fn: typing.Optional[<built-in function callable>] = <function prepare_model_inputs_fn_language_modeling at 0x7f4b4c0635b0> prepare_layer_inputs_fn: typing.Union[<built-in function callable>, typing.Dict[str, <built-in function callable>], NoneType] = <function prepare_layer_inputs_fn_language_modeling at 0x7f4b4c063640> 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,则需要提供数据加载器,并且 state_dict 将使用
get_eva_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) — 是否从所有 rank 收集层输入。默认值为 True,表示在分布式设置中,层输入将从所有 rank 收集以进行 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
< source >( model: Module dataloader: typing.Iterable peft_config: typing.Optional[peft.tuners.lora.config.LoraConfig] = None forward_fn: typing.Optional[<built-in function callable>] = <function forward_fn_dict at 0x7f4b4c0636d0> prepare_model_inputs_fn: typing.Optional[<built-in function callable>] = <function prepare_model_inputs_fn_language_modeling at 0x7f4b4c0635b0> prepare_layer_inputs_fn: typing.Union[<built-in function callable>, typing.Dict[str, <built-in function callable>], NoneType] = <function prepare_layer_inputs_fn_language_modeling at 0x7f4b4c063640> 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 计算的输入。例如,对于语言建模,注意力掩码用于确定哪些索引是填充标记,不应用于 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) — 用于计算 SVD 的适配器名称。
- gather_distributed_inputs (bool) — 是否从所有 rank 收集层输入。默认为 True,表示在分布式设置中,层输入将从所有 rank 收集以进行 SVD 计算。对于非分布式设置,此参数将被忽略。如果在分布式设置中使用非分布式数据加载器,请设置为 False。
- show_progress_bar (bool) — 是否显示进度条。默认为 True。
返回
eva_state_dict (dict)
包含每个层的 SVD 组件的状态字典。
计算模型中每个层的 SVD。
此函数计算模型中每个层的奇异值分解 (SVD)。它使用增量 PCA 方法来计算 SVD 组件。该函数还使用余弦相似度检查计算出的组件的收敛性。每个层的秩分布是根据解释方差比率确定的。