PEFT 文档

BOFT

Hugging Face's logo
加入 Hugging Face 社区

获得增强文档体验的访问权限

开始使用

BOFT

正交蝶形(BOFT)是一种通用方法,专为微调基础模型而设计。它通过借鉴库利-图基快速傅里叶变换,提高了微调范例——正交微调(OFT)的参数效率,对微调不同基础模型(包括大型视觉转换器、大型语言模型和文本到图像扩散模型)显示出良好的结果。

论文摘要如下

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

BOFTConfig

class peft.BOFTConfig

< >

(peft_type: 联合 = 无 auto_mapping: 可选 = 无 base_model_name_or_path: 可选 = 无 revision: 可选 = 无 task_type: 联合 = 无 inference_mode: 布尔 = 否 boft_block_size: int = 4 boft_block_num: int = 0 boft_n_butterfly_factor: int = 1 target_modules: 联合 = 无 boft_dropout: 浮动 = 0.0 fan_in_fan_out: 布尔 = 否 bias: 字符串 = '无' modules_to_save: 可选 = 无 init_weights: 布尔 = 是 layers_to_transform: 联合 = 无 layers_pattern: 可选 = 无 )

参数

  • boft_block_size (int) — 不同层之间 BOFT 块大小。
  • boft_block_num (int) — 每个注入层中 BOFT 块数量。
  • target_modules (Union[List[str],str]) — 要应用适配器的模块的名称。
  • boft_dropout (float) — BOFT 层的乘法 dropout 概率。
  • fan_in_fan_out (bool) — 将此设置为 True,如果要替换的层存储像 (fan_in, fan_out) 的权重。例如,gpt-2 使用 Conv1D 来存储像 (fan_in, fan_out) 这样的权重,因此应将其设置为 True
  • bias (str) — BOFT 的偏差类型。可以是“无”、“全部”或“仅 BOFT”。如果是“全部”或“仅 BOFT”,则相应的偏差将在训练期间更新。请注意,这意味着,即使禁用适配器,模型也不会产生与基础模型在没有适配的情况下相同的输出。
  • modules_to_save (List[str]) —除 BOFT 层之外的模块列表,这些模块将设置为可训练并在最终检查点中保存。
  • layers_to_transform (Union[List[int],int]) —要转换的层索引,如果指定此参数,它将对在此列表中指定的层索引应用 BOFT 转换。如果传递单个整数,它将在该索引处的层上应用 BOFT 转换。

BOFTModel

peft.BOFTModel

< >

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

参数

  • model ([transformers.PreTrainedModel]) — 要被适配的模型。
  • config ([BOFTConfig]) — BOFT 模型的配置。
  • low_cpu_mem_usage (bool, optional, defaults to False) — 在元设备上创建空适配器权重。有助于加快加载过程。

返回

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: 否 = False safe_merge: 否 = False adapter_names: 可选 = None )

参数

卸载所有 boft 模块,且不合并,即可让基础模型恢复原状。

< > 在 GitHub 上更新