本文仅为科普说明,并非研究性/新技术的讲解
如有理论错误,欢迎联系修改。
本文中所有资料均可被自由引用。
最终解释权归 作者 所有。
特别鸣谢:元素法典作者群/秋叶甜品店
潜工具书:Stable Diffusion 潜工具书(中文最全文档)
部分引用资料:
stable-diffusion-webui-model-toolkit/README.md
Skip/Reset CLIP position_ids FIX (rentry.org)
一、 使用工具
修复/检查模型所使用的工具的下载和安装
这里模型常用的模型检测与处理工具为:
Clip check tensors/model toolkit/model converter
注意:部分插件仅能对于SD1.5的模型使用,SDXL无法使用
1. 工具下载
这3个插件都不是web-ui自带的,所以需要先安装,以下是安装步骤。
Clip check tensors:iiiytn1k/sd-webui-check-tensors (github.com)
model toolkit:arenasys/stable-diffusion-webui-model-toolkit
model converter(模型格式转换)Akegarasu/sd-webui-model-converter
a.使用webUI直接安装
将网址打开后的链接直接填入WebUI插件下载区,等待自动加载完毕即可

b.压缩包下载
【PS:请在任何其他手段均无法下载时使用此方法,极不推荐使用】
github界面点击【Download ZIP】

完整解压后放在扩展文件夹:你的WebUI所在文件夹/extensions

能在顶部栏看到即为安装成功(这里是Kitchen theme折叠了一部分顶部栏)

2. 功能介绍
CLIP tensors checker
用于查询偏移的Clip

model toolkit
用于修复损坏的Clip,导出/更换模型的Unet/VAE/Clip等

model converter
转换模型格式、修复clip、压缩模型

二、 模型问题
这部分为模型理论知识以及常见的模型问题
有关Stable Diffusion的部分基本原理可以查看:【AI绘画】大魔导书:AI 是如何绘画的?Stable Diffusion 原理全解(一) - 哔哩哔哩 (bilibili.com)
有能力的也可以查看生肉文章:
What are Diffusion Models? | Lil'Log (lilianweng.github.io)
这里只讲解通俗易懂的模型相关的内容,所以这里不会摆出一大堆晦涩难懂的“基础知识”来唬人或者是撑篇幅。
3. 【基础】模型三大件:clip、unet、VAE
TextEncoder(Clip):会把tag转化成U-net网络能理解embedding形式
【简单的说就是将“人话”转换成AI能够理解的语言】
U-net:对随机种子生成的噪声图进行引导,来指导去噪的方向,找出需要改变的地方并给出改变的数据
【简单的说就是死盯着乱码图片,看他像什么】
VAE:AI原本的生成图不是人能看的正常图片,VAE的作用就是把AI的这部分输出转化为人能够看的图片。
【简单的说就是把AI输出翻译成人能看到的图片】

模型问题修复前后对比(上面是修复后的)
4. VAE问题
a.VAE问题的原因
模型输出图发灰说明这个模型的VAE出现问题了,常见于融合模型中。不同VAE之间的任何Merge都会导致VAE中的某些东西被破坏。并且很多融合的模型再拿去融合,那么VAE就会跟着破坏。这就是为什么很多模型输出图是灰色的,以及人们热衷于单独使用加外置VAE的原因。
遇到这种情况,一般而言需要修复VAE才能使得模型正常使用。不过web UI提供了外置VAE的选项,可以在生成时忽略模型的VAE而使用外置VAE替代。

例如这种图就是典型的VAE损坏
b.更换模型VAE
更换/使用其他VAE并非很好的解决方案,部分模型在更换VAE后会出现输出图模糊或者线条混乱的情况。
不过不能更换其他VAE并非不能使用原本模型的VAE,Merge模型可以使用原本合并之前的模型VAE,这样效果上就不会出现各种各样的问题。
c.VAE重复
VAE重复:有的人喜欢自己重命名一些现有的VAE,然后把这个VAE当作自己模型的VAE来使用,这就造成了下载了很多VAE,但是一检查哈希发现都是一模一样的。下面是我这里所有的VAE的哈希对照:

d.常见误区/错误说法
【1】“VAE没有注入到模型里,可以自由选用想用的VAE”"VAE是加滤镜的" "VAE可有可无"这种说法都是错误的

【2】VAE颜色深度排序相关的内容同样的不科学的,例如什么“NAI的VAE颜色最浅、840000VAE的颜色最深”之类的。随意更换VAE会影响输出图,部分模型的输出模糊或者线条爆炸就是因为这样产生的。使用没有问题的外置VAE发现输出图发灰那是模型本身的问题,与VAE无关。
【3】VAE的作用并非纠正色调或者是“模型滤镜”
5. clip损坏
a.clip偏移
通常意义上的clip损坏指代clip出现偏移,类似于下面这种

这些东西的是一个 值从 0 到 76int64 张量,模型Merge会将这些张量转换为浮点数并引入错误数值。例如在 AnythingV3 中,值 76 变为 75.9975,当由 webui 加载时该值被转换回 int64结果为 就变成了75。(所以上面这张图其实只有值41会影响模型的正常使用,在toolkit上只显示了会影响模型正常使用的clip值,这也是两个检测工具输出不同的原因)

b.clip偏移的影响
clip偏移会影响模型对于对应位置的token语义的理解,详情可以查看早期“微笑测试”实验(下面的链接),这里引用部分实验内容。
测试参数如下:seed是固定的、clip skip=1、eta=0
smile sleepy girl standing bear
Steps: 40, Sampler: Euler a, CFG scale: 7.5, Seed: 651296271, Face restoration: CodeFormer, Size: 512x512
我们对其修改如下:
1-0:tensor([[ 0,0,2,3,4,5 …
2-0:tensor([[ 0,1,0,3,4,5 …
3-0:tensor([[ 0,1,2,0,4,5 …
3-1:tensor([[ 0,1,2,1,4,5 …

顶部是常规的8528d-fix,smile被忽略。
keychange_8528dfix是修复后的, smile又回来了。
3. break_1-0 smile再次消失
4. break_2-0 sleepy没有体现
5. break_3-0 girl不见了,变成了熊。
6. break_3-1 girl部分的值为1, 女孩没有消失,1的笑容也没有消失。
break_3-1 结果比较难以分辨
【更详细的测试在链接指向的文章】
引用自:[調査] Smile Test: Elysium_Anime_V3 問題を調べる #3|bbcmc (note.com)
当然了,详情也可以查看下面链接的文章
简单说明/修复:Skip/Reset CLIP position_ids FIX (rentry.org)
很久之前有人通过裁剪FP16的方式“修复”clip,不过现在使用toolkit等插件可以很轻松的修复clip。
6. junk data
a.垃圾(无效)数据的产生
模型融合经常会出现很多webui在跑图过程中实际用不上的junk data,模型里只有固定的那些内容才能够被加载,多出的全是垃圾数据。很多的融合模型都带有这么一堆的垃圾数据,并且很多人总是认为这些junk data删掉会影响模型本身而不去删除。
【1】其中影响最大的是模型EMA:模型在Merge后EMA将不再准确反映UNET,这种情况下EMA不止没啥用,还会影响模型的训练。如果你希望大家能有效的使用EMA,那么请使用训练模型。(融合模型前建议先把模型的EMA全部删掉,因为只要是Merge模型,那么EMA就可以等同于垃圾数据)

【2】部分将LoRA注入到ckp大模型中的操作会产生一部分无效数据
【3】其他不知道哪来的无法使用的数据(原因有很多,不展开讲,真要塞我甚至可以在模型里塞一个原神)
比如有10G多Junk data的传世经典17G模型:

b.模型一般大小
一般模型大小为1.98Gb和3.97Gb有的为7.17G,除非模型各部分精度不同造成的其他模型大小之外,一般而言奇怪大小的模型都会或多或少的存在junk data。
此外,noVAE模型的大小为1.8G左右,noVAE&clip的模型为1.6G
7. 无效精度
a.实际使用更高的精度是没意义的
默认情况下,webui 会将所有加载的模型转换为FP16使用。
所以很多时候更高的精度是没啥意义的,不使用--no-half这些模型将完全相同。而实际上哪怕使用--no-half,模型的差别也并不会很大。很多人对精度本身是没有什么认知的,普遍的直觉是"单精到半精的性能损失是线性的",即一半精度,性能为原本的一半,但在SD推理上事实上的差别是非常小的。
不看标题你能分辨出哪个效果好哪个效果差吗,不叠图的话啥什么都看不出来↓
FP32与FP16的叠图对比:https://imgsli.com/MTgwOTk2

b.作妖的float64
一般而言最常见的是旧版本SuperMerge插件整出来的问题(新版本已修复)。通过检测发现,在一个3.5GB的“FP16”模型里面混又有不少float64的weight,导致了模型出现奇怪的大小。早些时候的toolkit会存在bug无法处理这些float64的weight,更新最新版本后应该解决了这一问题
