speechbrain.nnet.adapters 模块

SpeechBrain 实现了各种预训练模型适配器,例如 LoRA、Houlsby

Authors
  • Titouan Parcollet 2024

  • 彼得·普兰廷加 2024

摘要

类:

AdaptedModel

给定任何torch模型,例如asr_brain.modules.Transformer,以及一个适配器类,例如HoulsbyAdapter,此类将用这个新的适配器类替换目标层(同时保留参数)。

HoulsbyAdapterLinear

该类实现了Houlsby适配器,如以下文献所述:'Parameter-Efficient Transfer Learning for NLP' https://arxiv.org/abs/1902.00751

LoRA

该类实现了LoRA适配器,如论文中所述:'LoRA: 大型语言模型的低秩适应' https://arxiv.org/abs/2106.09685

函数:

is_layer_adaptable

检查层是否在需要适配的层列表中。

replace_module

基于父分配用新模块替换层。

参考

class speechbrain.nnet.adapters.AdaptedModel(model_to_adapt: Module, adapter_class: Module, all_linear: bool = False, all_conv: bool = False, target_layers: list = [], unfrozen_layers: list = [], adapter_kwargs: dict = {}, manual_adapter_insertion: bool = False)[source]

基础:Module

给定任何torch模型,例如asr_brain.modules.Transformer,以及一个适配器类,例如HoulsbyAdapter,该类将用这个新的适配器类替换目标层(同时保留参数)。

Parameters:
  • model_to_adapt (nn.Module) – 要添加适配器的基本PyTorch模型。

  • adapter_class (class) – 这个SpeechBrain库的(未初始化的)适配器。

  • all_linear (bool) – 是否将适配器添加到所有线性层(默认值:False)

  • all_conv (bool) – 是否将适配器添加到所有卷积层(默认值:False)

  • target_layers (list of str) – 应该被替换的给定模型中的模块名称列表。 支持Unix shell风格的通配符 (*, ?, [seq], [!seq])fnmatch

  • unfrozen_layers (list of str) – 训练期间要解冻的层列表。 支持Unix shell风格的通配符 (*, ?, [seq], [!seq])fnmatch

  • adapter_kwargs (dict) – 应该传递给适配器的参数集合。

  • manual_adapter_insertion (bool) – 默认值 (False) 会导致适配器在初始化时被插入。然而,在某些情况下,最好等待插入适配器,例如当需要加载预训练参数时。在这种情况下,可以将其设置为 True 并在加载参数后手动调用 insert_adapters

Example

>>> from collections import OrderedDict
>>> model = torch.nn.Sequential(
...   OrderedDict([
...     ("layer1", torch.nn.Linear(10, 20)),
...     ("layer2", torch.nn.Linear(20, 20)),
...     ("layer3", torch.nn.Linear(20, 10)),
...   ])
... )
>>> lora_model = AdaptedModel(
...   model_to_adapt=model,
...   adapter_class=LoRA,
...   target_layers=["layer[13]"],
...   unfrozen_layers=["layer2"],
...   adapter_kwargs={"rank": 2},
... )
>>> lora_model
AdaptedModel(
  (adapted_model): Sequential(
    (layer1): LoRA(
      (pretrained_module): Linear(in_features=10, out_features=20, bias=True)
      (adapter_down_proj): Linear(in_features=10, out_features=2, bias=False)
      (adapter_up_proj): Linear(in_features=2, out_features=20, bias=False)
    )
    (layer2): Linear(in_features=20, out_features=20, bias=True)
    (layer3): LoRA(
      (pretrained_module): Linear(in_features=20, out_features=10, bias=True)
      (adapter_down_proj): Linear(in_features=20, out_features=2, bias=False)
      (adapter_up_proj): Linear(in_features=2, out_features=10, bias=False)
    )
  )
)
insert_adapters()[source]

如果这是在 __init__ 中,它会与 Pretrainer 冲突。 确保在训练前只调用一次此函数。 参见 __init__.manual_adapter_insertion

forward(*args, **kwargs)[source]

将参数传递给适配的模型。

saver(path)[source]

仅保存可训练的参数。

loader(path, end_of_epoch)[source]

加载基础模型以及训练好的参数。

parameter_transfer(path)[source]

避免因仅加载训练参数而导致的警告。

__getattr__(item)[source]

重写 getattr 以将项目访问传递给预先适配的模型。

speechbrain.nnet.adapters.is_layer_adaptable(name, module, all_linear, all_conv, target_layers)[source]

检查层是否在需要调整的层列表中。

Parameters:
  • name (str) – 要检查的模块的名称。

  • 模块 (torch.nn.Module) – 要检查的模块。

  • all_linear (bool) – 是否应该调整所有线性层。

  • all_conv (bool) – 是否应该调整所有卷积层。

  • target_layers (strliststr) – 参见 add_adapters_to_model

Returns:

该层是否需要进行适配。

Return type:

bool

speechbrain.nnet.adapters.replace_module(model: Module, name: str, new_module: Module)[source]

基于父分配替换层为一个新模块。 这用于将层替换为围绕原始层的适配器层。因此,旧参数被保留,新参数被添加。

Parameters:
  • 模型 (nn.Module) – 包含要替换模块的模型。

  • name (str) – 要替换的目标模块的名称。

  • new_module (nn.Module) – 由旧模块和新参数组成的新模块。

class speechbrain.nnet.adapters.HoulsbyAdapterLinear(target_linear, projection_size, activation=<class 'speechbrain.nnet.activations.Swish'>, bias=True)[source]

基础:Module

该类实现了Houlsby适配器,如以下文献所述: ‘参数高效的自然语言处理迁移学习’ https://arxiv.org/abs/1902.00751

Parameters:
  • target_linear (nn.Module) – 与预训练的Linear对应的模块,该模块将被此适配器包装。

  • projection_size (int) – 投影层的大小(通常较小)。

  • activation (nn.Module) – 激活函数。默认是Swish。

  • bias (bool) – 是否在线性投影中使用偏置。

Example

>>> import torch
>>> x = torch.rand((8, 60, 64))
>>> base_linear = nn.Linear(64, 64)
>>> adapt = HoulsbyAdapterLinear(base_linear, 8)
>>> output = adapt(x)
>>> output.shape
torch.Size([8, 60, 64])
forward(x: Tensor)[source]

将HoulsbyAdapter应用于输入张量x

Parameters:

x (torch.Tensor) – 输入到适配器模块的张量。形状:[B, 时间, X]

Return type:

线性输出

class speechbrain.nnet.adapters.LoRA(target_module, rank=16, alpha=1.0)[source]

基础:Module

该类实现了LoRA适配器,如以下文献所述: ‘LoRA: 大型语言模型的低秩适应’ https://arxiv.org/abs/2106.09685

Parameters:
  • target_module (nn.Module) – 与预训练层对应的模块,该层将被此适配器包装。适用于 nn.Linear 和 nn.Conv

  • rank (int) – 投影层的大小或秩(通常较小)。

  • alpha (float) – 用于控制LoRA中缩放的值。默认值为1。

Example

>>> import torch
>>> x = torch.rand((8, 60, 64))
>>> base_linear = nn.Linear(64, 64)
>>> adapt = LoRA(base_linear, 64, 4)
>>> output = adapt(x)
>>> output.shape
torch.Size([8, 60, 64])
forward(x: Tensor)[source]

应用LoRA适配器。

Parameters:

x (torch.Tensor) – 输入到适配器模块的张量。

Return type:

线性输出