Stable Diffusion Lora locon loha训练参数设置
一、部署
1. 环境构建
部署可以使用国内的整合包,也可以自己git pull,环境方面可参考。
https://zhuanlan.zhihu.com/p/612317907
我在使用bmaltais/kohya_ss训练时出现问题(https://github.com/KohakuBlueleaf/LyCORIS/issues/40),更换了derrian-distro/LoRA_Easy_Training_Scripts一切正常。https://zhuanlan.zhihu.com/p/612317907
derrian-distro/LoRA_Easy_Training_Scripts
Linaqruf/kohya-trainer
bmaltais/kohya_ss
hollowstrawberry/kohya-colab
https://github.com/kohya-ss/sd-scripts
github.com/kohya-ss/sd-scripts
2. pytorch 版本
多种版本都是被支持的,下面的一键Windows一键安装依赖包中,提供了对应的版本与pytorch版本,2.1 版本会更快一些,但似乎显存占用更多……
Release installers v6 · derrian-distro/LoRA_Easy_Training_Scripts
github.com/derrian-distro/LoRA_Easy_Training_Scripts/releases/tag/installers-v6
3. 环境迁移
当你在云服务器上训练时,可以使用一键安装脚本,也可以打包本地环境进行环境迁移,我使用的是conda-pack。
-> winows 方法:conda-pack > spec-list.txt
-> linux 方法:conda-pack > environment_name.yml
Conda-Pack 打包环境方式在目标计算机无法联网或者网络不畅时很好用,而Conda导出 environment.yml 的方式非常适合在不同平台和操作系统之间重新创建环境。
此处不再赘述具体操作,感兴趣的自己搜索方法即可。
二、Lora 训练参数
1. batch_size
只要显存不大,能多大就多大(迫真)
Batch_size 代表了同时送进去训练的数据量,理论上是应该第一个被确定的超参数。当数量为1时,等同于随机梯度下降法(SGD)。
较大的batch size往往会导致训练速度更快(每个epoch的iteration数小),内存占用更大,但收敛得慢(需要更多epoch数)。
较小的batch size往往会导致训练速度更慢(每个epoch的iteration数大),内存占用更小,但收敛得快(需要更少epoch数)。[1]
实际训练时,能多大就多大往往就能取得不错效果(那种batch_size几千时性能下降的情况只有在超恐怖的gpu/tpu上才会发生,谁让我们显存小)。nmist手写数字训练集可能3090 24G可能才能达到1024。所以……
下面是一些参考:
1024*768 分辨率下,24 GB VRAM 最大 batch_size = 4
1024*1024 分辨率下,24 GB VRAM 最大 batch_size = 3(推荐为2)
512*512 分辨率 12GB VRAM 最大 batch_size = 6
理论上,batch_size = 时计算速度更快。
2. base_model
底模型。一种不错的选择是,二次元选择novelai,训练三次元选择sd1.5,训练人物服装chilloutmix。也可以选择其他模型。使用 SD2.x based model 时,需要勾选 v2 参数。
3. clip_skip
跳过某些层的输出,起与 CFG 类似的作用。但通常三次元选1,二次元选2。
指定“2”使用文本编码器 (CLIP) 的倒数第二层的输出。 如果省略 1 或选项,则使用最后一层。
*SD2.0默认使用倒数第二层,学习SD2.0时请不要指定。
如果被训练的模型最初被训练为使用第二层,则 2 是一个很好的值。
如果您使用的是最后一层,那么整个模型都会根据该假设进行训练。 因此,如果再次使用第二层进行训练,可能需要一定数量的teacher数据和更长时间的学习才能得到想要的学习结果。
4. network_dimension
特征维度,当需要学习的内容复杂时,维度应当更高。模型文件的大小 当 network_dimension = 128 时,输出文件大小为 144 MB。
该参数不是越高越好。维度提升时有助于学会更多细节,但模型收敛速度变慢,需要的训练时间更长,也更容易过拟合。高分辨率训练集通常需要更高的维度。
训练人物通常设置network_dimension = 32,也可设置16或64,画风可以考虑128。通常训练人物不超过2000 steps 即可完成训练。
我尝试使用了 192 dim 训练分辨率为1024*1024的人物图像,学会了低 dim 下无法学会的复杂特征,但训练步数超过了15000 步。
我尝试使用了 192 dim 训练分辨率为1024*1024的人物图像,学会了低 dim 下无法学会的复杂特征,但训练步数超过了15000步。
Kasukanra 使用 200 dim 训练画风,他的测试结论是在更高 dim 下( 如 256 ),训练效果不佳。
https://www.youtube.com/watch?v=7m522D01mh0&t=1714s
你应该谨慎选择 dim 值,一个合适的 dim 能有效减少过拟合与欠拟合发生的概率。我倾向于设置成128这样的整数,再不急也使用192这样的数凑整。
5. alpha
指定 ``alpha`` 值以防止下溢并稳定学习。 默认值为 1。 如果您指定与 ``network_dim`` 相同的值,它的行为与以前的版本相同。
alpha 被推荐设置为 network_dimension 的一半,一些封装的训练脚本也默认这么设置。为了弄明白这个参数的作用,我翻开了源代码文件 lora.py 关于alpha 的部分。
其中有
可见,当alpha设置为一半dim时,scale为0.5,可以放缩网络的权重。从名字也可得知,这是一个缩放因子。但是这还不够,我打开了merge_lora.py,其中在合并到sd模型的文件中有
可见,该参数将模型权重放缩防止下溢,在半精度训练中很有意义。
6. learning_rate
学习率,在未设置 unet 学习率 和 text_encoder 学习率时生效。
7. steps
这不是一个可以设置的参数,但是必须要提,true_step = epochs * num_img / batch_size。
比如,你训练 8个 epochs,图片文件夹 10_dogs,里面有 50 张狗的图片。意味着重复10次,每个epoch 训练 500 steps。如果你的 batch_size = 4,还要除以 4,实际每个 epochs 只有 125steps。8 个 epochs 后 steps 是 1000。
还记得我们前面说的吗?更大的batch_size需要更多epochs。batch_size = 4 并不是意味着更新四次梯度,而意味着一次计算4张图片的梯度。业界常见的做法是让学习率随batch_size线性增加,不过我并不确定在这里是否使用。
8. unet_lr
unet 的学习率,默认值是1e-4,你也可以写 0.0001。使用不同学习率时有所调整,当你的 network_dimension较大时,需要更多的 steps 与更低的学习率。
9. text_encoder_lr
为与 ext 编码器关联的 LoRA 模块使用不同于正常学习率(使用 --learning_rate 选项指定)的学习率时指定。 有人说最好将Text Encoder设置为稍微低一点的学习率(比如5e-5)。
text_encoder 的学习率,常取定值5e-5,也有许多人将他调成 unet_lr 的 10-15分之一,调整到 unet_lr 1/8 附近也是常见的做法。有人说调低该参数有助于更多学习文本编码器(对 tag 更敏感)。
10. scheduler
学习率调度器,有以下几种
["cosine_with_restarts", "cosine", "polynomial", "constant", "constant_with_warmup", "linear"]
不妨搜索学习率调整策略。推荐使用 cosine_with_restarts,它会使学习率从高到低下降,变化速度先慢后快再慢。restarts 表示余弦退火的热重启次数,有助于逃脱平坦区域。
11. cycle
决定了重启次数,4-8 都是常见数值。不要太大,重启太多意义不大。
12. optimizer_type
["AdamW", "AdamW8bit", "Lion", "SGDNesterov", "SGDNesterov8bit", "DAdaptation", "AdaFactor"]
关于优化器的原理可以自行查询,Lion 是很新的一种优化器。如果你不了解优化器,使用 AdamW、AdamW8bit、Lion 、 DAdaptation 即可。AdamW8bit 对于显存小的用户更友好。Lion 优化器的使用率也很高,学习率需要设置得很小(如AdamW优化器下的 1/3,或者更小)
使用 DAdaptation 时,应当将学习率设置在1附近,text_encoder_lr 可以设置成1,或者小一点,0.5之类。使用DAdaptation 时,推荐将学习率调整策略调整为 constant 。
### 关于指定优化器
使用 --optimizer_args 选项指定优化器选项参数。 可以以key=value的格式指定多个值。 此外,您可以指定多个值,以逗号分隔。 例如,要指定 AdamW 优化器的参数,``--optimizer_args weight_decay=0.01 betas=.9,.999``。
指定可选参数时,请检查每个优化器的规格。
一些优化器有一个必需的参数,如果省略它会自动添加(例如 SGDNesterov 的动量)。 检查控制台输出。
D-Adaptation 优化器自动调整学习率。 学习率选项指定的值不是学习率本身,而是D-Adaptation决定的学习率的应用率,所以通常指定1.0。 如果您希望 Text Encoder 的学习率是 U-Net 的一半,请指定 ``--text_encoder_lr=0.5 --unet_lr=1.0``。
如果指定 relative_step=True,AdaFactor 优化器可以自动调整学习率(如果省略,将默认添加)。 自动调整时,学习率调度器被迫使用 adafactor_scheduler。 此外,指定 scale_parameter 和 warmup_init 似乎也不错。
自动调整的选项类似于``--optimizer_args "relative_step=True" "scale_parameter=True" "warmup_init=True"``。
如果您不想自动调整学习率,请添加可选参数 ``relative_step=False``。 在那种情况下,似乎建议将 constant_with_warmup 用于学习率调度程序,而不要为梯度剪裁范数。 所以参数就像``--optimizer_type=adafactor --optimizer_args "relative_step=False" --lr_scheduler="constant_with_warmup" --max_grad_norm=0.0``。
13. shuffle_captions
打乱 tag,开启后能够提高模型的泛化性,但是使用不当会欠拟合,使用时最好 keep_tokens。
14. keep_tokens
保证最前面的几个 tag 不被打乱,默认为1。可以多一点,保证打乱后仍然满足 asdweasf, 1girl, full body, outdoors 这种。
15. unet_only / text_only
unet_only 有时有用,只训练unet,显存严重不足时使用。
16. noise_offset
有助于生成特别暗或特别亮的图像,通常设置为 0.1,见 https://www.crosslabs.org//blog/diffusion-with-offset-noise
17. persistent_data_loader_workers
建议开启
在 Windows 环境中指定它可以显着减少时期之间的延迟。
18. max_data_loader_n_workers`
如果cpu很烂,设置成1或2
指定数据加载的进程数。 大量的进程会更快地加载数据并更有效地使用 GPU,但会消耗更多的主内存。 默认是"`8`或者`CPU并发执行线程数 - 1`,取小者",所以如果主存没有空间或者GPU使用率大概在90%以上,就看那些数字和 `2` 或将其降低到大约 `1`。
19. mixed_precision
混合精度,推荐bf16,保存精度请与它一致。
20. prior_loss_weight
使用正则化时使用,该权重控制先验知识强度,默认为1。使用100张以上训练集有人推荐是5%-10%,不要设置更低了,那等于没有正则化,使用正则化权重1时模型收敛会非常困难。我在设置为1时多次炸炉,推荐训练画风时使用正则化。
21. gradient_checkpointing
通过逐步计算权重而不是在训练期间一次计算所有权重来减少训练所需的 GPU 内存量。 关闭它不会影响准确性,但打开它允许更大的批量大小,所以那里有影响。
另外,打开它通常会减慢速度,但可以增加批量大小,因此总的学习时间实际上可能会更快。
一个节约显存的设置,然而我看见有的训练脚本里内容是pass(根本不起作用)推荐关闭,除非你显存严重不足。
22. --xformers` / `--mem_eff_attn`
当指定 xformers 选项时,使用 xformers 的 CrossAttention。如果未安装 xformers 或发生错误(取决于环境,例如 `mixed_precision="no"`),请指定 `mem_eff_attn` 选项而不是使用 CrossAttention 的内存节省版本(比 xformers 慢)。
都不开启的情况,24GB显存也非常容易炸。通常开启xformers,不要开启 mem_eff_attn,速度感人。除非你是16系显卡……
23. cache_latents
缓存潜变量,通常开启,提高速度,与 random_crop 互斥。
此外,在学习过程中执行 `random_crop` 或 `color_aug` 时,无法提前获取 latents(因为每次学习时图像都会改变)。如果你不预取,你可以从到目前为止的元数据中学习。事先获取图像的潜在表示并将其保存到磁盘。这允许快速学习。同时进行bucketing(根据纵横比对训练数据进行分类)
24. enable_bucket
开启后会进行分桶,如果你的训练集有不同分辨率图像则开启,会略微多消耗显存。
25. flip_aug
如果指定 --flip_aug 选项,它将执行水平翻转扩充(数据扩充)。你可以人为的将数据量加倍,但是如果在数据不对称的时候指定(比如人物外貌、发型等),学习就不会很顺利。
可选项,如果学习画风可以开启,人物也可以考虑,但是要是人物刘海有方向这种,就会出事。默认关闭。
26. lr_warmup_steps
可开可不开的东西,默认10%。预热阶段,不要听信别人说什么开始需要学习率大,那是稳定了才需要的,开始的梯度本身就很大,开启有助于减少神经元失活问题。
说得好,我决定设置为 0(X)
三、Locon 训练参数
1. 如何理解 locon (Conventional LoRA)
通过矩阵乘法降阶矩阵来降低参数的量。如 W = AB
W: (m,n)
A: (m,p)
B: (p, n)
https://zhuanlan.zhihu.com/p/612133434
2. 作者推荐参数
作者的推荐:
Include Conv layer implementation from LoCon
recommended settings
dim <= 64
alpha = 1 (or lower, like 0.3)
3. 实验参数
有的人 卷积 40 alpha 40 线性 40 alpha 40 仍然有不错效果(玄学调参)我没怎么练,不知道。
四、Loha 训练参数
1. 如何理解 loha
通过哈达马积进一步降低参数的量.

Use network_dim=0 or conv_dim=0 to disable linear/conv layer
LoHa doesn't support dropout yet.
2. 调参
recommended settings
dim <= 32
alpha = 1 (or lower)
WARNING: You are not supposed to use dim>64 in LoHa, which is over sqrt(original_dim) for almost all layer in SD
High dim with LoHa may cause unstable loss or just goes to NaN. If you want to use high dim LoHa, please use lower lr
WARNING-AGAIN: Use parameter-efficient algorithim in parameter-unefficient way is not a good idea
经过实验,效果不佳,可能是LOHA不适合训练特征不太明确的画风(很容易出现解剖结构崩坏的情况)。但是LOGA在特征较为明显的画风上表现比LOCON更好。推荐卷积层与线性层alpha都为1,线性层dim 32,64,16,8,卷积层dim 16,8,4,这也是目前比较成功的模型普遍采用的参数。
此外,loha 模型较难收敛,训练 Loha 画风普遍在 20000 - 30000 步……(所以说为了一点模型大小值得吗,不过在一些训练集上确实表现更好,另一些则是灾难)一些扑克之类构图训练也在 8000 步以上,只看到一两个模型2800 左右步数。