其实这篇教程写了很久了,但是一直没有同步过来。最近做了两个红包封面就刚好借着发封面的时机把这篇教程一起发一下。字很多,需要慢慢看
PART ONE
原理简述
训练LoRA的过程可以简化为这样一个流程:使用底模和训练集中提供的Tag生成图片,然后生成的图片跟训练集的图片进行对比,将差异点记录下来,这个记录的文件就是LoRA。
差异炼丹法的核心思想是将两个LoRA相减得到有差异的部分。比如想实现一个古铜色皮肤LoRA,先用普通肤色的人物形象去训练一个过拟合的LoRA X,然后再将人物形象的图片进行处理,把皮肤调整成古铜色但是其余其余的都不变,接着用这个新的人物形象去训练一个过拟合的LoRA Y,此时LoRA X和LoRA Y的差异是只有肤色的差异,所以只要将X和Y两个LoRA做差集,就可以得到一个古铜色皮肤LoRA Z
| 差异炼丹法的好处
得到的LoRA会比较“纯净”,能够尽可能减少底模提示词的污染,并且能够提升模型的泛化性
PART TWO
差异LoRA提取 — 融合训练法
一、数据集准备
需要准备2套数据集,我们称为变化前和变化后,两个数据集的差异就是我们想要的部分。比如做一个古铜色皮肤的LoRA,那么第一个数据集和第二个数据集的差异只有皮肤颜色有差异, 别的部分都相同 。并且两套数据集的 图片命名、描述词都需要一模一样 。另外差异化炼丹数据集不宜过多,一般建议每组不超过6张图片
二、训练第一个LoRA
将变化前的数据集作为输入,选择任意优化器都可以,我比较经常使用的是Prodigy优化器,Repeat设为20,一般情况下,在第30个Epoch就会过拟合,也就是差不多600步左右,此时输出LoRA X
三、融合底模
Kohya_GUI中,找到 Utilities-LoRA-Merge LoRA 选项进行融合,选择好底模路径、LoRA X路径、最终模型输出路径、Ratio设为1,然后直接融合即可,此时得到了融合底模Model M,需要注意的是,保存的精度需要和训练的LoRA精度保持一致
三、训练LoRA
将第二步中融合得到的Model M作为训练用的底模,将变化后的数据集作为输入进行训练,建议训练参数跟第一步中训练LoRA X时的参数保持一致,这里一般情况下会很快就过拟合了,所以我把Repeat设为5,一般情况下在20-30个Epoch就会过拟合了,此时输出最终的LoRA,大功告成
PART THREE
差异LoRA提取 — SVD修剪法
一、数据集准备
这一步跟融合训练法一样,需要准备变化前和变化后两套数据集
二、训练LoRA
在这一步需要分别训练2个LoRA,这两个LoRA除了数据集不同以外,其余参数均相同。一个需要使用变化前的数据集进行训练,一个需要使用变化后的数据集进行训练,并且这2个LoRA均训练到过拟合。一般情况下,使用Prodigy优化器、Repeat设为20的情况下,第30个Epoch就会过拟合
三、修剪LoRA
在Kohya_GUI中,找到 Utilities-LoRA-Merge LoRA(SVD) 选项进行修剪,选择好两个LoRA的路径,2个LoRA的Ratio均设为1,模型保存的精度需要和原本训练的精度保持一致,设置好输出名称和路径即可
PART FOUR
LoRA测试
得到最终LoRA之后,需要对模型跑XYZ进行测试,一般需要针对不同的采样器、不同的底模、不同的关键词、不同的权重进行跑图测试,根据跑图的结果来看模型是否符合预期以及是否要进行进一步的调整
CONCLUSION
总结
融合训练法和SVD修剪法均能够得到最终的差异化LoRA,但是目前测试下来发现,如果数据集前后差异比较大的话,SVD的效果会更好一些,不过目前测试数量有限,欢迎大家进一步测试讨论反馈。因为我在测试的过程中,当repeat值较高时,会出现模型出图崩坏的情况,因此将Repeat值调的比较低,也只是参考值,大家可以根据实际情况去调整,不一定要跟我的值一模一样