准备环境
创建应用
上传基础模型
在这以 sdxl 为例,需要上传 sdxl_vae.safetensors 和 sd_xl_base_1.0.safetensors两个模型
将模型放入到数据盘里的sd-models目录里
数据集准备
上传数据
在这里是以sdxl的为例,将数据集上传到 数据盘里的 train目录里
标签处理
如果上传的数据集已经有标签处理好了,可以跳过本步骤
打开 webui 入口和打开日志 webui界面,选择标签编辑器,如下图所示 处理标签主要步骤
选择标签管理器
在数据集目录,填写数据地址
点击数据集加载设置,如上图所示所选
点击加载
数据目录填写可以如下图操作
选择 sdxl 后,再点顶部的左边红框按钮,既可以复制文件路径
然后到数据目录下,粘贴下就可以,也可以按键盘的ctrl+v
修改标签
右边选择编辑被选图片描述,并勾选上自动从被选图片中复制描述,如下图所示
操作步骤如下三步
点击左边需要调整的图片
在编辑描述里修改标签
然后点击将更改应用于所选图像
例如这里添加了一个chinesegirl触发词,就是用来触发这个丹的咒语,同时也可删除部分标签
如需要对发型有所调整,可以保留发型的描述词,这样可以让 ai
知道这样的发型存在,如发色后续也需要可以更改,这里也可以添加对发色的描述
更详细的标签调整可以 自行在 b 站上去学习下
开始训练
参数调整
打开 webui的训练页面
注意:下面所涉及到的所有填写的最好不要使用中文,不然容易导致训练失败
可以选新手模式,等到熟悉后可以再选专家模式,专家的可以调整的参数比较多
下面都以专家模式展开讲讲,专家页面如下图所示
由于本次准备的是练 sdxl的 lora 丹,所以在训练种类这里需要选择sdxl-lora
自己可以根据需要练的丹选择对应的类型,sd-lora是练 1.5 的
如果是练基础大模型,需要转移到Dreambooth训练页面上
底模路径:这里可以参考数据集的操作,到文件管理上找到对应的文件复制路径,然后粘贴上即可,例如在准备环境步骤,我们将模型放到数据盘里的models目录下,那么完整路径为:/root/onethingai-tmp/sd-models/sd_xl_base_1.0.safetensors
VAE 路径:/root/onethingai-tmp/sd-models/sdxl_vae.safetensors
注意:vae 在训练 sdxl 的时候必须填写,不然会导致训练不起来
数据集路径:可以参考编辑标签步骤里的路径,如果你将数据集上传到数据盘里的 train 目录里,则填写路径位 /root/onethingai-tmp/train/sdxl 这里的 sdxl可以更改为自己上传的目录名称
下图为数据集配置和炼丹输出
需要注意的是:训练图片分辨率,宽、高必须为 8 的整数倍,数据集里的所有图片分辨率必须一致
其他可以按上图配置
下图中红框的需要注意调整为bf16
辅助工具
如何看进度
可以切换到之前打开的查看日志页面
如上图所示,即表示开始在训练了
如何调整 repeats
回到文件管理,进入数据盘,到 train/sdxl目录,如下图所属
可以看到这里之前的文件都消失了,并且多了个文件夹为5_zkz,这是在上面默认训练的时候,系统把这里的数据集文件都挪到这里去了
这个文件夹的主要意义?
发现这个文件夹的构造为 {数字}_{字符},这里的数字意义比较大,它就是我们需要的 repeat 的设置了,也就是告诉 ai 这个数据集里的图片需要学习多少次,可以减起调整为你需要的,然后重新点开始训即可采用新的训练次数
如何重新命名
如下图所示,我们已经将 repeat 给调整了
steps如何计算
steps = epoch * images * repeat
资源下载
sd_xl_base_1.0.safetensors: https://www.123pan.com/s/AK8tjv-WSEIh.html 提取码: R67o
参数说明
mixed_precision
混合精度,目前支持float、fp16和 bf16,目前对于消费级显卡推荐bf16,专业级可以使用 fp16
save_precision
保存精度,跟 mixed_precision保持一致即可
network_dim
特征维度,当需要学习的内容复杂时,维度应当更高。但是也不是越高越好
维度提升有助于学会更多细节,但模型收敛速度变慢,需要的训练时间更长,也更容易过拟合。
高分辨率训练集通常需要更高的维度。
通常越高维度容易学会更多的细节,对于简单的数据集(如人物),可以设置低点,对于复杂的数据集(如画风或构图比较复杂),可以设置高点,用来学会更多的细节
通常训练 xl 的 lora 个人倾向设置为 128这样的整数
network_alpha
该值被推荐设置为network_dim的一半,大多数的封装脚本也默认这么设置的
这个参数的主要用途将模型权重放缩防止下溢,在半精度训练中很有意义
pretrained_model_name_or_path
底模型的名称或者文件路径,可根据自己需要训练的目标来选择配合
batch_size
硬件能力越大,值就设置有多大
这个表示同时送去训练的数据量,同时也影响着训练所需要的时长
在实际训练时,值越大效果不一定越好,训练的快可能导致消化不良
optimizer_type
可选值:AdamW AdamW8bit Lion SGDNesterov SGDNesterov8bit DAdaptation AdaFactor
优化类型,关于优化器的原理可以自行查询,Lion 是很新的一种优化器,如果你不了解优化器,使用 AdamW、AdamW8bit、Lion 、 DAdaptation 即可。AdamW8bit 对于显存小的用户更友好。Lion 优化器的使用率也很高,学习率需要设置得很小(如AdamW优化器下的 1/3,或者更小),Lion 的效率在高batch_size时使用,效率会更高
使用 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。
shuffle_caption
打乱 tag,开启后能够提高模型的泛化性,但是使用不当会欠拟合,使用时最好 keep_tokens
keep_tokens
保证最前面的几个 tag 不被打乱,默认为1。可以多一点,保证打乱后仍然满足 asdweasf, 1girl, full body, outdoors 这种
learning_rate
学习率,在未设置 unet 学习率 和 text_encoder 学习率时生效
unet_lr
unet 的学习率,默认值是1e-4,你也可以写 0.0001。使用不同学习率时有所调整,当你的 network_dimension较大时,需要更多的 steps 与更低的学习率
1e-4 = 1 / 10000
1e-5 = 1 / 100000
5e-5 = 5 / 100000
text_encoder_lr
为与 ext 编码器关联的 LoRA 模块使用不同于正常学习率(使用 --learning_rate 选项指定)的学习率时指定。 有人说最好将Text Encoder设置为稍微低一点的学习率(比如5e-5)。
text_encoder 的学习率,常取定值5e-5,也有许多人将他调成 unet_lr 的 10-15分之一,调整到 unet_lr 1/8 附近也是常见的做法。有人说调低该参数有助于更多学习文本编码器(对 tag 更敏感)
lr_scheduler
学习率调度器,有以下几种
cosine_with_restarts,cosine,polynomial,constant,constant_with_warmup,linear 不妨搜索学习率调整策略。推荐使用 cosine_with_restarts,它会使学习率从高到低下降,变化速度先慢后快再慢。restarts 表示余弦退火的热重启次数,有助于逃脱平坦区域
lr_scheduler_num_cycles
余弦退火重启次数,仅在 lr_scheduler 为 cosine_with_restarts 时起效,不要太大,重启太多意义不大
lr_warmup_steps
可开可不开的东西,默认10%。预热阶段,不要听信别人说什么开始需要学习率大,那是稳定了才需要的,开始的梯度本身就很大,开启有助于减少神经元失活问题
train_unet_only / train_text_encoder_only
train_unet_only有时有用,只训练unet,显存严重不足时使用。
persistent_data_loader_workers
建议开启,但是容易爆内存
开启后会保留加载训练集的worker,减少每个 epoch 之间的停顿
max_data_loader_n_workers
如果cpu很烂,设置成1或2
指定数据加载的进程数。 大量的进程会更快地加载数据并更有效地使用 GPU,但会消耗更多的主内存。 默认是"8或者CPU并发执行线程数 - 1,取小者",所以如果主存没有空间或者GPU使用率大概在90%以上,就看那些数字和 2 或将其降低到大约 1。
noise_offset
在训练中添加噪声偏移来改良生成非常暗或者非常亮的图像,如果启用,推荐参数为0.1
prior_loss_weight
使用正则化时使用,该权重控制先验知识强度,默认为1。使用100张以上训练集有人推荐是5%-10%,不要设置更低了,那等于没有正则化,使用正则化权重1时模型收敛会非常困难。我在设置为1时多次炸炉,推荐训练画风时使用正则化
gradient_checkpointing
一个节约显存的设置,推荐关闭,除非显存严重不足
xformers
强烈推荐开启的优化项,不开启的情况,24GB显存也非常容易炸,开启后速度感人
cache_latents
缓存潜变量,通常开启,提高速度,与 random_crop 互斥
enable_bucket
开启后会进行分桶,如果你的训练集有不同分辨率图像则开启,会略微多消耗显存,显存不吃紧,建议开启
flip_aug
如果指定 --flip_aug 选项,它将执行水平翻转扩充(数据扩充)。你可以人为的将数据量加倍,但是如果在数据不对称的时候指定(比如人物外貌、发型等),学习就不会很顺利。 |
---|
可选项,如果学习画风可以开启,人物也可以考虑,但是要是人物刘海有方向这种,就会出事。默认关闭。
resolution
训练数据集图片的分辨率,支持非正方形,但必须是 64 倍数。格式为:宽,高
max_train_epoches
一个Epoch就是将所有训练样本训练一次的过程 |
---|
最大训练 epoch,个人设置为10
save_every_n_epochs
配置每 n 次 epoch 后就保存一个 lora 模型,推荐 1,这样在多轮epoch后,校验每轮 epoch 的模型的拟合度,这样设置比较容易获的较好的模型
clip_skip
一个玄学的配置,默认建议设置为:2,不需要调整