PEFT 文档

Bone

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

Bone

DiSHA: 维度分片适配(DiSHA)我们引入了维度分片适配(DiSHA),它扩展了 PEFT 的设计空间,默认解锁了更低的内在秩和更快的收敛速度。基于 DiSHA,我们提出了一种名为块仿射适配(Bone)的高效算法结构和一种名为块仿射变换适配(BAT)的非线性更新方法。

论文摘要如下:

低秩适配(LoRA)利用了大型语言模型(LLM)中权重更新的低内在秩特性,建立了一种参数高效微调(PEFT)范式。然而,LoRA 存在收敛速度慢的问题。我们引入了维度分片适配(DiSHA),它扩展了 PEFT 的设计空间,默认解锁了更低的内在秩和更快的收敛速度。在 DiSHA 的设计空间内,我们提出了块仿射适配(Bone),这是一种计算高效的结构,兼具高性能和高效率。虽然某些 DiSHA 配置可能导致权重分片的共线更新,但我们通过块仿射变换适配(BAT)—— 一种 DiSHA 的非线性变体 —— 解决了这个问题。BAT 通过将可训练矩阵与原始权重分片以非线性方式结合来引入非线性,从而在不增加额外参数的情况下实现矩阵更新的非线性。实验结果表明,在 DiSHA 框架下,Bone 在自然语言生成(NLG)和自然语言理解(NLU)任务中均持续优于 LoRA 变体,并且计算效率显著提高。进一步的分析表明,BAT 通过其非线性设计增强了模型的能力。

BoneConfig

class peft.BoneConfig

< >

( 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 target_modules: Optional[Union[list[str], str]] = None exclude_modules: Optional[Union[list[str], str]] = None init_weights: bool | Literal['bat'] = 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) — Bone 在不同层上的秩。最好将“r”设置为偶数;否则,默认的初始化方法将不起作用。
  • target_modules (Optional[Union[List[str], str]]) — 应用适配器的模块名称。如果指定此参数,只有名称匹配的模块才会被替换。当传入字符串时,将执行正则表达式匹配。当传入字符串列表时,将执行精确匹配或检查模块名称是否以任何传入的字符串结尾。如果此参数指定为 ‘all-linear’,则会选择所有线性模块,但不包括输出层。如果未指定,将根据模型架构选择模块。如果架构未知,将引发错误 —— 这种情况下,您应手动指定目标模块。
  • exclude_modules (Optional[Union[List[str], str]]) — 不应用适配器的模块名称。当传入字符串时,将执行正则表达式匹配。当传入字符串列表时,将执行精确匹配或检查模块名称是否以任何传入的字符串结尾。
  • init_weights (bool | Literal[“bat”]) — 不同的初始化对应不同的 Bone 变体。默认情况下,设置 True 使用 Bone 结构,而 “bat” 选择 Bat 结构。
  • layers_to_transform (Union[List[int], int]) — 要转换的层索引。如果传入一个整数列表,它将把适配器应用于此列表中指定的层索引。如果传入一个整数,它将在该索引的层上应用转换。
  • layers_pattern (str) — 层模式名称,仅当 layers_to_transform 不为 None 时使用。
  • modules_to_save (List[str]) — 除了适配器层之外,需要设置为可训练并保存在最终检查点中的模块列表。

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

BoneModel

class peft.BoneModel

< >

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

返回

torch.nn.Module

Bone 模型。

从预训练模型创建豪斯霍尔德反射适配(Bone)模型。该方法在 https://huggingface.co/papers/2409.15371 中有描述。

示例

>>> from diffusers import StableDiffusionPipeline
>>> from peft import BoneModel, BoneConfig

>>> config_te = BoneConfig(
...     r=8,
...     target_modules=["k_proj", "q_proj", "v_proj", "out_proj", "fc1", "fc2"],
...     init_weights=True,
... )
>>> config_unet = BoneConfig(
...     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 = BoneModel(model.text_encoder, config_te, "default")
>>> model.unet = BoneModel(model.unet, config_unet, "default")

属性:

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

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], 可选) — 应该被合并的适配器名称列表。如果为 None,所有活动的适配器都将被合并。默认为 None

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

unload

< >

( )

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

< > 在 GitHub 上更新