PEFT 文档

OFT

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

OFT

正交微调(OFT)是一种为适应文本到图像扩散模型而开发的方法。它通过用其正交矩阵重新参数化预训练的权重矩阵来工作,以保留预训练模型中的信息。为了减少参数数量,OFT在正交矩阵中引入了块对角结构。

论文摘要如下:

大型文本到图像扩散模型在从文本提示生成逼真图像方面具有令人印象深刻的能力。如何有效地引导或控制这些强大的模型以执行不同的下游任务成为一个重要的开放问题。为了应对这一挑战,我们引入了一种有原则的微调方法——正交微调(OFT),用于使文本到图像扩散模型适应下游任务。与现有方法不同,OFT可以可证明地保留超球面能量,该能量表征了单位超球面上神经元对之间的关系。我们发现这一特性对于保留文本到图像扩散模型的语义生成能力至关重要。为了提高微调的稳定性,我们进一步提出了约束正交微调(COFT),它对超球面施加了额外的半径约束。具体来说,我们考虑了两个重要的文本到图像微调任务:主题驱动生成,其目标是给定一个主题的几张图像和文本提示,生成特定主题的图像;以及可控生成,其目标是使模型能够接收额外的控制信号。我们通过实验表明,我们的OFT框架在生成质量和收敛速度方面优于现有方法。.

OFTConfig

class peft.OFTConfig

< >

( 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 = 0 oft_block_size: int = 32 module_dropout: float = 0.0 target_modules: Optional[Union[list[str], str]] = None fan_in_fan_out: bool = False bias: Literal['none', 'all', 'oft_only'] = '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 modules_to_save: Optional[list[str]] = None coft: bool = False eps: float = 6e-05 block_share: bool = False use_cayley_neumann: bool = True num_cayley_neumann_terms: int = 5 )

参数

  • r (int) — OFT 秩,每个注入层的 OFT 块数。
  • oft_block_size (int) — 不同层间的 OFT 块大小。
  • module_dropout (float) — 乘法 dropout 概率,通过在训练期间将 OFT 块设置为单位矩阵,类似于 LoRA 中的 dropout 层。
  • target_modules (Optional[Union[list[str], str]]) — 应用适配器的模块名称。如果指定了此项,则仅替换具有指定名称的模块。传递字符串时,将执行正则表达式匹配。传递字符串列表时,将执行精确匹配,或者检查模块名称是否以任何传递的字符串结尾。如果指定为“all-linear”,则选择所有线性模块,不包括输出层。如果未指定,将根据模型架构选择模块。如果架构未知,将引发错误——在这种情况下,您应该手动指定目标模块。
  • fan_in_fan_out (bool) — 如果要替换的层存储权重的方式是 (fan_in, fan_out),则设置为 True。
  • bias (str) — OFT 的偏置类型。可以是 'none'、'all' 或 'oft_only'。如果为 'all' 或 'oft_only',相应的偏置将在训练期间更新。请注意,这意味着即使在禁用适配器时,模型也不会产生与未经适配的基础模型相同的输出。
  • exclude_modules (Optional[Union[List[str], str]]) — 不应用适配器的模块名称。传递字符串时,将执行正则表达式匹配。传递字符串列表时,将执行精确匹配,或者检查模块名称是否以任何传递的字符串结尾。
  • init_weights (bool) — 是否执行 OFT 权重的初始化。
  • layers_to_transform (Union[List[int], int]) — 要转换的层索引。如果传递一个整数列表,它将把适配器应用于此列表中指定的层索引。如果传递单个整数,它将对该索引处的层应用转换。
  • layers_pattern (Optional[Union[List[str], str]]) — 层模式名称,仅在 `layers_to_transform` 不为 `None` 时使用。这应该针对模型的 `nn.ModuleList`,通常称为 `'layers'` 或 `'h'`。
  • modules_to_save (List[str]) — 除了适配器层之外,设置为可训练并保存在最终检查点中的模块列表。
  • coft (bool) — 是否使用 OFT 的约束变体,默认为关闭。
  • eps (float) — COFT 的控制强度。旋转的自由度。仅在 `coft` 设置为 True 时有效。
  • block_share (bool) — 是否在块之间共享 OFT 参数。默认为 `False`。

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

check_kwargs

< >

( **kwargs )

参数

  • kwargs (附加关键字参数,可选) — 传递给子类初始化的附加关键字参数。

检查 kwargs 是否对配置有效。

OFTModel

class peft.OFTModel

< >

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

参数

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

返回

torch.nn.Module

OFT 模型。

从预训练模型创建正交微调模型。该方法在 https://huggingface.ac.cn/papers/2306.07280 中有描述。

示例

>>> from diffusers import StableDiffusionPipeline
>>> from peft import OFTModel, OFTConfig

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

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

属性:

  • model (~torch.nn.Module) — 将要被适配的模型。
  • peft_config (OFTConfig): OFT 模型的配置。

delete_adapter

< >

( adapter_name: str )

参数

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

删除一个现有的适配器。

enable_adapter_layers

< >

( )

启用所有适配器。

如果您之前禁用了所有适配器并希望重新启用它们,请调用此函数。

merge_and_unload

< >

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

参数

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

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

set_adapter

< >

( adapter_name )

参数

  • adapter_name (str or list[str]) — 要激活的适配器名称。

设置活动的适配器。

此外,此函数将把指定的适配器设置为可训练的(即 requires_grad=True)。如果不希望如此,请使用以下代码。

>>> for name, param in model_peft.named_parameters():
...     if ...:  # some check on name (ex. if 'lora' in name)
...         param.requires_grad = False

unload

< >

( )

通过移除所有 oft 模块而不合并,恢复基础模型。这将返回原始的基础模型。

< > 在 GitHub 上更新