PEFT 文档

IA3

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

IA3

“通过抑制和放大内部激活来注入适配器”(Infused Adapter by Inhibiting and Amplifying Inner Activations),简称 (IA)³,是一种通过添加三个学习到的向量来重新缩放自注意力层和编码器-解码器注意力层中的键和值,以及位置前馈网络中的中间激活的方法。

论文摘要如下:

少样本上下文学习(ICL)使预训练语言模型能够在没有任何基于梯度的训练的情况下执行一个以前未见过的任务,只需将少量训练样本作为输入的一部分。ICL 会产生大量的计算、内存和存储成本,因为它在每次进行预测时都需要处理所有的训练样本。参数高效微调(PEFT)(例如适配器模块、提示调优、稀疏更新方法等)提供了一种替代范式,其中只训练一小部分参数来使模型能够执行新任务。在本文中,我们严格比较了少样本 ICL 和 PEFT,并证明了后者不仅提供了更高的准确性,而且计算成本也大大降低。在此过程中,我们引入了一种名为 (IA)³ 的新 PEFT 方法,该方法通过学习到的向量来缩放激活,在只引入相对少量新参数的情况下获得了更强的性能。我们还提出了一个基于 T0 模型的简单配方,称为 T-Few,它可以应用于新任务,而无需进行特定任务的调优或修改。我们通过将其应用于 RAFT 基准测试来验证 T-Few 在完全未见过的任务上的有效性,首次实现了超越人类的性能,并将最先进水平绝对提升了 6%。我们实验中使用的所有代码都是公开可用的。.

IA3Config

class peft.IA3Config

< >

( 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 target_modules: Optional[Union[list[str], str]] = None exclude_modules: Optional[Union[list[str], str]] = None feedforward_modules: Optional[Union[list[str], str]] = None fan_in_fan_out: bool = False modules_to_save: Optional[list[str]] = None init_ia3_weights: bool = True )

参数

  • target_modules (Optional[Union[List[str], str]]) — 要应用适配器的模块名称。如果指定此项,则只会替换具有指定名称的模块。当传递字符串时,将执行正则表达式匹配。当传递字符串列表时,将执行精确匹配或检查模块名称是否以任何传递的字符串结尾。如果指定为“all-linear”,则选择所有 linear/Conv1D 模块,不包括输出层。如果未指定,将根据模型架构选择模块。如果架构未知,则会引发错误——在这种情况下,您应手动指定目标模块。
  • exclude_modules (Optional[Union[List[str], str]]) — 不应用适配器的模块名称。当传递字符串时,将执行正则表达式匹配。当传递字符串列表时,将执行精确匹配或检查模块名称是否以任何传递的字符串结尾。
  • feedforward_modules (Optional[Union[List[str], str]]) — 如原始论文中所述,要被视为前馈模块的模块名称。这些模块会将 (IA)³ 向量乘到输入上,而不是输出上。`feedforward_modules` 必须是 `target_modules` 中存在的名称或名称子集。
  • fan_in_fan_out (bool) — 如果要替换的层存储权重的方式是 (fan_in, fan_out),则设置为 True。例如,gpt-2 使用 `Conv1D`,其权重存储方式为 (fan_in, fan_out),因此此项应设置为 `True`。
  • modules_to_save (Optional[List[str]]) — 除了 (IA)³ 层之外,要设置为可训练并保存在最终检查点中的模块列表。
  • init_ia3_weights (bool) — 是否初始化 (IA)³ 层中的向量,默认为 `True`。不建议将此设置为 `False`。

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

IA3Model

class peft.IA3Model

< >

( 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 (PreTrainedModel) — 要适配的模型。
  • config (IA3Config) — (IA)³ 模型的配置。
  • adapter_name (str) — 适配器的名称,默认为 "default"
  • low_cpu_mem_usage (bool, 可选, 默认为 False) — 在元设备上创建空的适配器权重。有助于加速加载过程。

返回

torch.nn.Module

(IA)³ 模型。

根据预训练的 transformers 模型创建一个“通过抑制和放大内部激活来注入适配器”((IA)^3) 模型。该方法在 https://huggingface.co/papers/2205.05638 中有详细描述。

示例

>>> from transformers import AutoModelForSeq2SeqLM, ia3Config
>>> from peft import IA3Model, IA3Config

>>> config = IA3Config(
...     peft_type="IA3",
...     task_type="SEQ_2_SEQ_LM",
...     target_modules=["k", "v", "w0"],
...     feedforward_modules=["w0"],
... )

>>> model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")
>>> ia3_model = IA3Model(config, model)

属性:

  • model (PreTrainedModel) — 需要被适配的模型。
  • peft_config (ia3Config):(IA)³ 模型的配置。

add_weighted_adapter

< >

( adapters: list[str] weights: list[float] adapter_name: str )

参数

  • adapters (list) — 要合并的适配器名称列表。
  • weights (list) — 每个适配器的权重列表。
  • adapter_name (str) — 新适配器的名称。

此方法通过将给定的适配器与给定的权重合并来添加一个新的适配器。

delete_adapter

< >

( adapter_name: str )

参数

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

删除一个现有的适配器。

disable_adapter_layers

< >

( )

禁用所有适配器。

禁用所有适配器后,模型输出对应于基础模型的输出。

enable_adapter_layers

< >

( )

启用所有适配器。

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

merge_and_unload

< >

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

参数

  • safe_merge (bool) — 是否激活安全合并检查,以检查适配器权重中是否存在任何潜在的 Nan 值。
  • adapter_names (List[str], 可选) — 应被合并的适配器名称列表。如果为 None,所有活动的适配器都将被合并。默认为 None

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

示例

>>> from transformers import AutoModelForCausalLM
>>> from peft import PeftModel

>>> base_model = AutoModelForCausalLM.from_pretrained("tiiuae/falcon-40b")
>>> peft_model_id = "smangrul/falcon-40B-int4-peft-lora-sfttrainer-sample"
>>> model = PeftModel.from_pretrained(base_model, peft_model_id)
>>> merged_model = model.merge_and_unload()

set_adapter

< >

( adapter_name: str | list[str] )

参数

  • adapter_name (strlist[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

< >

( )

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

< > 在 GitHub 上更新