PEFT 文档

VeRA:基于向量的随机矩阵适配

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

VeRA:基于向量的随机矩阵适配

VeRA 是一种参数高效的微调技术,类似于 LoRA,但需要更少的额外参数,同时承诺相似甚至更好的性能。 因此,当参数预算非常有限时,例如扩展到非常大的模型时,它特别有用。 可训练参数数量的减少是通过跨所有层共享相同的低秩矩阵,并且每层仅训练两个额外的向量来实现的。

在保存适配器参数时,可以通过在 VeraConfig 上设置 save_projection=False 来避免存储低秩矩阵。 在这种情况下,这些矩阵将根据 projection_prng_key 参数中的固定随机种子进行恢复。 这减少了检查点的大小,但我们无法保证在所有设备上以及 PyTorch 的所有未来版本中都具有可重复性。 如果您想确保可重复性,请设置 save_projection=True(这是默认设置)。

为了处理不同形状的适配层,VeRA 使用每个维度所需的最大尺寸初始化共享的 A 和 B 矩阵。 在前向传递期间,给定层的子矩阵 A 和 B 从这些共享矩阵中切片出来,并按照论文中的描述使用。 例如,适配形状为 (100, 20) 和 (80, 50) 的两个线性层将分别创建形状为 (rank, 50) 和 (100, rank) 的 A 和 B 矩阵。 然后,为了适配形状为 (100, 20) 的层,将提取形状为 (rank, 20) 和 (100, rank) 的子矩阵 A 和 B。

VeRA 目前有以下约束

  • 仅支持 nn.Linear 层。

论文摘要如下:

低秩适配 (LoRA) 是一种流行的方法,可以减少微调大型语言模型时可训练参数的数量,但当扩展到更大的模型或部署大量按用户或按任务适配的模型时,仍然面临严峻的存储挑战。 在这项工作中,我们提出了基于向量的随机矩阵适配 (VeRA),与 LoRA 相比,它显着减少了可训练参数的数量,但保持了相同的性能。 它通过使用跨所有层共享的一对低秩矩阵并学习小的缩放向量来实现这一点。 我们在 GLUE 和 E2E 基准测试、图像分类任务中证明了其有效性,并展示了其在 7B 和 13B 语言模型的指令调优中的应用。

VeraConfig

class peft.VeraConfig

< >

( 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 = 256 target_modules: Optional[Union[list[str], str]] = None projection_prng_key: int = 0 save_projection: bool = True vera_dropout: float = 0.0 d_initial: float = 0.1 fan_in_fan_out: bool = False bias: str = 'none' modules_to_save: Optional[list[str]] = None init_weights: bool = True layers_to_transform: Optional[Union[list[int], int]] = None layers_pattern: Optional[Union[list[str], str]] = None )

参数

  • r (int, 可选,默认为 256) — VeRA 参数维度(“秩”)。 此处选择比 LoRA 秩更高的值,因为 VeRA 使用的参数远少于 LoRA(参见表 1)。
  • target_modules (Union[List[str], str]) — 要将 Vera 应用于的模块的名称。 仅支持线性层。
  • projection_prng_key (int) — Vera PRNG 初始化密钥。 用于初始化新模型的 vera_A 和 vera_B,或在加载不包含这些投影的检查点时使用。 默认为 0
  • save_projection (bool) — 是否将 vera_A / vera_B 投影与每层 lambda_b / lambda_d 权重一起保存在状态字典中。 这将增加检查点的大小,但保证我们可以在所有系统配置上重新加载检查点。 默认为 True
  • vera_dropout (float) — Vera 层的 dropout 概率。
  • d_initial (float, 可选,默认为 0.1) — 初始化 VeRA 参数时使用的 vera_lambda_d 向量的初始初始化值。 建议使用小值(<=0.1)(参见论文中的表 6c)。
  • fan_in_fan_out (bool) — 如果要替换的层存储的权重类似于 (fan_in, fan_out),则设置为 True。 例如,gpt-2 使用 Conv1D,它存储的权重类似于 (fan_in, fan_out),因此应将其设置为 True
  • bias (str) — Vera 的 bias 类型。 可以是 ‘none’、‘all’ 或 ‘vera_only’。 如果为 ‘all’ 或 ‘vera_only’,则将在训练期间更新相应的 bias。 请注意,这意味着即使禁用适配器,模型也不会产生与未进行适配的基础模型相同的输出。
  • modules_to_save (List[str]) — 除了 Vera 层之外,要设置为可训练并在最终检查点中保存的模块列表。
  • init_weights (bool) — 是否使用其默认初始化方式初始化 Vera 层的权重。除非您确切知道自己在做什么,否则请勿更改此设置。
  • layers_to_transform (Union[List[int],int]) — 要转换的层索引。如果指定此参数,它将 Vera 转换应用于此列表中指定的层索引。如果传递单个整数,它将 Vera 转换应用于此索引处的层。
  • layers_pattern (Optional[Union[List[str], str]]) — 层模式名称,仅当 layers_to_transformNone 不同时使用。这应指向模型的 nn.ModuleList,通常称为 'layers''h'

这是用于存储 VeraModel 配置的配置类。

论文: https://arxiv.org/abs/2310.11454

VeRAModel

class peft.VeraModel

< >

( model config adapter_name low_cpu_mem_usage: bool = False ) torch.nn.Module

参数

  • model (PreTrainedModel) — 要适配的模型。
  • config (VeraConfig) — Vera 模型的配置。
  • adapter_name (str) — 适配器的名称,默认为 "default"
  • low_cpu_mem_usage (bool, optional, defaults to False) — 在 meta 设备上创建空适配器权重。有助于加速加载过程。

返回值

torch.nn.Module

Vera 模型。

从预训练的 transformers 模型创建基于向量的随机矩阵适配 (Vera) 模型。

示例

>>> from transformers import AutoModelForCausalLM
>>> from peft import VeraConfig, get_peft_model

>>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
>>> config = VeraConfig(r=128)
>>> model = get_peft_model(base_model, config)

属性:

delete_adapter

< >

( adapter_name: str )

参数

  • adapter_name (str) — 要删除的适配器的名称。

删除现有适配器。

merge_and_unload

< >

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

参数

  • progressbar (bool) — 是否显示指示卸载和合并过程的进度条
  • safe_merge (bool) — 是否激活安全合并检查以检查适配器权重中是否存在任何潜在的 Nan
  • adapter_names (list[str], optional) — 应该合并的适配器名称列表。如果为 None,则将合并所有活动适配器。默认为 None

此方法将 Vera 层合并到基础模型中。如果有人想将基础模型用作独立模型,则需要这样做。

示例

>>> 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()

unload

< >

( )

通过删除所有 Vera 模块而不进行合并,返回基础模型。这将返回原始基础模型。

< > 更新 在 GitHub 上