PEFT 文档

MiSS

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

MiSS

MiSS: Balancing LoRA Performance and Efficiency with Simple Shard Sharing(MiSS) 是一种新颖的 PEFT 方法,它采用低秩结构,仅需要单个可训练矩阵,并引入了与 LoRA 不同的新更新机制,在性能和效率之间实现了出色的平衡。

论文摘要如下:

参数高效微调 (PEFT) 方法,特别是低秩适配 (LoRA),有效减少了大型语言模型 (LLM) 的可训练参数数量。然而,随着模型规模的持续增长,对计算资源的需求仍然是一个重大挑战。现有的 LoRA 变体通常难以在适应性(模型性能和收敛速度)与效率(计算开销、内存使用和初始化时间)之间达到最佳平衡。本文介绍了 MiSS (Matrix Shard Sharing),一种新颖的 PEFT 方法,通过简单的分片共享机制解决了这一权衡问题。MiSS 借鉴了这样一个观点:通过将权重矩阵分解为多个碎片矩阵并利用一个共享的可训练公共碎片,可以实现低秩适配。该方法通过复制这些共享的分区化分片来构建低秩更新矩阵。我们还为 MiSS 提出了一种硬件高效且广泛适用的实现方案。在各种任务上进行的大量实验,以及对计算性能的系统性分析,证明了 MiSS 的优越性。结果表明,MiSS 在模型性能指标和计算效率(包括初始化速度和训练吞吐量)方面均显著优于标准 LoRA 及其主要变体。通过有效平衡表达能力和资源利用率,MiSS 为高效适配大规模模型提供了一个引人注目的解决方案。.

MissConfig

class peft.MissConfig

< >

( 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 r: int = 64 miss_dropout: float = 0.0 mini_r: int = 1 target_modules: Optional[Union[list[str], str]] = None exclude_modules: Optional[Union[list[str], str]] = None init_weights: bool | Literal['bat', 'mini'] = True layers_to_transform: Optional[Union[list[int], int]] = None layers_pattern: Optional[str] = None bias: str = 'none' modules_to_save: Optional[list[str]] = None )

参数

  • r (int) — MiSS 在不同层之间的秩。最好将 'r' 设置为偶数;否则,默认的初始化方法将无法工作。MiSS 的秩对应于沿 `in_features` 维度的低秩分解。
  • miss_dropout (float) — MiSS 层的 dropout 概率。
  • mini_r (int) — MiSS 的秩对应于沿 `out_features` 维度的低秩分解。当您设置 `init_weights=mini` 时,需要设置 `mini_r`。请确保 `out_features` 可以被 `mini_r` 整除。
  • target_modules (Optional[Union[List[str], str]]) — 应用适配器的模块名称。如果指定此项,则只会替换具有指定名称的模块。传递字符串时,将执行正则表达式匹配。传递字符串列表时,将执行精确匹配,或者检查模块名称是否以任何传递的字符串结尾。如果指定为 'all-linear',则选择所有线性模块,不包括输出层。如果未指定,将根据模型架构选择模块。如果架构未知,将引发错误 — 在这种情况下,您应该手动指定目标模块。
  • exclude_modules (Optional[Union[List[str], str]]) — 不应用适配器的模块名称。传递字符串时,将执行正则表达式匹配。传递字符串列表时,将执行精确匹配,或者检查模块名称是否以任何传递的字符串结尾。
  • init_weights (bool | Literal[“bat”, “mini”]) — 不同的初始化对应不同的 MiSS 变体。默认情况下 (balance),将使用 MiSS 中最有效和通用的方法。'bat':在此模式下,您可以启用跨不同分片的非线性更新。'mini':在此模式下,您可以设置更小的秩以使用更少的可训练参数,但建议保持 `out_features % mini_r == 0`。
  • layers_to_transform (Union[List[int], int]) — 要转换的层索引。如果传递一个整数列表,它将把适配器应用到此列表中指定的层索引。如果传递单个整数,它将在该索引的层上应用转换。
  • layers_pattern (str) — 层模式名称,仅在 `layers_to_transform` 不为 `None` 时使用。
  • modules_to_save (List[str]) — 除适配器层外,需要设置为可训练并在最终检查点中保存的模块列表。

这是用于存储 `MiSSModel` 配置的配置类。

MissModel

class peft.MissModel

< >

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

返回

torch.nn.Module

MiSS 模型。

从预训练模型创建 Householder 反射适配 (MiSS) 模型。该方法在 https://huggingface.co/papers/2409.15371 中有详细描述。

示例

>>> from diffusers import StableDiffusionPipeline
>>> from peft import MissModel, MissConfig

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

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

属性:

  • model (~torch.nn.Module) — 将要被适配的模型。
  • peft_config (MissConfig): MiSS 模型的配置。

delete_adapter

< >

( adapter_name: str )

参数

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

删除一个现有的适配器。

merge_and_unload

< >

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

参数

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

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

unload

< >

( )

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

< > 在 GitHub 上更新