PEFT documentation

FRoD:具有旋转自由度的全秩高效微调

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.21.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

FRoD:具有旋转自由度的全秩高效微调

FRoD 是一种参数高效微调方法,它将共享的全秩基与稀疏可学习的旋转自由度相结合。适配器更新通过固定的投影张量和可训练的系数来表示,这使得 FRoD 能够在保持训练参数数量较小的同时应用全秩更新。

论文:具有旋转自由度的全秩高效微调。

在保存适配器参数时,可以通过在 FrodConfig 中设置 save_projection=False 来避免存储投影张量。在这种情况下,投影将从基础模型权重以及 projection_prng_key 中的固定随机种子中恢复。这可以减小检查点的大小,但默认值为 save_projection=True,以确保检查点的加载独立于重新生成的细节。

与 LoRA 相比,FRoD 可以在每个适配的线性层中表达满秩更新,同时仅训练对角系数和一组稀疏的非对角旋转系数。当低秩更新过于受限时,这一点可能很有用。其权衡在于,FRoD 在适配器注入期间从基础权重计算固定的投影张量,这使得设置成本更高,且其实现的广泛支持程度不如 LoRA。

在大模型上,投影初始化可能较慢,因为 FRoD 在注入适配器之前,会针对目标模块类别执行矩阵分解。默认情况下会显示进度条,可通过 FrodConfig(progressbar=False) 将其禁用。

对于内存受限的训练,runtime_offload_base_weight=True 会在当前激活的 FRoD 路径不需要目标基础权重时,将其保留在 CPU 上。由于 PEFT 方法通常在将模型移至加速器以及执行前向传播后,会将所有基础参数保留在加速器上,因此该选项需要显式启用。

FRoD 目前存在以下约束:

  • 仅支持 nn.Linear 和 transformers.pytorch_utils.Conv1D 层。

快速入门

from transformers import AutoModelForSequenceClassification

from peft import FrodConfig, TaskType, get_peft_model

model = AutoModelForSequenceClassification.from_pretrained("google-bert/bert-base-uncased", num_labels=2)

peft_config = FrodConfig(
    task_type=TaskType.SEQ_CLS,
    target_modules=["query", "value"],
    modules_to_save=["classifier"],
    sparse_rate=0.02,
    frod_dropout=0.0,
    runtime_offload_base_weight=True,
)

model = get_peft_model(model, peft_config)
model.print_healthcheck()

FrodConfig

类 peft.FrodConfig

< >

( task_type: Optional[Union[str, TaskType]] = Nonepeft_type: Optional[Union[str, PeftType]] = Noneauto_mapping: Optional[dict] = Nonepeft_version: Optional[str] = Nonebase_model_name_or_path: Optional[str] = Nonerevision: Optional[str] = Noneinference_mode: bool = Falsetarget_modules: Optional[Union[list[str], str]] = Noneprojection_prng_key: int = 0save_projection: bool = Truefrod_dropout: float = 0.0fan_in_fan_out: bool = Falsebias: str = 'none'modules_to_save: Optional[list[str]] = Noneinit_weights: bool = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = Nonesparse_rate: float = 0.01regularization_alpha: float = 0.001progressbar: bool = Trueruntime_offload_base_weight: bool = False )

参数

  • target_modules (Union[List[str], str]) — 要应用 FRoD 的模块名称。仅支持线性层。
  • projection_prng_key (int) — 用于初始化稀疏 FRoD COO 模式的随机种子。
  • save_projection (bool) — 是否在状态字典中保存 FRoD 投影张量。这会增加检查点的大小,但使适配器重新加载不再依赖于本地缓存的重新生成。默认为 True。
  • frod_dropout (float) — FRoD 层的 dropout 概率。
  • fan_in_fan_out (bool) — 如果待替换的层以 (fan_in, fan_out) 的形式存储权重,请将此项设置为 True。例如,gpt-2 使用的 Conv1D 以 (fan_in, fan_out) 的形式存储权重,因此应将其设置为 True。
  • bias (str) — FRoD 的偏置类型。可以是 ‘none’、‘all’ 或 ‘frod_only’。如果设置为 ‘all’ 或 ‘frod_only’,对应的偏置将在训练期间被更新。请注意,这意味着即使禁用了适配器,模型的输出也不会与未进行适配的基础模型相同。
  • modules_to_save (List[str]) — 除 FRoD 层外,需要设置为可训练并在最终检查点中保存的模块列表。
  • init_weights (bool) — 是否使用默认初始化方式初始化 FRoD 层的权重。除非您完全清楚自己在做什么,否则请勿更改此设置。
  • layers_to_transform (Union[List[int],int]) — 要转换的层索引。如果指定了此参数,将对该列表中指定的层索引应用 FRoD 转换。如果传入单个整数,则对该索引处的层应用 FRoD 转换。
  • layers_pattern (Optional[Union[List[str], str]]) — 层模式名称,仅在 layers_to_transform 不同于 None 时使用。它应指向模型的 nn.ModuleList,该列表通常命名为 'layers' 或 'h'。
  • sparse_rate (float) — 稀疏可训练旋转矩阵中非对角线元素的比例。较高的值会增加容量和可训练参数;较低的值成本更低。默认值为 0.01。
  • regularization_alpha (float) — 用于从基础权重构建共享基时的小正数。当同一类别中的层具有相关权重时,它可稳定矩阵求逆。默认值为 1e-3。
  • progressbar (bool) — 是否在构建 FRoD 投影时显示进度条。由于投影初始化会在目标模块类别上运行矩阵分解,因此在大型模型上可能较慢。默认为 True。
  • runtime_offload_base_weight (bool) — 当活动的 FRoD 路径不需要目标基础权重时,是否将其保留在 CPU 上。由于 FRoD 会直接重建适配后的权重,这可以减少 GPU 内存占用,但它改变了 PEFT 的常规约定,即模型移动或执行前向传播后所有基础参数都保留在加速器上。默认为 False。

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

论文:https://doi.org/10.1609/aaai.v40i31.39813。

FrodModel

class peft.FrodModel

< >

( modelpeft_config: Union[PeftConfig, dict[str, PeftConfig]]adapter_name: strlow_cpu_mem_usage: bool = Falsestate_dict: Optional[dict[str, torch.Tensor]] = None )

Update on GitHub