PEFT 文档

BOFT

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

BOFT

正交蝴蝶 (BOFT) 是一种为微调基础模型而设计的通用方法。它通过借鉴 Cooley-Tukey 快速傅里叶变换,改进了微调范式的参数效率——正交微调 (OFT),并在微调不同的基础模型(包括大型视觉 Transformer 模型、大型语言模型和文本到图像扩散模型)中显示出良好的结果。

论文摘要如下:

大型基础模型正变得无处不在,但从头开始训练它们非常昂贵。因此,高效地将这些强大的模型适配到下游任务变得越来越重要。在本文中,我们研究了一种有原则的微调范式——正交微调 (OFT)——用于下游任务适配。尽管 OFT 展示了良好的泛化能力,但由于正交矩阵的高维度,它仍然使用了相当多的可训练参数。为了解决这个问题,我们首先从信息传输的角度检查 OFT,然后确定了一些能够实现更好参数效率的关键要素。受到 Cooley-Tukey 快速傅里叶变换算法如何实现高效信息传输的启发,我们提出了一种使用蝴蝶结构的高效正交参数化方法。我们将这种参数化应用于 OFT,创建了一种新型的参数高效微调方法,称为正交蝴蝶 (BOFT)。通过将 OFT 作为一种特殊情况包含在内,BOFT 引入了一个广义的正交微调框架。最后,我们对大型视觉 Transformer 模型、大型语言模型和文本到图像扩散模型在视觉和语言的各种下游任务中的适配进行了广泛的实证研究.

BOFTConfig

class peft.BOFTConfig

< >

( 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 boft_block_size: int = 4 boft_block_num: int = 0 boft_n_butterfly_factor: int = 1 target_modules: Optional[Union[list[str], str]] = None exclude_modules: Optional[Union[list[str], str]] = None boft_dropout: float = 0.0 fan_in_fan_out: bool = False bias: str = 'none' modules_to_save: Optional[list[str]] = None init_weights: bool = True layers_to_transform: Optional[Union[list[int], int]] = None layers_pattern: Optional[Union[list[str], str]] = None )

参数

  • boft_block_size (int) — 跨不同层的 BOFT 块大小。
  • boft_block_num (int) — 每个注入层的 BOFT 块数量。
  • boft_n_butterfly_factor (int) — 跨不同层的蝴蝶因子数量。
  • target_modules (Union[List[str],str]) — 应用适配器的模块名称。
  • exclude_modules (Optional[Union[List[str], str]]) — 不应用适配器的模块名称。当传递字符串时,将执行正则表达式匹配。当传递字符串列表时,将执行精确匹配,或者检查模块名称是否以任何传递的字符串结尾。
  • boft_dropout (float) — 乘法 dropout 概率,通过在训练期间将 OFT 块设置为恒等,类似于 LoRA 中的 dropout 层。
  • fan_in_fan_out (bool) — 如果要替换的层以 (fan_in, fan_out) 的形式存储权重,则设置为 True。例如,gpt-2 使用 Conv1D,它以 (fan_in, fan_out) 的形式存储权重,因此应将其设置为 True
  • bias (str) — BOFT 的 bias 类型。可以是 ‘none’、‘all’ 或 ‘boft_only’。如果为 ‘all’ 或 ‘boft_only’,则将在训练期间更新相应的 bias。请注意,这意味着即使禁用适配器,模型也不会产生与未进行适配的基础模型相同的输出。
  • modules_to_save (List[str]) — 除了 BOFT 层之外,要设置为可训练并在最终检查点中保存的模块列表。
  • layers_to_transform (Union[List[int],int]) — 要转换的层索引,如果指定此参数,它将对该列表中指定的层索引应用 BOFT 转换。如果传递单个整数,它将对该索引处的层应用 BOFT 转换。
  • layers_pattern (Optional[Union[List[str], str]]) — 层模式名称,仅当 layers_to_transformNone 不同且层模式不在常用层模式中时使用。这应指向模型的 nn.ModuleList,通常称为 'layers''h'

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

BOFTModel

class peft.BOFTModel

< >

( model config adapter_name low_cpu_mem_usage: bool = False ) torch.nn.Module

参数

  • model ([transformers.PreTrainedModel]) — 要适配的模型。
  • config ([BOFTConfig]) — BOFT 模型的配置。
  • adapter_name (str) — 适配器的名称,默认为 “default”
  • low_cpu_mem_usage (bool, optional, 默认为 False) — 在 meta 设备上创建空的适配器权重。有助于加速加载过程。

返回

torch.nn.Module

BOFT 模型。

从预训练的 transformers 模型创建 BOFT 和 OFT 模型。论文:https://arxiv.org/abs/2311.06243 https://arxiv.org/abs/2306.07280

示例

>>> import transformers >>> from transformers import AutoModelForSeq2SeqLM, BOFTConfig >>> from peft import
BOFTConfig, get_peft_model

>>> config = BOFTConfig( ... boft_block_size=8, ... boft_n_butterfly_factor=1, ... target_modules=["query",
"value", "key", "output.dense", "mlp.fc1", "mlp.fc2"], ... boft_dropout=0.1, ... bias="boft_only", ...
modules_to_save=["classifier"], ... )

>>> model = transformers.Dinov2ForImageClassification.from_pretrained( ... "facebook/dinov2-large", ...
num_labels=100, ... ) >>> boft_model = get_peft_model(model, config)

属性:

  • model ([transformers.PreTrainedModel]) — 要适配的模型。
  • peft_config ([BOFTConfig]): BOFT 模型的配置。

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

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

unload

< >

( )

通过移除所有 boft 模块但不合并,返回基础模型。这将返回原始的基础模型。

< > 在 GitHub 上更新