PEFT documentation
稀疏高秩适配器
稀疏高秩适配器
稀疏高秩适配器,即 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
< 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 = 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
< source >( 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)属性:
- model (PreTrainedModel) — 要适配的模型。
- peft_config (ShiraConfig): SHiRA 模型的配置。