PEFT 文档

C3A: 通过循环卷积实现参数高效微调

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

C3A: 通过循环卷积实现参数高效微调

C3A 是一种参数高效的微调技术,它利用循环卷积在合理的资源限制内实现高秩适应。

请注意,你应该为 C3A 使用比其他方法大得多的学习率 (LR)。例如,1e-1 的学习率是 C3A 的一个良好起点。此外,应使用小得多的权重衰减。你可以参考 method_comparison 文件夹了解更多详情。

对于 block_size,它会影响可调参数和性能。作为开始,你可以选择一个接近 $\frac{\sqrt{d_1\times d_2}}{r}$ 的 $\mathrm{gcd}(d_1,d_2)$,其中 $r$ 是你将为此任务使用的 LoRA 秩。

C3A 目前有以下限制:

  • 仅支持 `nn.Linear` 层。
  • 不支持量化层。
  • 块大小应该是目标层输入和输出大小的公约数。

如果这些限制不适用于你的用例,请考虑使用其他方法。

论文摘要如下:

低秩适应 (LoRA) 因其在微调大型基础模型方面的应用而广受欢迎,它利用低秩矩阵 $\mathbf{A}$ 和 $\mathbf{B}$ 来表示权重变化(即 $\Delta \mathbf{W} = \mathbf{B} \mathbf{A}$)。该方法通过将 $\mathbf{A}$ 和 $\mathbf{B}$ 与激活值依次相乘,减少了可训练参数,并减轻了与完整增量矩阵相关的大量内存消耗。尽管取得了成功,但其固有的低秩特性可能会限制其性能。虽然已经提出了几种变体来解决这个问题,但它们往往忽略了 LoRA 带来的关键计算和内存效率。在本文中,我们提出了循环卷积适应 (C3A),它不仅以增强的性能实现了高秩适应,而且在计算能力和内存利用方面也表现出色。大量的实验表明,C3A 在各种微调任务中始终优于 LoRA 及其变体。

C3AConfig

class peft.C3AConfig

< >

( 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 block_size: int = 256 target_modules: Optional[Union[list[str], str]] = None bias: str = 'none' modules_to_save: Optional[list[str]] = None layers_to_transform: Optional[Union[list[int], int]] = None layers_pattern: Optional[Union[list[str], str]] = None block_size_pattern: Optional[dict] = <factory> init_weights: Optional[Union[bool, Literal['gaussian', 'kaiming_uniform', 'xavier_uniform']]] = 'xavier_uniform' )

参数

  • block_size (int) — C3A 的块大小,必须能被目标层的输入大小和输出大小整除。如果你不知道该使用什么块大小,请将其设置为目标层所有输入和输出大小的最大公约数。增加此值将导致参数减少。
  • target_modules (Union[list[str],str]) — 应用 C3A 的模块名称。
  • bias (str) — C3A 的偏置类型。可以是 ‘none’、‘all’ 或 ‘c3a_only’。如果为 ‘all’ 或 ‘c3a_only’,则相应的偏置将在训练期间更新。请注意,这意味着即使禁用适配器,模型也不会产生与未经适应的基础模型相同的输出。
  • modules_to_save (list[str]) — 除了 C3A 层之外,需要设置为可训练并保存在最终检查点中的模块列表。
  • layers_to_transform (Union[list[int],int]) — 要转换的层索引,如果指定此参数,它将在该列表中指定的层索引上应用 C3A。如果传入单个整数,它将在该索引的层上应用 C3A。
  • layers_pattern (str) — 层模式名称,仅当 `layers_to_transform` 不为 `None` 且层模式不在常见层模式中时使用。
  • block_size_pattern (dict) — 从层名称或正则表达式到与默认指定值不同的 block_size 的映射。例如,`{"model.decoder.layers.0.encoder_attn.k_proj": 1280}`。
  • init_weights (Union[bool, Literal["gaussian", "kaiming_uniform", "xavier_uniform"]]) — C3A 权重的初始化。如果权重应初始化为常用分布,则将其设置为 False。如果权重应初始化为零,则将其设置为 True。

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

C3AModel

class peft.C3AModel

< >

( 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 (C3AConfig) — C3A 模型的配置。
  • adapter_name (str) — 适配器的名称,默认为 `"default"`。

返回

torch.nn.Module

C3A 模型。

从预训练的 transformers 模型创建 C3A 模型。

该方法在 [待办] 中有详细描述。

属性:

  • model (PreTrainedModel) — 需要被适配的模型。
  • peft_config (C3AConfig): C3A 模型的配置。

disable_adapter_layers

< >

( )

禁用所有适配器。

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

enable_adapter_layers

< >

( )

启用所有适配器。

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

merge_and_unload

< >

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

参数

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

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

set_adapter

< >

( adapter_name: str | list[str] )

参数

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

设置活动的适配器。

unload

< >

( )

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

< > 在 GitHub 上更新