[Stable Diffusion]模型概览(v1~v2)

前置

代码库

文件格式

训练好的模型 checkpoint 有如下三种保存格式:

  • .ckpt:适用于官方 GitHub 仓库和 webui.
  • .safetensors:HuggingFace 推出的文件格式,旨在更安全、更快速地加载权重,可用于 webui.
  • Diffusers 格式:将 Stable Diffusion 的各个组件分别存储在子目录中,每个子目录包含 .json 配置文件和权重文件,适用于 HuggingFace Diffusers 库。

举个例子,打开 Stable Diffusion v2.1 官方仓库可以看到,里面既有 .ckpt 文件、又有 .safetensors 文件、还有按组件分目录存储的配置文件和权重文件。事实上,上传者是把上述三种格式一股脑都传到了仓库中,我们按需下载即可

官方模型

注:v2.0 指代 v2-base,v2.0-v 指代 v2.

FID Score 指示图像质量,CLIP Score 指示图像与文本的匹配程度。对于每个版本的模型,遍历 8 种 cfg-scale (classifier-free guidance scale),连接成一条曲线。理论上,cfg-scale 越大,图像与文本越匹配,但图像质量可能会被损坏(例如颜色过饱和),这解释了曲线后半段的上升。但当 cfg-scale 比较小时,增大 cfg-scale 反而能让图像质量更好,推测这与训练时条件生成相对无条件生成占比更大有关。

  • Stable Diffusion v2.1
    • 说明:以 v2 权重初始化,在同一数据集上继续训练 55k steps,768x768 分辨率;然后在减轻了 NSFW 过滤限制的数据集上继续训练另外 155k steps.
    • 下载链接,包含全部三种文件格式,可按需下载。
    • 在官方 GitHub 仓库中使用:见 README.
    • 在 Diffusers 库中使用:见 Examples.
  • Stable Diffusion v2.1-base
    • 说明:以 v2-base 权重初始化,继续训练 220k steps,512x512 分辨率,减轻了数据集的 NSFW 过滤限制。
    • 下载链接,包含全部三种文件格式,可按需下载。
    • 在官方 GitHub 仓库中使用:见 README.
    • 在 Diffusers 库中使用:见 Examples.
  • Stable Diffusion x4-upscaler
    • 说明:4 倍上采样器。在 LAION 数据集中大于 2048x2048 分辨率的 10M 张图片上训练 1.25M steps.
    • 下载链接,包含全部三种文件格式,可按需下载。
    • 在官方 GitHub 仓库中使用:见 README.
    • 在 Diffusers 库中使用:见 Examples.
  • Stable Diffusion v2
    • 说明:以 v2-base 权重初始化,在同一数据集上训练 150k steps,但训练目标换成了 v-prediction. 随后以 768x768 分辨率又训练了 140k steps.
    • 下载链接,包含全部三种文件格式,可按需下载。
    • 在官方 GitHub 仓库中使用:见 README.
    • 在 Diffusers 库中使用:见 Examples.
  • Stable Diffusion v2-depth
    • 说明:以深度图为条件的图像生成。以 v2-base 权重初始化,训练 200k steps. 添加了一个额外的输入通道用于输入 MiDaS 模型预测的深度图。
    • 下载链接,包含全部三种文件格式,可按需下载。
    • 在官方 GitHub 仓库中使用:见 README.
    • 在 Diffusers 库中使用:见 Examples.
  • Stable Diffusion v2-inpainting
    • 说明:图像填充模型。以 v2-base 权重初始化,训练 200k steps. 参考 LaMa 的掩码生成策略,加上输入图像的 VAE 隐空间表示一同作为 UNet 的条件。
    • 下载链接,包含全部三种文件格式,可按需下载。
    • 在官方 GitHub 仓库中使用:见 README.
    • 在 Diffusers 库中使用:见 Examples.
  • Stable Diffusion v2-base
    • 说明:从头训练,在过滤后的 LAION-5B 数据集上以 256x256 分辨率训练 550k steps. 接着在同样的数据集上以 512x512 分辨率训练 850k steps.
    • 与 v1 对比
      • 使用更大的文本编码器:从 v1 的 CLIP ViT-L/14 换成了 OpenCLIP-ViT/H.
      • 使用 CLIP 倒数第二层而非倒数第一层,与 Imagen 和 novelai 一样。
      • UNet 的结构略有调整:attention head 固定 dim=64 而不是固定 head 数量,不影响参数量;由于换了文本编码器,text embedding dim 从 768 变成了 1024,使得 cross-attention 的参数量有轻微变化。
    • 下载链接,包含全部三种文件格式,可按需下载。
    • 在官方 GitHub 仓库中使用:见 README.
    • 在 Diffusers 库中使用:见 Examples.
  • Stable Diffusion v1.5
    • 说明:以 v1.2 权重初始化,在 laion-aesthetics v2 5+ 数据集上以 512x512 分辨率训练 595k steps,同时以 10% 的概率丢弃文本条件来提升 classifier-free guidance 性能。
    • 下载链接,包含全部三种文件格式,可按需下载。其中,以 v1-5-pruned-emaonly 命名的文件只包含 EMA 权重,适用于推理;以 v1-5-pruned 命名的文件包含 EMA 权重和 non-EMA 权重,适用于接着微调。
    • 在官方 GitHub 仓库中使用:见 README.
    • 在 Diffusers 库中使用:见 Examples.
  • Stable Diffusion v1.5 inpainting
    • 说明:图像填充模型。以 v1.5 权重初始化,在 laion-aesthetics v2 5+ 数据集上以 512x512 分辨率训练 440k steps,同时以 10% 的概率丢弃文本条件。为了支持 inpainting,给 UNet 增加了 5 个额外的输入通道(4 个用于编码输入图片,1 个用于掩码本身),它们以零值初始化。训练时生成随机掩码,并且以 25% 的概率遮掉整张图。
    • 下载链接,包含 .ckpt 和 Diffusers 两种格式,可按需下载。
    • 在官方 GitHub 仓库中使用:见 README.
    • 在 Diffusers 库中使用:见 Examples.
  • Stable Diffusion v1.4
    • 说明:以 v1.2 权重初始化,在 laion-aesthetics v2 5+ 数据集上以 512x512 分辨率训练 225k steps,同时以 10% 的概率丢弃文本条件来提升 classifier-free guidance 性能。
    • 下载Diffusers 格式.ckpt 格式,其中 sd-v1-4.ckpt 只包含 EMA 权重;sd-v1-4-full-ema.ckpt 包含 EMA 权重和 non-EMA 权重。
  • Stable diffusion v1.3
    • 说明:以 v1.2 权重初始化,在 laion-improved-aesthetics 数据集上以 512x512 分辨率训练 195k steps,同时以 10% 的概率丢弃文本条件来提升 classifier-free guidance 性能。
    • 下载Diffusers 格式.ckpt 格式
  • Stable Diffusion v1.2
    • 说明:以 v1.1 权重初始化,在 laion-improved-aesthetics 数据集上以 512x512 分辨率训练 515k steps.
    • 下载Diffusers 格式.ckpt 格式
  • Stable Diffusion v1.1
    • 说明:在 laion2B-en 数据集上以 256x256 分辨率训练 237k steps;在 laion-high-resolution 数据集上以 512x512 分辨率训练194k steps.
    • 下载Diffusers 格式.ckpt 格式

在 webui 中使用:下载 .ckpt.safetensors 格式的权重,放在 ./models/Stable-diffusion 目录下,刷新 webui 顶部的模型选择框即可看到目录下所有的模型。

VAE

VAE 是 Stable Diffusion (Latent Diffusion) 的一个组件,其编码器将输入图片从图像空间 \(\mathbb R^{3\times H\times W}\) 映射到隐空间 \(\mathbb R^{4\times H/f\times W/f}\)\(f\) 为下采样系数),在隐空间中通过扩散模型学习数据分布后,再由解码器映射回图像空间。VAE 编码图像的高频细节信息,使得隐空间中的扩散模型能把精力着重花在学习图像的 high-level 语义上,从而摆脱繁琐的细节。

理论上,扩散模型的学习依赖于预训练好的 VAE,但我们也可以在训练好扩散模型后,固定住扩散模型而微调 VAE,使得图片的细节和色调更加完善。因此,我们有时能见到人们单独发布 VAE 权重。

在 webui 中使用

常见的模型权重一般会内置 VAE,无需再额外挂载;但有些模型没有内置 VAE,或者额外训练了自己的 VAE,这时就需要选择正确的 VAE 挂载上去。VAE 的选择框被淹没在了设置标签页里的众多设置项之中,我们可以在 Settings → User interface → Quicksettings list 中添加 sd_vae 一项,这样选择框就会被固定在整个页面上方,方便随时切换。

在 webui 中,有两种使用 VAE 的方式:

  1. 将 VAE 权重命名为对应模型相同的名字(例如 <model name>.vae.pt),放在 ./models/Stable-diffusion 目录下,那么 webui 会自动加载与模型名匹配的 VAE.
  2. 将 VAE 权重放在 ./models/VAE 下,在设置项中选择使用哪个 VAE.

社区模型举例

  • sd-vae-ft-mse-original:StabilityAI 在原始 kl-f8 autoencoder(使用 KL 作为正则项,下采样到原图大小的 1/8)上微调而来。数据集为 LAION-Aesthetics 和 LAION-Humans 按 1:1 比例混合。首先加载原 EMA 权重并以 L1 + LPIPS 为目标训练 313198 steps,然后以 MSE + 0.1 * LPIPS 为目标训练另外 280k steps. 只微调了 decoder 部分。
  • kl-f8-anime2.ckpt:Waifu Diffusion 的 VAE,顾名思义,专门对日漫风格微调。
  • blessed_vae:据称能提高对比度。
  • orangemix:OrangeMixs 系列模型的 VAE.

测试:基底模型为 AnythingV5Ink_v32Ink.

微调模型 / Dreambooth / 合并模型

在 CivitAI 社区中以 "Checkpoint" 标签标识的模型,即通常说的基底模型(底模)。这些模型或是通过微调、或是通过合并权重得到,往往有着显著的风格,在特定领域上的出图效果往往远好于 Stable Diffusion 官方权重。

其中,Dreambooth 指的是一种微调整个模型使之生成指定对象(即个性化生成)的方法,由 Google 在这篇论文中提出。在 LoRA(详见后文)被引入 Stable Diffusion 之后,人们也会依照 DreamBooth 的方式微调 LoRA.

社区模型举例

另外,该网站收集了一些模型。

Textual Inversion Embeddings

这篇论文提出的个性化生成方法,通过对一个特殊 text token 做 inversion,使之绑定到某特定对象上。该方法不改动基底模型的权重,仅需保存得到的 text embedding,所以文件非常小(几十到几百 KB)。但毕竟没有微调模型权重,其效果往往不如 LoRA.

特殊用法:对低质量图片做 textual inversion,那么结果可作为 negative embedding 放入 negative prompts 中。

在 webui 中使用

将训练/下载的 textual inversion 文件放在 ./embeddings 目录下,使用时找到 Generate 按钮下方第三个按钮 Show/hide extra networks,在弹出的页面中点击想使用的 embedding,则相关词语会出现在 prompt 框中。注意不要把 negative embedding 写在正向 prompt 里面了。

社区模型举例(Negative embeddings)

LoRA 模型

LoRA 是一种参数高效微调方法(PEFT),最早由这篇论文提出并应用于微调语言大模型之中,后来由这个代码库引入到对 Stable Diffusion 模型的微调之中。LoRA 并不改变原模型的权重,而是在线性层旁边新增一个下采样-上采样的支路,通过训练这个支路来完成微调。因此,同一个基底 Stable Diffusion 模型可以搭载不同的 LoRA 使用,具有很高的灵活性。由于 LoRA 支路网络的参数量小(文件大小在几十到几百 MB 左右),相比微调整个模型,对算力的需求更加友好,并且也能达到不错的效果,因此很快受到大家的热烈欢迎,成为了目前最流行的微调 Stable Diffusion 的方法之一。

在 webui 中使用

将训练/下载的 LoRA 模型放在 ./models/Lora 目录下,使用时找到 Generate 按钮下方第三个按钮 Show/hide extra networks,在弹出的页面中点击想使用的 LoRA,则 <lora:xxx:1> 会出现在 prompt 框中,其中 1 代表 LoRA 权重,可以按需修改。

使用疑问

  1. 按理说,使用 LoRA 时需要配合训练用到的基底模型才能 work,但是实测发现同一个 LoRA 有时能够在不同基底模型上产生效果,这是为什么?猜测是因为这些基底模型都从同一个权重(如官方权重)微调而来,参数上或多或少差异不大。
  2. 如何融合多个 LoRA?直接将参数加权求和即可。

社区模型举例

References

  1. https://github.com/compvis/stable-diffusion ↩︎
  2. https://github.com/runwayml/stable-diffusion ↩︎
  3. https://github.com/Stability-AI/StableDiffusion ↩︎
  4. https://cyberes.github.io/stable-diffusion-models/ ↩︎
  5. 文生图模型之Stable Diffusion - 小小将的文章 - 知乎 https://zhuanlan.zhihu.com/p/617134893 ↩︎
  6. StableDiffusion模型资源探索食用指南 - SeASnAkE的文章 - 知乎 https://zhuanlan.zhihu.com/p/597504900 ↩︎
  7. 在StableDiffusion中说起VAE时,我们在谈论什么? - SeASnAkE的文章 - 知乎 https://zhuanlan.zhihu.com/p/599129815 ↩︎

[Stable Diffusion]模型概览(v1~v2)
https://xyfjason.github.io/blog-main/2023/06/16/Stable-Diffusion-模型概览(v1~v2)/
作者
xyfJASON
发布于
2023年6月16日
许可协议