PEFT 文档

通过 Householder 反射适配 (HRA) 弥合低秩适配和正交适配之间的差距

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

通过 Householder 反射适配 (HRA) 弥合低秩适配和正交适配之间的差距

HRA 是一种简单而有效的基于适配器的微调方法,它利用了 Householder 反射。该方法兼具两种策略的优点,减少了参数和计算成本,同时惩罚了预训练知识的损失。它始终以更少的可训练参数实现更好的性能,并在包括大型语言模型 (LLM) 和条件图像生成器在内的不同模型中优于最先进的适配器。

论文摘要如下:

虽然低秩适配和正交适配技术遵循不同的技术路线,但它们都可以基于少量可训练参数有效地适配特定任务或领域中的大规模预训练模型。在本研究中,我们弥合了这两种技术之间的差距,提出了一种基于 Householder 反射的简单而有效的适配方法。给定一个预训练模型,我们的方法通过将每个冻结的权重矩阵与由一系列可学习的 Householder 反射 (HR) 构建的正交矩阵相乘来微调其层。这种基于 HR 的正交微调等效于自适应低秩适配。此外,我们表明,与 HR 对应的反射面的正交性会影响模型的容量和规则性。该分析促使我们规范化 HR 的正交性,从而产生了所提出的 Householder 反射适配 (HRA) 方法的不同实现。与最先进的方法相比,HRA 在适配大型语言模型和条件图像生成器时,以更少的可学习参数实现了卓越的性能。代码可在 peftHRA 获取。

HRAConfig

class peft.HRAConfig

< >

( 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 = 8 apply_GS: bool = False target_modules: Optional[Union[list[str], str]] = None exclude_modules: Optional[Union[list[str], str]] = None init_weights: bool = True layers_to_transform: Optional[Union[list[int], int]] = None layers_pattern: Optional[Union[list[str], str]] = None bias: str = 'none' modules_to_save: Optional[list[str]] = None )

参数

  • r (int) — HRA 在不同层中的秩。最好将“r”设置为偶数;否则,默认初始化方法将无法工作。
  • apply_GS (bool) — 是否应用 Gram-Schmidt 正交化。
  • target_modules (Optional[Union[List[str], str]]) — 要应用适配器的模块名称。如果指定此项,则仅替换具有指定名称的模块。当传递字符串时,将执行正则表达式匹配。当传递字符串列表时,将执行完全匹配,或者检查模块名称是否以任何传递的字符串结尾。如果将其指定为“all-linear”,则将选择所有线性模块,但不包括输出层。如果未指定此项,则将根据模型架构选择模块。如果架构未知,则会引发错误 - 在这种情况下,您应手动指定目标模块。
  • exclude_modules (Optional[Union[List[str], str]]) — 不应用适配器的模块名称。当传递字符串时,将执行正则表达式匹配。当传递字符串列表时,将执行完全匹配,或者检查模块名称是否以任何传递的字符串结尾。
  • init_weights (bool) — 是否执行 HRA 权重初始化。
  • layers_to_transform (Union[List[int], int]) — 要转换的层索引。如果传递整数列表,它会将适配器应用于此列表中指定的层索引。如果传递单个整数,它将在此索引处的层上应用转换。
  • layers_pattern (Optional[Union[List[str], str]]) — 层模式名称,仅当 layers_to_transformNone 不同时使用。这应以模型的 nn.ModuleList 为目标,后者通常称为 'layers''h'
  • modules_to_save (List[str]) — 除了适配器层之外,要设置为可训练并在最终检查点中保存的模块列表。

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

HRAModel

class peft.HRAModel

< >

( model peft_config: Union[PeftConfig, dict[str, PeftConfig]] adapter_name: str low_cpu_mem_usage: bool = False ) torch.nn.Module

参数

  • model (torch.nn.Module) — 适配器调谐器层将附加到的模型。
  • config (HRAConfig) — HRA 模型的配置。
  • adapter_name (str) — 适配器的名称,默认为 "default"
  • low_cpu_mem_usage (bool, optional, 默认为 False) — 在 meta 设备上创建空的适配器权重。有助于加速加载过程。

返回:

torch.nn.Module

HRA 模型。

从预训练模型创建 Householder 反射适配 (HRA) 模型。该方法在 https://arxiv.org/abs/2405.17484 中描述。

示例

>>> from diffusers import StableDiffusionPipeline
>>> from peft import HRAModel, HRAConfig

>>> config_te = HRAConfig(
...     r=8,
...     target_modules=["k_proj", "q_proj", "v_proj", "out_proj", "fc1", "fc2"],
...     init_weights=True,
... )
>>> config_unet = HRAConfig(
...     r=8,
...     target_modules=[
...         "proj_in",
...         "proj_out",
...         "to_k",
...         "to_q",
...         "to_v",
...         "to_out.0",
...         "ff.net.0.proj",
...         "ff.net.2",
...     ],
...     init_weights=True,
... )

>>> model = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
>>> model.text_encoder = HRAModel(model.text_encoder, config_te, "default")
>>> model.unet = HRAModel(model.unet, config_unet, "default")

属性:

  • model (~torch.nn.Module) — 要适配的模型。
  • peft_config (HRAConfig): HRA 模型的配置。

delete_adapter

< >

( adapter_name: str )

参数

  • adapter_name (str) — 要删除的适配器的名称。

删除现有适配器。

merge_and_unload

< >

( progressbar: bool = False safe_merge: bool = False adapter_names: typing.Optional[typing.List[str]] = None )

参数

  • progressbar (bool) — 是否显示进度条以指示卸载和合并过程
  • safe_merge (bool) — 是否激活安全合并检查以检查适配器权重中是否存在任何潜在的 Nan 值
  • adapter_names (List[str], optional) — 应该合并的适配器名称列表。如果为 None,则将合并所有活动适配器。默认为 None

此方法将 HRA 层合并到基础模型中。如果有人想将基础模型用作独立模型,则需要这样做。

unload

< >

( )

通过移除所有 hra 模块而不合并,返回基础模型。这会返回原始的基础模型。

< > GitHub 上更新