设置训练用模型、数据集
转自:秋葉aaaki SD-Trainer训练器参数详解
底模选择
底模,尽量选祖宗级别的模型练出来的LoRA会更通用。如果在融合模型上训练可能会仅仅在你训练的底模上生成图片拥有不错的效果 但是失去了通用性。可以自己抉择
什么是祖宗级别的模型?
sd1.5 2.0、novelai 原版泄露模型。也就是非融合模型。融合模型比如 anything 系列融合了一大堆,orangemix系列融合了 anything 和 basil 更灵车了等等。在他们上面训练的会迁移性更差一些。
#训练分辨率
训练时的分辨率 宽,高,可以是非正方形,但必须为64的整数倍。建议使用大于 512x512 且小于 1024x1024 的值,长宽比根据训练集的占比决定,一般来说方形的可以照顾到各种不同的分辨率。如果多数为长图可以使用512x768这种分辨率,如果宽图居多则可以使用768x512等。
#ARB 桶
默认开启 ARB 桶,以允许使用非固定宽高比的图像来训练(简单来说就是不需要手动剪裁了)。ARB 桶在一定程度上会增加训练时间。 ARB桶分辨率必须大于训练分辨率
#学习率与优化器设置
#学习率设置
UNet和TE的学习率通常是不同的,因为学习难度不同,通常UNet的学习率会比TE高 。
如图所示,我们希望UNet和TE都处于一个恰好的位置(绿色部分),但是这个值我们不知道。
如果UNet训练不足,那么生成的图会不像,UNet训练过度会导致面部扭曲或者产生大量色块。TE训练不足会让出图对Prompt的服从度低,TE训练过度则会生成多余的物品。
总学习步数 = (图片数量 重复次数 epoch)/ 批次大小
以UNet学习率为1e-4为例,一般来说图片较少的时候训练人物需要至少1000步,训练画风则需要至少2500步,训练概念则需要至少3000步。这里只是最低的步数,图片多则需要更多步数。学习率更大可以适当减少步数,但并非线性关系,使用两倍的学习率需要使用比之前步数的一半更多的步数。
决定学习率和步数的最好方法是先训练,再测试。一般比较好的初始值为UNet使用1e-4,TE使用5e-5
#学习率调整策略(lr_scheduler)
推荐使用余弦退火cosine。如果开启预热,预热步数应该占总步数的5%-10%。
如果使用带重启的余弦退火cosine_with_restarts,重启次数不应该超过4次。
#批次大小 (batch_size)
Batch size 越大梯度越稳定,也可以使用更大的学习率来加速收敛,但是占用显存也更大。
一般而言 2 倍的 batch_size 可以使用两倍的 UNet 学习率,但是TE学习率不能提高太多。
#优化器
这里只介绍最常用的三种:
- AdamW8bit:启用的int8优化的AdamW优化器,默认选项。
- Lion:Google Brain发表的新优化器,各方面表现优于AdamW,同时占用显存更小,可能需要更大的batch size以保持梯度更新稳定。
- D-Adaptation:FB发表的自适应学习率的优化器,调参简单,无需手动控制学习率,但是占用显存巨大(通常需要大于8G)。使用时设置学习率为1即可,同时学习率调整策略使用constant。需要添加”—optimizer_args decouple=True”来分离UNet和TE的学习率。(这些设置训练UI都会帮你自动处理)
#网络设置
#网络结构(LoRA/LoCon/LoHa/DyLoRA)
不同网络结构对应不同的矩阵低秩分解方法。LoRA 是老祖宗,只控制模型中的线性层和1x1卷积层,后续的不同网络结构都是在 LoRA 的基础上进行改进。
LyCORIS 对其进行改进,添加了其他几种算法:
- LoCon 加入了对卷积层 (Conv) 的控制
- LoHa(哈达玛积)和 LoKr(克罗内克积)
- IA3
理论上来说 LyCORIS 会比 LoRA 拥有更加强的微调效果,但是也更加容易过拟合。
需要注意的是,不同的网络结构一般需要对应不同的 dim 以及学习率。
#网络大小
网络大小应该根据实际的训练集图片数量和使用的网络结构决定
上表中值为我自己的角色训练推荐值,训练画风和概念需要适当增加 Linear 部分大小。推荐值并非对各个不同的数据集都是最优的,需要自己实验得出最优。Conv 的大小最好不要超过8。
#网络Alpha(network_alpha)
alpha在训练期间缩放网络的权重,alpha越小学习越慢,关系可以认为是负线性相关的。
一般设置为dim/2或者dim/4。如果选择1,则需要提高学习率或者使用D-Adapation优化器。
#高级设置
#Caption 相关
#caption dropout
网上关于这几个caption dropout的说明少之又少,甚至作者在文档里面也没有包含这些参数,只能在代码注释里面找到说明。但是caption dropout在某些情况下对模型性能有提升,所以拿出来讲一下。
caption_dropout_rate:丢弃全部标签的概率,对一个图片概率不使用caption或class token
caption_dropout_every_n_epochs:每N个epoch丢弃全部标签。
caption_tag_dropout_rate:按逗号分隔的标签来随机丢弃tag的概率。如果使用DB+标签的训练方法训练画风,推荐使用这个参数,能够有效防止tag过拟合,一般选择0.2-0.5之间的值。训练人物则无需开启。
#token 热身
两个token热身相关的参数。
token_warmup_min:最小学习的token数量,token_warmup_step: 在多少步后达到最大token数量。
token_warmup可以理解为另一种形式的caption dropout,但是如果不随机打乱token,则只会学习前面N个token。本人并未实测过启用这两个参数的效果,有兴趣可以自行实验。
#噪声相关
#噪声偏移(noise_offset)
在训练过程中加入全局的噪声,改善图片的亮度变化范围(能生成更黑或者更白的图片)。
如果需要开启,推荐设置值为0.1,同时需要增加学习步数作为网络收敛更慢的补偿。
#多分辨率/金字塔噪声 multires_noise_iterations、multires_noise_discount
多分辨率/金字塔噪声相关参数。iteration设置在6-8,再高提升不大。discount设置在0.3-0.8之间,更小的值需要更多步数。
#其他一堆参数
- CLIP_SKIP CLIP模型使用倒数第N层的输出,需要与底模使用的值保持一致,如果是基于NAI的二次元模型,应当使用2。如果是SD1.5等真实模型应当使用1。生成时也应该使用同样的值。
- Min-SNR-γ 发表于今年CVPR23上的一种加速扩散模型收敛的方法。不同样本批次的学习难度不同导致梯度方向不一致所以收敛慢,于是引入根据信噪比调整学习率比重。 设置在5左右的值是实验效果比较好的,但是注意优化器使用D-Adaptation的时候不适用,因为学习率是优化器控制的。
- 数据增强相关 数据增强是在训练时实时对图片做变换的方法,可用于防止过拟合,能用的一共有四种: color_aug, flip_aug, face_crop_aug_range, random_crop。 其中只有翻转(flip_aug)能和cache latent兼容,因为latent可以直接翻转。 四种都不推荐使用,因为裁剪图片的两种cropping方法都会导致tag对应不上。color_aug无法启用cache latent导致训练慢,得不偿失。翻转的flip_aug在图像不对称的情况下表现差,会导致无法正确生成人物不对称的特征(刘海、发饰等)。
- max_grad_norm 限制模型更新梯度的大小,改善数值稳定性。梯度的范数超过这个值将会被缩放到这个大小,一般来说无需设置。
- gradient_accumulation_steps 梯度累积步数,用于在小显存上模拟大batch size的效果。如果显存足够使用4以上的batch size就没必要启用。
- log_with、wandb_api_key 选择logger类型,可选tensorboard或者wandb。使用wandb需要指定api key。
- prior_loss_weight DB训练当中先验部分的权重,控制正则化图像的强度,论文中使用的是1的值,如无特殊情况无需更改。
- debug_dataset 不训练模型,仅输出训练集元数据和训练参数信息,可以用来检查各项设置是否正确。
- vae_batch_size cache lantent的时候VAE编码器的batch size,和训练效果无关。一般来说使用2-4可以加速一点cache latent的过程。因为VAE编码器本身参数量比较小,实测在Linux机器上8G的显卡也能开启4。Windows下系统占用显存较多,显存小于10G不建议开启。