PEFT documentation
FRoD:具有旋转自由度的全秩高效微调
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
< source >( 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 配置的类。
FrodModel
class peft.FrodModel
< source >( modelpeft_config: Union[PeftConfig, dict[str, PeftConfig]]adapter_name: strlow_cpu_mem_usage: bool = Falsestate_dict: Optional[dict[str, torch.Tensor]] = None )