Diffusers 文档

LoRA

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

LoRA

LoRA 是一种快速轻量级的训练方法,它插入和训练比所有模型参数显著更少的参数。这产生了一个更小的文件(~100 MBs),并使得快速训练模型以学习新概念变得更容易。LoRA 权重通常加载到去噪器、文本编码器或两者都加载。去噪器通常对应于 UNet(例如 UNet2DConditionModel)或 Transformer(例如 SD3Transformer2DModel)。有几个类用于加载 LoRA 权重。

  • StableDiffusionLoraLoaderMixin 为加载和卸载、融合和解融、启用和禁用等功能提供了函数。这个类可以与任何模型一起使用。
  • StableDiffusionXLLoraLoaderMixin 是用于加载和保存 LoRA 权重的 StableDiffusionLoraLoaderMixin 类的 Stable Diffusion (SDXL) 版本。它只能用于 SDXL 模型。
  • SD3LoraLoaderMixinStable Diffusion 3 提供了类似的功能。
  • AmusedLoraLoaderMixin 适用于 AmusedPipeline
  • LoraBaseMixin 提供了一个基础类,其中包含多个实用方法,用于融合、解融、卸载 LoRA 以及更多。

有关如何加载 LoRA 权重的更多信息,请参阅 LoRA 加载指南

StableDiffusionLoraLoaderMixin

class diffusers.loaders.StableDiffusionLoraLoaderMixin

< >

( )

将 LoRA 层加载到 Stable Diffusion 的 UNet2DConditionModelCLIPTextModel

load_lora_into_text_encoder

< >

( state_dict network_alphas text_encoder prefix = None lora_scale = 1.0 adapter_name = None _pipeline = None )

参数

  • state_dict (dict) — 包含LoRA层参数的标准状态字典。键值应以text_encoder开头以区分unet LoRA层。
  • network_alphas (Dict[str, float]) — 参见LoRALinearLayer获取更多详细信息。
  • text_encoder (CLIPTextModel) — 要加载LoRA层的文本编码器模型。
  • prefix (str) — 预期在state_dict中的text_encoder的前缀。
  • lora_scale (float) — 修改LoRA线性层输出的大小,在将其与常规LoRA层输出相加之前。
  • adapter_name (str, 可选) — 要用于引用加载的适配器模型的适配器名称。如果未指定,将使用 default_{i} ,其中 i 是正在加载的适配器总数。

这将将在 state_dict 中指定的不稳定网络层加载到 text_encoder 上。

load_lora_into_unet

< >

( state_dict network_alphas unet adapter_name = None _pipeline = None )

参数

  • state_dict (dict) — 包含洛拉层参数的标准状态字典。键可以直接索引到unet或前面加上额外的unet,以便区分文本编码器洛拉层。
  • network_alphas (Dict[str, float]) — 稳定学习和防止下溢所使用的网络alpha值。此值与kohya-ss训练脚本中的--network_alpha选项具有相同的含义。请参阅此链接
  • unet (UNet2DConditionModel) — 将洛拉层加载至其中的UNet模型。
  • adapter_name (str, 可选) — 使用此名称参考加载的适配器模型。如果未指定,则将使用 default_{i},其中 i 是正在加载的适配器总数。

这会将 state_dict 中指定的 LoRa 层加载到 unet 中。

load_lora_weights

< >

( pretrained_model_name_or_path_or_dict: Union adapter_name = None **kwargs )

参数

  • 预训练模型名称或路径或字典 (stros.PathLikedict) — 参见 lora_state_dict()
  • kwargs (dict, 可选) — 请参见lora_state_dict()
  • adapter_name (str, 可选) — 用于引用已加载适配器模型的适配器名称。若未指定,将使用default_{i},其中i是正在加载的适配器总数。

pretrained_model_name_or_path_or_dict中指定的LoRA权重加载到self.unetself.text_encoder中。

所有kwargs都转发到self.lora_state_dict

有关如何加载状态字典的更多详细信息,请参见lora_state_dict()

有关如何将状态字典加载到self.unet中的更多详细信息,请参见load_lora_into_unet()

有关如何将状态字典加载到self.text_encoder中的更多详细信息,请参见load_lora_into_text_encoder()

lora_state_dict

< >

( 预训练模型名称或路径或字典: Union **kwargs )

参数

  • 预训练模型名称或路径或字典 (stros.PathLikedict) — 可以是:

    • 一个字符串,存储在Hub上的预训练模型的 模型ID(例如 google/ddpm-celebahq-256)。
    • 一个路径,指向包含使用 ModelMixin.save_pretrained() 保存的模型权重的 目录(例如 ./my_model_directory)。
    • 一个 torch状态字典
  • cache_dir (Union[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 (strbool可选) — 用作远程文件的HTTP摘要认证令牌。如果设置为True,则使用从diffusers-cli login生成的令牌(存储在~/.huggingface)。
  • 修订版本 (str, 可选, 默认为 "main") — 要使用的特定模型版本。它可以是分支名称、标签名称、提交 ID 或 Git 允许的任何识别符。
  • 子文件夹 (str, 可选, 默认为 "") — 模型文件在 Hub 或本地较大模型仓库中的子文件夹位置。
  • 权重名称 (str, 可选, 默认为 None) — 序列化状态字典文件的名称。

返回 lora 权重和网络 alpha 的状态字典。

我们有限度地支持加载 A1111 格式的 LoRA 检查点。

此函数是实验性的,可能在未来进行更改。

保存 lora 权重

< >

( save_directory: 联合 unet_lora_layers: 字典 = None text_encoder_lora_layers: 字典 = None is_main_process: 布尔 = True weight_name: 字符串 = None save_function: 可调用 = None safe_serialization: 布尔 = True )

参数

  • save_directory (字符串os.PathLike) — 存储LoRA参数的目录。如果不存在,将被创建。
  • unet_lora_layers (Dict[str, torch.nn.Module]Dict[str, torch.Tensor]) — 对应于 unet 的 LoRA 层的状态字典。
  • text_encoder_lora_layers (Dict[str, torch.nn.Module]Dict[str, torch.Tensor]) — 对应于 text_encoder 的 LoRA 层的状态字典。必须显式传递文本编码器 LoRA 状态字典,因为它来自 🤗 Transformers。
  • is_main_process (bool可选,默认为 True)— 调用此过程的进程是否为主进程。在分布式训练期间非常有用,您需要在所有进程中调用此函数。在这种情况下,仅将 is_main_process=True 设置为主进程以避免竞争条件。
  • save_function (Callable) — 用于保存状态字典的函数。在分布式训练期间,当需要替换 torch.save 为另一种方法时很有用。可以通过环境变量 DIFFUSERS_SAVE_MODE 进行配置。
  • safe_serialization (bool, 可选,默认为 True) — 是否使用 safetensors 或传统的 PyTorch 方式(使用 pickle)保存模型。

保存对应 UNet 和文本编码器的 LoRA 参数。

StableDiffusionXLLoraLoaderMixin

diffusers.loaders.StableDiffusionXLLoraLoaderMixin

< >

( )

将 LoRA 层加载到 Stable Diffusion XL 的 UNet2DConditionModel、CLIPTextModel 和 CLIPTextModelWithProjection。

load_lora_into_text_encoder

< >

( state_dict network_alphas text_encoder prefix = None lora_scale = 1.0 adapter_name = None _pipeline = None )

参数

这将将在 state_dict 中指定的不稳定网络层加载到 text_encoder 上。

load_lora_into_unet

< >

( state_dict network_alphas unet adapter_name = None _pipeline = None )

参数

  • state_dict (dict) — 包含 LoRA 层参数的标准状态字典。键可以直接索引到 unet,或者可以添加前缀 unet 以区分文本编码器 LoRA 层。
  • network_alphas (Dict[str, float]) — 用于稳定学习和防止下溢的网络 alpha 值。此值与 kohya-ss 训练脚本中的 --network_alpha 选项具有相同的意义。请参考 此链接
  • unet (UNet2DConditionModel) — 要加载 LoRA 层的 UNet 模型。
  • adapter_name (str, 可选) — 用于引用加载的适配器模型的适配器名称。如未指定,将使用 default_{i},其中 i 是正在加载的适配器总数。

这会将 state_dict 中指定的 LoRa 层加载到 unet 中。

load_lora_weights

< >

( 预训练模型名称或路径或字典: 联合 适配器名称: 可选 = None **kwargs )

参数

  • 预训练模型名称或路径或字典 (stros.PathLikedict) — 请参阅 lora_state_dict()
  • adapter_name (str, 可选) — 用于引用加载的适配器模型的适配器名称。如果未指定,将使用 default_{i},其中 i 是正在加载的适配器的总数。
  • kwargs (dict, 可选) — 请参阅 lora_state_dict()

pretrained_model_name_or_path_or_dict中指定的LoRA权重加载到self.unetself.text_encoder中。

所有kwargs都转发到self.lora_state_dict

有关如何加载状态字典的更多详细信息,请参见lora_state_dict()

有关如何将状态字典加载到self.unet中的更多详细信息,请参见load_lora_into_unet()

有关如何将状态字典加载到self.text_encoder中的更多详细信息,请参见load_lora_into_text_encoder()

lora_state_dict

< >

( 预训练模型名称或路径或字典: Union **kwargs )

参数

  • pretrained_model_name_or_path_or_dict (stros.PathLikedict) — 可以是以下之一:

    • 字符串,Hub 上托管的预训练模型的 模型 ID(例如 google/ddpm-celebahq-256)。
    • 包含使用ModelMixin.save_pretrained() 保存的模型权重的 目录路径(例如 ./my_model_directory)。
    • torch 状态字典
  • cache_dir (Union[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 (strbool,可选) — 用于远程文件 HTTP 身份验证的令牌。如果设置为 True,则使用从 diffusers-cli login 生成的令牌(存储在 ~/.huggingface 中)。
  • 修订版本str可选,默认为 "main") — 要使用的特定模型版本。可以是分支名称、标签名称、提交ID或Git允许的任何标识符。
  • 子文件夹str可选,默认为 "") — 模型文件的子文件夹位置,位于Hub或本地的更大的模型仓库中。
  • 权重名称str可选,默认为 None) — 序列化状态字典文件的名称。

返回 lora 权重和网络 alpha 的状态字典。

我们有限度地支持加载 A1111 格式的 LoRA 检查点。

此函数是实验性的,可能在未来进行更改。

保存 lora 权重

< >

( save_directory: Union unet_lora_layers: Dict = None text_encoder_lora_layers: Dict = None text_encoder_2_lora_layers: Dict = None is_main_process: bool = True weight_name: str = None save_function: Callable = None safe_serialization: bool = True )

参数

  • 保存目录 (stros.PathLike) — 保存 LoRA 参数的目录。如果不存在,将会被创建。
  • unet_lora_layers (Dict[str, torch.nn.Module]Dict[str, torch.Tensor]) — 对应于 unet 的 LoRA 层的状态字典。
  • text_encoder_lora_layers (Dict[str, torch.nn.Module]Dict[str, torch.Tensor]) — 对应于 text_encoder 的 LoRA 层的状态字典。必须显式传递文本编码器 LoRA 状态字典,因为它来自 🤗 Transformers。
  • text_encoder_2_lora_layers (Dict[str, torch.nn.Module]Dict[str, torch.Tensor]) — 对应于 text_encoder_2 的 LoRA 层的状态字典。必须显式传递文本编码器 LoRA 状态字典,因为它来自 🤗 Transformers。
  • is_main_process (bool, 可选, 默认为 True) — 调用此函数的进程是否为主进程。在分布式训练期间非常有用,并且需要在所有进程中调用此函数。在这种情况下,仅将主进程的 is_main_process=True 设置为 True 以避免竞争条件。
  • save_function (Callable) — 用于保存状态字典的函数。在分布式训练期间非常有用,当需要将 torch.save 替换为其他方法时。可以通过环境变量 DIFFUSERS_SAVE_MODE 进行配置。
  • safe_serialization (bool, 可选, 默认为 True) — 是否使用 safetensors 或传统的 PyTorch 方式(使用 pickle)保存模型。

保存对应 UNet 和文本编码器的 LoRA 参数。

SD3LoraLoaderMixin

diffusers.loaders.SD3LoraLoaderMixin

< >

( )

将LoRA层加载到SD3Transformer2DModelCLIPTextModelCLIPTextModelWithProjection中。

专用于StableDiffusion3Pipeline

load_lora_into_text_encoder

< >

( state_dict network_alphas text_encoder prefix = None lora_scale = 1.0 adapter_name = None _pipeline = None )

参数

  • state_dict (dict) — 包含洛拉层参数的标准状态字典。键应以额外的 text_encoder 前缀来区分 U-Net 洛拉层。
  • network_alphas (Dict[str, float]) — 参见 LoRALinearLayer 了解更多详情。
  • text_encoder (CLIPTextModel) — 将 LoRA 层加载进来的文本编码器模型。
  • prefix (str) — expected prefix of the text_encoder in the state_dict.
  • lora_scale (float) — 在将其与常规lora层的输出相加之前,如何调整lora线性层的输出。
  • adapter_name (str, 可选) — 使用的引用已加载适配器模型的适配器名称。如果未指定,则使用default_{i},其中i为正在加载的适配器总数。

这将将在 state_dict 中指定的不稳定网络层加载到 text_encoder 上。

load_lora_into_transformer

< >

( state_dict transformer adapter_name = None _pipeline = None )

参数

  • state_dict (dict) — 包含LoRA层参数的标准状态字典。键可以直接索引到unet,或者前缀加一个额外的unet,用于区分文本编码器LoRA层。
  • transformer (SD3Transformer2DModel) — 将LoRA层加载进来的Transformer模型。
  • adapter_name (str, 可选) — 用于引用加载的适配器模型的名称。如果未指定,则使用default_{i},其中i是要加载的适配器的总数量。

这将在transformer中加载state_dict中指定的LoRA层。

load_lora_weights

< >

( pretrained_model_name_or_path_or_dict: Union adapter_name = None **kwargs )

参数

  • 预训练模型名称、路径或字典 (stros.PathLikedict) — 请参阅 lora_state_dict()
  • kwargs (dict, 可选) — 请参阅 lora_state_dict()
  • adapter_name (str, 可选) — 将用于引用已加载的适配器模型的名字。如果未指定,将使用 default_{i},其中 i 是正在加载的适配器总数。

pretrained_model_name_or_path_or_dict中指定的LoRA权重加载到self.unetself.text_encoder中。

所有kwargs都转发到self.lora_state_dict

有关如何加载状态字典的更多详细信息,请参见lora_state_dict()

详情请参考 ~loaders.StableDiffusionLoraLoaderMixin.load_lora_into_transformer 了解状态字典是如何加载到 self.transformer 中的。

lora_state_dict

< >

( 预训练模型名称或路径或字典: Union **kwargs )

参数

  • pretrained_model_name_or_path_or_dict (stros.PathLikedict) — 可以是以下之一:

    • 一个字符串,Hugging Face Hub 上托管的一个预训练模型的 模型 id(例如 google/ddpm-celebahq-256)。
    • 一个包含使用 ModelMixin.save_pretrained() 保存的模型权重的 目录 路径(例如 ./my_model_directory)。
    • torch 状态字典
  • cache_dir (Union[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可选) — 用于远程文件HTTP认证令牌。如果为 True,使用从 diffusers-cli login 生成的令牌(存储在 ~/.huggingface)。
  • revision (str可选,默认为 "main") — 要使用的特定模型版本。可以是分支名、标签名、提交id或Git允许的任何标识符。
  • 子文件夹 (str, 可选, 默认值为 "") — 模型文件在 Hub 或本地的较大模型存储库中的子文件夹位置。

返回 lora 权重和网络 alpha 的状态字典。

我们有限度地支持加载 A1111 格式的 LoRA 检查点。

此函数是实验性的,可能在未来进行更改。

保存 lora 权重

< >

( save_directory: 联合 transformer_lora_layers: 字典 = None text_encoder_lora_layers: 字典 = None text_encoder_2_lora_layers: 字典 = None is_main_process: 布尔 = True weight_name: 字符串 = None save_function: 可调用 = None safe_serialization: 布尔 = True )

参数

  • save_directory (stros.PathLike) — 保存 LoRA 参数的目录。如果不存在将创建。
  • transformer_lora_layers (Dict[str, torch.nn.Module]Dict[str, torch.Tensor]) — 对应于 transformer 的 LoRA 层的状态字典。
  • text_encoder_lora_layers (Dict[str, torch.nn.Module]Dict[str, torch.Tensor]) — 对应于 text_encoder 的 LoRA 层的状态字典。由于它来自 🤗 Transformers,必须显式传递文本编码器的 LoRA 状态字典。
  • text_encoder_2_lora_layers (Dict[str, torch.nn.Module]Dict[str, torch.Tensor]) — 与 text_encoder_2 对应的 LoRA 层的状态字典。必须显式地传递文本编码器的 LoRA 状态字典,因为它来自 🤗 Transformers。
  • is_main_process (bool,可选,默认为 True)— 调用此过程的进程是否是主进程。在分布式训练期间很有用,您需要在所有进程上调用此函数。在这种情况下,仅在主进程中设置 is_main_process=True 以避免竞争条件。
  • save_function (Callable)— 保存状态字典所使用的函数。在分布式训练期间非常有用,您需要用另一种方法替换 torch.save。可以通过环境变量 DIFFUSERS_SAVE_MODE 进行配置。
  • safe_serialization (bool, 可选, 默认值为 True) — 是否使用 safetensors 保存模型,或使用传统的 PyTorch pickle 方式。

保存对应 UNet 和文本编码器的 LoRA 参数。

AmusedLoraLoaderMixin

diffusers.loaders.AmusedLoraLoaderMixin

< >

( )

load_lora_into_transformer

< >

( state_dict network_alphas transformer adapter_name = None _pipeline = None )

参数

  • state_dict (dict) — 包含LoRA层参数的标准状态字典。键可以直接索引到unet,或者前缀为额外的unet,用于区分文本编码器LoRA层。
  • network_alphas (Dict[str, float]) — 参见LoRALinearLayer获取更多详情。
  • unet (UNet2DConditionModel) — 将LoRA层加载到其中的UNet模型。
  • adapter_name (str, 可选) — 用于引用已加载适配器模型的适配器名称。如果未指定,将使用 default_{i} 其中 i 是正在加载的总适配器数量。

这将在transformer中加载state_dict中指定的LoRA层。

LoraBaseMixin

diffusers.loaders.lora_base.LoraBaseMixin

< >

( )

处理LoRAs的实用类。

delete_adapters

< >

( adapter_names: 联合 )

参数

  • 删除 对于unet和text-encoder(s)的代码中adapter_name的LoRA层。 — adapter_names (联合[List[str], str]):要删除的适配器的名称。可以是单个字符串或字符串列表

融合LoRA

< >

( components: 列表 = [] lora_scale: 浮点数 = 1.0 safe_fusing: 布尔值 = False adapter_names: 可选型 = None **kwargs )

参数

  • lora_scale (浮点数, 默认为 1.0) — 控制LoRA参数对输出的影响程度。
  • safe_fusing (布尔值, 默认为 False) — 在融合之前检查融合的权重是否有NaN值,如果值为NaN则不融合。
  • adapter_names (字符串列表, 可选) — 要用于融合的适配器名称。如果不传递任何内容,将融合所有活动适配器。

将LoRA参数融合到对应块的原始参数中。

这是一个实验性API。

示例

from diffusers import DiffusionPipeline
import torch

pipeline = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16
).to("cuda")
pipeline.load_lora_weights("nerijs/pixel-art-xl", weight_name="pixel-art-xl.safetensors", adapter_name="pixel")
pipeline.fuse_lora(lora_scale=0.7)

get_active_adapters

< >

( )

获取当前活动适配器的列表。

示例

from diffusers import DiffusionPipeline

pipeline = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
).to("cuda")
pipeline.load_lora_weights("CiroN2022/toy-face", weight_name="toy_face_sdxl.safetensors", adapter_name="toy")
pipeline.get_active_adapters()

get_list_adapters

< >

( )

获取当前管道中所有可用适配器的列表。

set_lora_device

< >

( adapter_names: 列表 device: 并联 )

参数

  • adapter_names (列表[str]) — 发送设备到适配器的列表。
  • device (联合[torch.device, str, int]) — 发送适配器到的设备。可以是torch设备,字符串或整数。

将名单中列出的LoRAs移动到目标设备。当您想加载多个适配器并释放一些GPU内存时,将LoRA卸载到CPU很有用。

unfuse_lora

< >

( 组件: 列表 = [] **kwargs )

参数

  • components (List[str]) — 从中解融 LoRA 的可注入组件列表。
  • unfuse_unet (bool, 默认为 True) — 是否解融 UNet LoRA 参数。
  • unfuse_text_encoder (bool, 默认为 True) — 是否解融文本编码器 LoRA 参数。如果文本编码器没有使用 LoRA 参数 monkey-patch,则此操作不会有任何效果。

pipe.fuse_lora() 的效果相反。

这是一个实验性API。

unload_lora_weights

< >

( )

卸载 LoRA 参数。

示例

>>> # Assuming `pipeline` is already loaded with the LoRA parameters.
>>> pipeline.unload_lora_weights()
>>> ...
< > 更新于 GitHub