在生成图像的时候需要设置「 采样步数 Steps」,这个参数是模型中的去噪过程,即以迭代的方式从一张纯噪声图中一步步去除噪点,直至它变成一张清晰的图像。采样步数一般需要 20-50 步。

基础说明

名称 示意
Karras 优化算法,它们在采样8步之后,比同名算法噪点更少。
2S 表单步算法。2M代表二阶多步算法。与2S相比增加了相邻层之间的信息传递。
2M 2S的升级版本
3M v1.6版本新增的算法,迭代步数到30+、CFG值减小后达到质量最佳。
SDE 随机微分方程,调用祖先采样,表现不收敛特性。没有多步算法加持生成图像较慢,可以生成逼真的写实风格画面。
Exponential 指数算法,细节少一些但是画面更柔和、干净。渲染时间与SDE和2M相接近。

早期采样器

LMS:ODM求解器,线性多步法。速度与Euler相近,但质量不如Euler。
LMS Karras:ODM求解器
Heun:ODM求解器,是Euler的改进算法,画质更好,但速度慢一倍。
Euler:ODM求解器,简单直接,可收敛——能产生最终稳定图像。
Euler a:ODM求解器,不收敛——最终图像具有一定幅度随机性。
DDIM:SD刚问世时的内置算法。
PLMS:SD刚问世时的内置算法。

Euler与Euler a的差别的“a”是祖先采样器,产生的画面不收敛。当Euler在合适的步骤下图像逐渐收敛产生一个稳定的图像结果。而Euler a在每一步骤下都添加随机噪声,因此产生的图像具有一定随机偏差。

DPM采样器

StableDiffusion中绝大部分都是DPM算法。二代算法相比于一代算法,质量有所提升但需要更多的时间和迭代步数,通过增加一代算法的迭代步数也能达到相同的质量效果。

DPM2:DPM二代算法。画质提升有限,渲染时长增加一倍。
DPM2a:DPM二代算法。画质提升有限,渲染时长增加一倍。
DPM++2S a:DPM一代算法。
DPM++2S a Karras:DPM一代算法。优化算法,8步之后噪点更少。
DPM++2M:DPM一代算法。收敛速度快,质量好。
DPM++2M Karras:DPM一代算法。强烈推荐,优化算法。
DPM++SDE:DPM一代算法。
DPM++SDE Karras:DPM一代算法。高画质,速度慢,不收敛。
DPM++2M SDE:DPM一代算法。2M与SDE中和,速度较快,不收敛。
DPM++2M SDE Karras:DPM一代算法。优化算法,同上。
DPM++2M SDE Heun:DPM一代算法。
DPM++2M SDE Heun Karras:DPM一代算法。优化算法,同上。
DPM++3M SDE:DPM一代算法。
DPM++3M SDE Karras:DPM一代算法。30步以上低CFG值效果好。
DPM++3M SDE Exponential:DPM一代算法。同上。
DPM++2M SDE Exponential:DPM一代算法。画面柔和,不收敛。
DPM2 Karras:DPM二代算法。画质提升有限,渲染时长增加一倍。
DPM2 a Karras:DPM二代算法。画质提升有限,渲染时长增加一倍。
DPM++2M SDE Heun Exponential:DPM一代算法。
DPM fast:DPM一代算法。几乎不能生成想要的图像。
DPM adaptive:自适应渲染,无视采样步数。质量好但渲染时间过长。

其它

UniPC:统一预测校正器,收敛快,10步左右产生可用画面。
Restart:每步渲染时间长,比UniPC更少的采样步数就能生成不错的画面。
LCM:可以通过少量步骤推理合成高分辨率图像,使图像生成速度提升 2-5 倍,通常只用4-7步,需要搭配LCM模型,提示词中添加 ,CFG Scale 设置为 1-2 之间

LCM启用办法

  1. 在 SD webui 中添加 lcm 扩展。

    1
    2
    https://github.com/0xbitches/sd-webui-lcm 

  2. 下载 LCM 的 lora 文件也可以用自己的LCM模型,放在 \stable-diffusion-webui-new\models\Lora

    1
    https://huggingface.co/latent-consistency/lcm-lora-sdv1-5/tree/main   
  3. 修改 \stable-diffusion-webui\repositories\k-diffusion\k_diffusion\sampling.py 在代码最后添加下面的代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    @torch.no_grad()
    def sample_lcm(model, x, sigmas, extra_args=None, callback=None, disable=None, noise_sampler=None):
    extra_args = {} if extra_args is None else extra_args
    noise_sampler = default_noise_sampler(x) if noise_sampler is None else noise_sampler
    s_in = x.new_ones([x.shape[0]])
    for i in trange(len(sigmas) - 1, disable=disable):
    denoised = model(x, sigmas[i] * s_in, **extra_args)
    if callback is not None:
    callback({'x': x, 'i': i, 'sigma': sigmas[i], 'sigma_hat': sigmas[i], 'denoised': denoised})

    x = denoised
    if sigmas[i + 1] > 0:
    x += sigmas[i + 1] * noise_sampler(sigmas[i], sigmas[i + 1])
    return x
  4. 修改 \stable-diffusion-webui-new\modules\sd_samplers_kdiffusion.py 在代码的39行后添加下面的代码:

    1
    ('LCM Method', 'sample_lcm', ['lcm'], {}),

重新启动 Stable Diffusion。重新加载 UI 后,在采样方法列表中找到“LCM 方法”。