大家好,我是每天分享AI应用的萤火君!
如果你经常使用 Stable Diffusion 绘图,是否注意到很多大模型文件的大小各有不同,有2G的、4G的、还有8G的,这些模型占用了大量的磁盘空间,特别是租用云服务器的有限免费空间;有些模型的作者或者使用者会说模型文件越大越好,越大出图越精细,真的是这样吗?这里边有没有什么科技与狠活呢?
本文先给大家介绍一个给模型瘦身的方法,将那些4G、5G、8G的模型文件缩减到2G左右,然后对比下原模型与新模型的图片生成效果,最后再讲讲其中的原理。真正能拯救大家的内存和磁盘哦!
这是秋叶大佬开发的一个模型转换插件,秋叶整合包中自带。如果你的 Stable Diffusion WebUI 中没有这个插件,请使用下面这个地址安装,安装完成之后别忘了重启 WebUI。
https://github.com/Akegarasu/sd-webui-model-converter
如果你访问 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 绘画资源中,后续也会持续更新,如有需要,请关/注/公/众/号:萤火遛AI(yinghuo6ai),发消息:SD,即可获取下载地址。
以上就是本文的主要内容了,如有问题,欢迎留言沟通交流。