保姆级的Stable-Diffusion Hypernetwork训练教程
Aeka0超铀
2022年10月19日 01:48

本文为烤肉,转自ixynetworkanon


在文章中会以灰色来特别标注仍然存疑的内容。 在阅读这篇文章前,你需要对Stable Diffusion和webui拥有一定了解,至少得会亲自部署以及使用过。

行文风格和出处保持一致,某些正经内容也有本土化改动。


序言

我超,我也不好说,这解释起来就有点费劲了,真想知根问底的话还是问问你认识的其他CS系大佬,或者读读手册啊白皮书什么的比较好。在这里,这玩意的作用是改变SD图像的整个输出结果,并且而不像Embedding那样,必须要用关键词来调用它,浪费你宝贵的文本tokens。如果你已经有了一个成品的话,就可以在设置里去启用它,之后它就会自动作用于你接下来输出的所有图像。

想训练Hypernetwork的话,8GB显存的卡应该不多不少,但训练前注意一点,启动命令行里不要带有--medvram参数,要不然出来的东西都蛮哈人的。默认是没有的,如果你为了节省显存而特地设置了它,在开始训练前记得移除。


第一步,准备高品质样本

万事开头难,最重要也是最麻烦的部分就是第一步——数据准备工作。丢进去的样本是垃圾,出来的结果也只会是垃圾,非常简单粗暴的道理。实际上,制作一个Hypernetwork的大部分时间都会用在这一步上。

样本以有足够明显的特征为佳,这样可以避免冗余信息的干扰。画师的风格或主题的相关性越简单直白越好,图片质量和风格也尽量一致,以及避免图中出现文本、符号、logo之类你不想要的东西。不管你打算训练什么,整体上更干净、细节上更准确的样本都会让你的hypernetwork表现更佳。

如果样本不太符合标准,你也可以自己动手处理一下:

  1. 自己P一下图,抹掉任何你不希望被学到成品模型里的内容。

  2. 裁剪图像,使其处于一个更方便训练的比例和分辨率。用做样本的图片最好是长宽比为1:1的正方形,且分辨率为64的倍数,比如512*512。

  3. 如果图像的分辨率不太够就尽量别用了,必须要用的话就想办法超分辨率一下,二刺螈冻鳗图推荐使用Real-ESRGAN,写实或者三次元图可以考虑下Topaz Gigapixel。最新的版本已经整合了一些超分辨率模型,你可以去Extra标签页里试试效果。


第二步,设置和其他乱七八糟的

在启动webui前,先在webui-user.bat里把命令行设置好:

COMMANDLINE_ARGS=--deepdanbooru

待会训练的时候绝壁用得着它,并且反正它也不碍事,在你不训练的时候也不影响。

然后,照着这两张图进行设置:

一定要确保所有设置都没问题。标签之间应该使用空格这点无需多言,按照字母顺序排序不要打开,因为prompts的比重是从前到后越来越低的,重要的prompts尽量手动放在靠前的位置。关于圆括号的回避选项也应该注意下,勾选后,本身带有括号的danbooru tags里的括号就不会被脚本识别为成强调符。

噢,看在上帝的份上,你,我的老伙计,在训练时别让VAE来捣乱。

一定要确保勾选了训练时从显存里卸载VAE和CLIP这个选项,否则它会把你的训练集变成一坨不可名状之物。无数的网友因为VAE开着而白白浪费了人生中的一段美好时光。


第三步,制作Hypernetwork文件

名字可以随便起,不影响。下面的框框不用管,保持默认全勾着就行。

项目作者の话,看看就好

768是一个处理输入的模块, 320 640 1280是处理中间结果的模,比这些数字越大,就会离网络中心被放置的这些模越近(据我所知)。 数值是交叉注意层输入的第三维空间。 交叉注意层的文本输入具有匹配的态时(你输入的prompts,并且有[x,x,768]的形态,Hypernetwork会被注入交叉注意层。其他三种尺寸则与卷积层的自我注意有关(我希望我没搞错术语))。

将Width和Height两个滑块设置成你要训练的素材集的分辨率。像上面说的,推荐使用1:1的长宽比,尽量把你的输入图像处理成正方形。其他的比例也不是不可以,但最好还是别,项目作者自己说过不用1:1的画幅基本上没有好果汁吃。

勾选Create flipped copies对训练的影响未知,学术老哥可以留个回复。建议打开,已证实有用。

将过大的图像分成两个,是否开启此选项主要取决你的样本如何,如果样本很长或很高那就建议打开。如果你没有勾选它,而且样本不是1:1的话,输入的样本将被自动调整大小,但不是拉伸缩放而是裁剪,只保留中间的一部分。如果样本被系统闭着眼从中间裁了一刀,用作训练时的样子就可能不太好,比如说一张横躺着的人的图片,可能脑袋和腿就都没了。

使用deepbooru询问标题,该选项对于给训练样本附加prompts时非常有用,如果你没有每张图片的tags来源,那就建议打开它。(这种情况下裁剪应该也得打开,祝你好运w)

把你所有的样本放在一个文件夹里作为Source,然后为你的输出制定一个路径作为Destination。你可以新建个文件夹,然后从资源管理器路径栏中复制文件夹目录,粘贴到框框里即可。

检查一下没问题,然后点击Preprocess按钮,目标文件夹里应该就会有东西出现了。


第四步,训练前的关键设置

我们制作的不是Embedding,所以Embedding栏留空。

Hypernetwork文件就选择刚刚生成出来的那个。

Learning rate建议用项目作者推荐的值,0.000005。如果你不想做什么实验性的东西的话这个值就可以,过低会导致进度缓慢,过高可能会见到古神。

将Dataset directory设置为你的预处理好的数据集所在的路径。

Log directory是预览输出的位置,按数据和特定的Hypernetwork模型来排序。

Prompt template file是你的关键词集合文档(其实我并不明白一个准确的prompts本对训练出来的模型的质量和效果有多大的影响,懂哥可以留个评论),我把它清空了,只留下了一个[fileword],个人认为其他的东西都没什么用,除非你没在做与二刺螈相关的东西。

你可以把masterpiece, best quality这类prompts加在文档名前,比如:

masterpiece, best quality, [filewords], [name] masterpiece, [filewords], [name] best quality, [filewords], [name] [filewords], [name]

这样做可能会让你的训练结果质量更加高一些。(目前来说,我只看到过一个老哥的对比能够证明此方法确实有用,不过此外很多其他高质量的Hypernetwork也都是用上面的模板建立的,所以大概率是有用,如果你对它存疑,使用下面的模板也可以)

最后再度确认一次,你是在1:1的分辨率比例上进行训练。如果在长宽比不同的分辨率上训练,钻出来古神的概率更高。

Max steps可以不用考虑,除非你真的打算没完没了地跑,默认值大概率是不会用完的。你可以在任何时候停止训练,因为进度是会被自动保存的。如果你准备开始跑训练就挂机睡觉,并且有那么一点点担心电费,那可以把它设置得低一些。

保存image / embedding到日志目录也可以不用管,除非你的硬盘空间真的紧张到就这么点体积还得计较一下。到每500步或任何你设置的步长时,一张预览图和当时的模型会被保存在前面提到的日志目录中。

打开Read parameters这个设置的话,可以在txt2img选项页中把你想测试的词条输进去,一段时间后,会根据你的prompts生成图像,可以简便地观测到你的Hypernetwork的训练进展情况,这也会影响到SD本体生成和保存的图像。

确保无误后,点击训练按钮,看它跑起来后就可以去泡杯茶喝了。


第五步,关于训练的调整和测试

到了这步以后,一切都取决于你自己了。该阶段不存在统一的标准,因为变量太多,其中包括你主观上的满意标准、你输入的样本质量、设置和数据、还有你的硬件以及训练速度。不要问模型离训练好大概得多久。

话又说回来,训练不是越久越好,你可以通过生成的预览来观察效果,并决定是否要进行干预,看见出现奇怪的伪影就差不多该收手了。如果这种情况出现的非常快,快到此时的效果还不太好,那就需要调整一下数据或者样本,然后重新开始训练。解决伪影可以把Learning rate再往小了调一调,比如前面再加个0试试看。

如果你觉得已经效果已经足够好了,就差不多得了。你的进度已经被保存了,如果后面还想继续的话可以接着来。

我个人来说,之后所做的是复制每一个保存在

\stable-diffusion-webui\textual_inversion\datehere\hypernetworknamehere

的.pt文件,并把它复制到

\stable-diffusion-webui\models\hypernetworks

里。

你可以用这个按钮刷新webui中的hypernetworks列表。

考虑更科学一点的方法的话,也许你可以做一个图表,在上标明你的Hypernetwork迭代版本,使用相同的条件和种子来生成预览图,来对比每个版本的效果。其他设置调整为你认为最合适的就行。

在这以后,你还可以继续调整cfg scale之类的参数,使用各种抽样步骤进行测试。你可以随便用你最觉得最好的方法来对模型的不同迭代版本进行测试,以找到一个完美的迭代版本!

一个训练中模型的迭代图表

如果事与愿违,你觉得你训练出的结果全都没眼看,可以尝试将clipskip设置为1,没准之后的结果就会出现巨大的良性逆转。之前提到过的VAE也会干扰你的结果,所以如果关闭clipskip也没有用的话,还是扭过头再去看看你是不是忘了关掉这个选项。


最后祝你好运,炼丹这种玄学,运气是必不可少的。