LoRA
LoRA 是一种快速轻量级的训练方法,它插入和训练比所有模型参数显著更少的参数。这产生了一个更小的文件(~100 MBs),并使得快速训练模型以学习新概念变得更容易。LoRA 权重通常加载到去噪器、文本编码器或两者都加载。去噪器通常对应于 UNet(例如 UNet2DConditionModel)或 Transformer(例如 SD3Transformer2DModel)。有几个类用于加载 LoRA 权重。
StableDiffusionLoraLoaderMixin
为加载和卸载、融合和解融、启用和禁用等功能提供了函数。这个类可以与任何模型一起使用。StableDiffusionXLLoraLoaderMixin
是用于加载和保存 LoRA 权重的StableDiffusionLoraLoaderMixin
类的 Stable Diffusion (SDXL) 版本。它只能用于 SDXL 模型。SD3LoraLoaderMixin
为 Stable Diffusion 3 提供了类似的功能。AmusedLoraLoaderMixin
适用于 AmusedPipeline。LoraBaseMixin
提供了一个基础类,其中包含多个实用方法,用于融合、解融、卸载 LoRA 以及更多。
有关如何加载 LoRA 权重的更多信息,请参阅 LoRA 加载指南。
StableDiffusionLoraLoaderMixin
将 LoRA 层加载到 Stable Diffusion 的 UNet2DConditionModel 和 CLIPTextModel
。
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
< source >( pretrained_model_name_or_path_or_dict: Union adapter_name = None **kwargs )
参数
- 预训练模型名称或路径或字典 (
str
或os.PathLike
或dict
) — 参见 lora_state_dict()。 - kwargs (
dict
, 可选) — 请参见lora_state_dict()。 - adapter_name (
str
, 可选) — 用于引用已加载适配器模型的适配器名称。若未指定,将使用default_{i}
,其中i是正在加载的适配器总数。
将pretrained_model_name_or_path_or_dict
中指定的LoRA权重加载到self.unet
和self.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 )
参数
- 预训练模型名称或路径或字典 (
str
或os.PathLike
或dict
) — 可以是:- 一个字符串,存储在Hub上的预训练模型的 模型ID(例如
google/ddpm-celebahq-256
)。 - 一个路径,指向包含使用 ModelMixin.save_pretrained() 保存的模型权重的 目录(例如
./my_model_directory
)。 - 一个 torch状态字典。
- 一个字符串,存储在Hub上的预训练模型的 模型ID(例如
- 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
或bool,可选) — 用作远程文件的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
将 LoRA 层加载到 Stable Diffusion XL 的 UNet2DConditionModel、CLIPTextModel 和 CLIPTextModelWithProjection。
load_lora_into_text_encoder
< source >( 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
) — 期望的text_encoder
的state_dict
的前缀。 - 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
) — 包含 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 )
参数
- 预训练模型名称或路径或字典 (
str
或os.PathLike
或dict
) — 请参阅 lora_state_dict()。 - adapter_name (
str
, 可选) — 用于引用加载的适配器模型的适配器名称。如果未指定,将使用default_{i}
,其中 i 是正在加载的适配器的总数。 - kwargs (
dict
, 可选) — 请参阅 lora_state_dict()。
将pretrained_model_name_or_path_or_dict
中指定的LoRA权重加载到self.unet
和self.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 (
str
或os.PathLike
或dict
) — 可以是以下之一:- 字符串,Hub 上托管的预训练模型的 模型 ID(例如
google/ddpm-celebahq-256
)。 - 包含使用ModelMixin.save_pretrained() 保存的模型权重的 目录路径(例如
./my_model_directory
)。 - torch 状态字典。
- 字符串,Hub 上托管的预训练模型的 模型 ID(例如
- 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
或 bool,可选) — 用于远程文件 HTTP 身份验证的令牌。如果设置为True
,则使用从diffusers-cli login
生成的令牌(存储在~/.huggingface
中)。 - 修订版本 (
str
,可选,默认为"main"
) — 要使用的特定模型版本。可以是分支名称、标签名称、提交ID或Git允许的任何标识符。 - 子文件夹 (
str
,可选,默认为""
) — 模型文件的子文件夹位置,位于Hub或本地的更大的模型仓库中。 - 权重名称 (
str
,可选,默认为 None) — 序列化状态字典文件的名称。
返回 lora 权重和网络 alpha 的状态字典。
我们有限度地支持加载 A1111 格式的 LoRA 检查点。
此函数是实验性的,可能在未来进行更改。
保存 lora 权重
< source >( 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 )
参数
- 保存目录 (
str
或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。 - 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
将LoRA层加载到SD3Transformer2DModel、CLIPTextModel
和CLIPTextModelWithProjection
中。
load_lora_into_text_encoder
< source >( 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
< source >( state_dict transformer adapter_name = None _pipeline = None )
这将在transformer
中加载state_dict
中指定的LoRA层。
load_lora_weights
< 源代码 >( pretrained_model_name_or_path_or_dict: Union adapter_name = None **kwargs )
参数
- 预训练模型名称、路径或字典 (
str
或os.PathLike
或dict
) — 请参阅 lora_state_dict()。 - kwargs (
dict
, 可选) — 请参阅 lora_state_dict()。 - adapter_name (
str
, 可选) — 将用于引用已加载的适配器模型的名字。如果未指定,将使用default_{i}
,其中 i 是正在加载的适配器总数。
将pretrained_model_name_or_path_or_dict
中指定的LoRA权重加载到self.unet
和self.text_encoder
中。
所有kwargs都转发到self.lora_state_dict
。
有关如何加载状态字典的更多详细信息,请参见lora_state_dict()。
详情请参考 ~loaders.StableDiffusionLoraLoaderMixin.load_lora_into_transformer
了解状态字典是如何加载到 self.transformer
中的。
lora_state_dict
< source >( 预训练模型名称或路径或字典: Union **kwargs )
参数
- pretrained_model_name_or_path_or_dict (
str
或os.PathLike
或dict
) — 可以是以下之一:- 一个字符串,Hugging Face Hub 上托管的一个预训练模型的 模型 id(例如
google/ddpm-celebahq-256
)。 - 一个包含使用 ModelMixin.save_pretrained() 保存的模型权重的 目录 路径(例如
./my_model_directory
)。 - torch 状态字典。
- 一个字符串,Hugging Face Hub 上托管的一个预训练模型的 模型 id(例如
- 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 (
str
或os.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
保存模型,或使用传统的 PyTorchpickle
方式。
保存对应 UNet 和文本编码器的 LoRA 参数。
AmusedLoraLoaderMixin
load_lora_into_transformer
< 源代码 >( state_dict network_alphas transformer adapter_name = None _pipeline = None )
这将在transformer
中加载state_dict
中指定的LoRA层。
LoraBaseMixin
处理LoRAs的实用类。
delete_adapters
< 来源 >( adapter_names: 联合 )
融合LoRA
< 来源 >( components: 列表 = [] lora_scale: 浮点数 = 1.0 safe_fusing: 布尔值 = False adapter_names: 可选型 = None **kwargs )
将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)
获取当前活动适配器的列表。
获取当前管道中所有可用适配器的列表。
set_lora_device
< 来源 >( adapter_names: 列表 device: 并联 )
将名单中列出的LoRAs移动到目标设备。当您想加载多个适配器并释放一些GPU内存时,将LoRA卸载到CPU很有用。
卸载 LoRA 参数。