保姆级最详细Kohya_ss gui训练StableDiffusion SDXL自定义Lora流程及参数解析

目录

1、前言

2、数据准备

2.1、原图预处理

2.2、图片打标签

2.3、添加触发词

2.3.1、批量文首添加

2.3.2、批量删除第一行

2.3.3、批量替换

3、训练参数

3.1、切换到LoRA

3.2、路径

3.2.1、底模路径

3.2.2、图片路径

3.2.3、其它路径

3.3、杂项

3.4、参数

3.5、高级参数

3.5.1、禁用文本编码器

3.5.2、梯度检查点

3.6、思维导图

4、一些错误

4.1、load Diffusers pretrained models

4.2、更改分辨率无法训练

4.3、完成训练后无法训练

4.4、相同参数无法训练


1、前言

    本文详细讲解了使用Kohya_ss gui训练SD lora的流程,包含数据处理、参数解析、报错分析等部分,并且在参数部分加入了很多个人的经验和理解,希望能对大家有所帮助。同时本文还附带了BLIP运行所需的两个大权重文件,以解决BLIP无法运行的问题。

2、数据准备

2.1、原图预处理

    收集的原始图片质量可能参差不齐,在进行下一步之前最好先进行一些简单的预处理,主要是对分辨率过低的图片进行处理,提高分辨率。这里介绍SD的批量图像放大。

    进入SD webui的附加功能(Extras)的从目录进行批量处理(Batch from Directory)页签,提前将需要提高分辨率的图片筛选出来放在一个文件夹内,填好对应输入目录和输出目录,如下图所示:

    勾选图像放大(Upscale),在下拉菜单中设置放大算法及缩放比例(Scale by),放大算法可以选R-ESRGAN 4x+,如果是动漫图片可以选R-ESRGAN 4x+ Anime6B。填好后点击生成(Generate)。

    注:本文主要介绍lora训练,此处所提供的图像放大方法并非最优,只是相对简单的一种方法。如果需要更好的图像放大效果,可以自行搜索Tiled Diffusion、Ultimate SD Upscaler、StableSR等方法。

2.2、图片打标签

     对图片进行完预处理后下一步就是图片打标签,方法同样很多,这里还是介绍通过SD进行打标的方法。与上一步类似,打开附加功能-从目录进行批量处理,输入目录选择处理好后的图片目录(别忘记把不用放大的图片加进来),输出路径中的30表示这个文件夹内的每张图片每一轮训练30次。

    取消勾选图像放大,勾选最下方的Caption,下拉菜单中勾选BLIP,这里BLIP代表以一句话的形式描述图片,如a man with a hat and a black jacket and a yellow and black jacket and a black and white background, Baiōken Eishun, anime visual, a character portrait, computer art

而Deepbooru表示以一个词一个词的形式描述,如a man, with a hat, black jacket……

两种都可以。个人习惯使用BLIP。

    运行时在后台可以看到SD加载了models\BLIP下的model_base_caption_capfilt_large.pth文件,第一次运行,下载失败时可以手动下载此文件放在对应路径下。但可能会发现把对应文件下好放在对应目录下后运行时SD仍在下载文件。其实这时SD下的并非是这个model_base_caption_capfilt_large.pth,而是在缓存区内的ViT-L-14.pt文件。这两个文件大小差不多,很容易搞混,需要注意。我的这两个文件分享如下:

链接:https://pan.baidu.com/s/18XuUkk7nqOVQYOVifO05pg 
提取码:2118

    完成后会在输出目录中看到照片+同名txt标签的组合形式,如果时间允许,最好再逐个检查一下标签文件,看看有没有错漏。标签的修改也是个大项,如这里不展开,简单提一下:标签中没提到的东西会被模型认为是主体整体的一部分。比如你训练一个人物lora,每张数据都打着把红伞,但标签中没写出“Red Umbrella”,那么模型就会认为红伞也是这个人物的一部分,出的每张图都有这把伞。不理解也没关系,通常来说不去研究标签工程也能训练出很好的模型。

2.3、添加触发词

    可以不仔细修改标签,但最好给每个标签前面加上一个无意义的触发词,这样使用lora的时候输入此触发词通常可以更好的让模型明白正在使用这个lora。

2.3.1、批量文首添加

    在txt最前面添加东西(不换行):随便找个地方新建一个add_test.bat,编辑里面的内容如下,

其中fjdad换成想要添加的触发词,下面的路径换成txt标签所在的路径,双击运行即可。

@echo off
setlocal enabledelayedexpansion

rem 设置要添加的内容
set "content=fjdad, "

rem 设置要处理的文件夹路径
set "folder_path=D:\data\anime\30_anime"

rem 遍历文件夹中的所有txt文件
for %%f in ("%folder_path%\*.txt") do (
    rem 读取文件的内容
    set "file_content="
    for /f "delims=" %%i in (%%f) do (
        set "file_content=!file_content!%%i"
    )
    
    rem 将内容添加到文件的开头
    echo !content!!file_content!>temp.txt
    move /y temp.txt %%f >nul
)

echo Done.

    之后txt就都变成这样了:

    txt如果已经像我上图一样了,就可以跳过加触发词这一节了,后面几小节都是协助把搞错了的txt标签调回来的。

2.3.2、批量删除第一行

   慎用,小心把描述文本删了。

    作用是删除文件夹内所有txt的第一行。适用的情况是从别处找的txt首行添加并非在第一行前面添加内容,而是直接新加了一个第一行,此时可以用此脚本批量删掉第一行。

    也就是这种情况:

    用法是创建一个delete_first.bat,里面的内容填充如下,将这个文件放在需要删除首行的txt文件的同目录,双击运行。(运行完记得把这个bat文件删了,那个目录内只要图片和图片的描述文件。)N表示删除的行数,如果要删除前3行就改成3。

@ECHO OFF
SET TxtDir="%~dp0"
SET /A N=1
ECHO
ECHO
ECHO ...
CD /D %TxtDir%
FOR /F "tokens=1 delims=" %%I IN ('DIR /A /B *.txt') DO ((MORE +%N% "%%I">"%%I_")&(DEL /A /F /Q "%%I")&(REN "%%I_" "%%I"))
ECHO
PAUSE

2.3.3、批量替换

   慎用,小心改变了描述文本。

    作用是替换文件夹内所有txt的某些文本。适用的情况是想换个触发词,比如把fjdad换成dadfj,或者想把所有的woman换成1girl,此时可以用此脚本批量替换所有txt文件。

    用法是创建一个replace_text.bat,里面的内容填充如下,将这个文件放在需要批量替换的txt文件的同目录,双击运行。(运行完记得把这个bat文件删了,那个目录内只要图片和图片的描述文件。)search表示要被替换的词,replace表示替换为的词。

@echo off
setlocal enabledelayedexpansion

set "search=fjdad"
set "replace=dadfj"

for %%f in (*.txt) do (
    set "outfile=%%~nf.tmp"
    (for /f "usebackq delims=" %%l in ("%%f") do (
        set "line=%%l"
        set "line=!line:%search%=%replace%!"
        echo !line!
    )) > "!outfile!"
    move /y "!outfile!" "%%f" >nul
)

echo Replacement complete.

pause

3、训练参数

3.1、切换到LoRA

    实在是被忘记这个折磨太多次了,这里一定要单开一章说一下。Kohya_ss GUI的Dreambooth和LoRA的训练界面基本上长得差不多,很容易弄混,在一切开始之前,务必在最上面切换到LoRA页签,进入LoRA的训练。

3.2、路径

3.2.1、底模路径

    Pretrained model name or path:这里是选择底模的名字或者路径,stabilityai开头的就是选名字,然后训练脚本会自动去huggingface里下载对应的底模,如果使用这种方式,确保你的网络可以访问huggingface。同时第一次运行会比较久,因为要下载模型。

    另一种方式是直接填写本地底模的路径,也就是像这个样子。

    然后需要你选择你这个底模的类型,是V2还是SDXL,如果是SD1.5那就都不勾选。

3.2.2、图片路径

    Image folder (containing training images subfolders):这个就是存放训练图片的路径,需要注意,只选到30_xxx前面的那一级,比如像这个架构,此处就填D:\data\anime

    这是因为这个30_anime可能并不是这个lora唯一的数据,比如说我们要训练一个人的lora,可以新建一个文件夹30_face,里面只存放人脸的数据,然后再新建一个文件夹10_body,里面存放身体的数据,让模型主要去学习人脸,每张人脸学习30次,每张身体只学习10次。(也可以通过数据量来达到类似的效果,只用一个数据集,里面放20张人脸,只放5张身体)

    也就是像这样,那此处的路径就填D:\data\human

3.2.3、其它路径

    点开Folders页签,里面有:

    Output folder to output trained model,保存输出权重文件的路径。         

    Regularisation folder(Optional. containing reqularization images),存放正则化图片的路径,(这个一般用不上,我所了解只有在训练Dreambooth的时候用的比较多,是用于比如训练一个施瓦辛格的模型时,数据集描述全都是Schwarzenegger,a man,……那最后训练出的模型不管输入Schwarzenegger,还是a man,都会生成施瓦辛格的样子,如果想要模型也能生成其他男人,就需要在训练的时候加入正则化图片,通常是底模直接生成a man的图片,以作区分。)

    Logging folder (Optional. to enable logging and output Tensorboard log),存放日志的路径,用于在Tensorboard中查看训练信息。这是可选的,可用可不用。多次训练调节优化器、学习率等观察它们的不同表现时可以用上。

3.3、杂项

    Trained Model output name:输出模型的名字,根据情况改就行了。

    Training comment:不知道,没用过。

    Save trained model as:训练好的权重的保存格式,一般都选safetensors。

    Save precision:保存的精度,一般都选fp16。

3.4、参数

    也就是Parameters页签展开。

    Presets:预设,可以用一些预设的参数,我一般不用,就保持为none。

    LoRA type:LoRA的类型,通常来说都是Standard

    LoRA network weights:迁移学习模型的路径,比如上一次训练中第三轮的模型表现得挺好的,但是最后第10轮学崩了,可以调整参数后在这里填上第三轮模型的路径,相当于从第三轮模型的基础上开始训练,有些时候这个功能效果挺好的。

    DIM from weights:勾选后网络的dim rank就会和LoRA network weights中设置的模型的dim rank保持一致。(实际上不勾选,而两者的Network rank不一致时会报错。如果要迁移学习,还是得保证两个网络的rank一致。)

    Train batch size:训练的批次,此值越大,耗显存越多,根据实际机器的表现来,但并非越大速度越快。拿4090举例,速度最快的时候大概是16的batch size,这个值调到20跟16总耗时差不多,但是调到20显存会耗的更多。(另外我通常用4090时此值调为8,这样可以边训练边用SD画图。速度方面大概是此值为16时的百分之八九十)

    Epoch,训练轮数,通常10轮以内就够了,简单的任务几轮也就够了。我通常设为10(也试过20轮,后面基本上都过拟合了)。

    Max train epoch Max train steps:没用过

    Save every N epochs:几轮保存一次模型,空间充足就每一轮保存一次最好了,训练完了在SD中用XYZ脚本把每一轮的模型都拿来用一下,看看变化趋势,选效果最好的。(也可以边训练边测试),如果空间有限那就根据实际情况来。

    Caption Extension:修改为txt。这里加红是因为它写的是Optional(可选)的,但实际上这个是得改的,不然数据集的描述文件就失效了。

    Seed:随机种子,不填就是随机,填了就是按照某个随机种子来训练(即便使用相同随机种子,训练出的模型大概率也不会完全一样。)通常不填。

    Cache latents:是否开启缓存latents,开了之后会增加一些耗时,减少显存消耗。

    Cache latents to disk:是否把缓存的latents保存在电脑里,开了之后下次训练相同的数据就不用再重新缓存一遍latents,就不会增加耗时了。(会在图片-描述的数据集里每一张图片多产生一个latents缓存文件)

    LR Scheduler:学习率调度器,通常就选择cosine(余弦退火),也可以尝试cosine_with_restarts,带restarts的余弦退火,不过感觉上跟cosine差不多。如果这里选constant_with_warmup,可以调节后面的一个参数LR warmup (% of total steps)来控制暖机的步数比例。

    Optimizer:优化器,AdamW8bit最全能了。据说Lion比它好,但我实际用下来感觉Lion会没那么稳定,更可能出现损失越来越大的情况,所以后来还是都用AdamW8bit了。

    Learning rate:学习率,1e-4(0.0001),5e-5(0.00005)比较常用。理论上来说需要根据数据情况、模型参数等进行调整,不过我一般就在0.0001附近就差不多了,这个值大的话模型就学的快,损失下降的快,但如果太大了也有可能会损失不降反增,或来回震荡。这个值小就学的慢,但是稳定。但是太小可能会陷入局部最优解走不出去。

    Unet learning rate:Unet的学习率,通常就跟上面这个参数保持一致就好了。

    Text Encoder learning rate:文本编码器的学习率,通常设为他俩的一半。(实际上4090训练SDXL的时候需要设置不训练文本编码器,这个值应该没啥用。)

    Max resolution:可以认为是所训练的lora的分辨率,这个值为多少,lora就在多少分辨率下表现最好,一般跟底模相同,如果是SD1.5那就设成512,512,如果是SDXL就设成1024,1024,当然如果机器没那么好,或者数据集中大部分分辨率没1024这么大,设成768,768也是可以的。

    Stop text encoder training (% of total steps):停止训练文本编码器的步数,一般不用管。SDXL会直接设置不训练文本编码器。

    Enable buckets:是否开启buckets,以及buckets的最大最小分辨率,这个通常是要开的,它会自动的把数据裁剪成前面Max resolution所设分辨率周围的,各种形状的数据。这样的好处是可以增加训练出来模型的泛化性,如果不开,可能模型只会画正方形的,分辨率一旦设为长方形就效果不好了。开了之后训练数据里就各种形状都有了。

    Minimum/Maximum bucket resolution:bucket的最大最小分辨率,通常不用修改,如果数据集里有特别特别小的图片,可以适当降低Minimum bucket resolution(但还是建议先对这样的图片进行分辨率提升再拿来训练。)

    Network Rank (Dimension):网络的规模,这一项在SD1.5和SDXL里还颇为不同,对于XL来说,简单的任务32或者16,复杂一点的给64,已经是很高的配置了,很少会遇到需要给128的时候,而SD1.5中通常都是64、128、256。这个数字越大,模型的学习能力越强,最后生成的模型文件的大小也越大。如果感觉数据集里的元素太多,模型有点学不懂了,可以增加此项的值。

    Network Alpha:对权重进行缩放,它的思路是神经网络的权重容易接近0,就通过这一项以一定的比例来在训练过程中对权重进行削弱,让权重看起来比较小,但实际保存的时候比较大,实际保存的时候就不容易接近0了。我通常不会用到它,它的削弱比例是Network Alpha/Network Rank,如果不想用的话就让它和Network Rank相等就行了。

    SDXL Specific Parameters:训练SDXL时才会有的参数选项,分别是Cache text encoder outputs和No half VAE,前者可以降低显存消耗,后者不勾选由于某些bug会报错。建议都勾选。

3.5、高级参数

    也就是Advanced选项卡打开

3.5.1、禁用文本编码器

    在Additional parameters处填入--network_train_unet_only,此选项的目的是仅训练Unet而不训练text encoders这也是官方建议的做法,官方说:
强烈建议选择SDXL LoRA。因为SDXL有两个文本编码器,所以训练的结果会出乎意料。

3.5.2、梯度检查点

    勾选Gradient checkpointing,这一项通过在前向传播的过程中将某些中间结果临时储存,而不是一直保留,可以显著减少显存需求。它会增加耗时,但是由于显存需求降低了,可以使用更大的Batchsize,所以整体耗时是降低的。

3.6、思维导图

    顺便贴一张自己之前做的思维导图,其中参数的解析基本都是从官网翻译过来的。

4、一些错误

    一些常见的错误在kohya_ss的终端上就能看到,如显存不足,路径为空之类的,这里列出一些不太看得出来原因的错误

4.1、load Diffusers pretrained models

    在load Diffusers pretrained models:   stabilityai/stable-diffusion-xl-base-1.0, variant=fp16 处卡了很久,原因是底模路径那儿填的是名字,然后电脑无法访问huggingface,建议手动下载对应底模然后换成路径的形式使用。

4.2、更改分辨率无法训练

    开启过一次训练后,更改分辨率,再次训练,会无法训练,但没有报错,此时重启服务重新点击开始训练可以解决。

4.3、完成训练后无法训练

    完成一次完整的训练后,相同文件名再次开始训练会无法训练,删掉之前训练的结果,或者换一个保存名可以解决。

4.4、相同参数无法训练

    一切看起来都很正常,突然就怎么都运行不起来训练了,就算是相同参数。此时先停掉SD再开启训练也许可以解决。应该是内存不足(RAM不足,而非显存VRAM不足),换了台电脑之后没出现过这个问题。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值