Stable Diffusion采样器及LCM启用办法
在生成图像的时候需要设置「 采样步数 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模型,提示词中添加
LCM启用办法
在 SD webui 中添加 lcm 扩展。
1
2https://github.com/0xbitches/sd-webui-lcm
下载 LCM 的 lora 文件也可以用自己的LCM模型,放在 \stable-diffusion-webui-new\models\Lora
1
https://huggingface.co/latent-consistency/lcm-lora-sdv1-5/tree/main
修改 \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修改 \stable-diffusion-webui-new\modules\sd_samplers_kdiffusion.py 在代码的39行后添加下面的代码:
1
('LCM Method', 'sample_lcm', ['lcm'], {}),
重新启动 Stable Diffusion。重新加载 UI 后,在采样方法列表中找到“LCM 方法”。
- 感谢你赐予我前进的力量