Stable Diffusion 采样器:对比分析

560 阅读9分钟

先说建议

  1. 如果想使用快速、融合、新颖且质量不错的东西,那么最好的选择是
    • DPM++ 2M Karras, 20 – 30 个步骤
    • UniPC有 20-30 个步骤。
  1. 如果想要高质量的图像并且不关心收敛,那么不错的选择是
    • DPM++ SDE Karras 10-15 个步骤(注意:这是一个较慢的采样器)
    • DDIM 10-15 个步骤。
  1. 如果喜欢稳定、可重复的图像,请避免使用任何祖先采样器(祖先采样器是什么?)。
  2. 如果喜欢简单的东西,EulerHeun是不错的选择。减少 Heun 的步骤以节省时间。
  3. 建议使用trailing间距法,因为当采样步数较少时,该方法可以生成更高质量、更详细的图像。
DPMSolverMultistepScheduler.from_config(
    pipeline.scheduler.config,
    timestep_spacing="trailing"
)
  1. 可以使用guidance_rescale以防止过度曝光。较低的值会增加亮度,但某些细节可能会显得褪色。
pipeline.scheduler = DDIMScheduler.from_config(
    pipeline.scheduler.config,
    rescale_betas_zero_snr=True,
    timestep_spacing="trailing"
)
pipeline(prompt, guidance_rescale=0.7, generator=generator).images[0]


Stable Diffusion v2-1 默认生图Stable Diffusion v2-1 默认生图

image.png 使用了 zero SNR 和and trailing timestep spacing


正文


那么什么是采样器?它们如何工作?它们之间有什么区别?应该使用哪一个?

什么是抽样?

image.png 

为了生成图像,稳定扩散首先在潜在空间中生成完全随机的图像。然后噪声预测器估计图像的噪声。从图像中减去预测的噪声。这个过程重复十几次。最后,你会得到一个干净的图像。

这个去噪过程称为采样,因为稳定扩散在每个步骤中都会生成一个新的样本图像。抽样所采用的方法称为抽样器抽样方法

下面是一个正在运行的采样过程。采样器逐渐产生越来越清晰的图像。

cat_euler_15.gif

虽然框架是相同的,但有许多不同的方法可以执行此去噪过程。这通常是速度和准确性之间的权衡。

通过Stable Diffusion源码,我们可以看到通过传入unet预测噪声和pre latents进行采样

image.png

噪音表

您一定已经注意到,嘈杂的图像逐渐变成清晰的图像。噪声表控制每个采样步骤的噪声水平。噪声在第一步最高,在最后一步逐渐降至零。



在每个步骤中,采样器的工作是生成噪声水平与噪声表相匹配的图像

image.png

增加采样步数有什么影响?每个步骤之间的噪音降低幅度较小。这有助于减少采样的截断误差。

比较下面 15 步和 30 步的噪声表。

image.png

扩散轨迹

潜空间中的扩散是什么样的?SDXL 样本在 65,536 维的潜在空间中扩散!,所以很难想象。使用 PCA 在二维空间中投影了扩散过程。两个主要组成部分如下所示。

image.png

与噪声时间表一致,扩散最初采取较大的步骤,并在接近结束时采取较小的步骤。初始步骤设置图像的全局组成。后面的步骤会完善细节。

样本需要经过复杂的概率分布环境中的训练,才能获得最终的潜在图像。

改变种子

更改图像的种子会生成相似但不同的图像。抽样过程中实际发生了什么?它们的轨迹略有不同,但终点相似。

image.png

更改Prompt

更改prompt将极大地改变示例的终点,因为您最终会得到一个非常不同的图像。

image.png

采样器概述

Webui自带了多种采样器供选择

image.png

Huggingface diffusers库中提供的采样器

image.png

将在本文的后面部分了解它们是什么

老式 ODE 求解器

让我们先剔除简单的。列表中的一些采样器是一百多年前发明的。它们是常微分方程 (ODE) 的老式求解器。

  • Euler– 最简单的求解器。
  • Heun– 欧拉的更准确但速度较慢的版本。
  • LMS(线性多步法)——与欧拉速度相同,但(据说)更准确。

祖先采样器

您是否注意到某些采样器的名字有一个字母“a”?

  • Euler
  • DPM2a
  • DPM++ 2S a
  • DPM++ 2S Karras

它们是祖先采样器。祖先采样器在每个采样步骤中都会向图像添加噪声。它们是随机采样器,因为采样结果具有一定的随机性。

请注意,许多其他采样器也是随机采样器,尽管他们的名字中没有“a”。

使用祖先采样器的缺点是图像不会收敛。比较使用 Euler a 和下面的 Euler 生成的图像。

euler-a-2-40.gif
Euler a 不收敛

euler-2-40.webp
Euler 收敛

使用 Euler a 生成的图像在高采样步长时不会收敛。相比之下,欧拉的图像收敛得很好。

为了再现性,希望图像收敛。如果你想生成轻微的变化,你应该使用变分种子

Karras

带有“ Karras ”标签的采样器使用Karras 中推荐的噪声表。如果仔细观察,会发现噪声步长在接近末尾时较小。研究发现这提高了图像质量。

image.png

在HuggingFace官方提供的schedulers中,我们可以通过传入use_karras_sigmas来使用Karras, 内部会采用Karras方法进行采样,具体使用方法如下:

image.png

内部转换逻辑:

image.png

DDIM 和 PLMS

原始稳定扩散v1附带了两种采样器,分别是DDIM(去噪扩散隐式模型)和PLMS(伪线性多步方法)。 DDIM 是最早为扩散模型设计的采样器之一。 PLMS 是 DDIM 更新、更快的替代方案。

它们通常被认为已经过时并且不再广泛使用。

DPM 和 DPM++

DPM(扩散概率模型求解器)和 DPM++ 是为 2022 年发布的扩散模型设计的新采样器。它们代表了一系列具有相似架构的求解器。

DPMDPM2 类似,只是 DPM2 是二阶(更准确但速度更慢)。

DPM++ 是对 DPM 的改进。

DPM 自适应自适应调整步长。它可能会很慢,因为它不能保证在采样步骤数内完成。



在HuggingFace官方提供的schedulers中,我们可以通过传入algorithm_type来指定使用的算法 , 内部会采用不同的方法进行采样,具体使用方法如下:

image.png

内部实现逻辑:

image.png

深入了解的话,可以参考这篇文章 zhuanlan.zhihu.com/p/667869002

UniPC

UniPC(Unified Predictor-Corrector)是 2023 年发布的新采样器。受到 ODE 求解器中的预测器-校正器方法的启发,它可以在 5-10 步内实现高质量图像生成。

k-diffusion

它只是指 Katherine Crowson 的k-diffusion GitHub 存储库以及与其关联的采样器。

该存储库实现了Karras 2022 文章中研究的采样器。

基本上,AUTOMATIC1111 中除 DDIM、PLMS 和 UniPC 之外的所有采样器都是从 k-diffusion 借用的。

采样器评估

图像融合

将使用不同的采样器(最多 40 个采样步骤)生成相同的图像。第 40 步的最后一个图像用作评估采样收敛速度的参考。欧拉方法将被用作参考。

Euler、DDIM、PLMS、LMS Karras 和 Heun

首先,让我们将 Euler、DDIM、PLMS、LMS Karras 和 Heun 作为一组来看看,因为它们代表了老式的 ODE 求解器或原始扩散求解器。 DDIM 收敛于欧拉的步长,但有更多变化。这是因为它在采样步骤中注入了随机噪声。

image.png

PLMS 在这次测试中表现不佳。

LMS Karras 似乎很难收敛,并稳定在较高的基线上。

Heun 收敛速度更快,但计算速度慢两倍,因为它是二阶方法。例如,我们应该将 30 步的 Heun 与 15 步的 Euler 进行比较。

祖先采样器

如果稳定、可重复的图像是最终目标,则不应使用祖先采样器。 所有祖先采样器并不收敛。

image.png

DPM 和 DPM2

DPM fast 收敛得不好。DPM2DPM2 Karras 的性能优于 Euler,但代价是速度慢了两倍。

DPM 自适应性能看似良好,因为它使用自己的自适应采样步骤。它可能会非常慢。

image.png

DPM++ 求解器

DPM++ SDEDPM++ SDE Karras具有与祖先采样器相同的缺点。它们不仅不收敛,而且图像还会随着步数的变化而大幅波动。

DPM++ 2MDPM++ 2M Karras表现良好。当步数足够多时,Karras 变体收敛得更快。

image.png

UniPC

UniPC 的收敛速度比 Euler 慢一点,但还不错。

image.png

速度

image.png

尽管DPM自适应在收敛方面表现良好,但它也是最慢的。

可能已经注意到其余的渲染时间分为两组,第一组花费大约相同的时间(约 1 倍),另一组花费大约两倍的时间(约 2 倍)。这反映了求解器的顺序。二阶求解器虽然更准确,但需要对去噪 U-Net 进行两次评估。所以它们的速度慢两倍。



质量

当然,如果图像看起来很糟糕,那么速度和收敛就毫无意义。

最终图像

我们首先看一下图像样本。

image.png image.png image.png

image.png

image.png

image.png DPM++ fast 非常失败。祖先样本没有收敛到其他采样器收敛到的图像。

祖先采样器倾向于收敛到小猫的头像,而确定性采样器倾向于收敛到猫的整体图像。没有正确的答案,只要它们对你来说看起来不错即可。

感知质量

即使图像没有收敛,图像看起来仍然不错。让我们看看每个采样器生成高质量图像的速度有多快。

将看到使用BRISQUE(盲/无参考图像空间质量评估器)测量的感知质量。它衡量自然图像的质量。

DDIM 在这方面的表现出人意料地好,能够在短短 8 个步骤内生成组内最高质量的图像。

image.png

除了一两个例外,所有祖先采样器在生成高质量图像方面都与Euler相似。

image.png

DPM2 采样器的性能略优于 Euler。

image.png

DPM++ SDEDPM++ SDE Karras在本次质量测试中表现最好。

image.png

UniPC 在低步长上比 Euler 稍差,但在高步长上与 Euler 相当。

image.png

参考链接

stable-diffusion-art.com/samplers/

huggingface.co/docs/diffus…