Dreambooth 官方炼丹教程万字详解-Epochs\Batch size\学习率 等超参数调优 (一)
原创 设计师忠忠 Stable Diffusion 炼丹阁 2023-04-09 18:16 发表于广东 原文链接地址:https://mp.weixin.qq.com/s/8ECZ5xaUF20AqMU3jb2Zqg
前言
Dreambooth 官方 Github 的 Readme 文档上有着非常详细的文字说明与视频教程,是学习 Dreambooth 炼丹的最佳资料之一,讲解了包括训练集训练轮数Epochs 、同时处理的图片数 Batch Size 、学习率 Learning Rate 等核心超参数在内的各种参数设置与调整建议。 接下来我将结合自己的理解,靠着 GPT4、NewBing 的帮助和大家一起修炼这份炼丹术进阶教程,踏上这炼丹修仙长生之路!
Dreambooth Extension for Stable-Diffusion-WebUI
这是Shivam Shriao的Diffusers Repo的一个正在进行中的移植版本,该版本是基于Huggingface Diffusers Repo的默认版本进行修改的,以在低VRAM GPU(低显存显卡)上获得更好的性能。此外,还借鉴了BMaltais的Koyha SS的部分内容。它还添加了其他一些功能,包括同时训练多个概念,以及(即将推出)图像修复训练。
样式说明:灰色正文主要来自官方文档翻译,有些地方不通顺,我会做一定程度的更改。黑色正文则是 我自己的理解和总结,如有错漏,欢迎斧正。
Installation 安装
要安装,请在SD Web UI中转到“Extensions(扩展)”选项卡,选择“Available(可用)”子选项卡,选择“Load from:(从...加载)”以加载扩展列表,最后在Dreambooth条目旁边点击“install(安装)”。
安装完成后,您必须完全重新启动Stable-Diffusion WebUI。重新加载UI将无法安装所需的依赖项。
我们还需要更新版本的diffusers,因为SD-WebUI使用的是0.3.0版本,而DB训练需要>= 0.10.0版本。没有正确的diffusers版本会导致“UNet2DConditionModel”对象没有属性“enable_gradient_checkpointing”的错误消息,以及安全检查器警告。
如果在安装后遇到依赖项问题,请查看以下内容
为了强制sd-web-ui只安装一套依赖项并解决许多安装问题,我们可以指定命令行参数:
set/exportREQS_FILE=.\extensions\sd_dreambooth_extension\requirements.txt
请参考下面的适当脚本,以添加额外的标志来安装依赖项:
https://github.com/d8ahazard/sd_dreambooth_extension/blob/main/webui-user-dreambooth.bat
https://github.com/d8ahazard/sd_dreambooth_extension/blob/main/webui-user-dreambooth.sh
最后,如果您希望完全跳过Dreambooth的“本地”安装过程,您可以设置以下环境标志:
DREAMBOOTH_SKIP_INSTALL=True
这非常适合“离线模式”,您不希望脚本不断从pypi检查内容。
通过WebUI安装后,建议设置上述标志并重新启动整个Stable-diffusion-webui,而不仅仅是重新加载它。
以上主要是安装过程的讲解,我们主要使用B站大佬的整合包,所以略读一下即可。
Dreambooth 视频教程
这个视频介绍了从头开始到高级水平使用 Web UI和DreamBooth扩展进行稳定扩散训练的教程。
内容涵盖了如何安装和更新Web UI的扩展,使用DreamBooth进行训练,准备训练数据集,检查点保存,如何处理过度训练,生成图像,以及如何使用AI进行图像升级等。此外,还介绍了如何在Google Colab中使用训练模型,进行微调和混合训练,以及如何解决内存不足错误等问题。
这个视频介绍了如何将训练好的模型注入到自定义的 Stable Diffusion 模型中,和什么是主模型、次要模型和第三方模型,如何为新注入的主题模型选择合适的提示强度和CFG值等细节教程。
这个视频主要介绍了如何降级CUDA和xformers版本以进行合适的训练,以及如何在仅具备8GB GPU的情况下进行LoRA训练。
这个视频介绍DreamBooth技术的最佳训练设置和参数,并且举了使用0-100张不同张数训练集进行训练的案例,提供了对应的xyz轴对比图。还有文本引导视图合成、属性修改和配饰添加等内容。
这个视频也是介绍各种设置和优化器的比较的,通过对比各实验的x/y/z网格图像来确定最佳训练模型。
这个视频主要是讲如何升级到Torch版本2(PyTorch 2),以实现显著的图像生成和训练速度提升。
视频教程这部分提供的视频很详细,我觉得讲解参数设置对比的视频比较重要,毕竟跑通流程并不难,能掌控参数训练出自己想要的模型才比较难,后续也会继续学习分享视频教程的笔记。Usage 使用方法 Create a Model 创建一个模型1.进入Dreambooth选项卡。
2.在“创建模型”子选项卡下,输入一个新的模型名称,并选择要从哪个源检查点进行训练。如果您想使用HF Hub中的模型,请指定模型URL和令牌。URL格式应为 'runwayml/stable-diffusion-v1-5'
源检查点将被提取到models\dreambooth\模型名\working。
点击“创建”。这需要一两分钟的时间,但完成后,界面会提示您已经设置了一个新的模型目录。
这里是创建模型的过程,需要先选择一个基础模型,创建我们训练的基础文件,搭配上了我的界面截图对照。
Various Top Buttons 各种顶部按钮
Save Params 保存参数 - 保存当前模型的当前训练参数。
Load Params 加载参数 - 从当前选定的模型加载训练参数。可以使用此功能将参数从一个模型复制到另一个模型。
Generate Ckpt 生成检查点 - 从当前保存的权重生成一个当前版本的检查点。
Generate Samples 生成样本* - 在训练过程中点击此按钮,在下一个间隔之前生成样本。
Cancel 取消 - 在当前步骤后取消训练。
Train 训练 - 开始训练
这里对应的是顶部的按钮,跟我的界面有点小区别,但是不大,不影响使用。
Model Section 模型部分
Model 模型 - 要使用的模型。在更改模型时,训练参数不会自动加载到用户界面。
Lora Model Lora模型 - 如果恢复训练,需要加载现有的lora检查点,或者在生成检查点时将其与基础模型合并。
Half Model 半模型 - 启用此选项以使用半精度保存模型。这将生成一个较小的检查点,而图像输出的差异几乎可以忽略不计。
Save Checkpoint to Subdirectory -将检查点保存到子目录 - 使用模型名称将检查点保存到子目录中。
这个部分不是分布在同一个面板,保存功能在Saving标签下的面板里,开始训练只需要选择好模型就可以了,性能压力大的朋友可以勾选Half Model 半模型,Save Checkpoint to Subdirectory -将检查点保存到子目录 建议勾选,更方便文件管理。
Training Parameters训练参数
Performance Wizard (WIP) 性能向导(WIP) - 根据您的GPU的显存量和实例图像的数量尝试设置最佳训练参数。
可能不是完美的,但至少是一个很好的起点。
点击这个按钮可以自动设置一组参数,作为训练的起点,比如显存大的4090电脑的Batch Size 就会被设置为3,如果你不知道该怎么开始更好的话,从系统建议开始也是个不错的选择。
**Intervals 间隔**
本节包含训练过程中事物发生的相关参数。
Training Steps Per Image (Epochs) 训练集的训练轮数
Training Steps Per Image (Epochs) 训练集的训练轮数 (Epochs) - 顾名思义,一个epoch是对整个实例图像集进行一轮训练。因此,如果我们想要将训练集训练100轮,我们可以将该值设置为100,然后就可以开始了。
在这里我先说这个参数是什么,再说调节这个参数会有什么影响,应该采用怎样的调节策略。最后详细解释具体细节:
是什么
是训练多少轮我们的训练集,可以设想一个厨师在学习制作新菜品。每次尝试制作这道菜(一个 Epoch)都会带来新的经验和教训。随着 Epoch 数的增加,厨师会更熟练地掌握这道菜的制作技巧。
调节影响
"Training Steps Per Image (Epochs)" 值越小,训练时间越短,模型越可能欠拟合,还没学够。
"Training Steps Per Image (Epochs)" 值越大,训练时间越长,模型越可能过拟合,学的太多素材把其他东西都忘光了。
"Training Steps Per Image (Epochs)" 值对显存无明显影响,因为是分步训练的。
调节策略
目前我的理解是设置一个较大的Epoch数,将模型训练到过拟合的地步,然后再去之前的检查点里找表现比较好的平衡点,比较方便。
在 CycleGAN 的论文中,作者通过多个 Epoch 训练模型,并对比了不同 Epoch 下生成的图像质量。结果表明,随着 Epoch 次数的增加,生成图像的 质量逐渐提高。但是,当 Epoch 次数超过一定阈值时,生成图像的质量可能不再显著改善,甚至可能出现退化现象,这表明合适的 Epoch 次数对于生成高质量的图像至关重要。 原文链接:https://arxiv.org/abs/1703.10593
具体细节
训练的总步数由轮数 (Epochs) * 实例集图像数得出, 实例集图像多,比如100张,那这一轮就是100次训练,3轮总共300次。实例集图像少,比如9张,那这一轮就是9次训练,3轮总共27次。
先举一个简单例子来理解一下:
假设我们有一个训练集,其中包含 4 张图片:A、B、C 和 D。如果我们将 "Training Steps Per Image (Epochs)" 设置为 3,那么在训练期间,每张图片将被用来训练 3 次,一共三轮,总共12次。
在这种情况下,训练过程将按以下顺序进行
使用图片 A 训练一次使用图片 B 训练一次使用图片 C 训练一次使用图片 D 训练一次使用图片 B 训练一次(第二轮)更换图片顺序使用图片 A 训练一次(第二轮)使用图片 D 训练一次(第二轮)使用图片 C 训练一次(第二轮)使用图片 D 训练一次(第三轮)更换图片顺序使用图片 B 训练一次(第三轮)使用图片 A 训练一次(第三轮)使用图片 C 训练一次(第三轮)
完成这个过程后,每张图片都被用来训练了 3 次,总共进行了 12 次训练。通过增加 "Training Steps Per Image (Epochs)" 的值,选择合适的 Epoch 数目很重要。太少的 Epoch 可能会导致模型欠拟合,而太多的 Epoch 可能会导致过拟合。
Save Model Frequency (Epochs) 保存模型频率
Save Model Frequency (Epochs) 保存模型频率(Epochs) - 保存检查点将按每个epoch计算,而不是按步数计算。
是什么
是保存模型的频率,决定每几轮训练我们保存一次。
调节影响
Save Model Frequency (Epochs) 值越小,训练时间越长,磁盘空间占用越多,越可能遇到相对前后步骤来说更优秀的模型。
Save Model Frequency (Epochs) 值越大,训练时间越短,磁盘空间占用越少,越容易错过对前后步骤来说更优秀的模型,极端情况下就是过程中不保存模型,训练完成才保存一次。
该怎么调节
综合自己对训练时间,和磁盘空间的预期来调整,如果训练轮数 (Epochs) 较大比如600轮,那么Save Model Frequency (Epochs) 就不能太小,否则存几十个模型可能会占据几百G空间,也会大大拖累训练速度。
具体细节
继续上面的案例:
假设我们有一个训练集,其中包含 4 张图片:A、B、C 和 D。如果我们将设置 "Training Steps Per Image (Epochs)" = 3,Save Model Frequency (Epochs) =1,那么在训练期间,每张图片将被用来训练 3 次,每个Epochs保存1次,一共保存三次。
在这种情况下,训练过程将按以下顺序进行:
使用图片 A 训练一次使用图片 B 训练一次使用图片 C 训练一次使用图片 D 训练一次已经完成一轮(Epochs),保存第一次。使用图片 B 训练一次(第二轮)更换图片顺序使用图片 A 训练一次(第二轮)使用图片 D 训练一次(第二轮)使用图片 C 训练一次(第二轮)第二轮(Epochs),保存第二次。使用图片 D 训练一次(第三轮)更换图片顺序使用图片 B 训练一次(第三轮)使用图片 A 训练一次(第三轮)使用图片 C 训练一次(第三轮)第三轮(Epochs),保存第三次。
完成这个过程后,每张图片都被用来训练了 3 次,总共进行了 12 次训练,3次保存。
下图是设置与结果的对应。
然后我们再来实验复杂一点的案例
设置训练集图片数=4, "Training Steps Per Image (Epochs)" = 100, Save Model Frequency (Epochs) =25,那么在训练期间,训练集会被训练100轮,图片集数量为4,总次数100*4=400次,每个25轮(Epochs)保存1次,一共保存4次。分别在以下节点保存
第25轮(Epoch)完成时(第100次)第50个轮(Epoch)完成时(第200次)第75个轮(Epoch)完成时(第300次)第100个轮(Epoch)完成时(第400次)
然后是更复杂的案例
设置训练集图片数=9, "Training Steps Per Image (Epochs)" = 600, Save Model Frequency (Epochs) =25,那么在训练期间,每张图片将被用来训练600 次,一共5400次,每个25Epochs,也就是25*9=225步,保存1次,一共保存24次。
第25轮(Epoch)完成时(第225次)第50轮(Epoch)完成时(第450次)......第575轮(Epoch)完成时(第5175次)第600轮(Epoch)完成时(第5400次)
** Save Model Preview (Epochs) 保存预览图频率(Epochs)**
Save Model Frequency (Epochs) 保存预览图频率(Epochs) - 保存检查点将按每个epoch计算,而不是按步数计算。