PEFT 文档
VeRA:基于向量的随机矩阵自适应
并获得增强的文档体验
开始使用
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 伪随机数生成器初始化密钥。用于为新模型初始化 vera_A 和 vera_B,或加载未包含这些投影的检查点时使用。默认为 `0`。 - save_projection (
bool
) — 是否在状态字典中与每层的 lambda_b / lambda_d 权重一起保存 vera_A / vera_B 投影。这将增加检查点的大小,但保证我们可以在所有系统配置上重新加载检查点。默认为 `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 的偏置类型。可以是 ‘none’、‘all’ 或 ‘vera_only’。如果为 ‘all’ 或 ‘vera_only’,相应的偏置将在训练期间更新。请注意,这意味着即使禁用适配器,模型的输出也与未经适配的基础模型不同。 - 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_transform` 不为 `None` 时使用。这应该针对模型的 `nn.ModuleList`,通常称为 `'layers'` 或 `'h'`。
这是用于存储 VeraModel 配置的配置类。
VeRAModel
class peft.VeraModel
< 源文件 >( 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 (
PreTrainedModel
) — 要被适配的模型。 - config (VeraConfig) — Vera 模型的配置。
- adapter_name (
str
) — 适配器的名称,默认为 `"default"`。 - low_cpu_mem_usage (
bool
,可选
, 默认为 `False`) — 在元设备上创建空的适配器权重。有助于加快加载过程。
返回
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)
属性:
- model (
PreTrainedModel
) — 需要被适配的模型。 - peft_config (VeraConfig): Vera 模型的配置。
删除一个现有的适配器。
merge_and_unload
< 源文件 >( progressbar: bool = False safe_merge: bool = False adapter_names: Optional[list[str]] = 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()
通过移除所有 Vera 模块但不进行合并来恢复基础模型。这将返回原始的基础模型。