PEFT documentation

稀疏高秩适配器

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

稀疏高秩适配器

稀疏高秩适配器,即 SHiRA,是一种替代类型的适配器,相较于低秩适配器具有显著优势。具体而言,SHiRA 在多种视觉和语言任务上实现了比 LoRA 更高的准确率。此外,通过大幅减少概念丢失这一低秩适配器常见的难题,SHiRA 提供了更简单且质量更高的多适配器融合方案。SHiRA 直接微调基础模型中少量参数,从而在任意适配任务上对模型进行微调。

SHiRA 目前存在以下限制:

  • 仅支持 nn.Linear 层。

该论文的摘要如下:

低秩适应(LoRA)在近期的生成式 AI 研究中获得了巨大的关注。LoRA 的主要优势之一在于它能够与预训练模型融合,从而在推理阶段不引入任何额外开销。然而,从移动设备部署的角度来看,我们要么选择在融合模式下避免推理开销,但因此失去快速切换适配器的能力;要么选择在未融合模式下实现快速切换,但需承受显著的(最高可达 30% 的)推理延迟增加。此外,当多个适配器同时使用时,LoRA 还会出现概念丢失(concept-loss)现象。在本文中,我们提出了稀疏高秩适配器(SHiRA),这是一种新范式,它不仅不产生推理开销,还支持快速切换,并显著减少了概念丢失。具体而言,SHiRA 可以通过仅直接调整基础模型 1-2% 的权重,同时保持其他权重不变来进行训练。这产生了一个高度稀疏的适配器,可以直接在融合模式下进行切换。我们进一步从理论和实证角度提供了见解,说明 SHiRA 中的高稀疏性如何通过减少概念丢失来辅助多适配器融合。我们在大型视觉模型(LVMs)和大型语言模型(LLMs)上进行的广泛实验表明,仅微调基础模型中一小部分参数,其性能显著优于 LoRA,同时支持快速切换和多适配器融合。最后,我们提供了一个基于参数高效微调(PEFT)库的、在延迟和内存方面均高效的 SHiRA 实现。该实现以与 LoRA 几乎相同的速度进行训练,同时将峰值 GPU 内存消耗降低最多 16%,从而使 SHiRA 易于在实际用例中采用。为了展示推理期间快速切换的优势,我们表明,在 CPU 上,将 SHiRA 加载到基础模型上的速度比 LoRA 融合快 5 到 16 倍。

基准测试概览

API

ShiraConfig

类 peft.ShiraConfig

< >

( 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 = Falser: int = 32mask_type: Literal['random'] = 'random'random_seed: Optional[int] = Nonetarget_modules: Optional[Union[list[str], str]] = Nonefan_in_fan_out: bool = Falseinit_weights: bool = Truemodules_to_save: Optional[list[str]] = None )

参数

  • r (int, 可选,默认为 32) — 对于给定的目标模块,SHiRA 参数的数量计算为 r(m+n),其中原始张量的维度为 m x n。这意味着 SHiRA 参数的数量与 LoRA 适配器相同。SHiRA 是一种高秩适配器。设置此 r 参数并不会将秩限制为该值。
  • mask_type (str,默认为 random) — 掩码函数的类型。默认为随机稀疏掩码。也可以通过实例化 config = ShiraConfig(...) 并设置 config.mask_fn = <your custom mask function> 来提供可选的用户自定义 mask_fn 以计算掩码值。对于形状为 m x n 的预训练权重,自定义掩码函数必须仅返回一个掩码(形状:m x n),该掩码必须是二值的 0 或 1,且对于线性层,num_shira_parameters = r(m + n)。掩码的 Device 和 dtype 必须与基础层权重的 device 和 dtype 相同。有关更多详细信息以及默认随机稀疏掩码的实现,请参阅 mask_functions.py。
  • random_seed (int,可选,默认为 None) — 用于 random_mask 的 torch 生成器的随机种子。
  • target_modules (Union[List[str], str]) — 要替换为 SHiRA 的模块名称列表或模块名称的正则表达式。例如,[‘q’, ‘v’] 或 ‘.decoder.(SelfAttention|EncDecAttention).*(q|v)$‘。仅支持线性层。
  • fan_in_fan_out (bool) — 如果待替换的层以 (fan_in, fan_out) 的形式存储权重,请将此项设置为 True。例如,gpt-2 使用的 Conv1D 以 (fan_in, fan_out) 的形式存储权重,因此应将其设置为 True。
  • init_weights (bool, 默认为 True) — 将 SHiRA 权重初始化为零值。如果设置为 False,则 SHiRA 权重将被初始化为 randn 值而非零值,此设置仅用于测试。
  • modules_to_save (List[str]) — 除 SHiRA 层外,需要设置为可训练并在最终检查点中保存的模块列表。

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

ShiraModel

类 peft.ShiraModel

< >

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

参数

  • model (PreTrainedModel) — 要适配的模型。
  • config (ShiraConfig) — SHiRA 模型的配置。
  • adapter_name (str) — 适配器的名称,默认为 "default"。

返回值

torch.nn.Module

SHiRA 模型。

从预训练模型创建一个稀疏高秩适配器(SHiRA)模型。

示例:

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

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

属性:

Update on GitHub