Diffusers documentation

PEFT

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

PEFT

Diffusers 支持通过 PeftAdapterMixin 类,使用 PEFT 库加载 LoRA 等适配器。这使得 Diffusers 中的 UNet2DConditionModel、SD3Transformer2DModel 等建模类能够配合适配器运行。

有关如何在 Diffusers 中使用 PEFT 进行推理的概述,请参阅 使用 PEFT 进行推理 教程。

PeftAdapterMixin

类 diffusers.loaders.PeftAdapterMixin

< >

( )

一个包含所有用于加载和使用 PEFT 库支持的适配器权重的函数的类。有关适配器及其在基础模型中注入的更多详细信息,请参阅 PEFT 文档。

安装 PEFT 的最新版本,并使用此混入类来:

  • 在模型中附加新的适配器。
  • 附加多个适配器并迭代地激活/停用它们。
  • 激活/停用模型中的所有适配器。
  • 获取活动适配器的列表。

active_adapters

< >

( )

获取模型当前激活的适配器列表。

如果您对适配器和 PEFT 方法不熟悉,我们邀请您阅读 PEFT 的文档以了解更多相关信息。

add_adapter

< >

( adapter_configadapter_name: str = 'default' )

参数

  • adapter_config ([~peft.PeftConfig]) — 要添加的适配器的配置;支持的适配器包括非前缀调优和 adaption prompt 方法。
  • adapter_name (str,可选,默认为 "default") — 要添加的适配器名称。如果未传入名称,则会为适配器分配一个默认名称。

为当前模型添加一个新的适配器用于训练。如果未传入适配器名称,则会为该适配器分配一个默认名称,以遵循 PEFT 库的命名约定。

如果您对适配器和 PEFT 方法不熟悉,我们邀请您阅读 PEFT 文档以了解更多相关信息。

delete_adapters

< >

( adapter_names: list[str] | str )

参数

  • adapter_names (list[str, str]) — 要删除的适配器的名称(单个字符串或字符串列表)。

从底层模型中删除适配器的 LoRA 层。

示例:

from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16
).to("cuda")
pipeline.load_lora_weights(
    "jbilcke-hf/sdxl-cinematic-1", weight_name="pytorch_lora_weights.safetensors", adapter_names="cinematic"
)
pipeline.unet.delete_adapters("cinematic")

disable_adapters

< >

( )

禁用所有附加到模型上的适配器,并回退到仅使用基础模型进行推理。

如果您对适配器和 PEFT 方法不熟悉,我们邀请您阅读 PEFT 的文档以了解更多相关信息。

disable_lora

< >

( )

禁用底层模型中处于激活状态的 LoRA 层。

示例:

from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16
).to("cuda")
pipeline.load_lora_weights(
    "jbilcke-hf/sdxl-cinematic-1", weight_name="pytorch_lora_weights.safetensors", adapter_name="cinematic"
)
pipeline.unet.disable_lora()

enable_adapters

< >

( )

启用附加到模型的适配器。模型使用 self.active_adapters() 获取要启用的适配器列表。

如果您对适配器和 PEFT 方法不熟悉,我们邀请您阅读 PEFT 的文档以了解更多相关信息。

enable_lora

< >

( )

启用底层模型的激活 LoRA 层。

示例:

from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16
).to("cuda")
pipeline.load_lora_weights(
    "jbilcke-hf/sdxl-cinematic-1", weight_name="pytorch_lora_weights.safetensors", adapter_name="cinematic"
)
pipeline.unet.enable_lora()

enable_lora_hotswap

< >

( target_rank: int = 128check_compiled: typing.Literal['error', 'warn', 'ignore'] = 'error' )

参数

  • target_rank (int,可选,默认为 128) — 所有将加载的适配器中的最高秩。
  • check_compiled (str, 可选, 默认为 "error") — 当模型已被编译时如何处理,通常应避免这种情况。可选值:
    • “error”(默认值):引发错误
    • “warn”:发出警告
    • “ignore”:不执行任何操作

启用 LoRA 适配器的热替换功能。

仅在热切换适配器且模型已编译,或所加载适配器的秩不同时,才需要调用此方法。

load_lora_adapter

< >

( pretrained_model_name_or_path_or_dictprefix = 'transformer'hotswap: bool = False**kwargs )

参数

  • pretrained_model_name_or_path_or_dict (str 或 os.PathLike 或 dict) — 可以是以下之一: - 一个字符串,即托管在 Hub 上的预训练模型的模型 ID(例如 google/ddpm-celebahq-256)。 - 一个目录路径(例如 ./my_model_directory),其中包含使用 ModelMixin.save_pretrained() 保存的模型权重。 - 一个 torch 状态字典。
    • 一个字符串,即托管在 Hub 上的预训练模型的 model id(例如 google/ddpm-celebahq-256)。
    • 指向一个目录的路径(例如 ./my_model_directory),其中包含使用 ModelMixin.save_pretrained() 保存的模型权重。
    • 一个 torch 状态字典。
  • prefix (str, 可选) — 用于过滤 state dict 的前缀。
  • cache_dir (str | os.PathLike, 可选) — 如果未使用标准缓存,则下载的预训练模型配置将被缓存到的目录路径。
  • force_download (bool,可选,默认为 False) — 是否强制(重新)下载模型权重和配置文件,如果存在缓存版本则覆盖它们。
  • proxies (dict[str, str],可选) — 按协议或端点使用的代理服务器字典,例如 {'http': 'foo.bar:3128', 'http://hostname': 'foo.bar:4012'}。每次请求都会使用这些代理。
  • local_files_only (bool,可选,默认为 False) — 是否仅加载本地的模型权重和配置文件。如果设置为 True,则不会从 Hub 下载模型。
  • token (str 或 bool,可选) — 用于远程文件的 HTTP bearer 授权令牌。如果为 True,则使用由 diffusers-cli login 生成的令牌(存储在 ~/.huggingface 中)。
  • revision (str, 可选, 默认为 "main") — 要使用的特定模型版本。它可以是分支名称、标签名称、提交 id,或 Git 允许的任何标识符。
  • subfolder (str,可选,默认为 "") — 模型文件在 Hub 或本地更大的模型仓库中的子文件夹位置。
  • network_alphas (dict[str, float]) — 用于稳定学习并防止下溢的网络 alpha 值。该值与 kohya-ss 训练脚本中的 --network_alpha 选项含义相同。请参阅 此链接。
  • low_cpu_mem_usage (bool,可选) — 通过仅加载预训练的 LoRA 权重而不初始化随机权重,来加快模型加载速度。
  • hotswap — (bool, 可选) 默认值为 False. 是否用新加载的适配器就地替换现有的(LoRA)适配器。这意味着,它不会加载额外的适配器,而是获取现有适配器的权重,并用新适配器的权重进行替换。这种方式可能更快且更节省内存。然而,热替换的主要优势在于,当模型使用 torch.compile 编译时,加载新适配器无需重新编译模型。使用热替换时,传入的 adapter_name 应为已加载适配器的名称。如果新适配器和旧适配器的秩和/或 LoRA alpha(即缩放)不同,在加载适配器之前需要调用一个额外方法:pipeline = ... # 加载 diffusers pipeline max_rank = ... # 想要加载的所有 LoRA 中的最高秩 # 在编译和加载 LoRA 适配器*之前*调用 pipeline.enable_lora_hotswap(target_rank=max_rank) pipeline.load_lora_weights(file_name) # 现在可选地编译模型 请注意,目前尚不支持对文本编码器适配器进行热替换。此技术还有一些其他限制,文档如下:https://huggingface.co/docs/peft/main/en/package_reference/hotswap

    如果新适配器和旧适配器的秩和/或 LoRA alpha(即缩放)不同,则在加载适配器之前需要调用一个额外的方法:

    pipeline = ...  # load diffusers pipeline
    max_rank = ...  # the highest rank among all LoRAs that you want to load
    # call *before* compiling and loading the LoRA adapter
    pipeline.enable_lora_hotswap(target_rank=max_rank)
    pipeline.load_lora_weights(file_name)
    # optionally compile the model now

    请注意,目前尚不支持热替换文本编码器的适配器。该技术还存在一些其他限制,相关文档如下: https://huggingface.co/docs/peft/main/en/package_reference/hotswap

  • metadata — LoRA 适配器元数据。如果提供了该参数,则不会使用通过状态字典推断出的元数据来初始化 LoraConfig。

将 LoRA 适配器加载到底层模型中。

save_lora_adapter

< >

( save_directoryadapter_name: str = 'default'upcast_before_saving: bool = Falsesafe_serialization: bool = Trueweight_name: str | None = None )

参数

  • save_directory (str 或 os.PathLike) — 用于保存 LoRA 参数的目录。如果该目录不存在,将会自动创建。
  • adapter_name — (str,默认为 “default”):要序列化的适配器名称。当底层模型加载了多个适配器时,此参数非常有用。
  • upcast_before_saving (bool,默认为 False) — 是否在序列化前将底层模型转换为 torch.float32。
  • safe_serialization(bool,可选,默认为 True)—— 是否使用 safetensors 保存模型,还是使用传统的基于 pickle 的 PyTorch 方式。
  • weight_name — (str,可选,默认为 None):用于序列化状态字典的文件名。

保存与底层模型对应的 LoRA 参数。

set_adapter

< >

( adapter_name: str | list[str] )

参数

  • adapter_name (str | list[str])) — 要设置的适配器列表,或在单个适配器的情况下为适配器名称。

通过强制模型仅使用该适配器并禁用其他适配器,来设置特定的适配器。

如果您对适配器和 PEFT 方法不熟悉,我们邀请您阅读 PEFT 的文档以了解更多相关信息。

set_adapters

< >

( adapter_names: list[str] | strweights: float | dict | list[float] | list[dict] | list[None] | None = None )

参数

  • adapter_names (list[str] 或 str) — 要使用的适配器名称。
  • weights (Union[List[float], float], 可选) — 用于 UNet 的适配器权重。如果为 None,则所有适配器的权重均设置为 1.0。

设置当前在扩散网络(例如 unet、transformer 等)中使用的活动适配器。

示例:

from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16
).to("cuda")
pipeline.load_lora_weights(
    "jbilcke-hf/sdxl-cinematic-1", weight_name="pytorch_lora_weights.safetensors", adapter_name="cinematic"
)
pipeline.load_lora_weights("nerijs/pixel-art-xl", weight_name="pixel-art-xl.safetensors", adapter_name="pixel")
pipeline.unet.set_adapters(["cinematic", "pixel"], weights=[0.5, 0.5])
Update on GitHub