diffusers 源码解析(六十三)
# 版权声明,表明该文件的版权归 HuggingFace 团队所有
# Copyright 2024 The HuggingFace Team. All rights reserved.
#
# 根据 Apache 许可证第 2.0 版(“许可证”)授权;
# 除非遵循许可证,否则您不能使用此文件。
# 您可以在以下地址获取许可证副本:
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# 除非适用法律或书面协议另有约定,否则根据许可证分发的软件是按“原样”提供的,
# 不提供任何形式的明示或暗示的担保或条件。
# 请参阅许可证以了解管理权限和限制的具体条款。
import importlib # 导入 importlib 模块以便动态导入模块
import os # 导入 os 模块以进行操作系统交互
from dataclasses import dataclass # 从 dataclasses 模块导入 dataclass 装饰器
from enum import Enum # 从 enum 模块导入 Enum 类以定义枚举
from typing import Optional, Union # 从 typing 模块导入 Optional 和 Union 类型提示
import torch # 导入 PyTorch 库以进行深度学习计算
from huggingface_hub.utils import validate_hf_hub_args # 导入验证 Hugging Face Hub 参数的工具函数
from ..utils import BaseOutput, PushToHubMixin # 从上级目录导入 BaseOutput 和 PushToHubMixin 类
SCHEDULER_CONFIG_NAME = "scheduler_config.json" # 定义调度器配置文件的名称
# 注意:将该类型定义为枚举类型,因为它简化了文档中的使用,并防止在调度器模块的 `_compatibles` 中产生循环导入。
# 当在管道中用作类型时,它实际上是一个联合类型,因为实际的调度器实例被传入。
class KarrasDiffusionSchedulers(Enum):
DDIMScheduler = 1 # 定义 DDIM 调度器的枚举值
DDPMScheduler = 2 # 定义 DDPMScheduler 调度器的枚举值
PNDMScheduler = 3 # 定义 PNDM 调度器的枚举值
LMSDiscreteScheduler = 4 # 定义 LMS 离散调度器的枚举值
EulerDiscreteScheduler = 5 # 定义 Euler 离散调度器的枚举值
HeunDiscreteScheduler = 6 # 定义 Heun 离散调度器的枚举值
EulerAncestralDiscreteScheduler = 7 # 定义 Euler 祖先离散调度器的枚举值
DPMSolverMultistepScheduler = 8 # 定义 DPM 求解器多步调度器的枚举值
DPMSolverSinglestepScheduler = 9 # 定义 DPM 求解器单步调度器的枚举值
KDPM2DiscreteScheduler = 10 # 定义 KDPM2 离散调度器的枚举值
KDPM2AncestralDiscreteScheduler = 11 # 定义 KDPM2 祖先离散调度器的枚举值
DEISMultistepScheduler = 12 # 定义 DEIS 多步调度器的枚举值
UniPCMultistepScheduler = 13 # 定义 UniPC 多步调度器的枚举值
DPMSolverSDEScheduler = 14 # 定义 DPM 求解器 SDE 调度器的枚举值
EDMEulerScheduler = 15 # 定义 EMD Euler 调度器的枚举值
# 定义一个字典,包含不同调度器的时间步和 sigma 值
AysSchedules = {
"StableDiffusionTimesteps": [999, 850, 736, 645, 545, 455, 343, 233, 124, 24], # 稳定扩散的时间步列表
"StableDiffusionSigmas": [14.615, 6.475, 3.861, 2.697, 1.886, 1.396, 0.963, 0.652, 0.399, 0.152, 0.0], # 稳定扩散的 sigma 值列表
"StableDiffusionXLTimesteps": [999, 845, 730, 587, 443, 310, 193, 116, 53, 13], # 稳定扩散 XL 的时间步列表
"StableDiffusionXLSigmas": [14.615, 6.315, 3.771, 2.181, 1.342, 0.862, 0.555, 0.380, 0.234, 0.113, 0.0], # 稳定扩散 XL 的 sigma 值列表
"StableDiffusionVideoSigmas": [700.00, 54.5, 15.886, 7.977, 4.248, 1.789, 0.981, 0.403, 0.173, 0.034, 0.0], # 稳定扩散视频的 sigma 值列表
}
@dataclass
class SchedulerOutput(BaseOutput): # 定义调度器输出类,继承自 BaseOutput
"""
调度器的 `step` 函数输出的基类。
参数:
prev_sample (`torch.Tensor`,形状为 `(batch_size, num_channels, height, width)` 的图像):
先前时间步的计算样本 `(x_{t-1})`。`prev_sample` 应用作去噪循环中的下一个模型输入。
"""
prev_sample: torch.Tensor # 定义 prev_sample 属性,类型为 torch.Tensor
class SchedulerMixin(PushToHubMixin): # 定义调度器混合类,继承自 PushToHubMixin
"""
所有调度器的基类。
[`SchedulerMixin`] 包含所有调度器共享的常用函数,例如通用的加载和保存功能。
[`ConfigMixin`] 负责存储传递的配置属性(如 `num_train_timesteps`)。
# 调度器的 `__init__` 函数,属性可通过 `scheduler.config.num_train_timesteps` 访问
# 类属性:
# - **_compatibles** (`List[str]`) -- 兼容父调度器类的调度器类列表
# 使用 [`~ConfigMixin.from_config`] 加载不同的兼容调度器类(应由父类重写)。
"""
# 配置名称设为调度器配置名称常量
config_name = SCHEDULER_CONFIG_NAME
# 初始化兼容调度器列表为空
_compatibles = []
# 指示存在兼容调度器
has_compatibles = True
# 类方法,允许从预训练模型加载
@classmethod
@validate_hf_hub_args
def from_pretrained(
cls,
# 预训练模型名称或路径(可选)
pretrained_model_name_or_path: Optional[Union[str, os.PathLike]] = None,
# 子文件夹(可选)
subfolder: Optional[str] = None,
# 是否返回未使用的参数
return_unused_kwargs=False,
# 其他参数
**kwargs,
# 保存调度器配置对象到指定目录
def save_pretrained(self, save_directory: Union[str, os.PathLike], push_to_hub: bool = False, **kwargs):
"""
将调度器配置对象保存到目录,以便使用
[`~SchedulerMixin.from_pretrained`] 类方法重新加载。
参数:
save_directory (`str` 或 `os.PathLike`):
配置 JSON 文件将保存的目录(如果不存在则创建)。
push_to_hub (`bool`, *可选*, 默认为 `False`):
保存后是否将模型推送到 Hugging Face Hub。可以使用 `repo_id` 指定要推送的
仓库(默认为 `save_directory` 的名称)。
kwargs (`Dict[str, Any]`, *可选*):
其他关键词参数,传递给 [`~utils.PushToHubMixin.push_to_hub`] 方法。
"""
# 保存配置,传入目录和推送标志及其他参数
self.save_config(save_directory=save_directory, push_to_hub=push_to_hub, **kwargs)
# 属性方法,返回与该调度器兼容的所有调度器
@property
def compatibles(self):
"""
返回与此调度器兼容的所有调度器
返回:
`List[SchedulerMixin]`: 兼容调度器的列表
"""
# 获取兼容调度器列表
return self._get_compatibles()
# 类方法,获取兼容类
@classmethod
def _get_compatibles(cls):
# 创建包含当前类名和兼容类名的唯一字符串列表
compatible_classes_str = list(set([cls.__name__] + cls._compatibles))
# 导入 diffusers 库
diffusers_library = importlib.import_module(__name__.split(".")[0])
# 获取存在的兼容类
compatible_classes = [
getattr(diffusers_library, c) for c in compatible_classes_str if hasattr(diffusers_library, c)
]
# 返回兼容类列表
return compatible_classes
# 版权声明,表明文件版权归 HuggingFace 团队所有
#
# 根据 Apache 许可证第 2.0 版("许可证")进行许可;
# 除非遵循许可证,否则不得使用此文件。
# 可在以下网址获取许可证副本:
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# 除非适用法律要求或书面同意,否则根据许可证分发的软件
# 以 "原样" 基础提供,不附带任何明示或暗示的担保或条件。
# 请参阅许可证以获取有关权限和
# 限制的具体语言。
import importlib # 导入 importlib 模块,用于动态导入模块
import math # 导入 math 模块,提供数学函数
import os # 导入 os 模块,用于操作系统相关的功能
from dataclasses import dataclass # 从 dataclasses 导入 dataclass,用于简化类定义
from enum import Enum # 从 enum 导入 Enum,用于创建枚举类型
from typing import Optional, Tuple, Union # 从 typing 导入类型提示工具
import flax # 导入 flax 库,用于构建和训练神经网络
import jax.numpy as jnp # 导入 jax.numpy 并重命名为 jnp,用于高性能数值计算
from huggingface_hub.utils import validate_hf_hub_args # 从 huggingface_hub.utils 导入验证函数
from ..utils import BaseOutput, PushToHubMixin # 从相对路径导入 BaseOutput 和 PushToHubMixin
SCHEDULER_CONFIG_NAME = "scheduler_config.json" # 定义调度器配置文件的名称
# 注意:将此类型定义为枚举简化了文档中的使用,并防止
# 在调度器模块内使用时出现循环导入。
# 当作为管道中的类型使用时,它实际上是一个联合,因为实际的
# 调度器实例会传入。
class FlaxKarrasDiffusionSchedulers(Enum):
FlaxDDIMScheduler = 1 # 定义 FlaxDDIM 调度器
FlaxDDPMScheduler = 2 # 定义 FlaxDDPM 调度器
FlaxPNDMScheduler = 3 # 定义 FlaxPNDM 调度器
FlaxLMSDiscreteScheduler = 4 # 定义 FlaxLMS 离散调度器
FlaxDPMSolverMultistepScheduler = 5 # 定义 FlaxDPM 多步求解器调度器
FlaxEulerDiscreteScheduler = 6 # 定义 FlaxEuler 离散调度器
@dataclass
class FlaxSchedulerOutput(BaseOutput):
"""
调度器步函数输出的基类。
参数:
prev_sample (`jnp.ndarray`,形状为 `(batch_size, num_channels, height, width)` 的图像):
计算的前一时间步样本 (x_{t-1})。`prev_sample` 应在
去噪循环中用作下一个模型输入。
"""
prev_sample: jnp.ndarray # 定义前一时间步样本的属性
class FlaxSchedulerMixin(PushToHubMixin):
"""
包含调度器通用功能的混入类。
类属性:
- **_compatibles** (`List[str]`) -- 兼容父类的类列表,以便
可以从与保存配置不同的类使用 `from_config`(应由父类重写)。
"""
config_name = SCHEDULER_CONFIG_NAME # 设置配置名称属性
ignore_for_config = ["dtype"] # 定义在配置中忽略的属性
_compatibles = [] # 初始化兼容类的空列表
has_compatibles = True # 设置兼容类存在的标志
@classmethod
@validate_hf_hub_args # 应用装饰器以验证 Hugging Face Hub 参数
def from_pretrained(
cls,
pretrained_model_name_or_path: Optional[Union[str, os.PathLike]] = None, # 预训练模型名称或路径
subfolder: Optional[str] = None, # 子文件夹参数
return_unused_kwargs=False, # 是否返回未使用的关键字参数
**kwargs, # 其他可选关键字参数
# 定义一个保存预训练模型配置的方法,接受保存目录和其他参数
def save_pretrained(self, save_directory: Union[str, os.PathLike], push_to_hub: bool = False, **kwargs):
# 保存调度器配置对象到指定目录,以便后续可以使用从预训练加载方法重新加载
"""
Save a scheduler configuration object to the directory `save_directory`, so that it can be re-loaded using the
[`~FlaxSchedulerMixin.from_pretrained`] class method.
Args:
save_directory (`str` or `os.PathLike`):
Directory where the configuration JSON file will be saved (will be created if it does not exist).
push_to_hub (`bool`, *optional*, defaults to `False`):
Whether or not to push your model to the Hugging Face Hub after saving it. You can specify the
repository you want to push to with `repo_id` (will default to the name of `save_directory` in your
namespace).
kwargs (`Dict[str, Any]`, *optional*):
Additional keyword arguments passed along to the [`~utils.PushToHubMixin.push_to_hub`] method.
"""
# 调用保存配置的方法,传入保存目录、是否推送到 Hub 及其他参数
self.save_config(save_directory=save_directory, push_to_hub=push_to_hub, **kwargs)
# 定义一个属性,返回与当前调度器兼容的所有调度器
@property
def compatibles(self):
# 返回与该调度器兼容的调度器列表
"""
Returns all schedulers that are compatible with this scheduler
Returns:
`List[SchedulerMixin]`: List of compatible schedulers
"""
# 调用获取兼容调度器的方法并返回结果
return self._get_compatibles()
# 定义一个类方法,用于获取兼容的调度器类
@classmethod
def _get_compatibles(cls):
# 获取当前类名及其兼容类名的集合
compatible_classes_str = list(set([cls.__name__] + cls._compatibles))
# 导入当前模块的主库
diffusers_library = importlib.import_module(__name__.split(".")[0])
# 遍历兼容类名列表,获取存在于库中的类
compatible_classes = [
getattr(diffusers_library, c) for c in compatible_classes_str if hasattr(diffusers_library, c)
]
# 返回兼容类列表
return compatible_classes
# 定义一个函数,用于从左侧广播数组到指定形状
def broadcast_to_shape_from_left(x: jnp.ndarray, shape: Tuple[int]) -> jnp.ndarray:
# 断言目标形状的维度不小于输入数组的维度
assert len(shape) >= x.ndim
# 将输入数组重塑为目标形状,并进行广播
return jnp.broadcast_to(x.reshape(x.shape + (1,) * (len(shape) - x.ndim)), shape)
# 定义一个函数,生成beta调度以离散化给定的alpha_t_bar函数
def betas_for_alpha_bar(num_diffusion_timesteps: int, max_beta=0.999, dtype=jnp.float32) -> jnp.ndarray:
"""
创建一个beta调度,离散化给定的alpha_t_bar函数,定义(1-beta)的累积乘积。
包含一个alpha_bar函数,该函数将参数t转化为(1-beta)的累积乘积。
Args:
num_diffusion_timesteps (`int`): 生成的beta数量。
max_beta (`float`): 最大beta值;使用小于1的值以避免奇异性。
Returns:
betas (`jnp.ndarray`): 调度器用来更新模型输出的betas
"""
# 定义一个内部函数,计算给定时间步的alpha_bar值
def alpha_bar(time_step):
return math.cos((time_step + 0.008) / 1.008 * math.pi / 2) ** 2
# 初始化betas列表
betas = []
# 遍历每个扩散时间步
for i in range(num_diffusion_timesteps):
# 计算当前和下一个时间步
t1 = i / num_diffusion_timesteps
t2 = (i + 1) / num_diffusion_timesteps
# 将计算出的beta添加到列表中,限制其最大值
betas.append(min(1 - alpha_bar(t2) / alpha_bar(t1), max_beta))
# 返回beta数组
return jnp.array(betas, dtype=dtype)
# 定义一个数据类,用于表示通用调度器的状态
@flax.struct.dataclass
class CommonSchedulerState:
alphas: jnp.ndarray
betas: jnp.ndarray
alphas_cumprod: jnp.ndarray
# 定义一个类方法,用于创建调度器状态
@classmethod
def create(cls, scheduler):
config = scheduler.config
# 检查配置中是否有训练好的betas
if config.trained_betas is not None:
# 将训练好的betas转换为数组
betas = jnp.asarray(config.trained_betas, dtype=scheduler.dtype)
# 根据配置选择不同的beta调度
elif config.beta_schedule == "linear":
# 创建线性beta调度
betas = jnp.linspace(config.beta_start, config.beta_end, config.num_train_timesteps, dtype=scheduler.dtype)
elif config.beta_schedule == "scaled_linear":
# 创建特定于潜在扩散模型的调度
betas = (
jnp.linspace(
config.beta_start**0.5, config.beta_end**0.5, config.num_train_timesteps, dtype=scheduler.dtype
)
** 2
)
elif config.beta_schedule == "squaredcos_cap_v2":
# 使用Glide余弦调度
betas = betas_for_alpha_bar(config.num_train_timesteps, dtype=scheduler.dtype)
else:
# 如果beta调度未实现,则抛出错误
raise NotImplementedError(
f"beta_schedule {config.beta_schedule} is not implemented for scheduler {scheduler.__class__.__name__}"
)
# 计算alphas为1减去betas
alphas = 1.0 - betas
# 计算累积的alphas乘积
alphas_cumprod = jnp.cumprod(alphas, axis=0)
# 返回包含alphas、betas和alphas_cumprod的调度器状态
return cls(
alphas=alphas,
betas=betas,
alphas_cumprod=alphas_cumprod,
)
# 定义一个函数,获取平方根的alphas乘积
def get_sqrt_alpha_prod(
state: CommonSchedulerState, original_samples: jnp.ndarray, noise: jnp.ndarray, timesteps: jnp.ndarray
):
# 获取当前状态的alphas累积乘积
alphas_cumprod = state.alphas_cumprod
# 计算对应时间步的平方根alphas乘积
sqrt_alpha_prod = alphas_cumprod[timesteps] ** 0.5
# 将 sqrt_alpha_prod 转换为一维数组
sqrt_alpha_prod = sqrt_alpha_prod.flatten()
# 将一维数组根据原始样本形状从左侧广播扩展
sqrt_alpha_prod = broadcast_to_shape_from_left(sqrt_alpha_prod, original_samples.shape)
# 计算 1 减去 alpha 累积乘积的平方根
sqrt_one_minus_alpha_prod = (1 - alphas_cumprod[timesteps]) ** 0.5
# 将 sqrt_one_minus_alpha_prod 转换为一维数组
sqrt_one_minus_alpha_prod = sqrt_one_minus_alpha_prod.flatten()
# 将一维数组根据原始样本形状从左侧广播扩展
sqrt_one_minus_alpha_prod = broadcast_to_shape_from_left(sqrt_one_minus_alpha_prod, original_samples.shape)
# 返回 sqrt_alpha_prod 和 sqrt_one_minus_alpha_prod 两个结果
return sqrt_alpha_prod, sqrt_one_minus_alpha_prod
# 定义一个函数,添加噪声到原始样本
def add_noise_common(
# 接受调度状态、原始样本、噪声和时间步长作为参数
state: CommonSchedulerState, original_samples: jnp.ndarray, noise: jnp.ndarray, timesteps: jnp.ndarray
):
# 计算平方根的 alpha 和 (1-alpha) 的乘积
sqrt_alpha_prod, sqrt_one_minus_alpha_prod = get_sqrt_alpha_prod(state, original_samples, noise, timesteps)
# 生成带噪声的样本,结合原始样本和噪声
noisy_samples = sqrt_alpha_prod * original_samples + sqrt_one_minus_alpha_prod * noise
# 返回带噪声的样本
return noisy_samples
# 定义一个函数,计算样本的速度
def get_velocity_common(state: CommonSchedulerState, sample: jnp.ndarray, noise: jnp.ndarray, timesteps: jnp.ndarray):
# 计算平方根的 alpha 和 (1-alpha) 的乘积
sqrt_alpha_prod, sqrt_one_minus_alpha_prod = get_sqrt_alpha_prod(state, sample, noise, timesteps)
# 根据噪声和样本计算速度
velocity = sqrt_alpha_prod * noise - sqrt_one_minus_alpha_prod * sample
# 返回计算得到的速度
return velocity
# 版权所有 2024 Microsoft 和 HuggingFace 团队。保留所有权利。
#
# 根据 Apache 许可证第 2.0 版(“许可证”)授权;
# 除非遵循许可证,否则您不得使用此文件。
# 您可以在以下网址获取许可证副本:
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# 除非适用法律或书面协议另有规定,软件在许可证下按“原样”分发,
# 不附有任何形式的保证或条件,无论是明示还是暗示的。
# 有关许可证所适用的权限和限制,请参见许可证。
# 从数据类导入装饰器
from dataclasses import dataclass
# 从类型导入可选类型、元组和联合
from typing import Optional, Tuple, Union
# 导入 NumPy 库并命名为 np
import numpy as np
# 导入 PyTorch 库
import torch
# 导入 PyTorch 的功能模块
import torch.nn.functional as F
# 从配置实用工具中导入 ConfigMixin 和 register_to_config
from ..configuration_utils import ConfigMixin, register_to_config
# 从实用程序中导入 BaseOutput
from ..utils import BaseOutput
# 从调度实用工具中导入 SchedulerMixin
from .scheduling_utils import SchedulerMixin
# 定义调度器输出类,继承自 BaseOutput
@dataclass
class VQDiffusionSchedulerOutput(BaseOutput):
"""
调度器步骤函数输出的输出类。
参数:
prev_sample (`torch.LongTensor`,形状为 `(batch size, num latent pixels)`):
上一时间步的计算样本 x_{t-1}。`prev_sample` 应用作去噪循环中的下一个模型输入。
"""
# 上一时间步的样本
prev_sample: torch.LongTensor
# 将类索引批次转换为批次的对数 onehot 向量
def index_to_log_onehot(x: torch.LongTensor, num_classes: int) -> torch.Tensor:
"""
将类索引的向量批次转换为对数 onehot 向量批次。
参数:
x (`torch.LongTensor`,形状为 `(batch size, vector length)`):
类索引的批次
num_classes (`int`):
用于 onehot 向量的类别数量
返回:
`torch.Tensor`,形状为 `(batch size, num classes, vector length)`:
对数 onehot 向量
"""
# 将类索引转换为 onehot 向量
x_onehot = F.one_hot(x, num_classes)
# 重新排列维度
x_onehot = x_onehot.permute(0, 2, 1)
# 计算对数并防止出现无穷大
log_x = torch.log(x_onehot.float().clamp(min=1e-30))
# 返回对数 onehot 向量
return log_x
# 对 logits 应用 Gumbel 噪声
def gumbel_noised(logits: torch.Tensor, generator: Optional[torch.Generator]) -> torch.Tensor:
"""
对 `logits` 应用 Gumbel 噪声
"""
# 生成与 logits 形状相同的均匀随机数
uniform = torch.rand(logits.shape, device=logits.device, generator=generator)
# 计算 Gumbel 噪声
gumbel_noise = -torch.log(-torch.log(uniform + 1e-30) + 1e-30)
# 将噪声添加到 logits
noised = gumbel_noise + logits
# 返回加噪后的 logits
return noised
# 定义累积和非累积的 alpha 调度
def alpha_schedules(num_diffusion_timesteps: int, alpha_cum_start=0.99999, alpha_cum_end=0.000009):
"""
累积和非累积的 alpha 调度。
请参阅第 4.1 节。
"""
# 计算 alpha 调度值
att = (
np.arange(0, num_diffusion_timesteps) / (num_diffusion_timesteps - 1) * (alpha_cum_end - alpha_cum_start)
+ alpha_cum_start
)
# 在前面添加 1
att = np.concatenate(([1], att))
# 计算非累积 alpha
at = att[1:] / att[:-1]
# 在最后添加 1
att = np.concatenate((att[1:], [1]))
# 返回非累积和累积的 alpha
return at, att
# 定义累积和非累积的 gamma 调度
def gamma_schedules(num_diffusion_timesteps: int, gamma_cum_start=0.000009, gamma_cum_end=0.99999):
"""
累积和非累积的 gamma 调度。
请参阅第 4.1 节。
"""
# 计算归一化的累积gamma值,范围从gamma_cum_start到gamma_cum_end
ctt = (
np.arange(0, num_diffusion_timesteps) / (num_diffusion_timesteps - 1) * (gamma_cum_end - gamma_cum_start)
+ gamma_cum_start
)
# 在计算后的数组前添加0,以形成新数组ctt
ctt = np.concatenate(([0], ctt))
# 计算1减去ctt的值
one_minus_ctt = 1 - ctt
# 计算一阶差分,即当前值与前一个值的比值
one_minus_ct = one_minus_ctt[1:] / one_minus_ctt[:-1]
# 计算ct的值,即1减去one_minus_ct
ct = 1 - one_minus_ct
# 重新组织ctt数组,将最后一个元素替换为0
ctt = np.concatenate((ctt[1:], [0]))
# 返回ct和ctt两个数组
return ct, ctt
# 定义一个用于向量量化扩散调度的类,继承自 SchedulerMixin 和 ConfigMixin
class VQDiffusionScheduler(SchedulerMixin, ConfigMixin):
"""
向量量化扩散的调度器。
该模型继承自 [`SchedulerMixin`] 和 [`ConfigMixin`]。有关库实现的所有调度器的通用方法,请查看超类文档。
参数:
num_vec_classes (`int`):
潜在像素的向量嵌入的类别数量,包括被遮罩潜在像素的类别。
num_train_timesteps (`int`, defaults to 100):
训练模型的扩散步骤数量。
alpha_cum_start (`float`, defaults to 0.99999):
起始累积 alpha 值。
alpha_cum_end (`float`, defaults to 0.00009):
结束累积 alpha 值。
gamma_cum_start (`float`, defaults to 0.00009):
起始累积 gamma 值。
gamma_cum_end (`float`, defaults to 0.99999):
结束累积 gamma 值。
"""
# 设置调度器的顺序
order = 1
# 注册初始化方法到配置中
@register_to_config
def __init__(
self,
num_vec_classes: int, # 向量类别数量
num_train_timesteps: int = 100, # 默认训练时间步数
alpha_cum_start: float = 0.99999, # 默认起始累积 alpha
alpha_cum_end: float = 0.000009, # 默认结束累积 alpha
gamma_cum_start: float = 0.000009, # 默认起始累积 gamma
gamma_cum_end: float = 0.99999, # 默认结束累积 gamma
):
# 保存向量嵌入类别数量
self.num_embed = num_vec_classes
# 根据约定,遮罩类的索引为最后一个类别索引
self.mask_class = self.num_embed - 1
# 计算 alpha 和 gamma 的调度值
at, att = alpha_schedules(num_train_timesteps, alpha_cum_start=alpha_cum_start, alpha_cum_end=alpha_cum_end)
ct, ctt = gamma_schedules(num_train_timesteps, gamma_cum_start=gamma_cum_start, gamma_cum_end=gamma_cum_end)
# 计算非遮罩类的数量
num_non_mask_classes = self.num_embed - 1
# 计算 bt 和 btt 值
bt = (1 - at - ct) / num_non_mask_classes
btt = (1 - att - ctt) / num_non_mask_classes
# 转换为张量,确保数据类型为 float64
at = torch.tensor(at.astype("float64"))
bt = torch.tensor(bt.astype("float64"))
ct = torch.tensor(ct.astype("float64"))
log_at = torch.log(at) # 计算 at 的对数
log_bt = torch.log(bt) # 计算 bt 的对数
log_ct = torch.log(ct) # 计算 ct 的对数
# 转换 att, btt 和 ctt 为张量
att = torch.tensor(att.astype("float64"))
btt = torch.tensor(btt.astype("float64"))
ctt = torch.tensor(ctt.astype("float64"))
log_cumprod_at = torch.log(att) # 计算 att 的对数
log_cumprod_bt = torch.log(btt) # 计算 btt 的对数
log_cumprod_ct = torch.log(ctt) # 计算 ctt 的对数
# 将对数值转换为 float 类型并保存
self.log_at = log_at.float()
self.log_bt = log_bt.float()
self.log_ct = log_ct.float()
self.log_cumprod_at = log_cumprod_at.float()
self.log_cumprod_bt = log_cumprod_bt.float()
self.log_cumprod_ct = log_cumprod_ct.float()
# 可设置的推理步骤数量
self.num_inference_steps = None
# 创建时间步张量,逆序排列
self.timesteps = torch.from_numpy(np.arange(0, num_train_timesteps)[::-1].copy())
# 定义设置离散时间步的函数,用于扩散链(在推断之前运行)
def set_timesteps(self, num_inference_steps: int, device: Union[str, torch.device] = None):
# 文档字符串,说明函数的参数和用途
"""
Sets the discrete timesteps used for the diffusion chain (to be run before inference).
Args:
num_inference_steps (`int`):
The number of diffusion steps used when generating samples with a pre-trained model.
device (`str` or `torch.device`, *optional*):
The device to which the timesteps and diffusion process parameters (alpha, beta, gamma) should be moved
to.
"""
# 将输入的推断步数赋值给实例变量
self.num_inference_steps = num_inference_steps
# 创建一个从 num_inference_steps 到 0 的倒序时间步数组
timesteps = np.arange(0, self.num_inference_steps)[::-1].copy()
# 将时间步数组转换为 PyTorch 张量并移动到指定设备
self.timesteps = torch.from_numpy(timesteps).to(device)
# 将日志参数移动到指定设备
self.log_at = self.log_at.to(device)
self.log_bt = self.log_bt.to(device)
self.log_ct = self.log_ct.to(device)
self.log_cumprod_at = self.log_cumprod_at.to(device)
self.log_cumprod_bt = self.log_cumprod_bt.to(device)
self.log_cumprod_ct = self.log_cumprod_ct.to(device)
# 定义步骤函数,用于执行单次推断
def step(
# 输入的模型输出张量
model_output: torch.Tensor,
# 当前的时间步长
timestep: torch.long,
# 样本张量
sample: torch.LongTensor,
# 可选的随机数生成器
generator: Optional[torch.Generator] = None,
# 返回字典的标志
return_dict: bool = True,
) -> Union[VQDiffusionSchedulerOutput, Tuple]:
"""
从前一个时间步预测样本,通过反向转移分布。有关如何计算分布的更多细节,请参见
[`~VQDiffusionScheduler.q_posterior`]。
参数:
log_p_x_0: (`torch.Tensor`,形状为`(batch size, num classes - 1, num latent pixels)`):
初始潜在像素预测类别的对数概率。不包括被遮盖类别的预测,因为初始未噪声图像不能被遮盖。
t (`torch.long`):
确定使用哪些转移矩阵的时间步。
x_t (`torch.LongTensor`,形状为`(batch size, num latent pixels)`):
时间`t`时每个潜在像素的类别。
generator (`torch.Generator`,或`None`):
用于在从`p(x_{t-1} | x_t)`中采样之前施加的噪声的随机数生成器。
return_dict (`bool`,*可选*,默认值为`True`):
是否返回[`~schedulers.scheduling_vq_diffusion.VQDiffusionSchedulerOutput`]或`tuple`。
返回:
[`~schedulers.scheduling_vq_diffusion.VQDiffusionSchedulerOutput`]或`tuple`:
如果`return_dict`为`True`,则返回[`~schedulers.scheduling_vq_diffusion.VQDiffusionSchedulerOutput`],
否则返回一个元组,元组的第一个元素是样本张量。
"""
# 如果时间步为0,则将模型输出赋值给log_p_x_t_min_1
if timestep == 0:
log_p_x_t_min_1 = model_output
else:
# 使用后验分布函数计算log_p_x_t_min_1
log_p_x_t_min_1 = self.q_posterior(model_output, sample, timestep)
# 对log_p_x_t_min_1施加Gumbel噪声
log_p_x_t_min_1 = gumbel_noised(log_p_x_t_min_1, generator)
# 找到log_p_x_t_min_1中最大值的索引,得到x_t_min_1
x_t_min_1 = log_p_x_t_min_1.argmax(dim=1)
# 如果return_dict为False,则返回x_t_min_1的元组
if not return_dict:
return (x_t_min_1,)
# 返回一个VQDiffusionSchedulerOutput对象,包含前一个样本x_t_min_1
return VQDiffusionSchedulerOutput(prev_sample=x_t_min_1)
# 定义一个方法,用于计算从已知类别到已知类别的转移概率的对数
def log_Q_t_transitioning_to_known_class(
self, *, t: torch.int, x_t: torch.LongTensor, log_onehot_x_t: torch.Tensor, cumulative: bool
# 定义一个方法,应用累积转移
def apply_cumulative_transitions(self, q, t):
# 获取输入q的批大小
bsz = q.shape[0]
# 获取时间步t的对数累积概率
a = self.log_cumprod_at[t]
b = self.log_cumprod_bt[t]
c = self.log_cumprod_ct[t]
# 获取潜在像素的数量
num_latent_pixels = q.shape[2]
# 扩展c的形状以匹配bsz和num_latent_pixels
c = c.expand(bsz, 1, num_latent_pixels)
# 将q与a相加并进行logaddexp操作与b合并
q = (q + a).logaddexp(b)
# 在最后一个维度上将c与q进行拼接
q = torch.cat((q, c), dim=1)
# 返回更新后的q
return q
# 版权声明,表明版权归 HuggingFace 团队所有
#
# 根据 Apache 许可证第 2.0 版(“许可证”)许可;
# 除非遵循许可证,否则不得使用本文件。
# 可以在以下地址获取许可证副本:
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# 除非根据适用法律或书面协议另有规定,
# 否则根据许可证分发的软件是以“原样”方式提供的,
# 不附有任何明示或暗示的担保或条件。
# 请参阅许可证以了解管理权限和
# 限制的特定语言。
# 引入类型检查相关模块
from typing import TYPE_CHECKING
# 从 utils 模块引入多个工具函数和常量
from ..utils import (
DIFFUSERS_SLOW_IMPORT, # 用于慢导入的常量
OptionalDependencyNotAvailable, # 表示可选依赖不可用的异常
_LazyModule, # 延迟加载模块的工具
get_objects_from_module, # 从模块中获取对象的工具
is_flax_available, # 检查 Flax 库是否可用的函数
is_scipy_available, # 检查 SciPy 库是否可用的函数
is_torch_available, # 检查 PyTorch 库是否可用的函数
is_torchsde_available, # 检查 PyTorch SDE 是否可用的函数
)
# 初始化一个空字典用于存储虚拟模块
_dummy_modules = {}
# 初始化一个空字典用于存储导入结构
_import_structure = {}
# 尝试检查是否可用 PyTorch 库
try:
if not is_torch_available(): # 如果 PyTorch 不可用
raise OptionalDependencyNotAvailable() # 抛出可选依赖不可用异常
except OptionalDependencyNotAvailable: # 捕获可选依赖不可用异常
from ..utils import dummy_pt_objects # 引入虚拟 PyTorch 对象
_dummy_modules.update(get_objects_from_module(dummy_pt_objects)) # 更新虚拟模块字典
else: # 如果没有异常抛出
# 定义导入结构的不同部分及其包含的调度器
_import_structure["deprecated"] = ["KarrasVeScheduler", "ScoreSdeVpScheduler"] # 过时的调度器
_import_structure["scheduling_amused"] = ["AmusedScheduler"] # Amused 调度器
_import_structure["scheduling_consistency_decoder"] = ["ConsistencyDecoderScheduler"] # 一致性解码器调度器
_import_structure["scheduling_consistency_models"] = ["CMStochasticIterativeScheduler"] # 一致性模型调度器
_import_structure["scheduling_ddim"] = ["DDIMScheduler"] # DDIM 调度器
_import_structure["scheduling_ddim_cogvideox"] = ["CogVideoXDDIMScheduler"] # CogVideoX DDIM 调度器
_import_structure["scheduling_ddim_inverse"] = ["DDIMInverseScheduler"] # DDIM 反向调度器
_import_structure["scheduling_ddim_parallel"] = ["DDIMParallelScheduler"] # DDIM 并行调度器
_import_structure["scheduling_ddpm"] = ["DDPMScheduler"] # DDPM 调度器
_import_structure["scheduling_ddpm_parallel"] = ["DDPMParallelScheduler"] # DDPM 并行调度器
_import_structure["scheduling_ddpm_wuerstchen"] = ["DDPMWuerstchenScheduler"] # DDPM Wuerstchen 调度器
_import_structure["scheduling_deis_multistep"] = ["DEISMultistepScheduler"] # DEIS 多步骤调度器
_import_structure["scheduling_dpm_cogvideox"] = ["CogVideoXDPMScheduler"] # CogVideoX DPM 调度器
_import_structure["scheduling_dpmsolver_multistep"] = ["DPMSolverMultistepScheduler"] # DPM 求解器多步骤调度器
_import_structure["scheduling_dpmsolver_multistep_inverse"] = ["DPMSolverMultistepInverseScheduler"] # DPM 求解器多步骤反向调度器
_import_structure["scheduling_dpmsolver_singlestep"] = ["DPMSolverSinglestepScheduler"] # DPM 求解器单步骤调度器
_import_structure["scheduling_edm_dpmsolver_multistep"] = ["EDMDPMSolverMultistepScheduler"] # EDM DPM 求解器多步骤调度器
_import_structure["scheduling_edm_euler"] = ["EDMEulerScheduler"] # EDM Euler 调度器
_import_structure["scheduling_euler_ancestral_discrete"] = ["EulerAncestralDiscreteScheduler"] # Euler 祖先离散调度器
_import_structure["scheduling_euler_discrete"] = ["EulerDiscreteScheduler"] # Euler 离散调度器
_import_structure["scheduling_flow_match_euler_discrete"] = ["FlowMatchEulerDiscreteScheduler"] # 流匹配 Euler 离散调度器
# 将调度器的名称映射到其对应的类,方便后续导入
_import_structure["scheduling_flow_match_heun_discrete"] = ["FlowMatchHeunDiscreteScheduler"]
# 将调度器的名称映射到其对应的类,方便后续导入
_import_structure["scheduling_heun_discrete"] = ["HeunDiscreteScheduler"]
# 将调度器的名称映射到其对应的类,方便后续导入
_import_structure["scheduling_ipndm"] = ["IPNDMScheduler"]
# 将调度器的名称映射到其对应的类,方便后续导入
_import_structure["scheduling_k_dpm_2_ancestral_discrete"] = ["KDPM2AncestralDiscreteScheduler"]
# 将调度器的名称映射到其对应的类,方便后续导入
_import_structure["scheduling_k_dpm_2_discrete"] = ["KDPM2DiscreteScheduler"]
# 将调度器的名称映射到其对应的类,方便后续导入
_import_structure["scheduling_lcm"] = ["LCMScheduler"]
# 将调度器的名称映射到其对应的类,方便后续导入
_import_structure["scheduling_pndm"] = ["PNDMScheduler"]
# 将调度器的名称映射到其对应的类,方便后续导入
_import_structure["scheduling_repaint"] = ["RePaintScheduler"]
# 将调度器的名称映射到其对应的类,方便后续导入
_import_structure["scheduling_sasolver"] = ["SASolverScheduler"]
# 将调度器的名称映射到其对应的类,方便后续导入
_import_structure["scheduling_sde_ve"] = ["ScoreSdeVeScheduler"]
# 将调度器的名称映射到其对应的类,方便后续导入
_import_structure["scheduling_tcd"] = ["TCDScheduler"]
# 将调度器的名称映射到其对应的类,方便后续导入
_import_structure["scheduling_unclip"] = ["UnCLIPScheduler"]
# 将调度器的名称映射到其对应的类,方便后续导入
_import_structure["scheduling_unipc_multistep"] = ["UniPCMultistepScheduler"]
# 将调度器的名称映射到其对应的类,方便后续导入,包含多个调度器
_import_structure["scheduling_utils"] = ["AysSchedules", "KarrasDiffusionSchedulers", "SchedulerMixin"]
# 将调度器的名称映射到其对应的类,方便后续导入
_import_structure["scheduling_vq_diffusion"] = ["VQDiffusionScheduler"]
try:
# 检查 Flax 库是否可用
if not is_flax_available():
# 如果不可用,抛出自定义异常
raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
# 导入虚假的 Flax 对象,避免依赖缺失的问题
from ..utils import dummy_flax_objects # noqa F403
# 更新虚假模块,添加从虚假 Flax 对象中获取的内容
_dummy_modules.update(get_objects_from_module(dummy_flax_objects))
else:
# 更新导入结构,添加 Flax 相关的调度器
_import_structure["scheduling_ddim_flax"] = ["FlaxDDIMScheduler"]
_import_structure["scheduling_ddpm_flax"] = ["FlaxDDPMScheduler"]
_import_structure["scheduling_dpmsolver_multistep_flax"] = ["FlaxDPMSolverMultistepScheduler"]
_import_structure["scheduling_euler_discrete_flax"] = ["FlaxEulerDiscreteScheduler"]
_import_structure["scheduling_karras_ve_flax"] = ["FlaxKarrasVeScheduler"]
_import_structure["scheduling_lms_discrete_flax"] = ["FlaxLMSDiscreteScheduler"]
_import_structure["scheduling_pndm_flax"] = ["FlaxPNDMScheduler"]
_import_structure["scheduling_sde_ve_flax"] = ["FlaxScoreSdeVeScheduler"]
_import_structure["scheduling_utils_flax"] = [
"FlaxKarrasDiffusionSchedulers",
"FlaxSchedulerMixin",
"FlaxSchedulerOutput",
"broadcast_to_shape_from_left",
]
try:
# 检查 Torch 和 SciPy 库是否同时可用
if not (is_torch_available() and is_scipy_available()):
# 如果任何一个不可用,抛出自定义异常
raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
# 导入虚假的 Torch 和 SciPy 对象,避免依赖缺失的问题
from ..utils import dummy_torch_and_scipy_objects # noqa F403
# 更新虚假模块,添加从虚假对象中获取的内容
_dummy_modules.update(get_objects_from_module(dummy_torch_and_scipy_objects))
else:
# 更新导入结构,添加 LMS 调度器
_import_structure["scheduling_lms_discrete"] = ["LMSDiscreteScheduler"]
try:
# 检查 Torch 和 TorchSDE 库是否同时可用
if not (is_torch_available() and is_torchsde_available()):
# 如果任何一个不可用,抛出自定义异常
raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
# 导入虚假的 Torch 和 TorchSDE 对象,避免依赖缺失的问题
from ..utils import dummy_torch_and_torchsde_objects # noqa F403
# 更新虚假模块,添加从虚假对象中获取的内容
_dummy_modules.update(get_objects_from_module(dummy_torch_and_torchsde_objects))
else:
# 更新导入结构,添加 Cosine DPMSolver 多步调度器和 DPMSolver SDE 调度器
_import_structure["scheduling_cosine_dpmsolver_multistep"] = ["CosineDPMSolverMultistepScheduler"]
_import_structure["scheduling_dpmsolver_sde"] = ["DPMSolverSDEScheduler"]
# 检查类型注解或慢速导入标志
if TYPE_CHECKING or DIFFUSERS_SLOW_IMPORT:
# 导入必要的工具函数和异常处理
from ..utils import (
OptionalDependencyNotAvailable,
is_flax_available,
is_scipy_available,
is_torch_available,
is_torchsde_available,
)
try:
# 检查 Torch 库是否可用
if not is_torch_available():
# 如果不可用,抛出自定义异常
raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
# 导入虚假的 PyTorch 对象,避免依赖缺失的问题
from ..utils.dummy_pt_objects import * # noqa F403
else: # 如果不满足之前的条件,则执行以下导入操作
# 从 deprecated 模块导入 KarrasVeScheduler 和 ScoreSdeVpScheduler
from .deprecated import KarrasVeScheduler, ScoreSdeVpScheduler
# 从 scheduling_amused 模块导入 AmusedScheduler
from .scheduling_amused import AmusedScheduler
# 从 scheduling_consistency_decoder 模块导入 ConsistencyDecoderScheduler
from .scheduling_consistency_decoder import ConsistencyDecoderScheduler
# 从 scheduling_consistency_models 模块导入 CMStochasticIterativeScheduler
from .scheduling_consistency_models import CMStochasticIterativeScheduler
# 从 scheduling_ddim 模块导入 DDIMScheduler
from .scheduling_ddim import DDIMScheduler
# 从 scheduling_ddim_cogvideox 模块导入 CogVideoXDDIMScheduler
from .scheduling_ddim_cogvideox import CogVideoXDDIMScheduler
# 从 scheduling_ddim_inverse 模块导入 DDIMInverseScheduler
from .scheduling_ddim_inverse import DDIMInverseScheduler
# 从 scheduling_ddim_parallel 模块导入 DDIMParallelScheduler
from .scheduling_ddim_parallel import DDIMParallelScheduler
# 从 scheduling_ddpm 模块导入 DDPMScheduler
from .scheduling_ddpm import DDPMScheduler
# 从 scheduling_ddpm_parallel 模块导入 DDPMParallelScheduler
from .scheduling_ddpm_parallel import DDPMParallelScheduler
# 从 scheduling_ddpm_wuerstchen 模块导入 DDPMWuerstchenScheduler
from .scheduling_ddpm_wuerstchen import DDPMWuerstchenScheduler
# 从 scheduling_deis_multistep 模块导入 DEISMultistepScheduler
from .scheduling_deis_multistep import DEISMultistepScheduler
# 从 scheduling_dpm_cogvideox 模块导入 CogVideoXDPMScheduler
from .scheduling_dpm_cogvideox import CogVideoXDPMScheduler
# 从 scheduling_dpmsolver_multistep 模块导入 DPMSolverMultistepScheduler
from .scheduling_dpmsolver_multistep import DPMSolverMultistepScheduler
# 从 scheduling_dpmsolver_multistep_inverse 模块导入 DPMSolverMultistepInverseScheduler
from .scheduling_dpmsolver_multistep_inverse import DPMSolverMultistepInverseScheduler
# 从 scheduling_dpmsolver_singlestep 模块导入 DPMSolverSinglestepScheduler
from .scheduling_dpmsolver_singlestep import DPMSolverSinglestepScheduler
# 从 scheduling_edm_dpmsolver_multistep 模块导入 EDMDPMSolverMultistepScheduler
from .scheduling_edm_dpmsolver_multistep import EDMDPMSolverMultistepScheduler
# 从 scheduling_edm_euler 模块导入 EDMEulerScheduler
from .scheduling_edm_euler import EDMEulerScheduler
# 从 scheduling_euler_ancestral_discrete 模块导入 EulerAncestralDiscreteScheduler
from .scheduling_euler_ancestral_discrete import EulerAncestralDiscreteScheduler
# 从 scheduling_euler_discrete 模块导入 EulerDiscreteScheduler
from .scheduling_euler_discrete import EulerDiscreteScheduler
# 从 scheduling_flow_match_euler_discrete 模块导入 FlowMatchEulerDiscreteScheduler
from .scheduling_flow_match_euler_discrete import FlowMatchEulerDiscreteScheduler
# 从 scheduling_flow_match_heun_discrete 模块导入 FlowMatchHeunDiscreteScheduler
from .scheduling_flow_match_heun_discrete import FlowMatchHeunDiscreteScheduler
# 从 scheduling_heun_discrete 模块导入 HeunDiscreteScheduler
from .scheduling_heun_discrete import HeunDiscreteScheduler
# 从 scheduling_ipndm 模块导入 IPNDMScheduler
from .scheduling_ipndm import IPNDMScheduler
# 从 scheduling_k_dpm_2_ancestral_discrete 模块导入 KDPM2AncestralDiscreteScheduler
from .scheduling_k_dpm_2_ancestral_discrete import KDPM2AncestralDiscreteScheduler
# 从 scheduling_k_dpm_2_discrete 模块导入 KDPM2DiscreteScheduler
from .scheduling_k_dpm_2_discrete import KDPM2DiscreteScheduler
# 从 scheduling_lcm 模块导入 LCMScheduler
from .scheduling_lcm import LCMScheduler
# 从 scheduling_pndm 模块导入 PNDMScheduler
from .scheduling_pndm import PNDMScheduler
# 从 scheduling_repaint 模块导入 RePaintScheduler
from .scheduling_repaint import RePaintScheduler
# 从 scheduling_sasolver 模块导入 SASolverScheduler
from .scheduling_sasolver import SASolverScheduler
# 从 scheduling_sde_ve 模块导入 ScoreSdeVeScheduler
from .scheduling_sde_ve import ScoreSdeVeScheduler
# 从 scheduling_tcd 模块导入 TCDScheduler
from .scheduling_tcd import TCDScheduler
# 从 scheduling_unclip 模块导入 UnCLIPScheduler
from .scheduling_unclip import UnCLIPScheduler
# 从 scheduling_unipc_multistep 模块导入 UniPCMultistepScheduler
from .scheduling_unipc_multistep import UniPCMultistepScheduler
# 从 scheduling_utils 模块导入 AysSchedules, KarrasDiffusionSchedulers 和 SchedulerMixin
from .scheduling_utils import AysSchedules, KarrasDiffusionSchedulers, SchedulerMixin
# 从 scheduling_vq_diffusion 模块导入 VQDiffusionScheduler
from .scheduling_vq_diffusion import VQDiffusionScheduler
# 尝试检查 flax 是否可用
try:
# 如果 flax 不可用,则抛出异常
if not is_flax_available():
raise OptionalDependencyNotAvailable()
# 捕获 OptionalDependencyNotAvailable 异常
except OptionalDependencyNotAvailable:
# 从 utils.dummy_flax_objects 模块导入所有内容,忽略 F403 警告
from ..utils.dummy_flax_objects import * # noqa F403
else: # 如果前面的条件不满足
# 导入 FlaxDDIMScheduler 模块
from .scheduling_ddim_flax import FlaxDDIMScheduler
# 导入 FlaxDDPMScheduler 模块
from .scheduling_ddpm_flax import FlaxDDPMScheduler
# 导入 FlaxDPMSolverMultistepScheduler 模块
from .scheduling_dpmsolver_multistep_flax import FlaxDPMSolverMultistepScheduler
# 导入 FlaxEulerDiscreteScheduler 模块
from .scheduling_euler_discrete_flax import FlaxEulerDiscreteScheduler
# 导入 FlaxKarrasVeScheduler 模块
from .scheduling_karras_ve_flax import FlaxKarrasVeScheduler
# 导入 FlaxLMSDiscreteScheduler 模块
from .scheduling_lms_discrete_flax import FlaxLMSDiscreteScheduler
# 导入 FlaxPNDMScheduler 模块
from .scheduling_pndm_flax import FlaxPNDMScheduler
# 导入 FlaxScoreSdeVeScheduler 模块
from .scheduling_sde_ve_flax import FlaxScoreSdeVeScheduler
# 导入调度相关的工具函数和类
from .scheduling_utils_flax import (
FlaxKarrasDiffusionSchedulers, # Karras 扩散调度器
FlaxSchedulerMixin, # 调度器混合类
FlaxSchedulerOutput, # 调度器输出类
broadcast_to_shape_from_left, # 从左侧广播形状
)
try: # 尝试检查必要的依赖项
# 如果 PyTorch 和 SciPy 不可用,则抛出异常
if not (is_torch_available() and is_scipy_available()):
raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable: # 捕获依赖项不可用的异常
# 从 dummy_torch_and_scipy_objects 模块导入所有内容,避免引入实际依赖
from ..utils.dummy_torch_and_scipy_objects import * # noqa F403
else: # 如果没有异常,则导入 LMSDiscreteScheduler 模块
from .scheduling_lms_discrete import LMSDiscreteScheduler
try: # 再次尝试检查其他必要依赖项
# 如果 PyTorch 和 torchsde 不可用,则抛出异常
if not (is_torch_available() and is_torchsde_available()):
raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable: # 捕获依赖项不可用的异常
# 从 dummy_torch_and_torchsde_objects 模块导入所有内容,避免引入实际依赖
from ..utils.dummy_torch_and_torchsde_objects import * # noqa F403
else: # 如果没有异常,则导入 CosineDPMSolverMultistepScheduler 和 DPMSolverSDEScheduler 模块
from .scheduling_cosine_dpmsolver_multistep import CosineDPMSolverMultistepScheduler
from .scheduling_dpmsolver_sde import DPMSolverSDEScheduler
# 否则执行以下代码
else:
# 导入 sys 模块以访问系统特性
import sys
# 将当前模块替换为延迟加载的模块实例,使用模块名、文件名、导入结构和模块规范
sys.modules[__name__] = _LazyModule(__name__, globals()["__file__"], _import_structure, module_spec=__spec__)
# 遍历虚拟模块字典,将每个模块名和对应的值设置到当前模块
for name, value in _dummy_modules.items():
setattr(sys.modules[__name__], name, value)
.\diffusers\training_utils.py
# 导入标准库和第三方库
import contextlib # 上下文管理器相关功能
import copy # 复制对象的功能
import math # 数学相关功能
import random # 随机数生成器
from typing import Any, Dict, Iterable, List, Optional, Tuple, Union # 类型提示
# 导入 NumPy 库
import numpy as np # 数组处理
# 导入 PyTorch 库
import torch # 深度学习框架
# 从当前目录下的模型模块导入 UNet2DConditionModel 类
from .models import UNet2DConditionModel
# 从调度器模块导入 SchedulerMixin 类
from .schedulers import SchedulerMixin
# 从工具模块导入多个实用函数
from .utils import (
convert_state_dict_to_diffusers, # 转换状态字典为 Diffusers 格式
convert_state_dict_to_peft, # 转换状态字典为 PEFT 格式
deprecate, # 标记过时的功能
is_peft_available, # 检查 PEFT 是否可用
is_torch_npu_available, # 检查是否可用 NPU
is_torchvision_available, # 检查 torchvision 是否可用
is_transformers_available, # 检查 Transformers 是否可用
)
# 如果 Transformers 可用,导入相关库
if is_transformers_available():
import transformers # 导入 Transformers 库
# 如果 PEFT 可用,导入相关功能
if is_peft_available():
from peft import set_peft_model_state_dict # 导入设置 PEFT 模型状态字典的功能
# 如果 torchvision 可用,导入相关功能
if is_torchvision_available():
from torchvision import transforms # 导入图像变换功能
# 如果 NPU 可用,导入相关库,但不使用警告
if is_torch_npu_available():
import torch_npu # noqa: F401,表示此导入未使用
# 定义设置随机种子的函数
def set_seed(seed: int):
"""
Args:
Helper function for reproducible behavior to set the seed in `random`, `numpy`, `torch`.
seed (`int`): The seed to set.
"""
# 设置 Python 的随机种子
random.seed(seed)
# 设置 NumPy 的随机种子
np.random.seed(seed)
# 设置 PyTorch 的随机种子
torch.manual_seed(seed)
# 如果 NPU 可用,设置所有 NPU 的随机种子
if is_torch_npu_available():
torch.npu.manual_seed_all(seed)
else:
# 设置 CUDA 的随机种子,即使 CUDA 不可用也安全调用
torch.cuda.manual_seed_all(seed)
# 定义计算信噪比(SNR)的函数
def compute_snr(noise_scheduler, timesteps):
"""
Computes SNR as per
https://github.com/TiankaiHang/Min-SNR-Diffusion-Training/blob/521b624bd70c67cee4bdf49225915f5945a872e3/guided_diffusion/gaussian_diffusion.py#L847-L849
"""
# 获取噪声调度器的累积 alpha 值
alphas_cumprod = noise_scheduler.alphas_cumprod
# 计算 alpha 的平方根
sqrt_alphas_cumprod = alphas_cumprod**0.5
# 计算 (1 - alpha) 的平方根
sqrt_one_minus_alphas_cumprod = (1.0 - alphas_cumprod) ** 0.5
# 扩展张量的维度
# 参考链接,调整张量维度
sqrt_alphas_cumprod = sqrt_alphas_cumprod.to(device=timesteps.device)[timesteps].float()
# 直到维度匹配为止,增加最后一个维度
while len(sqrt_alphas_cumprod.shape) < len(timesteps.shape):
sqrt_alphas_cumprod = sqrt_alphas_cumprod[..., None]
# 扩展 alpha 到与 timesteps 相同的形状
alpha = sqrt_alphas_cumprod.expand(timesteps.shape)
# 同样处理 (1 - alpha) 的平方根
sqrt_one_minus_alphas_cumprod = sqrt_one_minus_alphas_cumprod.to(device=timesteps.device)[timesteps].float()
while len(sqrt_one_minus_alphas_cumprod.shape) < len(timesteps.shape):
sqrt_one_minus_alphas_cumprod = sqrt_one_minus_alphas_cumprod[..., None]
# 扩展 sigma 到与 timesteps 相同的形状
sigma = sqrt_one_minus_alphas_cumprod.expand(timesteps.shape)
# 计算信噪比
snr = (alpha / sigma) ** 2
# 返回计算得到的 SNR
return snr
# 定义解析插值模式的函数
def resolve_interpolation_mode(interpolation_type: str):
"""
Maps a string describing an interpolation function to the corresponding torchvision `InterpolationMode` enum. The
full list of supported enums is documented at
https://pytorch.org/vision/0.9/transforms.html#torchvision.transforms.functional.InterpolationMode.
# 定义参数说明,描述插值方法的类型
Args:
interpolation_type (`str`):
# 字符串,描述插值方法。目前支持 `bilinear`, `bicubic`, `box`, `nearest`,
# `nearest_exact`, `hamming`, 和 `lanczos`,与 torchvision 中的插值模式相对应。
# 定义返回值说明,返回 torchvision 的插值模式枚举
Returns:
`torchvision.transforms.InterpolationMode`: 一个 `InterpolationMode` 枚举,用于 torchvision 的 `resize`
# 变换。
"""
# 检查 torchvision 是否可用
if not is_torchvision_available():
# 如果不可用,抛出导入错误并提示用户安装 torchvision
raise ImportError(
"Please make sure to install `torchvision` to be able to use the `resolve_interpolation_mode()` function."
)
# 判断插值类型是否为 bilinear
if interpolation_type == "bilinear":
# 设置插值模式为 BILINEAR
interpolation_mode = transforms.InterpolationMode.BILINEAR
# 判断插值类型是否为 bicubic
elif interpolation_type == "bicubic":
# 设置插值模式为 BICUBIC
interpolation_mode = transforms.InterpolationMode.BICUBIC
# 判断插值类型是否为 box
elif interpolation_type == "box":
# 设置插值模式为 BOX
interpolation_mode = transforms.InterpolationMode.BOX
# 判断插值类型是否为 nearest
elif interpolation_type == "nearest":
# 设置插值模式为 NEAREST
interpolation_mode = transforms.InterpolationMode.NEAREST
# 判断插值类型是否为 nearest_exact
elif interpolation_type == "nearest_exact":
# 设置插值模式为 NEAREST_EXACT
interpolation_mode = transforms.InterpolationMode.NEAREST_EXACT
# 判断插值类型是否为 hamming
elif interpolation_type == "hamming":
# 设置插值模式为 HAMMING
interpolation_mode = transforms.InterpolationMode.HAMMING
# 判断插值类型是否为 lanczos
elif interpolation_type == "lanczos":
# 设置插值模式为 LANCZOS
interpolation_mode = transforms.InterpolationMode.LANCZOS
# 如果插值类型不支持,抛出值错误
else:
raise ValueError(
# 提示用户给定的插值模式不被支持,并列出当前支持的插值模式
f"The given interpolation mode {interpolation_type} is not supported. Currently supported interpolation"
f" modes are `bilinear`, `bicubic`, `box`, `nearest`, `nearest_exact`, `hamming`, and `lanczos`."
)
# 返回最终的插值模式
return interpolation_mode
# 定义函数,计算梦境并更新潜在变量
def compute_dream_and_update_latents(
# UNet模型,用于生成预测
unet: UNet2DConditionModel,
# 噪声调度器,用于在给定时间步添加噪声
noise_scheduler: SchedulerMixin,
# 噪声调度器使用的时间步
timesteps: torch.Tensor,
# 噪声张量,形状与noisy_latents相同
noise: torch.Tensor,
# 先前的噪声潜在变量,来自训练循环
noisy_latents: torch.Tensor,
# 目标张量,用于在移除eps后进行预测
target: torch.Tensor,
# 编码器隐藏状态,来自文本模型的文本嵌入
encoder_hidden_states: torch.Tensor,
# 梦境细节保留水平的浮点值
dream_detail_preservation: float = 1.0,
) -> Tuple[Optional[torch.Tensor], Optional[torch.Tensor]]:
"""
实现"DREAM (Diffusion Rectification and Estimation-Adaptive Models)",见http://arxiv.org/abs/2312.00210。
DREAM有助于对齐训练与采样,使训练更加高效和准确,代价是多一步无梯度的前向计算。
参数:
`unet`: 用于生成预测的状态unet。
`noise_scheduler`: 用于给定时间步添加噪声的噪声调度器。
`timesteps`: 噪声调度器使用的时间步。
`noise`: 形状与noisy_latents相同的噪声张量。
`noisy_latents`: 来自训练循环的先前噪声潜在变量。
`target`: 移除eps后要预测的真实目标张量。
`encoder_hidden_states`: 来自文本模型的文本嵌入。
`dream_detail_preservation`: 表示细节保留水平的浮点值。
参考文献。
返回:
`tuple[torch.Tensor, torch.Tensor]`: 调整后的noisy_latents和target。
"""
# 获取时间步对应的累积alpha值,并将其移动到时间步所在设备
alphas_cumprod = noise_scheduler.alphas_cumprod.to(timesteps.device)[timesteps, None, None, None]
# 计算1减去累积alpha的平方根
sqrt_one_minus_alphas_cumprod = (1.0 - alphas_cumprod) ** 0.5
# 计算梦境系数,使用论文中lambda = sqrt(1 - alpha) ** p,p取1
dream_lambda = sqrt_one_minus_alphas_cumprod**dream_detail_preservation
pred = None
# 禁用梯度计算
with torch.no_grad():
# 使用UNet生成预测结果
pred = unet(noisy_latents, timesteps, encoder_hidden_states).sample
_noisy_latents, _target = (None, None)
# 如果预测类型为"epsilon"
if noise_scheduler.config.prediction_type == "epsilon":
# 将预测的噪声存储在predicted_noise中
predicted_noise = pred
# 计算实际噪声与预测噪声的差值,并从计算图中分离
delta_noise = (noise - predicted_noise).detach()
# 按梦境系数缩放差值噪声
delta_noise.mul_(dream_lambda)
# 更新噪声潜在变量
_noisy_latents = noisy_latents.add(sqrt_one_minus_alphas_cumprod * delta_noise)
# 更新目标张量
_target = target.add(delta_noise)
# 如果预测类型为"v_prediction",抛出未实现错误
elif noise_scheduler.config.prediction_type == "v_prediction":
raise NotImplementedError("DREAM has not been implemented for v-prediction")
# 否则抛出值错误,说明未知的预测类型
else:
raise ValueError(f"Unknown prediction type {noise_scheduler.config.prediction_type}")
# 返回更新后的噪声潜在变量和目标张量
return _noisy_latents, _target
# 定义函数,获取UNet的LoRA状态字典
def unet_lora_state_dict(unet: UNet2DConditionModel) -> Dict[str, torch.Tensor]:
r"""
返回:
仅包含LoRA参数的状态字典。
"""
# 初始化一个空字典,用于存储LoRA状态
lora_state_dict = {}
# 遍历 UNet 模型的所有命名模块
for name, module in unet.named_modules():
# 检查模块是否具有设置 Lora 层的属性
if hasattr(module, "set_lora_layer"):
# 获取模块的 Lora 层
lora_layer = getattr(module, "lora_layer")
# 确保 Lora 层不为空
if lora_layer is not None:
# 获取当前 Lora 层的状态字典
current_lora_layer_sd = lora_layer.state_dict()
# 遍历 Lora 层状态字典中的所有矩阵名称和参数
for lora_layer_matrix_name, lora_param in current_lora_layer_sd.items():
# 矩阵名称可以是 "down" 或 "up",将参数保存到字典中
lora_state_dict[f"{name}.lora.{lora_layer_matrix_name}"] = lora_param
# 返回包含 Lora 层参数的状态字典
return lora_state_dict
# 定义一个函数,将模型参数转换为指定的数据类型
def cast_training_params(model: Union[torch.nn.Module, List[torch.nn.Module]], dtype=torch.float32):
# 检查输入的模型是否为列表,如果不是则将其转换为列表
if not isinstance(model, list):
model = [model]
# 遍历模型列表中的每个模型
for m in model:
# 遍历模型的所有参数
for param in m.parameters():
# 仅将可训练的参数转换为指定的数据类型
if param.requires_grad:
param.data = param.to(dtype)
# 定义一个函数,将 LoRA 状态字典设置到文本编码器中
def _set_state_dict_into_text_encoder(
lora_state_dict: Dict[str, torch.Tensor], prefix: str, text_encoder: torch.nn.Module
):
"""
将来自 `transformers` 的 `lora_state_dict` 设置到 `text_encoder` 中。
Args:
lora_state_dict: 要设置的状态字典。
prefix: 字符串标识符,用于检索属于 `text_encoder` 的状态字典部分。
text_encoder: 要设置 `lora_state_dict` 的地方。
"""
# 创建一个新的状态字典,只包含以 prefix 开头的键值对
text_encoder_state_dict = {
f'{k.replace(prefix, "")}': v for k, v in lora_state_dict.items() if k.startswith(prefix)
}
# 将状态字典转换为 PEFT 格式
text_encoder_state_dict = convert_state_dict_to_peft(convert_state_dict_to_diffusers(text_encoder_state_dict))
# 将转换后的状态字典设置到文本编码器中
set_peft_model_state_dict(text_encoder, text_encoder_state_dict, adapter_name="default")
# 定义一个函数,计算用于时序采样的密度
def compute_density_for_timestep_sampling(
weighting_scheme: str, batch_size: int, logit_mean: float = None, logit_std: float = None, mode_scale: float = None
):
"""计算在进行 SD3 训练时采样时序的密度。
参考:这是由 Rafie Walker 提供的 https://github.com/huggingface/diffusers/pull/8528。
SD3 论文参考: https://arxiv.org/abs/2403.03206v1。
"""
# 根据加权方案选择计算方式
if weighting_scheme == "logit_normal":
# 参见 SD3 论文中的公式
u = torch.normal(mean=logit_mean, std=logit_std, size=(batch_size,), device="cpu")
# 应用 sigmoid 函数
u = torch.nn.functional.sigmoid(u)
elif weighting_scheme == "mode":
# 生成均匀分布的随机数
u = torch.rand(size=(batch_size,), device="cpu")
# 根据模式调整 u 的值
u = 1 - u - mode_scale * (torch.cos(math.pi * u / 2) ** 2 - 1 + u)
else:
# 如果没有匹配的方案,则生成随机数
u = torch.rand(size=(batch_size,), device="cpu")
# 返回计算的 u 值
return u
# 定义一个函数,为 SD3 训练计算损失加权方案
def compute_loss_weighting_for_sd3(weighting_scheme: str, sigmas=None):
"""计算 SD3 训练的损失加权方案。
参考:这是由 Rafie Walker 提供的 https://github.com/huggingface/diffusers/pull/8528。
SD3 论文参考: https://arxiv.org/abs/2403.03206v1。
"""
# 根据加权方案选择计算方式
if weighting_scheme == "sigma_sqrt":
# 计算加权值为 sigma 的平方的倒数
weighting = (sigmas**-2.0).float()
elif weighting_scheme == "cosmap":
# 根据 sigma 计算底部值,并计算加权
bot = 1 - 2 * sigmas + 2 * sigmas**2
weighting = 2 / (math.pi * bot)
else:
# 如果没有匹配的方案,则返回与 sigmas 相同大小的全1张量
weighting = torch.ones_like(sigmas)
# 返回计算的加权值
return weighting
# 定义一个类,用于实现模型权重的指数移动平均
class EMAModel:
"""
模型权重的指数移动平均
"""
# 初始化方法,设置 EMA 模型的参数
def __init__(
self,
parameters: Iterable[torch.nn.Parameter], # 模型参数的可迭代对象
decay: float = 0.9999, # 衰减因子的默认值
min_decay: float = 0.0, # 最小衰减值
update_after_step: int = 0, # 更新后开始计算的步骤
use_ema_warmup: bool = False, # 是否使用 EMA 暖启动
inv_gamma: Union[float, int] = 1.0, # 反伽马值,用于计算衰减
power: Union[float, int] = 2 / 3, # 衰减的幂
foreach: bool = False, # 是否使用逐项更新
model_cls: Optional[Any] = None, # 模型类的可选参数
model_config: Dict[str, Any] = None, # 模型配置的字典
**kwargs, # 其他关键字参数
# 类方法,用于从预训练模型加载
@classmethod
def from_pretrained(cls, path, model_cls, foreach=False) -> "EMAModel":
# 从给定路径加载模型配置,返回未使用的参数
_, ema_kwargs = model_cls.load_config(path, return_unused_kwargs=True)
# 从预训练路径加载模型
model = model_cls.from_pretrained(path)
# 创建 EMA 模型,传入模型参数及其他配置
ema_model = cls(model.parameters(), model_cls=model_cls, model_config=model.config, foreach=foreach)
# 加载 EMA 模型的状态字典
ema_model.load_state_dict(ema_kwargs)
# 返回创建的 EMA 模型
return ema_model
# 保存预训练模型的方法
def save_pretrained(self, path):
# 检查是否定义了模型类
if self.model_cls is None:
raise ValueError("`save_pretrained` can only be used if `model_cls` was defined at __init__.")
# 检查是否定义了模型配置
if self.model_config is None:
raise ValueError("`save_pretrained` can only be used if `model_config` was defined at __init__.")
# 根据模型配置创建模型
model = self.model_cls.from_config(self.model_config)
# 获取当前模型的状态字典
state_dict = self.state_dict()
# 从状态字典中删除 "shadow_params" 项
state_dict.pop("shadow_params", None)
# 将状态字典注册到模型配置中
model.register_to_config(**state_dict)
# 将当前模型的参数复制到新模型中
self.copy_to(model.parameters())
# 保存模型到指定路径
model.save_pretrained(path)
# 计算衰减因子的方法
def get_decay(self, optimization_step: int) -> float:
"""
计算指数移动平均的衰减因子。
"""
# 计算当前步骤,确保不为负
step = max(0, optimization_step - self.update_after_step - 1)
# 如果当前步骤小于等于0,返回0.0
if step <= 0:
return 0.0
# 根据是否使用 EMA 暖启动计算当前衰减值
if self.use_ema_warmup:
cur_decay_value = 1 - (1 + step / self.inv_gamma) ** -self.power
else:
cur_decay_value = (1 + step) / (10 + step)
# 确保当前衰减值不大于最大衰减值
cur_decay_value = min(cur_decay_value, self.decay)
# 确保衰减值不小于最小衰减值
cur_decay_value = max(cur_decay_value, self.min_decay)
# 返回计算出的衰减值
return cur_decay_value
# 在无梯度计算的上下文中执行的装饰器
@torch.no_grad()
# 定义一个方法,接收参数列表,参数可以是可迭代的 PyTorch 参数
def step(self, parameters: Iterable[torch.nn.Parameter]):
# 检查传入的参数是否是 PyTorch 模块
if isinstance(parameters, torch.nn.Module):
# 定义一个弃用警告消息,提示用户不应传递模块
deprecation_message = (
"Passing a `torch.nn.Module` to `ExponentialMovingAverage.step` is deprecated. "
"Please pass the parameters of the module instead."
)
# 调用弃用函数,显示警告信息
deprecate(
"passing a `torch.nn.Module` to `ExponentialMovingAverage.step`",
"1.0.0",
deprecation_message,
standard_warn=False,
)
# 获取模块的参数列表
parameters = parameters.parameters()
# 将参数转换为列表形式
parameters = list(parameters)
# 增加优化步骤计数
self.optimization_step += 1
# 计算指数移动平均的衰减因子
decay = self.get_decay(self.optimization_step)
# 保存当前的衰减值
self.cur_decay_value = decay
# 计算 1 - 衰减值
one_minus_decay = 1 - decay
# 初始化上下文管理器为无操作上下文
context_manager = contextlib.nullcontext
# 检查是否可用 transformers 库以及 DeepSpeed 的 Zero3 功能
if is_transformers_available() and transformers.deepspeed.is_deepspeed_zero3_enabled():
# 导入 DeepSpeed 库
import deepspeed
# 如果使用 foreach 模式
if self.foreach:
# 如果可用,使用 DeepSpeed 的 GatheredParameters 上下文管理器
if is_transformers_available() and transformers.deepspeed.is_deepspeed_zero3_enabled():
context_manager = deepspeed.zero.GatheredParameters(parameters, modifier_rank=None)
# 使用上下文管理器进行操作
with context_manager():
# 筛选出需要梯度计算的参数
params_grad = [param for param in parameters if param.requires_grad]
# 与阴影参数配对,筛选出需要梯度的阴影参数
s_params_grad = [
s_param for s_param, param in zip(self.shadow_params, parameters) if param.requires_grad
]
# 如果需要梯度的参数数量少于总参数数量
if len(params_grad) < len(parameters):
# 复制不需要梯度的参数值到阴影参数
torch._foreach_copy_(
[s_param for s_param, param in zip(self.shadow_params, parameters) if not param.requires_grad],
[param for param in parameters if not param.requires_grad],
non_blocking=True,
)
# 更新阴影参数的值,使用指数移动平均更新
torch._foreach_sub_(
s_params_grad, torch._foreach_sub(s_params_grad, params_grad), alpha=one_minus_decay
)
# 如果不使用 foreach 模式
else:
# 遍历阴影参数和输入参数
for s_param, param in zip(self.shadow_params, parameters):
# 如果可用,使用 DeepSpeed 的 GatheredParameters 上下文管理器
if is_transformers_available() and transformers.deepspeed.is_deepspeed_zero3_enabled():
context_manager = deepspeed.zero.GatheredParameters(param, modifier_rank=None)
# 使用上下文管理器进行操作
with context_manager():
# 如果参数需要梯度
if param.requires_grad:
# 使用指数移动平均更新阴影参数
s_param.sub_(one_minus_decay * (s_param - param))
else:
# 直接复制参数到阴影参数
s_param.copy_(param)
# 定义一个将当前平均参数复制到给定参数集合的方法
def copy_to(self, parameters: Iterable[torch.nn.Parameter]) -> None:
# 方法文档,描述参数的作用
"""
Copy current averaged parameters into given collection of parameters.
Args:
parameters: Iterable of `torch.nn.Parameter`; the parameters to be
updated with the stored moving averages. If `None`, the parameters with which this
`ExponentialMovingAverage` was initialized will be used.
"""
# 将输入参数转换为列表
parameters = list(parameters)
# 如果设置了 foreach,则使用批量操作复制数据
if self.foreach:
torch._foreach_copy_(
# 提取参数的数据
[param.data for param in parameters],
# 将影子参数的数据复制到目标参数的设备
[s_param.to(param.device).data for s_param, param in zip(self.shadow_params, parameters)],
)
else:
# 否则逐一复制影子参数的数据到目标参数
for s_param, param in zip(self.shadow_params, parameters):
param.data.copy_(s_param.to(param.device).data)
# 定义一个将内部缓冲区移动到固定内存的方法
def pin_memory(self) -> None:
r"""
Move internal buffers of the ExponentialMovingAverage to pinned memory. Useful for non-blocking transfers for
offloading EMA params to the host.
"""
# 将影子参数移动到固定内存
self.shadow_params = [p.pin_memory() for p in self.shadow_params]
# 定义一个将内部缓冲区移动到指定设备的方法
def to(self, device=None, dtype=None, non_blocking=False) -> None:
r"""Move internal buffers of the ExponentialMovingAverage to `device`.
Args:
device: like `device` argument to `torch.Tensor.to`
"""
# .to() 方法处理 None 的情况
self.shadow_params = [
# 如果参数是浮点型,则同时移动设备和数据类型
p.to(device=device, dtype=dtype, non_blocking=non_blocking)
if p.is_floating_point()
# 否则只移动设备
else p.to(device=device, non_blocking=non_blocking)
for p in self.shadow_params
]
# 定义一个返回 ExponentialMovingAverage 状态字典的方法
def state_dict(self) -> dict:
r"""
Returns the state of the ExponentialMovingAverage as a dict. This method is used by accelerate during
checkpointing to save the ema state dict.
"""
# 返回状态字典,遵循 PyTorch 约定,返回张量的引用
return {
"decay": self.decay,
"min_decay": self.min_decay,
"optimization_step": self.optimization_step,
"update_after_step": self.update_after_step,
"use_ema_warmup": self.use_ema_warmup,
"inv_gamma": self.inv_gamma,
"power": self.power,
"shadow_params": self.shadow_params,
}
# 定义一个保存当前参数以便后续恢复的方法
def store(self, parameters: Iterable[torch.nn.Parameter]) -> None:
r"""
Args:
Save the current parameters for restoring later.
parameters: Iterable of `torch.nn.Parameter`; the parameters to be
temporarily stored.
"""
# 将当前参数暂时存储在 CPU 上的克隆
self.temp_stored_params = [param.detach().cpu().clone() for param in parameters]
# 定义一个恢复方法,用于恢复存储的参数
def restore(self, parameters: Iterable[torch.nn.Parameter]) -> None:
r"""
Args:
恢复通过 `store` 方法存储的参数。此方法对于使用 EMA 参数验证模型非常有用,而不会影响
原始优化过程。在调用 `copy_to()` 方法之前存储参数。验证(或保存模型)后,使用此方法
恢复以前的参数。
parameters: `torch.nn.Parameter` 的可迭代对象;要更新为存储参数的参数。如果为 `None`,
则将使用此 `ExponentialMovingAverage` 初始化时的参数。
"""
# 检查是否有存储的参数,如果没有则引发运行时错误
if self.temp_stored_params is None:
raise RuntimeError("This ExponentialMovingAverage has no `store()`ed weights " "to `restore()`")
# 如果使用并行操作,则使用 foreach 复制参数
if self.foreach:
torch._foreach_copy_(
# 获取每个参数的数据进行复制
[param.data for param in parameters], [c_param.data for c_param in self.temp_stored_params]
)
# 否则,逐一复制存储的参数数据
else:
for c_param, param in zip(self.temp_stored_params, parameters):
# 将存储的参数数据复制到当前参数
param.data.copy_(c_param.data)
# 更好地节省内存,将临时存储的参数置为 None
self.temp_stored_params = None
# 定义一个加载状态字典的方法,用于加载指数移动平均的状态
def load_state_dict(self, state_dict: dict) -> None:
r"""
Args:
加载指数移动平均状态。此方法在检查点时由 accelerate 使用,以保存 ema 状态字典。
state_dict (dict): EMA 状态。应为从 :meth:`state_dict` 调用返回的对象。
"""
# 深拷贝状态字典,以与模块 API 保持一致
state_dict = copy.deepcopy(state_dict)
# 获取衰减值,如果未提供则使用当前值
self.decay = state_dict.get("decay", self.decay)
# 检查衰减值是否在有效范围内
if self.decay < 0.0 or self.decay > 1.0:
raise ValueError("Decay must be between 0 and 1")
# 获取最小衰减值,如果未提供则使用当前值
self.min_decay = state_dict.get("min_decay", self.min_decay)
# 检查最小衰减值是否为浮点数
if not isinstance(self.min_decay, float):
raise ValueError("Invalid min_decay")
# 获取优化步骤,如果未提供则使用当前值
self.optimization_step = state_dict.get("optimization_step", self.optimization_step)
# 检查优化步骤是否为整数
if not isinstance(self.optimization_step, int):
raise ValueError("Invalid optimization_step")
# 获取更新后步骤,如果未提供则使用当前值
self.update_after_step = state_dict.get("update_after_step", self.update_after_step)
# 检查更新后步骤是否为整数
if not isinstance(self.update_after_step, int):
raise ValueError("Invalid update_after_step")
# 获取是否使用 EMA 预热,如果未提供则使用当前值
self.use_ema_warmup = state_dict.get("use_ema_warmup", self.use_ema_warmup)
# 检查是否使用 EMA 预热的值是否为布尔值
if not isinstance(self.use_ema_warmup, bool):
raise ValueError("Invalid use_ema_warmup")
# 获取反伽马值,如果未提供则使用当前值
self.inv_gamma = state_dict.get("inv_gamma", self.inv_gamma)
# 检查反伽马值是否为浮点数或整数
if not isinstance(self.inv_gamma, (float, int)):
raise ValueError("Invalid inv_gamma")
# 获取幂值,如果未提供则使用当前值
self.power = state_dict.get("power", self.power)
# 检查幂值是否为浮点数或整数
if not isinstance(self.power, (float, int)):
raise ValueError("Invalid power")
# 获取影子参数,如果未提供则为 None
shadow_params = state_dict.get("shadow_params", None)
# 如果影子参数不为 None,则进行检查
if shadow_params is not None:
self.shadow_params = shadow_params
# 检查影子参数是否为列表
if not isinstance(self.shadow_params, list):
raise ValueError("shadow_params must be a list")
# 检查所有影子参数是否都是张量
if not all(isinstance(p, torch.Tensor) for p in self.shadow_params):
raise ValueError("shadow_params must all be Tensors")
.\diffusers\utils\accelerate_utils.py
# 版权所有 2024 HuggingFace 团队。保留所有权利。
#
# 根据 Apache 许可证,版本 2.0(“许可证”)授权;
# 除非遵守许可证,否则您不得使用此文件。
# 您可以在以下网址获取许可证副本:
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# 除非适用法律或书面协议另有约定,否则根据许可证分发的软件是以“原样”基础提供的,
# 不提供任何形式的明示或暗示的担保或条件。
# 请参阅许可证以了解特定语言的权限和
# 限制。
"""
加速工具:与加速相关的工具
"""
# 导入版本管理模块
from packaging import version
# 从导入工具模块中导入检测加速是否可用的函数
from .import_utils import is_accelerate_available
# 检查加速是否可用
if is_accelerate_available():
# 如果可用,导入加速模块
import accelerate
def apply_forward_hook(method):
"""
装饰器,将注册的 CpuOffload 钩子应用于任意函数而非 `forward`。这对于 PyTorch 模块提供的其他函数(如 `encode` 和 `decode`)非常有用,这些函数应触发移动到适当的加速设备。
此装饰器检查内部 `_hf_hook` 属性以查找注册的卸载钩子。
:param method: 要装饰的方法。此方法应为 PyTorch 模块的方法。
"""
# 如果加速不可用,则直接返回原方法
if not is_accelerate_available():
return method
# 解析当前加速模块的版本
accelerate_version = version.parse(accelerate.__version__).base_version
# 如果加速版本小于 0.17.0,则直接返回原方法
if version.parse(accelerate_version) < version.parse("0.17.0"):
return method
# 定义包装器函数
def wrapper(self, *args, **kwargs):
# 如果存在 `_hf_hook` 且具有 `pre_forward` 属性,则调用该钩子
if hasattr(self, "_hf_hook") and hasattr(self._hf_hook, "pre_forward"):
self._hf_hook.pre_forward(self)
# 调用原方法并返回结果
return method(self, *args, **kwargs)
# 返回包装器函数
return wrapper
.\diffusers\utils\constants.py
# 版权所有 2024 HuggingFace Inc.团队。保留所有权利。
#
# 根据 Apache 许可证第 2.0 版(“许可证”)进行许可;
# 除非遵守许可证,否则您不得使用此文件。
# 您可以在以下网址获取许可证副本:
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# 除非根据适用法律或书面协议另有约定,
# 否则根据许可证分发的软件是按“原样”基础提供的,
# 不提供任何形式的明示或暗示的担保或条件。
# 有关许可证所涉及的特定权限和限制,请参见许可证。
import importlib # 导入动态导入模块的库
import os # 导入操作系统功能模块
from huggingface_hub.constants import HF_HOME # 从 huggingface_hub.constants 导入 HF_HOME 常量
from packaging import version # 从 packaging 导入版本管理模块
from ..dependency_versions_check import dep_version_check # 从父目录导入版本检查函数
from .import_utils import ENV_VARS_TRUE_VALUES, is_peft_available, is_transformers_available # 从当前目录导入环境变量和库可用性检查函数
MIN_PEFT_VERSION = "0.6.0" # 定义 PEFT 库的最低版本要求
MIN_TRANSFORMERS_VERSION = "4.34.0" # 定义 Transformers 库的最低版本要求
_CHECK_PEFT = os.environ.get("_CHECK_PEFT", "1") in ENV_VARS_TRUE_VALUES # 检查环境变量以确定是否进行 PEFT 检查
CONFIG_NAME = "config.json" # 定义配置文件的名称
WEIGHTS_NAME = "diffusion_pytorch_model.bin" # 定义 PyTorch 模型权重文件的名称
WEIGHTS_INDEX_NAME = "diffusion_pytorch_model.bin.index.json" # 定义权重索引文件的名称
FLAX_WEIGHTS_NAME = "diffusion_flax_model.msgpack" # 定义 Flax 模型权重文件的名称
ONNX_WEIGHTS_NAME = "model.onnx" # 定义 ONNX 模型权重文件的名称
SAFETENSORS_WEIGHTS_NAME = "diffusion_pytorch_model.safetensors" # 定义 Safetensors 模型权重文件的名称
SAFE_WEIGHTS_INDEX_NAME = "diffusion_pytorch_model.safetensors.index.json" # 定义 Safetensors 权重索引文件的名称
SAFETENSORS_FILE_EXTENSION = "safetensors" # 定义 Safetensors 文件扩展名
ONNX_EXTERNAL_WEIGHTS_NAME = "weights.pb" # 定义外部 ONNX 权重文件的名称
HUGGINGFACE_CO_RESOLVE_ENDPOINT = os.environ.get("HF_ENDPOINT", "https://huggingface.co") # 获取 Hugging Face 端点环境变量,默认值为 https://huggingface.co
DIFFUSERS_DYNAMIC_MODULE_NAME = "diffusers_modules" # 定义 Diffusers 动态模块名称
HF_MODULES_CACHE = os.getenv("HF_MODULES_CACHE", os.path.join(HF_HOME, "modules")) # 获取 HF 模块缓存路径,默认为 HF_HOME/modules
DEPRECATED_REVISION_ARGS = ["fp16", "non-ema"] # 定义不推荐使用的修订参数列表
# 以下条件为真,表示当前 PEFT 和 Transformers 版本与 PEFT 后端兼容。
# 如果可用的库版本正确,将自动回退到 PEFT 后端。
# 对于 PEFT,它必须大于或等于 0.6.0,对于 Transformers,它必须大于或等于 4.34.0。
_required_peft_version = is_peft_available() and version.parse( # 检查 PEFT 是否可用且版本符合要求
version.parse(importlib.metadata.version("peft")).base_version # 获取 PEFT 的版本并进行解析
) >= version.parse(MIN_PEFT_VERSION) # 比较 PEFT 版本与最低要求
_required_transformers_version = is_transformers_available() and version.parse( # 检查 Transformers 是否可用且版本符合要求
version.parse(importlib.metadata.version("transformers")).base_version # 获取 Transformers 的版本并进行解析
) >= version.parse(MIN_TRANSFORMERS_VERSION) # 比较 Transformers 版本与最低要求
USE_PEFT_BACKEND = _required_peft_version and _required_transformers_version # 确定是否使用 PEFT 后端
if USE_PEFT_BACKEND and _CHECK_PEFT: # 如果满足条件则进行版本检查
dep_version_check("peft") # 执行 PEFT 库的依赖版本检查
.\diffusers\utils\deprecation_utils.py
# 导入 inspect 模块,用于获取栈帧信息
import inspect
# 导入 warnings 模块,用于发出警告
import warnings
# 从 typing 模块导入所需类型,用于类型注解
from typing import Any, Dict, Optional, Union
# 从 packaging 模块导入 version,用于版本比较
from packaging import version
# 定义 deprecate 函数,用于处理函数参数和属性的弃用警告
def deprecate(*args, take_from: Optional[Union[Dict, Any]] = None, standard_warn=True, stacklevel=2):
# 导入当前模块的版本
from .. import __version__
# 将 take_from 赋值给 deprecated_kwargs,用于存储要检查的参数或属性
deprecated_kwargs = take_from
# 初始化一个元组用于存储返回值
values = ()
# 如果第一个参数不是元组,将其转换为元组
if not isinstance(args[0], tuple):
args = (args,)
# 遍历每个弃用的属性、版本名和警告信息
for attribute, version_name, message in args:
# 检查当前版本是否大于等于弃用版本
if version.parse(version.parse(__version__).base_version) >= version.parse(version_name):
# 抛出 ValueError,提示弃用的元组应被移除
raise ValueError(
f"The deprecation tuple {(attribute, version_name, message)} should be removed since diffusers'"
f" version {__version__} is >= {version_name}"
)
# 初始化警告消息为 None
warning = None
# 如果 deprecated_kwargs 是字典且包含当前属性
if isinstance(deprecated_kwargs, dict) and attribute in deprecated_kwargs:
# 从字典中弹出属性值并添加到 values 元组
values += (deprecated_kwargs.pop(attribute),)
# 设置警告信息
warning = f"The `{attribute}` argument is deprecated and will be removed in version {version_name}."
# 如果 deprecated_kwargs 有该属性
elif hasattr(deprecated_kwargs, attribute):
# 获取属性值并添加到 values 元组
values += (getattr(deprecated_kwargs, attribute),)
# 设置警告信息
warning = f"The `{attribute}` attribute is deprecated and will be removed in version {version_name}."
# 如果 deprecated_kwargs 为 None
elif deprecated_kwargs is None:
# 设置警告信息
warning = f"`{attribute}` is deprecated and will be removed in version {version_name}."
# 如果有警告信息,发出警告
if warning is not None:
# 根据标准警告标志决定是否添加空格
warning = warning + " " if standard_warn else ""
# 发出 FutureWarning 警告
warnings.warn(warning + message, FutureWarning, stacklevel=stacklevel)
# 如果 deprecated_kwargs 是字典且仍有未处理的项
if isinstance(deprecated_kwargs, dict) and len(deprecated_kwargs) > 0:
# 获取当前帧的外部帧信息
call_frame = inspect.getouterframes(inspect.currentframe())[1]
# 获取文件名、行号和函数名
filename = call_frame.filename
line_number = call_frame.lineno
function = call_frame.function
# 获取第一个未处理的键值对
key, value = next(iter(deprecated_kwargs.items()))
# 抛出 TypeError,提示收到意外的关键字参数
raise TypeError(f"{function} in {filename} line {line_number-1} got an unexpected keyword argument `{key}`")
# 如果没有值返回
if len(values) == 0:
return
# 如果只有一个值返回该值
elif len(values) == 1:
return values[0]
# 如果有多个值返回值元组
return values
.\diffusers\utils\doc_utils.py
# 版权声明,标识该文件属于 HuggingFace 团队,所有权利保留
#
# 根据 Apache 2.0 许可协议进行许可;
# 除非遵守许可,否则不能使用此文件。
# 可以在以下网址获取许可证副本:
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# 除非适用法律或书面协议另有约定,软件在“按原样”基础上分发,
# 不提供任何明示或暗示的担保或条件。
# 请参阅许可证以获取有关权限和
# 限制的具体信息。
"""
文档工具:与文档相关的工具
"""
import re # 导入正则表达式模块,用于字符串匹配和处理
def replace_example_docstring(example_docstring): # 定义函数,用于替换示例文档字符串
def docstring_decorator(fn): # 定义装饰器函数,接受一个函数作为参数
func_doc = fn.__doc__ # 获取传入函数的文档字符串
lines = func_doc.split("\n") # 将文档字符串按行分割成列表
i = 0 # 初始化索引
while i < len(lines) and re.search(r"^\s*Examples?:\s*$", lines[i]) is None: # 查找“Examples:”行
i += 1 # 移动索引,直到找到“Examples:”或超出列表长度
if i < len(lines): # 如果找到“Examples:”行
lines[i] = example_docstring # 用新示例文档字符串替换该行
func_doc = "\n".join(lines) # 重新组合成完整文档字符串
else: # 如果没有找到“Examples:”行
raise ValueError( # 抛出错误,提示函数文档字符串需要包含“Examples:”占位符
f"The function {fn} should have an empty 'Examples:' in its docstring as placeholder, "
f"current docstring is:\n{func_doc}"
)
fn.__doc__ = func_doc # 更新传入函数的文档字符串
return fn # 返回更新后的函数
return docstring_decorator # 返回装饰器函数
# 该文件由命令 `make fix-copies` 自动生成,请勿编辑。
from ..utils import DummyObject, requires_backends # 从 utils 模块导入 DummyObject 和 requires_backends 函数
class FlaxStableDiffusionControlNetPipeline(metaclass=DummyObject): # 定义 FlaxStableDiffusionControlNetPipeline 类,使用 DummyObject 作为元类
_backends = ["flax", "transformers"] # 定义该类支持的后端列表
def __init__(self, *args, **kwargs): # 初始化方法,接收任意数量的参数和关键字参数
requires_backends(self, ["flax", "transformers"]) # 检查当前实例是否满足后端要求
@classmethod
def from_config(cls, *args, **kwargs): # 类方法,从配置创建类实例
requires_backends(cls, ["flax", "transformers"]) # 检查当前类是否满足后端要求
@classmethod
def from_pretrained(cls, *args, **kwargs): # 类方法,从预训练模型创建类实例
requires_backends(cls, ["flax", "transformers"]) # 检查当前类是否满足后端要求
class FlaxStableDiffusionImg2ImgPipeline(metaclass=DummyObject): # 定义 FlaxStableDiffusionImg2ImgPipeline 类,使用 DummyObject 作为元类
_backends = ["flax", "transformers"] # 定义该类支持的后端列表
def __init__(self, *args, **kwargs): # 初始化方法,接收任意数量的参数和关键字参数
requires_backends(self, ["flax", "transformers"]) # 检查当前实例是否满足后端要求
@classmethod
def from_config(cls, *args, **kwargs): # 类方法,从配置创建类实例
requires_backends(cls, ["flax", "transformers"]) # 检查当前类是否满足后端要求
@classmethod
def from_pretrained(cls, *args, **kwargs): # 类方法,从预训练模型创建类实例
requires_backends(cls, ["flax", "transformers"]) # 检查当前类是否满足后端要求
class FlaxStableDiffusionInpaintPipeline(metaclass=DummyObject): # 定义 FlaxStableDiffusionInpaintPipeline 类,使用 DummyObject 作为元类
_backends = ["flax", "transformers"] # 定义该类支持的后端列表
def __init__(self, *args, **kwargs): # 初始化方法,接收任意数量的参数和关键字参数
requires_backends(self, ["flax", "transformers"]) # 检查当前实例是否满足后端要求
@classmethod
def from_config(cls, *args, **kwargs): # 类方法,从配置创建类实例
requires_backends(cls, ["flax", "transformers"]) # 检查当前类是否满足后端要求
@classmethod
def from_pretrained(cls, *args, **kwargs): # 类方法,从预训练模型创建类实例
requires_backends(cls, ["flax", "transformers"]) # 检查当前类是否满足后端要求
class FlaxStableDiffusionPipeline(metaclass=DummyObject): # 定义 FlaxStableDiffusionPipeline 类,使用 DummyObject 作为元类
_backends = ["flax", "transformers"] # 定义该类支持的后端列表
def __init__(self, *args, **kwargs): # 初始化方法,接收任意数量的参数和关键字参数
requires_backends(self, ["flax", "transformers"]) # 检查当前实例是否满足后端要求
@classmethod
def from_config(cls, *args, **kwargs): # 类方法,从配置创建类实例
requires_backends(cls, ["flax", "transformers"]) # 检查当前类是否满足后端要求
@classmethod
def from_pretrained(cls, *args, **kwargs): # 类方法,从预训练模型创建类实例
requires_backends(cls, ["flax", "transformers"]) # 检查当前类是否满足后端要求
class FlaxStableDiffusionXLPipeline(metaclass=DummyObject): # 定义 FlaxStableDiffusionXLPipeline 类,使用 DummyObject 作为元类
_backends = ["flax", "transformers"] # 定义该类支持的后端列表
def __init__(self, *args, **kwargs): # 初始化方法,接收任意数量的参数和关键字参数
requires_backends(self, ["flax", "transformers"]) # 检查当前实例是否满足后端要求
@classmethod
def from_config(cls, *args, **kwargs): # 类方法,从配置创建类实例
requires_backends(cls, ["flax", "transformers"]) # 检查当前类是否满足后端要求
@classmethod
def from_pretrained(cls, *args, **kwargs): # 类方法,从预训练模型创建类实例
requires_backends(cls, ["flax", "transformers"]) # 检查当前类是否满足后端要求
.\diffusers\utils\dummy_flax_objects.py
# 该文件由命令 `make fix-copies` 自动生成,请勿编辑。
from ..utils import DummyObject, requires_backends # 导入 DummyObject 和 requires_backends 函数
class FlaxControlNetModel(metaclass=DummyObject): # 定义 FlaxControlNetModel 类,使用 DummyObject 作为元类
_backends = ["flax"] # 指定支持的后端为 "flax"
def __init__(self, *args, **kwargs): # 构造函数,接收可变参数
requires_backends(self, ["flax"]) # 检查是否支持 "flax" 后端
@classmethod
def from_config(cls, *args, **kwargs): # 类方法,用于从配置创建实例
requires_backends(cls, ["flax"]) # 检查类是否支持 "flax" 后端
@classmethod
def from_pretrained(cls, *args, **kwargs): # 类方法,从预训练模型创建实例
requires_backends(cls, ["flax"]) # 检查类是否支持 "flax" 后端
class FlaxModelMixin(metaclass=DummyObject): # 定义 FlaxModelMixin 类,使用 DummyObject 作为元类
_backends = ["flax"] # 指定支持的后端为 "flax"
def __init__(self, *args, **kwargs): # 构造函数,接收可变参数
requires_backends(self, ["flax"]) # 检查是否支持 "flax" 后端
@classmethod
def from_config(cls, *args, **kwargs): # 类方法,用于从配置创建实例
requires_backends(cls, ["flax"]) # 检查类是否支持 "flax" 后端
@classmethod
def from_pretrained(cls, *args, **kwargs): # 类方法,从预训练模型创建实例
requires_backends(cls, ["flax"]) # 检查类是否支持 "flax" 后端
class FlaxUNet2DConditionModel(metaclass=DummyObject): # 定义 FlaxUNet2DConditionModel 类,使用 DummyObject 作为元类
_backends = ["flax"] # 指定支持的后端为 "flax"
def __init__(self, *args, **kwargs): # 构造函数,接收可变参数
requires_backends(self, ["flax"]) # 检查是否支持 "flax" 后端
@classmethod
def from_config(cls, *args, **kwargs): # 类方法,用于从配置创建实例
requires_backends(cls, ["flax"]) # 检查类是否支持 "flax" 后端
@classmethod
def from_pretrained(cls, *args, **kwargs): # 类方法,从预训练模型创建实例
requires_backends(cls, ["flax"]) # 检查类是否支持 "flax" 后端
class FlaxAutoencoderKL(metaclass=DummyObject): # 定义 FlaxAutoencoderKL 类,使用 DummyObject 作为元类
_backends = ["flax"] # 指定支持的后端为 "flax"
def __init__(self, *args, **kwargs): # 构造函数,接收可变参数
requires_backends(self, ["flax"]) # 检查是否支持 "flax" 后端
@classmethod
def from_config(cls, *args, **kwargs): # 类方法,用于从配置创建实例
requires_backends(cls, ["flax"]) # 检查类是否支持 "flax" 后端
@classmethod
def from_pretrained(cls, *args, **kwargs): # 类方法,从预训练模型创建实例
requires_backends(cls, ["flax"]) # 检查类是否支持 "flax" 后端
class FlaxDiffusionPipeline(metaclass=DummyObject): # 定义 FlaxDiffusionPipeline 类,使用 DummyObject 作为元类
_backends = ["flax"] # 指定支持的后端为 "flax"
def __init__(self, *args, **kwargs): # 构造函数,接收可变参数
requires_backends(self, ["flax"]) # 检查是否支持 "flax" 后端
@classmethod
def from_config(cls, *args, **kwargs): # 类方法,用于从配置创建实例
requires_backends(cls, ["flax"]) # 检查类是否支持 "flax" 后端
@classmethod
def from_pretrained(cls, *args, **kwargs): # 类方法,从预训练模型创建实例
requires_backends(cls, ["flax"]) # 检查类是否支持 "flax" 后端
class FlaxDDIMScheduler(metaclass=DummyObject): # 定义 FlaxDDIMScheduler 类,使用 DummyObject 作为元类
_backends = ["flax"] # 指定支持的后端为 "flax"
def __init__(self, *args, **kwargs): # 构造函数,接收可变参数
requires_backends(self, ["flax"]) # 检查是否支持 "flax" 后端
@classmethod
def from_config(cls, *args, **kwargs): # 类方法,用于从配置创建实例
requires_backends(cls, ["flax"]) # 检查类是否支持 "flax" 后端
@classmethod
def from_pretrained(cls, *args, **kwargs): # 类方法,从预训练模型创建实例
requires_backends(cls, ["flax"]) # 检查类是否支持 "flax" 后端
class FlaxDDPMScheduler(metaclass=DummyObject): # 定义 FlaxDDPMScheduler 类,使用 DummyObject 作为元类
_backends = ["flax"] # 指定支持的后端为 "flax"
def __init__(self, *args, **kwargs): # 构造函数,接收可变参数
requires_backends(self, ["flax"]) # 检查是否支持 "flax" 后端
@classmethod
def from_config(cls, *args, **kwargs): # 类方法,用于从配置创建实例
requires_backends(cls, ["flax"]) # 检查类是否支持 "flax" 后端
@classmethod
def from_pretrained(cls, *args, **kwargs): # 类方法,从预训练模型创建实例
requires_backends(cls, ["flax"]) # 检查类是否支持 "flax" 后端
class FlaxDPMSolverMultistepScheduler(metaclass=DummyObject): # 定义 FlaxDPMSolverMultistepScheduler 类,使用 DummyObject 作为元类
_backends = ["flax"] # 指定支持的后端为 "flax"
def __init__(self, *args, **kwargs): # 构造函数,接收可变参数
requires_backends(self, ["flax"]) # 检查是否支持 "flax" 后端
@classmethod
def from_config(cls, *args, **kwargs): # 类方法,用于从配置创建实例
requires_backends(cls, ["flax"]) # 检查类是否支持 "flax" 后端
@classmethod
# 定义一个类方法,从预训练模型加载数据
def from_pretrained(cls, *args, **kwargs):
# 检查所需的后端是否可用,这里是 "flax"
requires_backends(cls, ["flax"])
# 定义一个名为 FlaxEulerDiscreteScheduler 的类,使用 DummyObject 作为其元类
class FlaxEulerDiscreteScheduler(metaclass=DummyObject):
# 设置该类支持的后端为 "flax"
_backends = ["flax"]
# 初始化方法,接受可变参数
def __init__(self, *args, **kwargs):
# 检查是否满足后端要求
requires_backends(self, ["flax"])
# 类方法,根据配置创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查类是否满足后端要求
requires_backends(cls, ["flax"])
# 类方法,从预训练模型创建实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查类是否满足后端要求
requires_backends(cls, ["flax"])
# 定义一个名为 FlaxKarrasVeScheduler 的类,使用 DummyObject 作为其元类
class FlaxKarrasVeScheduler(metaclass=DummyObject):
# 设置该类支持的后端为 "flax"
_backends = ["flax"]
# 初始化方法,接受可变参数
def __init__(self, *args, **kwargs):
# 检查是否满足后端要求
requires_backends(self, ["flax"])
# 类方法,根据配置创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查类是否满足后端要求
requires_backends(cls, ["flax"])
# 类方法,从预训练模型创建实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查类是否满足后端要求
requires_backends(cls, ["flax"])
# 定义一个名为 FlaxLMSDiscreteScheduler 的类,使用 DummyObject 作为其元类
class FlaxLMSDiscreteScheduler(metaclass=DummyObject):
# 设置该类支持的后端为 "flax"
_backends = ["flax"]
# 初始化方法,接受可变参数
def __init__(self, *args, **kwargs):
# 检查是否满足后端要求
requires_backends(self, ["flax"])
# 类方法,根据配置创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查类是否满足后端要求
requires_backends(cls, ["flax"])
# 类方法,从预训练模型创建实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查类是否满足后端要求
requires_backends(cls, ["flax"])
# 定义一个名为 FlaxPNDMScheduler 的类,使用 DummyObject 作为其元类
class FlaxPNDMScheduler(metaclass=DummyObject):
# 设置该类支持的后端为 "flax"
_backends = ["flax"]
# 初始化方法,接受可变参数
def __init__(self, *args, **kwargs):
# 检查是否满足后端要求
requires_backends(self, ["flax"])
# 类方法,根据配置创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查类是否满足后端要求
requires_backends(cls, ["flax"])
# 类方法,从预训练模型创建实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查类是否满足后端要求
requires_backends(cls, ["flax"])
# 定义一个名为 FlaxSchedulerMixin 的类,使用 DummyObject 作为其元类
class FlaxSchedulerMixin(metaclass=DummyObject):
# 设置该类支持的后端为 "flax"
_backends = ["flax"]
# 初始化方法,接受可变参数
def __init__(self, *args, **kwargs):
# 检查是否满足后端要求
requires_backends(self, ["flax"])
# 类方法,根据配置创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查类是否满足后端要求
requires_backends(cls, ["flax"])
# 类方法,从预训练模型创建实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查类是否满足后端要求
requires_backends(cls, ["flax"])
# 定义一个名为 FlaxScoreSdeVeScheduler 的类,使用 DummyObject 作为其元类
class FlaxScoreSdeVeScheduler(metaclass=DummyObject):
# 设置该类支持的后端为 "flax"
_backends = ["flax"]
# 初始化方法,接受可变参数
def __init__(self, *args, **kwargs):
# 检查是否满足后端要求
requires_backends(self, ["flax"])
# 类方法,根据配置创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查类是否满足后端要求
requires_backends(cls, ["flax"])
# 类方法,从预训练模型创建实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查类是否满足后端要求
requires_backends(cls, ["flax"])
.\diffusers\utils\dummy_note_seq_objects.py
# 该文件由命令 `make fix-copies` 自动生成,请勿编辑。
from ..utils import DummyObject, requires_backends # 从 utils 模块导入 DummyObject 和 requires_backends 函数
class MidiProcessor(metaclass=DummyObject): # 定义 MidiProcessor 类,使用 DummyObject 作为其元类
_backends = ["note_seq"] # 定义类属性 _backends,包含支持的后端列表
def __init__(self, *args, **kwargs): # 定义构造函数,接受任意位置和关键字参数
requires_backends(self, ["note_seq"]) # 检查是否存在所需的后端,如果没有则抛出错误
@classmethod
def from_config(cls, *args, **kwargs): # 定义类方法 from_config,接受任意位置和关键字参数
requires_backends(cls, ["note_seq"]) # 检查类是否有所需的后端
@classmethod
def from_pretrained(cls, *args, **kwargs): # 定义类方法 from_pretrained,接受任意位置和关键字参数
requires_backends(cls, ["note_seq"]) # 检查类是否有所需的后端
.\diffusers\utils\dummy_onnx_objects.py
# 该文件由命令 `make fix-copies` 自动生成,请勿编辑。
from ..utils import DummyObject, requires_backends # 从 utils 模块导入 DummyObject 和 requires_backends 函数
class OnnxRuntimeModel(metaclass=DummyObject): # 定义 OnnxRuntimeModel 类,使用 DummyObject 作为其元类
_backends = ["onnx"] # 定义一个类属性,表示支持的后端列表
def __init__(self, *args, **kwargs): # 初始化方法,接受任意数量的位置和关键字参数
requires_backends(self, ["onnx"]) # 调用 requires_backends 函数,检查是否支持 'onnx' 后端
@classmethod
def from_config(cls, *args, **kwargs): # 类方法,接受任意数量的位置和关键字参数
requires_backends(cls, ["onnx"]) # 调用 requires_backends 函数,检查类是否支持 'onnx' 后端
@classmethod
def from_pretrained(cls, *args, **kwargs): # 类方法,接受任意数量的位置和关键字参数
requires_backends(cls, ["onnx"]) # 调用 requires_backends 函数,检查类是否支持 'onnx' 后端
.\diffusers\utils\dummy_pt_objects.py
# 该文件由命令 `make fix-copies` 自动生成,请勿编辑。
from ..utils import DummyObject, requires_backends # 从 utils 导入 DummyObject 和 requires_backends 函数
class AsymmetricAutoencoderKL(metaclass=DummyObject): # 定义 AsymmetricAutoencoderKL 类,使用 DummyObject 作为元类
_backends = ["torch"] # 指定支持的后端为 "torch"
def __init__(self, *args, **kwargs): # 初始化方法,接受任意位置和关键字参数
requires_backends(self, ["torch"]) # 检查是否支持 "torch" 后端
@classmethod
def from_config(cls, *args, **kwargs): # 类方法,根据配置创建实例
requires_backends(cls, ["torch"]) # 检查类是否支持 "torch" 后端
@classmethod
def from_pretrained(cls, *args, **kwargs): # 类方法,从预训练模型创建实例
requires_backends(cls, ["torch"]) # 检查类是否支持 "torch" 后端
class AuraFlowTransformer2DModel(metaclass=DummyObject): # 定义 AuraFlowTransformer2DModel 类,使用 DummyObject 作为元类
_backends = ["torch"] # 指定支持的后端为 "torch"
def __init__(self, *args, **kwargs): # 初始化方法,接受任意位置和关键字参数
requires_backends(self, ["torch"]) # 检查是否支持 "torch" 后端
@classmethod
def from_config(cls, *args, **kwargs): # 类方法,根据配置创建实例
requires_backends(cls, ["torch"]) # 检查类是否支持 "torch" 后端
@classmethod
def from_pretrained(cls, *args, **kwargs): # 类方法,从预训练模型创建实例
requires_backends(cls, ["torch"]) # 检查类是否支持 "torch" 后端
class AutoencoderKL(metaclass=DummyObject): # 定义 AutoencoderKL 类,使用 DummyObject 作为元类
_backends = ["torch"] # 指定支持的后端为 "torch"
def __init__(self, *args, **kwargs): # 初始化方法,接受任意位置和关键字参数
requires_backends(self, ["torch"]) # 检查是否支持 "torch" 后端
@classmethod
def from_config(cls, *args, **kwargs): # 类方法,根据配置创建实例
requires_backends(cls, ["torch"]) # 检查类是否支持 "torch" 后端
@classmethod
def from_pretrained(cls, *args, **kwargs): # 类方法,从预训练模型创建实例
requires_backends(cls, ["torch"]) # 检查类是否支持 "torch" 后端
class AutoencoderKLCogVideoX(metaclass=DummyObject): # 定义 AutoencoderKLCogVideoX 类,使用 DummyObject 作为元类
_backends = ["torch"] # 指定支持的后端为 "torch"
def __init__(self, *args, **kwargs): # 初始化方法,接受任意位置和关键字参数
requires_backends(self, ["torch"]) # 检查是否支持 "torch" 后端
@classmethod
def from_config(cls, *args, **kwargs): # 类方法,根据配置创建实例
requires_backends(cls, ["torch"]) # 检查类是否支持 "torch" 后端
@classmethod
def from_pretrained(cls, *args, **kwargs): # 类方法,从预训练模型创建实例
requires_backends(cls, ["torch"]) # 检查类是否支持 "torch" 后端
class AutoencoderKLTemporalDecoder(metaclass=DummyObject): # 定义 AutoencoderKLTemporalDecoder 类,使用 DummyObject 作为元类
_backends = ["torch"] # 指定支持的后端为 "torch"
def __init__(self, *args, **kwargs): # 初始化方法,接受任意位置和关键字参数
requires_backends(self, ["torch"]) # 检查是否支持 "torch" 后端
@classmethod
def from_config(cls, *args, **kwargs): # 类方法,根据配置创建实例
requires_backends(cls, ["torch"]) # 检查类是否支持 "torch" 后端
@classmethod
def from_pretrained(cls, *args, **kwargs): # 类方法,从预训练模型创建实例
requires_backends(cls, ["torch"]) # 检查类是否支持 "torch" 后端
class AutoencoderOobleck(metaclass=DummyObject): # 定义 AutoencoderOobleck 类,使用 DummyObject 作为元类
_backends = ["torch"] # 指定支持的后端为 "torch"
def __init__(self, *args, **kwargs): # 初始化方法,接受任意位置和关键字参数
requires_backends(self, ["torch"]) # 检查是否支持 "torch" 后端
@classmethod
def from_config(cls, *args, **kwargs): # 类方法,根据配置创建实例
requires_backends(cls, ["torch"]) # 检查类是否支持 "torch" 后端
@classmethod
def from_pretrained(cls, *args, **kwargs): # 类方法,从预训练模型创建实例
requires_backends(cls, ["torch"]) # 检查类是否支持 "torch" 后端
class AutoencoderTiny(metaclass=DummyObject): # 定义 AutoencoderTiny 类,使用 DummyObject 作为元类
_backends = ["torch"] # 指定支持的后端为 "torch"
def __init__(self, *args, **kwargs): # 初始化方法,接受任意位置和关键字参数
requires_backends(self, ["torch"]) # 检查是否支持 "torch" 后端
@classmethod
def from_config(cls, *args, **kwargs): # 类方法,根据配置创建实例
requires_backends(cls, ["torch"]) # 检查类是否支持 "torch" 后端
@classmethod
def from_pretrained(cls, *args, **kwargs): # 类方法,从预训练模型创建实例
requires_backends(cls, ["torch"]) # 检查类是否支持 "torch" 后端
class CogVideoXTransformer3DModel(metaclass=DummyObject): # 定义 CogVideoXTransformer3DModel 类,使用 DummyObject 作为元类
_backends = ["torch"] # 指定支持的后端为 "torch"
def __init__(self, *args, **kwargs): # 初始化方法,接受任意位置和关键字参数
requires_backends(self, ["torch"]) # 检查是否支持 "torch" 后端
@classmethod # 开始定义一个类方法
# 从配置中创建类实例的方法,接受可变参数和关键字参数
def from_config(cls, *args, **kwargs):
# 检查是否需要特定的后端,确保 'torch' 已被导入
requires_backends(cls, ["torch"])
# 从预训练模型创建类实例的方法,接受可变参数和关键字参数
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查是否需要特定的后端,确保 'torch' 已被导入
requires_backends(cls, ["torch"])
# 定义一个名为 ConsistencyDecoderVAE 的类,使用 DummyObject 作为元类
class ConsistencyDecoderVAE(metaclass=DummyObject):
# 类属性,指定支持的后端框架为 "torch"
_backends = ["torch"]
# 初始化方法,接受任意数量的位置参数和关键字参数
def __init__(self, *args, **kwargs):
# 检查所需的后端是否可用,这里是 "torch"
requires_backends(self, ["torch"])
# 类方法,用于从配置创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查所需的后端是否可用,这里是 "torch"
requires_backends(cls, ["torch"])
# 类方法,用于从预训练模型创建实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查所需的后端是否可用,这里是 "torch"
requires_backends(cls, ["torch"])
# 定义一个名为 ControlNetModel 的类,使用 DummyObject 作为元类
class ControlNetModel(metaclass=DummyObject):
# 类属性,指定支持的后端框架为 "torch"
_backends = ["torch"]
# 初始化方法,接受任意数量的位置参数和关键字参数
def __init__(self, *args, **kwargs):
# 检查所需的后端是否可用,这里是 "torch"
requires_backends(self, ["torch"])
# 类方法,用于从配置创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查所需的后端是否可用,这里是 "torch"
requires_backends(cls, ["torch"])
# 类方法,用于从预训练模型创建实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查所需的后端是否可用,这里是 "torch"
requires_backends(cls, ["torch"])
# 定义一个名为 ControlNetXSAdapter 的类,使用 DummyObject 作为元类
class ControlNetXSAdapter(metaclass=DummyObject):
# 类属性,指定支持的后端框架为 "torch"
_backends = ["torch"]
# 初始化方法,接受任意数量的位置参数和关键字参数
def __init__(self, *args, **kwargs):
# 检查所需的后端是否可用,这里是 "torch"
requires_backends(self, ["torch"])
# 类方法,用于从配置创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查所需的后端是否可用,这里是 "torch"
requires_backends(cls, ["torch"])
# 类方法,用于从预训练模型创建实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查所需的后端是否可用,这里是 "torch"
requires_backends(cls, ["torch"])
# 定义一个名为 DiTTransformer2DModel 的类,使用 DummyObject 作为元类
class DiTTransformer2DModel(metaclass=DummyObject):
# 类属性,指定支持的后端框架为 "torch"
_backends = ["torch"]
# 初始化方法,接受任意数量的位置参数和关键字参数
def __init__(self, *args, **kwargs):
# 检查所需的后端是否可用,这里是 "torch"
requires_backends(self, ["torch"])
# 类方法,用于从配置创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查所需的后端是否可用,这里是 "torch"
requires_backends(cls, ["torch"])
# 类方法,用于从预训练模型创建实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查所需的后端是否可用,这里是 "torch"
requires_backends(cls, ["torch"])
# 定义一个名为 FluxTransformer2DModel 的类,使用 DummyObject 作为元类
class FluxTransformer2DModel(metaclass=DummyObject):
# 类属性,指定支持的后端框架为 "torch"
_backends = ["torch"]
# 初始化方法,接受任意数量的位置参数和关键字参数
def __init__(self, *args, **kwargs):
# 检查所需的后端是否可用,这里是 "torch"
requires_backends(self, ["torch"])
# 类方法,用于从配置创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查所需的后端是否可用,这里是 "torch"
requires_backends(cls, ["torch"])
# 类方法,用于从预训练模型创建实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查所需的后端是否可用,这里是 "torch"
requires_backends(cls, ["torch"])
# 定义一个名为 HunyuanDiT2DControlNetModel 的类,使用 DummyObject 作为元类
class HunyuanDiT2DControlNetModel(metaclass=DummyObject):
# 类属性,指定支持的后端框架为 "torch"
_backends = ["torch"]
# 初始化方法,接受任意数量的位置参数和关键字参数
def __init__(self, *args, **kwargs):
# 检查所需的后端是否可用,这里是 "torch"
requires_backends(self, ["torch"])
# 类方法,用于从配置创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查所需的后端是否可用,这里是 "torch"
requires_backends(cls, ["torch"])
# 类方法,用于从预训练模型创建实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查所需的后端是否可用,这里是 "torch"
requires_backends(cls, ["torch"])
# 定义一个名为 HunyuanDiT2DModel 的类,使用 DummyObject 作为元类
class HunyuanDiT2DModel(metaclass=DummyObject):
# 类属性,指定支持的后端框架为 "torch"
_backends = ["torch"]
# 初始化方法,接受任意数量的位置参数和关键字参数
def __init__(self, *args, **kwargs):
# 检查所需的后端是否可用,这里是 "torch"
requires_backends(self, ["torch"])
# 类方法,用于从配置创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查所需的后端是否可用,这里是 "torch"
requires_backends(cls, ["torch"])
# 类方法,用于从预训练模型创建实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查所需的后端是否可用,这里是 "torch"
requires_backends(cls, ["torch"])
# 定义一个名为 HunyuanDiT2DMultiControlNetModel 的类,使用 DummyObject 作为元类
class HunyuanDiT2DMultiControlNetModel(metaclass=DummyObject):
# 类属性,指定支持的后端框架为 "torch"
_backends = ["torch"]
# 初始化方法,接受任意数量的位置参数和关键字参数
def __init__(self, *args, **kwargs):
# 检查所需的后端是否可用,这里是 "torch"
requires_backends(self, ["torch"])
# 类方法,用于从配置创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查所需的后端是否可用,这里是 "torch"
requires_backends(cls, ["torch"])
# 类方法,用于从预训练模型创建实例
# 从预训练模型加载类方法,接收可变参数和关键字参数
def from_pretrained(cls, *args, **kwargs):
# 检查所需的后端是否可用,这里要求有 "torch"
requires_backends(cls, ["torch"])
# 定义 I2VGenXLUNet 类,使用 DummyObject 作为元类
class I2VGenXLUNet(metaclass=DummyObject):
# 指定支持的后端为 torch
_backends = ["torch"]
# 初始化方法,接受任意参数
def __init__(self, *args, **kwargs):
# 确保所需的后端存在
requires_backends(self, ["torch"])
# 类方法,根据配置创建类实例
@classmethod
def from_config(cls, *args, **kwargs):
# 确保所需的后端存在
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建类实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 确保所需的后端存在
requires_backends(cls, ["torch"])
# 定义 Kandinsky3UNet 类,使用 DummyObject 作为元类
class Kandinsky3UNet(metaclass=DummyObject):
# 指定支持的后端为 torch
_backends = ["torch"]
# 初始化方法,接受任意参数
def __init__(self, *args, **kwargs):
# 确保所需的后端存在
requires_backends(self, ["torch"])
# 类方法,根据配置创建类实例
@classmethod
def from_config(cls, *args, **kwargs):
# 确保所需的后端存在
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建类实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 确保所需的后端存在
requires_backends(cls, ["torch"])
# 定义 LatteTransformer3DModel 类,使用 DummyObject 作为元类
class LatteTransformer3DModel(metaclass=DummyObject):
# 指定支持的后端为 torch
_backends = ["torch"]
# 初始化方法,接受任意参数
def __init__(self, *args, **kwargs):
# 确保所需的后端存在
requires_backends(self, ["torch"])
# 类方法,根据配置创建类实例
@classmethod
def from_config(cls, *args, **kwargs):
# 确保所需的后端存在
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建类实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 确保所需的后端存在
requires_backends(cls, ["torch"])
# 定义 LuminaNextDiT2DModel 类,使用 DummyObject 作为元类
class LuminaNextDiT2DModel(metaclass=DummyObject):
# 指定支持的后端为 torch
_backends = ["torch"]
# 初始化方法,接受任意参数
def __init__(self, *args, **kwargs):
# 确保所需的后端存在
requires_backends(self, ["torch"])
# 类方法,根据配置创建类实例
@classmethod
def from_config(cls, *args, **kwargs):
# 确保所需的后端存在
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建类实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 确保所需的后端存在
requires_backends(cls, ["torch"])
# 定义 ModelMixin 类,使用 DummyObject 作为元类
class ModelMixin(metaclass=DummyObject):
# 指定支持的后端为 torch
_backends = ["torch"]
# 初始化方法,接受任意参数
def __init__(self, *args, **kwargs):
# 确保所需的后端存在
requires_backends(self, ["torch"])
# 类方法,根据配置创建类实例
@classmethod
def from_config(cls, *args, **kwargs):
# 确保所需的后端存在
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建类实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 确保所需的后端存在
requires_backends(cls, ["torch"])
# 定义 MotionAdapter 类,使用 DummyObject 作为元类
class MotionAdapter(metaclass=DummyObject):
# 指定支持的后端为 torch
_backends = ["torch"]
# 初始化方法,接受任意参数
def __init__(self, *args, **kwargs):
# 确保所需的后端存在
requires_backends(self, ["torch"])
# 类方法,根据配置创建类实例
@classmethod
def from_config(cls, *args, **kwargs):
# 确保所需的后端存在
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建类实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 确保所需的后端存在
requires_backends(cls, ["torch"])
# 定义 MultiAdapter 类,使用 DummyObject 作为元类
class MultiAdapter(metaclass=DummyObject):
# 指定支持的后端为 torch
_backends = ["torch"]
# 初始化方法,接受任意参数
def __init__(self, *args, **kwargs):
# 确保所需的后端存在
requires_backends(self, ["torch"])
# 类方法,根据配置创建类实例
@classmethod
def from_config(cls, *args, **kwargs):
# 确保所需的后端存在
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建类实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 确保所需的后端存在
requires_backends(cls, ["torch"])
# 定义 PixArtTransformer2DModel 类,使用 DummyObject 作为元类
class PixArtTransformer2DModel(metaclass=DummyObject):
# 指定支持的后端为 torch
_backends = ["torch"]
# 初始化方法,接受任意参数
def __init__(self, *args, **kwargs):
# 确保所需的后端存在
requires_backends(self, ["torch"])
# 类方法,根据配置创建类实例
@classmethod
def from_config(cls, *args, **kwargs):
# 确保所需的后端存在
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建类实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 确保所需的后端存在
requires_backends(cls, ["torch"])
# 定义 PriorTransformer 类,使用 DummyObject 作为元类
class PriorTransformer(metaclass=DummyObject):
# 定义支持的后端为 "torch"
_backends = ["torch"]
# 初始化方法,接受可变参数和关键字参数
def __init__(self, *args, **kwargs):
# 检查并要求后端支持
requires_backends(self, ["torch"])
# 类方法,从配置创建类实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查并要求后端支持
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建类实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查并要求后端支持
requires_backends(cls, ["torch"])
# 定义 SD3ControlNetModel 类,使用 DummyObject 作为元类
class SD3ControlNetModel(metaclass=DummyObject):
# 定义支持的后端为 "torch"
_backends = ["torch"]
# 初始化方法,接受可变参数和关键字参数
def __init__(self, *args, **kwargs):
# 检查并要求后端支持
requires_backends(self, ["torch"])
# 类方法,从配置创建类实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查并要求后端支持
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建类实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查并要求后端支持
requires_backends(cls, ["torch"])
# 定义 SD3MultiControlNetModel 类,使用 DummyObject 作为元类
class SD3MultiControlNetModel(metaclass=DummyObject):
# 定义支持的后端为 "torch"
_backends = ["torch"]
# 初始化方法,接受可变参数和关键字参数
def __init__(self, *args, **kwargs):
# 检查并要求后端支持
requires_backends(self, ["torch"])
# 类方法,从配置创建类实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查并要求后端支持
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建类实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查并要求后端支持
requires_backends(cls, ["torch"])
# 定义 SD3Transformer2DModel 类,使用 DummyObject 作为元类
class SD3Transformer2DModel(metaclass=DummyObject):
# 定义支持的后端为 "torch"
_backends = ["torch"]
# 初始化方法,接受可变参数和关键字参数
def __init__(self, *args, **kwargs):
# 检查并要求后端支持
requires_backends(self, ["torch"])
# 类方法,从配置创建类实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查并要求后端支持
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建类实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查并要求后端支持
requires_backends(cls, ["torch"])
# 定义 SparseControlNetModel 类,使用 DummyObject 作为元类
class SparseControlNetModel(metaclass=DummyObject):
# 定义支持的后端为 "torch"
_backends = ["torch"]
# 初始化方法,接受可变参数和关键字参数
def __init__(self, *args, **kwargs):
# 检查并要求后端支持
requires_backends(self, ["torch"])
# 类方法,从配置创建类实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查并要求后端支持
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建类实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查并要求后端支持
requires_backends(cls, ["torch"])
# 定义 StableAudioDiTModel 类,使用 DummyObject 作为元类
class StableAudioDiTModel(metaclass=DummyObject):
# 定义支持的后端为 "torch"
_backends = ["torch"]
# 初始化方法,接受可变参数和关键字参数
def __init__(self, *args, **kwargs):
# 检查并要求后端支持
requires_backends(self, ["torch"])
# 类方法,从配置创建类实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查并要求后端支持
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建类实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查并要求后端支持
requires_backends(cls, ["torch"])
# 定义 T2IAdapter 类,使用 DummyObject 作为元类
class T2IAdapter(metaclass=DummyObject):
# 定义支持的后端为 "torch"
_backends = ["torch"]
# 初始化方法,接受可变参数和关键字参数
def __init__(self, *args, **kwargs):
# 检查并要求后端支持
requires_backends(self, ["torch"])
# 类方法,从配置创建类实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查并要求后端支持
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建类实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查并要求后端支持
requires_backends(cls, ["torch"])
# 定义 T5FilmDecoder 类,使用 DummyObject 作为元类
class T5FilmDecoder(metaclass=DummyObject):
# 定义支持的后端为 "torch"
_backends = ["torch"]
# 初始化方法,接受可变参数和关键字参数
def __init__(self, *args, **kwargs):
# 检查并要求后端支持
requires_backends(self, ["torch"])
# 类方法,从配置创建类实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查并要求后端支持
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建类实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查并要求后端支持
requires_backends(cls, ["torch"])
# 定义一个二维变换模型的类,使用 DummyObject 作为元类
class Transformer2DModel(metaclass=DummyObject):
# 指定支持的后端库
_backends = ["torch"]
# 构造函数,接受任意位置和关键字参数
def __init__(self, *args, **kwargs):
# 检查是否安装了所需的后端库
requires_backends(self, ["torch"])
# 类方法,从配置中创建模型实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查是否安装了所需的后端库
requires_backends(cls, ["torch"])
# 类方法,从预训练模型加载
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查是否安装了所需的后端库
requires_backends(cls, ["torch"])
# 定义一个一维 UNet 模型的类,使用 DummyObject 作为元类
class UNet1DModel(metaclass=DummyObject):
# 指定支持的后端库
_backends = ["torch"]
# 构造函数,接受任意位置和关键字参数
def __init__(self, *args, **kwargs):
# 检查是否安装了所需的后端库
requires_backends(self, ["torch"])
# 类方法,从配置中创建模型实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查是否安装了所需的后端库
requires_backends(cls, ["torch"])
# 类方法,从预训练模型加载
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查是否安装了所需的后端库
requires_backends(cls, ["torch"])
# 定义一个二维条件 UNet 模型的类,使用 DummyObject 作为元类
class UNet2DConditionModel(metaclass=DummyObject):
# 指定支持的后端库
_backends = ["torch"]
# 构造函数,接受任意位置和关键字参数
def __init__(self, *args, **kwargs):
# 检查是否安装了所需的后端库
requires_backends(self, ["torch"])
# 类方法,从配置中创建模型实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查是否安装了所需的后端库
requires_backends(cls, ["torch"])
# 类方法,从预训练模型加载
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查是否安装了所需的后端库
requires_backends(cls, ["torch"])
# 定义一个二维 UNet 模型的类,使用 DummyObject 作为元类
class UNet2DModel(metaclass=DummyObject):
# 指定支持的后端库
_backends = ["torch"]
# 构造函数,接受任意位置和关键字参数
def __init__(self, *args, **kwargs):
# 检查是否安装了所需的后端库
requires_backends(self, ["torch"])
# 类方法,从配置中创建模型实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查是否安装了所需的后端库
requires_backends(cls, ["torch"])
# 类方法,从预训练模型加载
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查是否安装了所需的后端库
requires_backends(cls, ["torch"])
# 定义一个三维条件 UNet 模型的类,使用 DummyObject 作为元类
class UNet3DConditionModel(metaclass=DummyObject):
# 指定支持的后端库
_backends = ["torch"]
# 构造函数,接受任意位置和关键字参数
def __init__(self, *args, **kwargs):
# 检查是否安装了所需的后端库
requires_backends(self, ["torch"])
# 类方法,从配置中创建模型实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查是否安装了所需的后端库
requires_backends(cls, ["torch"])
# 类方法,从预训练模型加载
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查是否安装了所需的后端库
requires_backends(cls, ["torch"])
# 定义一个 UNet 控制网 XS 模型的类,使用 DummyObject 作为元类
class UNetControlNetXSModel(metaclass=DummyObject):
# 指定支持的后端库
_backends = ["torch"]
# 构造函数,接受任意位置和关键字参数
def __init__(self, *args, **kwargs):
# 检查是否安装了所需的后端库
requires_backends(self, ["torch"])
# 类方法,从配置中创建模型实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查是否安装了所需的后端库
requires_backends(cls, ["torch"])
# 类方法,从预训练模型加载
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查是否安装了所需的后端库
requires_backends(cls, ["torch"])
# 定义一个 UNet 动作模型的类,使用 DummyObject 作为元类
class UNetMotionModel(metaclass=DummyObject):
# 指定支持的后端库
_backends = ["torch"]
# 构造函数,接受任意位置和关键字参数
def __init__(self, *args, **kwargs):
# 检查是否安装了所需的后端库
requires_backends(self, ["torch"])
# 类方法,从配置中创建模型实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查是否安装了所需的后端库
requires_backends(cls, ["torch"])
# 类方法,从预训练模型加载
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查是否安装了所需的后端库
requires_backends(cls, ["torch"])
# 定义一个 UNet 时空条件模型的类,使用 DummyObject 作为元类
class UNetSpatioTemporalConditionModel(metaclass=DummyObject):
# 指定支持的后端库
_backends = ["torch"]
# 构造函数,接受任意位置和关键字参数
def __init__(self, *args, **kwargs):
# 检查是否安装了所需的后端库
requires_backends(self, ["torch"])
# 类方法,从配置中创建模型实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查是否安装了所需的后端库
requires_backends(cls, ["torch"])
# 类方法,从预训练模型加载
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查是否安装了所需的后端库
requires_backends(cls, ["torch"])
# 定义 UVit2DModel 类,使用 DummyObject 作为元类
class UVit2DModel(metaclass=DummyObject):
# 定义支持的后端为 "torch"
_backends = ["torch"]
# 初始化方法,接受任意位置和关键字参数
def __init__(self, *args, **kwargs):
# 检查是否有所需的后端
requires_backends(self, ["torch"])
# 类方法,根据配置创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查类是否有所需的后端
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查类是否有所需的后端
requires_backends(cls, ["torch"])
# 定义 VQModel 类,使用 DummyObject 作为元类
class VQModel(metaclass=DummyObject):
# 定义支持的后端为 "torch"
_backends = ["torch"]
# 初始化方法,接受任意位置和关键字参数
def __init__(self, *args, **kwargs):
# 检查是否有所需的后端
requires_backends(self, ["torch"])
# 类方法,根据配置创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查类是否有所需的后端
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查类是否有所需的后端
requires_backends(cls, ["torch"])
# 定义获取常量调度的函数,接受任意位置和关键字参数
def get_constant_schedule(*args, **kwargs):
# 检查函数是否有所需的后端
requires_backends(get_constant_schedule, ["torch"])
# 定义获取带预热的常量调度的函数,接受任意位置和关键字参数
def get_constant_schedule_with_warmup(*args, **kwargs):
# 检查函数是否有所需的后端
requires_backends(get_constant_schedule_with_warmup, ["torch"])
# 定义获取带预热的余弦调度的函数,接受任意位置和关键字参数
def get_cosine_schedule_with_warmup(*args, **kwargs):
# 检查函数是否有所需的后端
requires_backends(get_cosine_schedule_with_warmup, ["torch"])
# 定义获取带预热和硬重启的余弦调度的函数,接受任意位置和关键字参数
def get_cosine_with_hard_restarts_schedule_with_warmup(*args, **kwargs):
# 检查函数是否有所需的后端
requires_backends(get_cosine_with_hard_restarts_schedule_with_warmup, ["torch"])
# 定义获取带预热的线性调度的函数,接受任意位置和关键字参数
def get_linear_schedule_with_warmup(*args, **kwargs):
# 检查函数是否有所需的后端
requires_backends(get_linear_schedule_with_warmup, ["torch"])
# 定义获取带预热的多项式衰减调度的函数,接受任意位置和关键字参数
def get_polynomial_decay_schedule_with_warmup(*args, **kwargs):
# 检查函数是否有所需的后端
requires_backends(get_polynomial_decay_schedule_with_warmup, ["torch"])
# 定义获取调度器的函数,接受任意位置和关键字参数
def get_scheduler(*args, **kwargs):
# 检查函数是否有所需的后端
requires_backends(get_scheduler, ["torch"])
# 定义 AudioPipelineOutput 类,使用 DummyObject 作为元类
class AudioPipelineOutput(metaclass=DummyObject):
# 定义支持的后端为 "torch"
_backends = ["torch"]
# 初始化方法,接受任意位置和关键字参数
def __init__(self, *args, **kwargs):
# 检查是否有所需的后端
requires_backends(self, ["torch"])
# 类方法,根据配置创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查类是否有所需的后端
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查类是否有所需的后端
requires_backends(cls, ["torch"])
# 定义 AutoPipelineForImage2Image 类,使用 DummyObject 作为元类
class AutoPipelineForImage2Image(metaclass=DummyObject):
# 定义支持的后端为 "torch"
_backends = ["torch"]
# 初始化方法,接受任意位置和关键字参数
def __init__(self, *args, **kwargs):
# 检查是否有所需的后端
requires_backends(self, ["torch"])
# 类方法,根据配置创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查类是否有所需的后端
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查类是否有所需的后端
requires_backends(cls, ["torch"])
# 定义 AutoPipelineForInpainting 类,使用 DummyObject 作为元类
class AutoPipelineForInpainting(metaclass=DummyObject):
# 定义支持的后端为 "torch"
_backends = ["torch"]
# 初始化方法,接受任意位置和关键字参数
def __init__(self, *args, **kwargs):
# 检查是否有所需的后端
requires_backends(self, ["torch"])
# 类方法,根据配置创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查类是否有所需的后端
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查类是否有所需的后端
requires_backends(cls, ["torch"])
# 定义 AutoPipelineForText2Image 类,使用 DummyObject 作为元类
class AutoPipelineForText2Image(metaclass=DummyObject):
# 定义支持的后端为 "torch"
_backends = ["torch"]
# 初始化方法,接受任意位置和关键字参数
def __init__(self, *args, **kwargs):
# 检查是否有所需的后端
requires_backends(self, ["torch"])
# 类方法,根据配置创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查类是否有所需的后端
requires_backends(cls, ["torch"])
# 类方法,用于从预训练模型加载数据
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查当前类是否需要特定的后端库,这里需要 "torch"
requires_backends(cls, ["torch"])
# 定义 BlipDiffusionControlNetPipeline 类,使用 DummyObject 作为元类
class BlipDiffusionControlNetPipeline(metaclass=DummyObject):
# 设置支持的后端框架为 torch
_backends = ["torch"]
# 初始化方法,接受可变参数和关键字参数
def __init__(self, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(self, ["torch"])
# 类方法,从配置中创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查类所需的后端是否可用
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查类所需的后端是否可用
requires_backends(cls, ["torch"])
# 定义 BlipDiffusionPipeline 类,使用 DummyObject 作为元类
class BlipDiffusionPipeline(metaclass=DummyObject):
# 设置支持的后端框架为 torch
_backends = ["torch"]
# 初始化方法,接受可变参数和关键字参数
def __init__(self, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(self, ["torch"])
# 类方法,从配置中创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查类所需的后端是否可用
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查类所需的后端是否可用
requires_backends(cls, ["torch"])
# 定义 CLIPImageProjection 类,使用 DummyObject 作为元类
class CLIPImageProjection(metaclass=DummyObject):
# 设置支持的后端框架为 torch
_backends = ["torch"]
# 初始化方法,接受可变参数和关键字参数
def __init__(self, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(self, ["torch"])
# 类方法,从配置中创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查类所需的后端是否可用
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查类所需的后端是否可用
requires_backends(cls, ["torch"])
# 定义 ConsistencyModelPipeline 类,使用 DummyObject 作为元类
class ConsistencyModelPipeline(metaclass=DummyObject):
# 设置支持的后端框架为 torch
_backends = ["torch"]
# 初始化方法,接受可变参数和关键字参数
def __init__(self, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(self, ["torch"])
# 类方法,从配置中创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查类所需的后端是否可用
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查类所需的后端是否可用
requires_backends(cls, ["torch"])
# 定义 DanceDiffusionPipeline 类,使用 DummyObject 作为元类
class DanceDiffusionPipeline(metaclass=DummyObject):
# 设置支持的后端框架为 torch
_backends = ["torch"]
# 初始化方法,接受可变参数和关键字参数
def __init__(self, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(self, ["torch"])
# 类方法,从配置中创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查类所需的后端是否可用
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查类所需的后端是否可用
requires_backends(cls, ["torch"])
# 定义 DDIMPipeline 类,使用 DummyObject 作为元类
class DDIMPipeline(metaclass=DummyObject):
# 设置支持的后端框架为 torch
_backends = ["torch"]
# 初始化方法,接受可变参数和关键字参数
def __init__(self, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(self, ["torch"])
# 类方法,从配置中创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查类所需的后端是否可用
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查类所需的后端是否可用
requires_backends(cls, ["torch"])
# 定义 DDPMPipeline 类,使用 DummyObject 作为元类
class DDPMPipeline(metaclass=DummyObject):
# 设置支持的后端框架为 torch
_backends = ["torch"]
# 初始化方法,接受可变参数和关键字参数
def __init__(self, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(self, ["torch"])
# 类方法,从配置中创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查类所需的后端是否可用
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查类所需的后端是否可用
requires_backends(cls, ["torch"])
# 定义 DiffusionPipeline 类,使用 DummyObject 作为元类
class DiffusionPipeline(metaclass=DummyObject):
# 设置支持的后端框架为 torch
_backends = ["torch"]
# 初始化方法,接受可变参数和关键字参数
def __init__(self, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(self, ["torch"])
# 类方法,从配置中创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查类所需的后端是否可用
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查类所需的后端是否可用
requires_backends(cls, ["torch"])
# 定义一个名为 DiTPipeline 的类,使用 DummyObject 作为元类
class DiTPipeline(metaclass=DummyObject):
# 定义类变量 _backends,指定支持的后端框架
_backends = ["torch"]
# 初始化方法,接收任意位置参数和关键字参数
def __init__(self, *args, **kwargs):
# 检查所需后端是否可用,确保当前对象支持 "torch"
requires_backends(self, ["torch"])
# 类方法,从配置中创建类实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查所需后端是否可用,确保当前类支持 "torch"
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建类实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查所需后端是否可用,确保当前类支持 "torch"
requires_backends(cls, ["torch"])
# 定义一个名为 ImagePipelineOutput 的类,使用 DummyObject 作为元类
class ImagePipelineOutput(metaclass=DummyObject):
# 定义类变量 _backends,指定支持的后端框架
_backends = ["torch"]
# 初始化方法,接收任意位置参数和关键字参数
def __init__(self, *args, **kwargs):
# 检查所需后端是否可用,确保当前对象支持 "torch"
requires_backends(self, ["torch"])
# 类方法,从配置中创建类实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查所需后端是否可用,确保当前类支持 "torch"
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建类实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查所需后端是否可用,确保当前类支持 "torch"
requires_backends(cls, ["torch"])
# 定义一个名为 KarrasVePipeline 的类,使用 DummyObject 作为元类
class KarrasVePipeline(metaclass=DummyObject):
# 定义类变量 _backends,指定支持的后端框架
_backends = ["torch"]
# 初始化方法,接收任意位置参数和关键字参数
def __init__(self, *args, **kwargs):
# 检查所需后端是否可用,确保当前对象支持 "torch"
requires_backends(self, ["torch"])
# 类方法,从配置中创建类实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查所需后端是否可用,确保当前类支持 "torch"
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建类实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查所需后端是否可用,确保当前类支持 "torch"
requires_backends(cls, ["torch"])
# 定义一个名为 LDMPipeline 的类,使用 DummyObject 作为元类
class LDMPipeline(metaclass=DummyObject):
# 定义类变量 _backends,指定支持的后端框架
_backends = ["torch"]
# 初始化方法,接收任意位置参数和关键字参数
def __init__(self, *args, **kwargs):
# 检查所需后端是否可用,确保当前对象支持 "torch"
requires_backends(self, ["torch"])
# 类方法,从配置中创建类实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查所需后端是否可用,确保当前类支持 "torch"
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建类实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查所需后端是否可用,确保当前类支持 "torch"
requires_backends(cls, ["torch"])
# 定义一个名为 LDMSuperResolutionPipeline 的类,使用 DummyObject 作为元类
class LDMSuperResolutionPipeline(metaclass=DummyObject):
# 定义类变量 _backends,指定支持的后端框架
_backends = ["torch"]
# 初始化方法,接收任意位置参数和关键字参数
def __init__(self, *args, **kwargs):
# 检查所需后端是否可用,确保当前对象支持 "torch"
requires_backends(self, ["torch"])
# 类方法,从配置中创建类实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查所需后端是否可用,确保当前类支持 "torch"
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建类实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查所需后端是否可用,确保当前类支持 "torch"
requires_backends(cls, ["torch"])
# 定义一个名为 PNDMPipeline 的类,使用 DummyObject 作为元类
class PNDMPipeline(metaclass=DummyObject):
# 定义类变量 _backends,指定支持的后端框架
_backends = ["torch"]
# 初始化方法,接收任意位置参数和关键字参数
def __init__(self, *args, **kwargs):
# 检查所需后端是否可用,确保当前对象支持 "torch"
requires_backends(self, ["torch"])
# 类方法,从配置中创建类实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查所需后端是否可用,确保当前类支持 "torch"
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建类实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查所需后端是否可用,确保当前类支持 "torch"
requires_backends(cls, ["torch"])
# 定义一个名为 RePaintPipeline 的类,使用 DummyObject 作为元类
class RePaintPipeline(metaclass=DummyObject):
# 定义类变量 _backends,指定支持的后端框架
_backends = ["torch"]
# 初始化方法,接收任意位置参数和关键字参数
def __init__(self, *args, **kwargs):
# 检查所需后端是否可用,确保当前对象支持 "torch"
requires_backends(self, ["torch"])
# 类方法,从配置中创建类实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查所需后端是否可用,确保当前类支持 "torch"
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建类实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查所需后端是否可用,确保当前类支持 "torch"
requires_backends(cls, ["torch"])
# 定义一个名为 ScoreSdeVePipeline 的类,使用 DummyObject 作为元类
class ScoreSdeVePipeline(metaclass=DummyObject):
# 定义类变量 _backends,指定支持的后端框架
_backends = ["torch"]
# 初始化方法,接收任意位置参数和关键字参数
def __init__(self, *args, **kwargs):
# 检查所需后端是否可用,确保当前对象支持 "torch"
requires_backends(self, ["torch"])
# 类方法,从配置中创建类实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查所需后端是否可用,确保当前类支持 "torch"
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建类实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查所需后端是否可用,确保当前类支持 "torch"
requires_backends(cls, ["torch"])
# 定义一个类,使用 DummyObject 作为元类,表示该类与其他后端兼容
class StableDiffusionMixin(metaclass=DummyObject):
# 指定该类所依赖的后端,这里是 'torch'
_backends = ["torch"]
# 初始化方法,接受可变参数
def __init__(self, *args, **kwargs):
# 检查并确保所需的后端可用
requires_backends(self, ["torch"])
# 类方法,从配置创建类的实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查并确保所需的后端可用
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建类的实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查并确保所需的后端可用
requires_backends(cls, ["torch"])
# 定义另一个类,使用 DummyObject 作为元类
class AmusedScheduler(metaclass=DummyObject):
# 指定该类所依赖的后端,这里是 'torch'
_backends = ["torch"]
# 初始化方法,接受可变参数
def __init__(self, *args, **kwargs):
# 检查并确保所需的后端可用
requires_backends(self, ["torch"])
# 类方法,从配置创建类的实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查并确保所需的后端可用
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建类的实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查并确保所需的后端可用
requires_backends(cls, ["torch"])
# 定义另一个类,使用 DummyObject 作为元类
class CMStochasticIterativeScheduler(metaclass=DummyObject):
# 指定该类所依赖的后端,这里是 'torch'
_backends = ["torch"]
# 初始化方法,接受可变参数
def __init__(self, *args, **kwargs):
# 检查并确保所需的后端可用
requires_backends(self, ["torch"])
# 类方法,从配置创建类的实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查并确保所需的后端可用
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建类的实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查并确保所需的后端可用
requires_backends(cls, ["torch"])
# 定义另一个类,使用 DummyObject 作为元类
class CogVideoXDDIMScheduler(metaclass=DummyObject):
# 指定该类所依赖的后端,这里是 'torch'
_backends = ["torch"]
# 初始化方法,接受可变参数
def __init__(self, *args, **kwargs):
# 检查并确保所需的后端可用
requires_backends(self, ["torch"])
# 类方法,从配置创建类的实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查并确保所需的后端可用
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建类的实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查并确保所需的后端可用
requires_backends(cls, ["torch"])
# 定义另一个类,使用 DummyObject 作为元类
class CogVideoXDPMScheduler(metaclass=DummyObject):
# 指定该类所依赖的后端,这里是 'torch'
_backends = ["torch"]
# 初始化方法,接受可变参数
def __init__(self, *args, **kwargs):
# 检查并确保所需的后端可用
requires_backends(self, ["torch"])
# 类方法,从配置创建类的实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查并确保所需的后端可用
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建类的实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查并确保所需的后端可用
requires_backends(cls, ["torch"])
# 定义另一个类,使用 DummyObject 作为元类
class DDIMInverseScheduler(metaclass=DummyObject):
# 指定该类所依赖的后端,这里是 'torch'
_backends = ["torch"]
# 初始化方法,接受可变参数
def __init__(self, *args, **kwargs):
# 检查并确保所需的后端可用
requires_backends(self, ["torch"])
# 类方法,从配置创建类的实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查并确保所需的后端可用
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建类的实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查并确保所需的后端可用
requires_backends(cls, ["torch"])
# 定义另一个类,使用 DummyObject 作为元类
class DDIMParallelScheduler(metaclass=DummyObject):
# 指定该类所依赖的后端,这里是 'torch'
_backends = ["torch"]
# 初始化方法,接受可变参数
def __init__(self, *args, **kwargs):
# 检查并确保所需的后端可用
requires_backends(self, ["torch"])
# 类方法,从配置创建类的实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查并确保所需的后端可用
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建类的实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查并确保所需的后端可用
requires_backends(cls, ["torch"])
# 定义另一个类,使用 DummyObject 作为元类
class DDIMScheduler(metaclass=DummyObject):
# 指定该类所依赖的后端,这里是 'torch'
_backends = ["torch"]
# 初始化方法,接受可变参数
def __init__(self, *args, **kwargs):
# 检查并确保所需的后端可用
requires_backends(self, ["torch"])
# 类方法,从配置创建类的实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查并确保所需的后端可用
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建类的实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查并确保所需的后端可用
requires_backends(cls, ["torch"])
# 定义一个名为 DDPMParallelScheduler 的调度器类,使用 DummyObject 作为元类
class DDPMParallelScheduler(metaclass=DummyObject):
# 定义该类支持的后端为 'torch'
_backends = ["torch"]
# 初始化方法,接收可变参数
def __init__(self, *args, **kwargs):
# 检查是否满足所需后端的条件,这里为 'torch'
requires_backends(self, ["torch"])
# 类方法,用于从配置加载调度器
@classmethod
def from_config(cls, *args, **kwargs):
# 检查类是否满足所需后端的条件,这里为 'torch'
requires_backends(cls, ["torch"])
# 类方法,用于从预训练模型加载调度器
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查类是否满足所需后端的条件,这里为 'torch'
requires_backends(cls, ["torch"])
# 定义一个名为 DDPMScheduler 的调度器类,使用 DummyObject 作为元类
class DDPMScheduler(metaclass=DummyObject):
# 定义该类支持的后端为 'torch'
_backends = ["torch"]
# 初始化方法,接收可变参数
def __init__(self, *args, **kwargs):
# 检查是否满足所需后端的条件,这里为 'torch'
requires_backends(self, ["torch"])
# 类方法,用于从配置加载调度器
@classmethod
def from_config(cls, *args, **kwargs):
# 检查类是否满足所需后端的条件,这里为 'torch'
requires_backends(cls, ["torch"])
# 类方法,用于从预训练模型加载调度器
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查类是否满足所需后端的条件,这里为 'torch'
requires_backends(cls, ["torch"])
# 定义一个名为 DDPMWuerstchenScheduler 的调度器类,使用 DummyObject 作为元类
class DDPMWuerstchenScheduler(metaclass=DummyObject):
# 定义该类支持的后端为 'torch'
_backends = ["torch"]
# 初始化方法,接收可变参数
def __init__(self, *args, **kwargs):
# 检查是否满足所需后端的条件,这里为 'torch'
requires_backends(self, ["torch"])
# 类方法,用于从配置加载调度器
@classmethod
def from_config(cls, *args, **kwargs):
# 检查类是否满足所需后端的条件,这里为 'torch'
requires_backends(cls, ["torch"])
# 类方法,用于从预训练模型加载调度器
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查类是否满足所需后端的条件,这里为 'torch'
requires_backends(cls, ["torch"])
# 定义一个名为 DEISMultistepScheduler 的调度器类,使用 DummyObject 作为元类
class DEISMultistepScheduler(metaclass=DummyObject):
# 定义该类支持的后端为 'torch'
_backends = ["torch"]
# 初始化方法,接收可变参数
def __init__(self, *args, **kwargs):
# 检查是否满足所需后端的条件,这里为 'torch'
requires_backends(self, ["torch"])
# 类方法,用于从配置加载调度器
@classmethod
def from_config(cls, *args, **kwargs):
# 检查类是否满足所需后端的条件,这里为 'torch'
requires_backends(cls, ["torch"])
# 类方法,用于从预训练模型加载调度器
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查类是否满足所需后端的条件,这里为 'torch'
requires_backends(cls, ["torch"])
# 定义一个名为 DPMSolverMultistepInverseScheduler 的调度器类,使用 DummyObject 作为元类
class DPMSolverMultistepInverseScheduler(metaclass=DummyObject):
# 定义该类支持的后端为 'torch'
_backends = ["torch"]
# 初始化方法,接收可变参数
def __init__(self, *args, **kwargs):
# 检查是否满足所需后端的条件,这里为 'torch'
requires_backends(self, ["torch"])
# 类方法,用于从配置加载调度器
@classmethod
def from_config(cls, *args, **kwargs):
# 检查类是否满足所需后端的条件,这里为 'torch'
requires_backends(cls, ["torch"])
# 类方法,用于从预训练模型加载调度器
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查类是否满足所需后端的条件,这里为 'torch'
requires_backends(cls, ["torch"])
# 定义一个名为 DPMSolverMultistepScheduler 的调度器类,使用 DummyObject 作为元类
class DPMSolverMultistepScheduler(metaclass=DummyObject):
# 定义该类支持的后端为 'torch'
_backends = ["torch"]
# 初始化方法,接收可变参数
def __init__(self, *args, **kwargs):
# 检查是否满足所需后端的条件,这里为 'torch'
requires_backends(self, ["torch"])
# 类方法,用于从配置加载调度器
@classmethod
def from_config(cls, *args, **kwargs):
# 检查类是否满足所需后端的条件,这里为 'torch'
requires_backends(cls, ["torch"])
# 类方法,用于从预训练模型加载调度器
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查类是否满足所需后端的条件,这里为 'torch'
requires_backends(cls, ["torch"])
# 定义一个名为 DPMSolverSinglestepScheduler 的调度器类,使用 DummyObject 作为元类
class DPMSolverSinglestepScheduler(metaclass=DummyObject):
# 定义该类支持的后端为 'torch'
_backends = ["torch"]
# 初始化方法,接收可变参数
def __init__(self, *args, **kwargs):
# 检查是否满足所需后端的条件,这里为 'torch'
requires_backends(self, ["torch"])
# 类方法,用于从配置加载调度器
@classmethod
def from_config(cls, *args, **kwargs):
# 检查类是否满足所需后端的条件,这里为 'torch'
requires_backends(cls, ["torch"])
# 类方法,用于从预训练模型加载调度器
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查类是否满足所需后端的条件,这里为 'torch'
requires_backends(cls, ["torch"])
# 定义一个名为 EDMDPMSolverMultistepScheduler 的调度器类,使用 DummyObject 作为元类
class EDMDPMSolverMultistepScheduler(metaclass=DummyObject):
# 定义该类支持的后端为 'torch'
_backends = ["torch"]
# 初始化方法,接收可变参数
def __init__(self, *args, **kwargs):
# 检查是否满足所需后端的条件,这里为 'torch'
requires_backends(self, ["torch"])
# 类方法,用于从配置加载调度器
@classmethod
def from_config(cls, *args, **kwargs):
# 检查类是否满足所需后端的条件,这里为 'torch'
requires_backends(cls, ["torch"])
# 类方法的实现部分省略
# 从预训练模型加载类方法
def from_pretrained(cls, *args, **kwargs):
# 检查类是否需要指定的后端,确保使用 'torch'
requires_backends(cls, ["torch"])
# 定义使用 DummyObject 作为元类的 EDMEulerScheduler 类
class EDMEulerScheduler(metaclass=DummyObject):
# 定义支持的后端列表,包含 "torch"
_backends = ["torch"]
# 初始化方法,接受任意参数并检查后端
def __init__(self, *args, **kwargs):
requires_backends(self, ["torch"])
# 类方法,根据配置创建调度器
@classmethod
def from_config(cls, *args, **kwargs):
requires_backends(cls, ["torch"])
# 类方法,从预训练模型加载调度器
@classmethod
def from_pretrained(cls, *args, **kwargs):
requires_backends(cls, ["torch"])
# 定义使用 DummyObject 作为元类的 EulerAncestralDiscreteScheduler 类
class EulerAncestralDiscreteScheduler(metaclass=DummyObject):
# 定义支持的后端列表,包含 "torch"
_backends = ["torch"]
# 初始化方法,接受任意参数并检查后端
def __init__(self, *args, **kwargs):
requires_backends(self, ["torch"])
# 类方法,根据配置创建调度器
@classmethod
def from_config(cls, *args, **kwargs):
requires_backends(cls, ["torch"])
# 类方法,从预训练模型加载调度器
@classmethod
def from_pretrained(cls, *args, **kwargs):
requires_backends(cls, ["torch"])
# 定义使用 DummyObject 作为元类的 EulerDiscreteScheduler 类
class EulerDiscreteScheduler(metaclass=DummyObject):
# 定义支持的后端列表,包含 "torch"
_backends = ["torch"]
# 初始化方法,接受任意参数并检查后端
def __init__(self, *args, **kwargs):
requires_backends(self, ["torch"])
# 类方法,根据配置创建调度器
@classmethod
def from_config(cls, *args, **kwargs):
requires_backends(cls, ["torch"])
# 类方法,从预训练模型加载调度器
@classmethod
def from_pretrained(cls, *args, **kwargs):
requires_backends(cls, ["torch"])
# 定义使用 DummyObject 作为元类的 FlowMatchEulerDiscreteScheduler 类
class FlowMatchEulerDiscreteScheduler(metaclass=DummyObject):
# 定义支持的后端列表,包含 "torch"
_backends = ["torch"]
# 初始化方法,接受任意参数并检查后端
def __init__(self, *args, **kwargs):
requires_backends(self, ["torch"])
# 类方法,根据配置创建调度器
@classmethod
def from_config(cls, *args, **kwargs):
requires_backends(cls, ["torch"])
# 类方法,从预训练模型加载调度器
@classmethod
def from_pretrained(cls, *args, **kwargs):
requires_backends(cls, ["torch"])
# 定义使用 DummyObject 作为元类的 FlowMatchHeunDiscreteScheduler 类
class FlowMatchHeunDiscreteScheduler(metaclass=DummyObject):
# 定义支持的后端列表,包含 "torch"
_backends = ["torch"]
# 初始化方法,接受任意参数并检查后端
def __init__(self, *args, **kwargs):
requires_backends(self, ["torch"])
# 类方法,根据配置创建调度器
@classmethod
def from_config(cls, *args, **kwargs):
requires_backends(cls, ["torch"])
# 类方法,从预训练模型加载调度器
@classmethod
def from_pretrained(cls, *args, **kwargs):
requires_backends(cls, ["torch"])
# 定义使用 DummyObject 作为元类的 HeunDiscreteScheduler 类
class HeunDiscreteScheduler(metaclass=DummyObject):
# 定义支持的后端列表,包含 "torch"
_backends = ["torch"]
# 初始化方法,接受任意参数并检查后端
def __init__(self, *args, **kwargs):
requires_backends(self, ["torch"])
# 类方法,根据配置创建调度器
@classmethod
def from_config(cls, *args, **kwargs):
requires_backends(cls, ["torch"])
# 类方法,从预训练模型加载调度器
@classmethod
def from_pretrained(cls, *args, **kwargs):
requires_backends(cls, ["torch"])
# 定义使用 DummyObject 作为元类的 IPNDMScheduler 类
class IPNDMScheduler(metaclass=DummyObject):
# 定义支持的后端列表,包含 "torch"
_backends = ["torch"]
# 初始化方法,接受任意参数并检查后端
def __init__(self, *args, **kwargs):
requires_backends(self, ["torch"])
# 类方法,根据配置创建调度器
@classmethod
def from_config(cls, *args, **kwargs):
requires_backends(cls, ["torch"])
# 类方法,从预训练模型加载调度器
@classmethod
def from_pretrained(cls, *args, **kwargs):
requires_backends(cls, ["torch"])
# 定义使用 DummyObject 作为元类的 KarrasVeScheduler 类
class KarrasVeScheduler(metaclass=DummyObject):
# 定义支持的后端列表,包含 "torch"
_backends = ["torch"]
# 初始化方法,接受任意参数并检查后端
def __init__(self, *args, **kwargs):
requires_backends(self, ["torch"])
# 类方法,根据配置创建调度器
@classmethod
def from_config(cls, *args, **kwargs):
requires_backends(cls, ["torch"])
# 定义一个类方法,用于从预训练模型加载参数
def from_pretrained(cls, *args, **kwargs):
# 检查所需的后端库是否存在,这里要求必须有 "torch"
requires_backends(cls, ["torch"])
# 定义 KDPM2AncestralDiscreteScheduler 类,使用 DummyObject 作为其元类
class KDPM2AncestralDiscreteScheduler(metaclass=DummyObject):
# 定义可用的后端,当前支持 torch
_backends = ["torch"]
# 初始化方法,接受可变参数
def __init__(self, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(self, ["torch"])
# 类方法,从配置创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(cls, ["torch"])
# 类方法,从预训练模型加载
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(cls, ["torch"])
# 定义 KDPM2DiscreteScheduler 类,使用 DummyObject 作为其元类
class KDPM2DiscreteScheduler(metaclass=DummyObject):
# 定义可用的后端,当前支持 torch
_backends = ["torch"]
# 初始化方法,接受可变参数
def __init__(self, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(self, ["torch"])
# 类方法,从配置创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(cls, ["torch"])
# 类方法,从预训练模型加载
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(cls, ["torch"])
# 定义 LCMScheduler 类,使用 DummyObject 作为其元类
class LCMScheduler(metaclass=DummyObject):
# 定义可用的后端,当前支持 torch
_backends = ["torch"]
# 初始化方法,接受可变参数
def __init__(self, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(self, ["torch"])
# 类方法,从配置创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(cls, ["torch"])
# 类方法,从预训练模型加载
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(cls, ["torch"])
# 定义 PNDMScheduler 类,使用 DummyObject 作为其元类
class PNDMScheduler(metaclass=DummyObject):
# 定义可用的后端,当前支持 torch
_backends = ["torch"]
# 初始化方法,接受可变参数
def __init__(self, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(self, ["torch"])
# 类方法,从配置创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(cls, ["torch"])
# 类方法,从预训练模型加载
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(cls, ["torch"])
# 定义 RePaintScheduler 类,使用 DummyObject 作为其元类
class RePaintScheduler(metaclass=DummyObject):
# 定义可用的后端,当前支持 torch
_backends = ["torch"]
# 初始化方法,接受可变参数
def __init__(self, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(self, ["torch"])
# 类方法,从配置创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(cls, ["torch"])
# 类方法,从预训练模型加载
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(cls, ["torch"])
# 定义 SASolverScheduler 类,使用 DummyObject 作为其元类
class SASolverScheduler(metaclass=DummyObject):
# 定义可用的后端,当前支持 torch
_backends = ["torch"]
# 初始化方法,接受可变参数
def __init__(self, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(self, ["torch"])
# 类方法,从配置创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(cls, ["torch"])
# 类方法,从预训练模型加载
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(cls, ["torch"])
# 定义 SchedulerMixin 类,使用 DummyObject 作为其元类
class SchedulerMixin(metaclass=DummyObject):
# 定义可用的后端,当前支持 torch
_backends = ["torch"]
# 初始化方法,接受可变参数
def __init__(self, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(self, ["torch"])
# 类方法,从配置创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(cls, ["torch"])
# 类方法,从预训练模型加载
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(cls, ["torch"])
# 定义 ScoreSdeVeScheduler 类,使用 DummyObject 作为其元类
class ScoreSdeVeScheduler(metaclass=DummyObject):
# 定义可用的后端,当前支持 torch
_backends = ["torch"]
# 初始化方法,接受可变参数
def __init__(self, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(self, ["torch"])
# 类方法,从配置创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(cls, ["torch"])
# 类方法,从预训练模型加载
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(cls, ["torch"])
# 定义 TCDScheduler 类,使用 DummyObject 作为元类
class TCDScheduler(metaclass=DummyObject):
# 定义可用的后端列表,当前为 "torch"
_backends = ["torch"]
# 初始化方法,接受任意参数
def __init__(self, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(self, ["torch"])
# 类方法,从配置创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(cls, ["torch"])
# 定义 UnCLIPScheduler 类,使用 DummyObject 作为元类
class UnCLIPScheduler(metaclass=DummyObject):
# 定义可用的后端列表,当前为 "torch"
_backends = ["torch"]
# 初始化方法,接受任意参数
def __init__(self, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(self, ["torch"])
# 类方法,从配置创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(cls, ["torch"])
# 定义 UniPCMultistepScheduler 类,使用 DummyObject 作为元类
class UniPCMultistepScheduler(metaclass=DummyObject):
# 定义可用的后端列表,当前为 "torch"
_backends = ["torch"]
# 初始化方法,接受任意参数
def __init__(self, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(self, ["torch"])
# 类方法,从配置创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(cls, ["torch"])
# 定义 VQDiffusionScheduler 类,使用 DummyObject 作为元类
class VQDiffusionScheduler(metaclass=DummyObject):
# 定义可用的后端列表,当前为 "torch"
_backends = ["torch"]
# 初始化方法,接受任意参数
def __init__(self, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(self, ["torch"])
# 类方法,从配置创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(cls, ["torch"])
# 定义 EMAModel 类,使用 DummyObject 作为元类
class EMAModel(metaclass=DummyObject):
# 定义可用的后端列表,当前为 "torch"
_backends = ["torch"]
# 初始化方法,接受任意参数
def __init__(self, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(self, ["torch"])
# 类方法,从配置创建实例
@classmethod
def from_config(cls, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(cls, ["torch"])
# 类方法,从预训练模型创建实例
@classmethod
def from_pretrained(cls, *args, **kwargs):
# 检查所需的后端是否可用
requires_backends(cls, ["torch"])