Diffusers 文档

DEISMultistepScheduler

Hugging Face's logo
加入Hugging Face社区

并获得增强文档体验的访问权限

开始使用

DEISMultistepScheduler

在Qinsheng Zhang和Yongxin Chen的论文《使用指数积分器快速采样扩散模型》中提出了Diffusion Exponential Integrator Sampler (DEIS)。DEISMultistepScheduler是用于扩散常微分方程 (ODEs) 的高速高阶求解器。

此实现修改了DEIS论文中的对数rho空间中的多项式拟合公式,而不是DEIS论文中的原始线性t空间。这种修改具有指数多步更新的封闭形式系数,而不是依赖于数值求解器。

论文的摘要如下

过去几年,扩散模型(DMs)在生成式建模任务中生成高保真样本取得了巨大成功。DM的一个主要局限性是它的采样过程非常缓慢,通常需要成百上千步的时间离散化步骤来达到所需的精度。我们的目标是开发一种具有更少步骤的快速采样方法,同时在保持高样本质量的同时。为此,我们系统地分析了DM中的采样过程,并确定了影响样本质量的关键因素,其中离散化方法最为关键。通过仔细检查学到的扩散过程,我们提出了扩散指数积分器采样器~(DEIS)。它基于为离散化常微分方程 (ODEs) 设计的指数积分器,利用学到的扩散过程的双线性结构来减少离散化误差。提出的方法可以应用于任何DMs,并可以在仅需10步的情况下生成高保真样本。在我们的实验中,在A6000 GPU上大约需要3分钟生成50k幅CIFAR10图像。此外,通过直接使用预训练的DMs,当限制NFE数量时,我们实现了最先进的采样性能,例如,在CIFAR10上仅在15 NFE的情况下,实现了4.17个FID和10个NFEs,3.37个FID和9.74个IS。代码在我这个https URL上可用。

提示

建议将solver_order设置为2或3,而solver_order=1DDIMScheduler等价。

支持从Imagen中导入的动态阈值调整,而对于像素空间扩散模型,您可以通过设置thresholding=True来使用动态阈值调整。

DEISMultistepScheduler

类名 diffusers.DEISMultistepScheduler

< >

num_train_timesteps: int = 1000 beta_start: float = 0.0001 beta_end: float = 0.02 beta_schedule: str = 'linear' trained_betas: Optional = None solver_order: int = 2 prediction_type: str = 'epsilon' thresholding: bool = False dynamic_thresholding_ratio: float = 0.995 sample_max_value: float = 1.0 algorithm_type: str = 'deis' solver_type: str = 'logrho' lower_order_final: bool = True use_karras_sigmas: Optional = False timestep_spacing: str = 'linspace' steps_offset: int = 0

参数

  • num_train_timesteps (int, 默认为1000) — 训练模型所需的扩散步数。
  • beta_start (float, 默认为 0.0001) — 推理的起始 beta 值。
  • beta_end (float, 默认为 0.02) — 最终的 beta 值。
  • beta_schedule (str, 默认为 "linear") — beta 策略,将 beta 范围映射到模型的步进序列。可选择 linearscaled_linearsquaredcos_cap_v2
  • trained_betas (np.ndarray, 可选) — 直接传递一个beta数组到构造函数,以绕过beta_startbeta_end
  • solver_order (int, 默认为2) — DEIS阶数,可以是123。建议使用solver_order=2进行引导采样,使用solver_order=3进行无条件采样。
  • prediction_type (str, 默认为epsilon) — 调度函数的预测类型;可以是epsilon(预测扩散过程的噪声),sample(直接预测噪声样本)或v_prediction(参见Imagen Video论文的2.4节)。
  • 阈值(bool,默认False)—是否使用“动态阈值”方法。这种方法不适合Stable Diffusion这样的潜在空间扩散模型。
  • 动态阈值比率(float,默认0.995)—动态阈值方法的比率。仅在thresholding=True时有效。
  • sample_max_value(float,默认1.0)—动态阈值的阈值。仅在thresholding=True时有效。
  • algorithm_type (str, 默认为 deis) — 求解器的算法类型。
  • lower_order_final (bool, 默认为 True) — 在最后几个步骤中是否使用低阶求解器。仅对少于 15 个推理步骤有效。
  • use_karras_sigmas (bool, 可选,默认为 False) — 在采样过程中是否使用 Karras sigma 来确定噪声安排的步长。如果为 True,则 sigma 的确定根据噪声水平序列 {σi} 进行。
  • timestep_spacing (str, 默认为 "linspace") — 网格时间步长缩放的方式。有关更多信息,请参阅常见的扩散噪声计划和样本步骤是错误的中的表2。
  • steps_offset (int, 默认为 0) — 根据某些模型家族的需求,添加到的推理步骤的偏移量。

DEISMultistepScheduler 是一个用于扩散常微分方程 (ODEs) 的高阶求解器。

此模型继承自 SchedulerMixinConfigMixin。有关库为所有调度器实现的通用方法,请查看超级类文档,例如加载和保存。

convert_model_output

< >

( model_output: Tensor *args sample: Tensor = None **kwargs ) torch.Tensor

参数

  • model_output (torch.Tensor) — 从学习扩散模型中直接输出的结果。
  • timestep (int) — 扩散链中的当前离散时间步。
  • sample (torch.Tensor) — 由扩散过程创建的样本的当前实例。

返回

torch.Tensor

转换模型输出为DEIS算法所需对应的类型。

将模型输出转换成DEIS算法所需的对应类型。

deis_first_order_update

< >

( model_output: Tensor *args sample: Tensor = None **kwargs ) torch.Tensor

参数

  • model_output (torch.Tensor) — 由学习到的扩散模型直接输出的内容。
  • timestep (int) — 扩散链中的当前离散时间步。
  • prev_timestep (int) — 扩散链中的上一个离散时间步。
  • sample (torch.Tensor) — 由扩散过程创建的样本的当前实例。

返回

torch.Tensor

前一时间步的样本张量。

一阶DEIS的步进(等同于DDIM)。

multistep_deis_second_order_update

< >

( model_output_list: 列表 *args sample: 张量 = 无 **kwargs ) torch.Tensor

参数

  • model_output_list (List[torch.Tensor]) — 当前和后续时间步的学到的扩散模型的直接输出。
  • sample (torch.Tensor) — 由扩散过程创建的当前样本实例。

返回

torch.Tensor

前一时间步的样本张量。

二阶多步 DEIS 的一步。

multistep_deis_third_order_update

< >

( model_output_list: 列表 *args sample: 张量 = 无 **kwargs ) torch.Tensor

参数

  • model_output_list (List[torch.Tensor]) — 当前和后续时间步长从学习扩散模型直接输出的结果。
  • sample (torch.Tensor) — 由扩散过程创建的当前样本实例。

返回

torch.Tensor

前一时间步的样本张量。

第三阶多步 DEIS 的一步。

scale_model_input

< >

( sample: Tensor *args **kwargs ) torch.Tensor

参数

  • sample (torch.Tensor) — 输入样本。

返回

torch.Tensor

缩放后的输入样本。

确保与需要根据当前时间步缩放去噪模型输入的调度器可互换。

set_begin_index

< >

( begin_index: int = 0 )

参数

  • begin_index (int) — 调度器的开始索引。

设置调度器的开始索引。此函数应在推理之前从管道运行。

set_timesteps

< >

( num_inference_steps: int device: Union = None )

参数

  • num_inference_steps (int) — 在使用预训练模型生成样本时使用的扩散步骤数量。
  • device (strtorch.device, 可选) — 将时间步移动到其上的设备。如果为 None,则不移动时间步。

设置用于扩散链(在推理之前运行)的离散时间步。

step

< >

( model_output: Tensor timestep: Union sample: Tensor return_dict: bool = True ) SchedulerOutputtuple

参数

  • model_output (torch.Tensor) — 直接从学习到的扩散模型输出的内容。
  • timestep (int) — 扩散链中的当前离散时间步长。
  • sample (torch.Tensor) — 扩散过程产生的当前样本实例。
  • return_dict (bool) — 是否返回 SchedulerOutputtuple

返回

SchedulerOutputtuple

如果 return_dict 是 True,则返回 SchedulerOutput,否则返回一个元组,其中第一个元素是样本张量。

通过反转 SDE 预测前一时间步的样本。此函数通过多步 DEIS 传播样本。

SchedulerOutput

diffusers.schedulers.scheduling_utils.SchedulerOutput

< >

( )

参数

  • prev_sample(《tensor`,形状为(batch_size, num_channels, height, width),用于图像)——前一步计算的样本(x_{t-1})。在去噪循环中,应使用prev_sample作为下一模型输入。

调度器 step 函数输出的基类。

< > GitHub更新