如果你经常使用 Stable Diffusion 绘图,是否注意到很多大模型文件的大小各有不同,有2G的、4G的、还有8G的,这些模型占用了大量的磁盘空间,特别是租用云服务器的有限免费空间;有些模型的作者或者使用者会说模型文件越大越好,越大出图越精细,真的是这样吗?这里边有没有什么科技与狠活呢?
本文先给大家介绍一个给模型瘦身的方法,将那些4G、5G、8G的模型文件缩减到2G左右,然后对比下原模型与新模型的图片生成效果,最后再讲讲其中的原理。真正能拯救大家的内存和磁盘哦!
安装插件
这是秋叶大佬开发的一个模型转换插件,秋叶整合包中自带。如果你的 Stable Diffusion WebUI 中没有这个插件,请到文末领取安装包,安装完成之后别忘了重启 WebUI。
文末领取!
如果你访问 Github 不方便,也可以下载我整理的 Stable Diffusion 资源,然后把相关的文件上传到 Stable Diffusion WebUI 的 extensions 目录中。下载方式见本文最后部分。
缩减模型
安装成功后,我们会在主菜单中看到 Model Converter 这个插件,先看一下这几个设置:
这个插件可以转换单个模型,也可以处理多个模型,这里以“单个处理”为例。
降低精度
模型:选择一个文件大小在 4G 或以上的 SD 1.5 模型,这种模型都是能够缩减的。我这里选择的 revAnimated_v122 模型的文件大小是4G。确保模型已经上传到了 WebUI 的大模型目录,否则这里加载不出来。
自定义名称:缩减后的新模型的名称,如果不填写会自动生成,我这里自己写了一个。
Precision:浮点数精度,fp32 精度最高,fp16 和 bf16 精度比较低,但是占用的空间比 fp32 小一半。
Checkpoint Format:现在一般都使用 safetensors 了,安全。
其它设置暂时保持默认就可以了。
最后点击“运行”,正常情况下很快就能处理完毕,当右边出现类似下图的提示时就说明缩减完成了。
Checkpoint saved to …
给大家看一下文件大小的对比,差不多缩减了一半。根据这个效果,以及对 fp32 和 fp16 的对比,大致可以猜测出原来的大模型使用的是 fp32 的浮点数精度。
那么实际的生图效果怎么样呢?这里使用 WebUI 的 XYZ图表做一个对比,Y轴选择这两个模型。
注意采样器选择 Euler a,其它采样器可能存在采样不稳定的情况,每次出来的图可能有些小差别,就不好做对比了。
下面是生成图片的效果,大家对比下看看,确实是完全一样的,这说明缩减对模型的质量没有任何影响,Stable Diffusion WebUI 中生成图片时使用的就是 fp16。
去除EMA
再看一个例子。这个大模型是我从 liblib 下载的,文件大小有 6.88 G。
这里把自定义名称空了出来,让插件自己生成。
除了继续勾选 fp16 和 safetensors,这里还特别勾选了 no-ema,先不管 ema 是什么,让我们看看效果。
还是使用 XYZ图表 来做一个对比,这里我做了两次精简,第一次只降低精度,第二次去除ema。看下图的效果:
你能看出来他们之间的差别吗?反正我看不出来。
如果你觉得一两张图片可能是特殊情况,大家可以尽管去测试。
再给大家看看文件大小的变化,是不是很惊喜!内存和磁盘紧张的同学赶紧去试试吧。
原理
为什么降低精度和去除EMA可以无损的压缩模型?
搞清楚这个问题需要先搞清楚模型里边都有什么东西,这部分内容主要参考了秋叶大佬的文章,并结合一些别的网络资料。看下面这张图:
对于 1.5 模型,其中可能包括四部分:标准模型、文本编码器、VAE模型、EMA模型。
标准模型:生成图片的核心模块,潜空间中的前向扩散和反向扩散就是通过它做的,对应到图中左侧的 U-Net。 文本编码器:将文本提示词转换为数学向量,然后用作生成图片的引导条件。全称是 Text Encoder,对应到图中的TE。 VAE模型:用于图像在像素空间和潜在空间的映射,生成图片时将图像从潜在空间转换为像素图片,目前大部分模型都自带VAE。 EMA模型:EMA是一种算法,用来稳定模型效果的。对于日常生成,我们只要了解这样一个事实就行了:如果只是生成,EMA模型和标准模型的效果是一样的。如果你要做二次训练,并且显卡够好,选择带EMA的模型可能更好,因为所有数据都在;当然选择去EMA的模型也能做二次训练。所以我们从模型中去除EMA是不会影响生成图片质量的,反过来说加上EMA也不会让生成图片的质量更好。
再看精度的问题,fp32 和 fp16 是用来描述浮点数精度的,浮点数我们可以理解为小数,比如 3.1514926,在计算机中考虑到空间占用和计算效率的问题,表示小数时一般使用科学计数法并限定位数,这可能会带来一定的精度损失。
fp32代表的是float32,一般称为单精度浮点数,fp16则称为半精度浮点数,从字面上就可以看出 fp16 比 fp32 的精度要低很多。比如在精度不足的时候,2.00000 可能就变成了 1.99999。
不过这里有一个结论:神经网络训练对精度降低的容忍度非常高,精度对生成图片的影响微乎其微。这是可以得到实际佐证的,Stable Diffusion WebUI 默认就是以 fp16 处理模型中的数据的,如果模型是fp32的,那就先转换成fp16,这可以显著降低对内存和显存的使用。
所以我们降低精度时,Stable Diffusion WebUI 生成图片的效果也不会发生任何变化。
经过这样的修剪,磁盘空间的使用降低是显而易见的,那么内存和显存的使用会有什么样的变化呢?经过测试,缩减后的模型可以显著降低加载模型时的内存使用,但不会降低显存的使用,因为 WebUI 会把fp32的数据转换为fp16的进行处理。
有的同学可能会问:为什么U-Net是3.2G,而不是 2.2G、4.2G?这应该是1.5模型的参数规模决定的,XL模型就不是3.2G。再详细说我也不懂了。
资源下载
本系列使用的模型、插件,生成的图片,都已经上传到我整理的 Stable Diffusion 绘画资源中,后续也会持续更新,如有需要,添加下方,即可获取下载地址。
总结
**文章摘要**:本文介绍了如何在不损失图片生成效果的前提下,对Stable Diffusion绘图的大模型进行瘦身,从而释放和节省磁盘空间,特别是对于云服务器免费空间有限的用户尤为实用。文章首先阐述了模型文件大小与生成图片质量之间并不存在直接的正比关系,即并非模型文件越大生成图片越精细。接着,通过安装一个特定的插件,用户可以将原本占用空间较大的4G、5G、甚至8G的模型缩减到约2G大小。
文章详细介绍了缩减模型的两个主要步骤:降低精度(从fp32降低到fp16)和去除EMA(指数移动平均)模型,并通过对比原始模型和缩减后的模型所生成的图片效果,证明了这种方法能够无损地压缩模型,且对实际生成的图片质量没有任何影响。此外,还解释了这一技术背后的原理和科学依据,包括浮点数精度对神经网络训练的影响,以及EMA在模型生成中的作用等。
最后,文章提供了相关资源下载链接,包括用于缩减模型的插件和转换后的模型文件,以便读者可以依照本文的指导亲手尝试这一过程,从而更有效地管理和利用他们的存储资源。