PEFT 文档

LoHa

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

LoHa

低秩哈达玛积(LoHa)与 LoRA 类似,不同之处在于它用更多的低秩矩阵来近似大型权重矩阵,并使用哈达玛积将它们组合起来。这种方法比 LoRA 的参数效率更高,并且能达到相当的性能。

论文摘要如下:

在这项工作中,我们为联邦学习(FL)提出了一种通信高效的参数化方法 FedPara,以克服频繁模型上传和下载带来的负担。我们的方法使用低秩权重后跟哈达玛积来重新参数化层的权重参数。与传统的低秩参数化相比,我们的 FedPara 方法不受低秩约束的限制,因此具有更大的容量。这一特性使其能够在通信成本比原始层模型低 3 到 10 倍的情况下达到相当的性能,这是传统低秩方法无法实现的。通过与其他高效的联邦学习优化器结合,我们方法的效率可以进一步提高。此外,我们将我们的方法扩展到一个个性化的联邦学习应用 pFedPara,该应用将参数分为全局和局部两部分。我们证明,pFedPara 在参数少于三倍的情况下,性能优于竞争对手的个性化联邦学习方法。.

LoHaConfig

class peft.LoHaConfig

< >

( 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 rank_pattern: Optional[dict] = <factory> alpha_pattern: Optional[dict] = <factory> r: int = 8 alpha: int = 8 rank_dropout: float = 0.0 module_dropout: float = 0.0 use_effective_conv2d: bool = False target_modules: Optional[Union[list[str], str]] = None exclude_modules: Optional[Union[list[str], str]] = None init_weights: bool = True layers_to_transform: Optional[Union[list[int], int]] = None layers_pattern: Optional[Union[list[str], str]] = None modules_to_save: Optional[list[str]] = None )

参数

  • r (int) — LoHa 秩。
  • alpha (int) — LoHa 缩放的 alpha 参数。
  • rank_dropout (float) — 训练期间秩维度的丢弃概率。
  • module_dropout (float) — 训练期间禁用 LoHa 模块的丢弃概率。
  • use_effective_conv2d (bool) — 对 ksize > 1 的 Conv2d 使用参数有效分解(来自 FedPara 论文的“命题 3”)。
  • target_modules (Optional[Union[List[str], str]]) — 要应用适配器的模块名称。如果指定,只有具有指定名称的模块将被替换。当传递字符串时,将执行正则表达式匹配。当传递字符串列表时,将执行精确匹配,或者检查模块名称是否以任何传递的字符串结尾。如果指定为“all-linear”,则选择所有线性/Conv1D 模块,不包括输出层。如果未指定,将根据模型架构选择模块。如果架构未知,将引发错误——在这种情况下,您应手动指定目标模块。
  • exclude_modules (Optional[Union[List[str], str]]) — 不应用适配器的模块名称。当传递字符串时,将执行正则表达式匹配。当传递字符串列表时,将执行精确匹配,或者检查模块名称是否以任何传递的字符串结尾。
  • init_weights (bool) — 是否执行适配器权重的初始化。默认为 True,不建议传递 False
  • layers_to_transform (Union[List[int], int]) — 要转换的层索引。如果传递一个整数列表,它将把适配器应用到此列表中指定的层索引。如果传递单个整数,它将在此索引的层上应用转换。
  • layers_pattern (Optional[Union[List[str], str]]) — 层模式名称,仅当 layers_to_transform 不为 None 时使用。这应针对模型的 nn.ModuleList,通常称为 'layers''h'
  • rank_pattern (dict) — 从层名称或正则表达式到秩的映射,这些秩与 r 指定的默认秩不同。例如,{'^model.decoder.layers.0.encoder_attn.k_proj': 16}
  • alpha_pattern (dict) — 从层名称或正则表达式到 alpha 的映射,这些 alpha 与 alpha 指定的默认 alpha 不同。例如,{'^model.decoder.layers.0.encoder_attn.k_proj': 16}
  • modules_to_save (Optional[List[str]]) — 除了适配器层之外,需要设置为可训练并在最终检查点中保存的模块列表。

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

LoHaModel

class peft.LoHaModel

< >

( 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 (LoHaConfig) — LoHa 模型的配置。
  • adapter_name (str) — 适配器名称,默认为 "default"
  • low_cpu_mem_usage (bool, optional, 默认为 False) — 在元设备上创建空的适配器权重。有助于加快加载过程。

返回

torch.nn.Module

LoHa 模型。

从预训练模型创建低秩哈达玛积模型。该方法在 https://huggingface.co/papers/2108.06098 中有部分描述。当前实现大量借鉴了 https://github.com/KohakuBlueleaf/LyCORIS/blob/eb460098187f752a5d66406d3affade6f0a07ece/lycoris/modules/loha.py

示例

>>> from diffusers import StableDiffusionPipeline
>>> from peft import LoHaModel, LoHaConfig

>>> config_te = LoHaConfig(
...     r=8,
...     lora_alpha=32,
...     target_modules=["k_proj", "q_proj", "v_proj", "out_proj", "fc1", "fc2"],
...     rank_dropout=0.0,
...     module_dropout=0.0,
...     init_weights=True,
... )
>>> config_unet = LoHaConfig(
...     r=8,
...     lora_alpha=32,
...     target_modules=[
...         "proj_in",
...         "proj_out",
...         "to_k",
...         "to_q",
...         "to_v",
...         "to_out.0",
...         "ff.net.0.proj",
...         "ff.net.2",
...     ],
...     rank_dropout=0.0,
...     module_dropout=0.0,
...     init_weights=True,
...     use_effective_conv2d=True,
... )

>>> model = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
>>> model.text_encoder = LoHaModel(model.text_encoder, config_te, "default")
>>> model.unet = LoHaModel(model.unet, config_unet, "default")

属性:

  • model (~torch.nn.Module) — 将要被适配的模型。
  • peft_config (LoHaConfig): LoHa 模型的配置。
< > 在 GitHub 上更新