当前位置:首页|资讯|LoRA|Stable Diffusion

如何从零开始训练专属 LoRA 模型

作者:有趣的AI绘画实验室发布时间:2023-05-31

上篇文章我分享了 47 个高质量的 Stable Diffusion 模型,这些模型都是别人训练好的,使用起来非常方便。但是如果我们要生成特定人物、物品或画风,别人的这些模型就满足不了了,这时候就需要通过训练自己的专属模型来实现。


目前 Stable Diffusion 主要有四种模型训练方法:Dreambooth、LoRA、Textual Inversion、Hypernetwork。本文主要介绍如何训练 LoRA 模型,LoRA 是一种轻量化的模型微调训练方法,是在原有大模型的基础上,对模型进行微调,从而能够生成特定的人物、物品或画风。该方法具有训练速度快,模型大小适中,训练配置要求低的特点,能用少量的图片训练出想要的风格效果。

LoRA 模型训练主要分为四步:

● 训练数据集准备

● 训练环境参数配置

● 模型训练

● 模型测试


一、训练数据集准备

这个过程主要做三件事:

● 训练素材处理

● 图像预处理

● 打标优化


1.  训练素材处理

首先确定你的训练主题,比如某个人物、某种物品、某种画风等。以下我就以训练这种大手大脚的画风主题为例进行讲解。

确定好画风后,就需要准备用于训练的素材图片,素材图的质量直接决定了模型的质量,好的训练集有以下要求:

● 不少于 15 张的高质量图片,一般可以准备 20-50 张图;

● 图片主体内容清晰可辨、特征明显,图片构图简单,避免其它杂乱元素;

● 如果是人物照,尽可能以脸部特写为主(多角度、多表情),再放几张全身像(不同姿势、不同服装);

● 减少重复或相似度高的图片。


素材图准备完毕后,需要对图片做进一步处理:

● 对于低像素的素材图,可以用 Stable Diffusion 的 Extra 功能进行高清处理;

● 统一素材图分辨率,注意分辨率为 64 的倍数,显存低的可裁切为 512x512,显存高的可裁切为 768x768,可以通过 birme 网站进行批量裁切。


2.  图像预处理

这一步的关键是对训练素材进行打标签,从而辅助 AI 学习。这里介绍两种打标签的方法:

方法一:把训练素材文件夹路径填写到 Stable Diffusion 训练模块中的图像预处理功能,勾选生成 DeepBooru,进行 tags 打标签。

方法二:安装 tagger 标签器插件,进行 tags 打标签。https://github.com/toriato/stable-diffusion-webui-wd14-tagger

选择批量处理, 输入目录填写处理好的图片目录,设置标签文件输出目录,阈值设置为 0.3(生成尽可能多的标签来描述图片内容),开始打标签。


3.  打标优化

预处理生成 tags 打标文件后,就需要对文件中的标签再进行优化,一般有两种优化方法:

方法一:保留全部标签

就是对这些标签不做删标处理, 直接用于训练。一般在训练画风,或想省事快速训练人物模型时使用。

优点:不用处理 tags 省时省力,过拟合的出现情况低。

缺点:风格变化大,需要输入大量 tag 来调用、训练时需要把 epoch 训练轮次调高,导致训练时间变长。

方法二:删除部分特征标签

比如训练某个特定角色,要保留蓝眼睛作为其自带特征,那么就要将 blue eyes 标签删除,以防止将基础模型中的 blue eyes 引导到训练的 LoRA 上。简单来说删除标签即将特征与 LoRA 做绑定,保留的话画面可调范围就大。

一般需要删掉的标签:如人物特征 long hair,blue eyes 这类。

不需要删掉的标签:如人物动作 stand,run 这类,人物表情 smile,open mouth 这类,背景 simple background,white background 这类,画幅位置等 full body,upper body,close up 这类。

优点:调用方便,更精准还原特征。

缺点:容易导致过拟合,泛化性降低。


什么是过拟合:过拟合会导致画面细节丢失、画面模糊、画面发灰、边缘不齐、无法做出指定动作、在一些大模型上表现不佳等情况。

批量打标:有时要优化等标签会比较多,可以尝试使用批量打标工具 BooruDatasetTagManagerhttps://github.com/starik222/BooruDatasetTagManager


二、训练环境参数配置

训练数据集准备完毕后,开始训练环境配置。一般有本地和云端两种训练环境:

● 本地训练:要求 N 卡,推荐 RTX 30 系列及以上显卡,训练环境可以用秋叶大佬的一键训练包,或者安装 Stable Diffusion WebUI 的训练插件。 https://github.com/liasece/sd-webui-train-tools

● 云端训练:如在 AutoDL、Google Colab 等云平台上训练,推荐 kohya-ss 训练脚本。云端训练的好处在于不占用本机资源,训练的同时还可以干其他事。


以下我以云端训练为例,介绍如何使用 Google Colab 进行云端训练环境配置。


1.  训练环境配置

这里推荐使用基于 kohya-ss 的训练脚本,例如:https://colab.research.google.com/github/WSH032/kohya-config-webui/blob/main/kohya_train_webui.ipynb

进入 Colab 后,点击连接。

① 建立训练文件夹

连接成功后,展开(一)环境配置:

● 运行初始化常量与挂载谷歌硬盘。

● 成功挂载谷歌硬盘后,在 content - drive 目录下建一个 Lora 训练文件夹,在训练文件夹中建立 input 文件夹用于放置输入数据集,建立 output 文件夹用于放置输出的训练模型。

● input 文件夹内建一个训练数据集文件夹,注意该文件夹的命名有格式要求:Repeat值_主题名,这里 Repeat 值的含义代表每张素材图的训练步数。越精细的图,Repeat 值也越高,一般二次元可以 15-30,三次元可以 50-100。

② 运行克隆 github的库、安装依赖

③ 设置训练用底模型

● modelName:可以选择环境中已经提供的模型 如 Stable-Diffusion-v1-5.safetensors。

● base_model_url:也可以选择自定义模型,在 huggingface 上搜到想要模型的地址,复制过来。


2.  训练参数配置

展开(二)训练参数,运行启动 WebUI 来设置参数,出现 https://localhost:xxxxx/ 链接后点击打开训练参数配置界面。

先点击读取,完成默认参数配置,再进行基础参数和采样参数设置。

① 基础参数设置

基础设置

● train_data_dir:训练集输入目录,把之前建立的数据集文件夹路径复制过来,如/content/drive/MyDrive/Lora/input 。

● 底模:填入底模文件夹地址 /content/Lora/sd_model/,刷新加载底模。

● resolution:训练分辨率,支持非正方形,但必须是 64 倍数。一般方图 512x512、768x768,长图 512x768。

● batch_size:一次性送入训练模型的样本数,显存小推荐 1,12G 以上可以 2-6,并行数量越大,训练速度越快。

● max_train_epoches:最大训练的 epoch 数,即模型会在整个训练数据集上循环训练的次数。如最大训练 epoch 为 10,那么训练过程中将会进行 10 次完整的训练集循环,一般可以设为 5-10。

● network_dim:线性 dim,代表模型大小,数值越大模型越精细,常用 4~128,如果设置为 128,则 LoRA 模型大小为 144M。

● network_alpha:线性  alpha,一般设置为比 Network Dim 小或者相同,通常将 network dim 设置为 128,network alpha 设置为 64。


输出设置

● 模型输出地址:模型输出目录,把之前建立的训练输出文件夹路径复制过来,如/content/drive/MyDrive/Lora/output

● 输出模型名称:可以填模型主题名,如 bighand

● 保存模型格式:模型保存格式,默认 safetensors


学习率设置

● unet_lr:unet 学习率,默认值为 0.0001

 text_encoder_lr:文本编码器的学习率,一般为 unet 学习率的十分之一 0.00001

 lr_scheduler:学习率调度器,用来控制模型学习率的变化方式,一般默认。

● lr_warmup_steps:升温步数,仅在学习率调度策略为“constant_with_warmup”时设置,用来控制模型在训练前逐渐增加学习率的步数,一般不动。

● lr_restart_cycles:退火重启次数,仅在学习率调度策略为“cosine_with_restarts”时设置,用来控制余弦退火的重启次数,一般不动。


② 采样参数设置

Sample every n epochs:每 N 轮采样一次,一般设置为 1。

Sample every n steps:比如设置为 100,则代表每训练 100 步采样一次。 

Sample prompt:采样提示词,设置之后,LoRA 训练的同时会每隔设定的步数或轮次,生成一副图片,以此来直观观察 LoRA 训练的进展。


完成训练参数设置后,点击全部参数确认、生成 toml 参数与采样配置文件,并保存配置文件。


三、模型训练

训练参数配置保存完成后,点击开始训练。

这里的 steps 代表总训练步数。一般总训练步数不低于 1500,不高于 5000。

总训练步数=(Image图片数量 x Repeat每张图片训练步数 x Epoch训练轮次)/ batch_size并行数量。

训练完成后,模型文件会保存到设置的输出目录。比如 epoch 训练轮次设置了 5,就会得到 5 个训练好的 LoRA 模型。


四、模型测试

模型训练完成后,要对训练好的这些模型进行测试,以找出最适合的那个模型(哪个模型在哪个权重值下表现最佳)。

① 把训练好的 LoRA 模型全部放入 LoRA 模型目录 stable-diffusion-webui/models/Lora。

② 打开 Stable Diffusion WebUI,在 Stable Diffusion 模型里先加载个模型训练时的底模,LoRA 模型里加载一个刚才训练好的 LoRA 模型,如 000001 模型,填上一些必要的提示词和参数。

划重点:把引入的 LoRA 模型提示词,改成变量模式,如: 改成 ,NUM 变量代表模型序号,STRENGTH 变量代表权重值。

③ 在 Stable Diffusion WebUI 页面最底部的脚本栏中调用 XYZ plot 脚本,设置模型对比参数。

划重点:其中 X 轴类型和 Y 轴类型都选择「提示词搜索/替换」Prompt S/R。

X 轴值输入:NUM,000001,000002,000003,000004,000005,对应模型序号

Y 轴值输入:STRENGTH,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1,对应模型权重值

这样就形成了一张模型测试对比表。

设置完毕后,点击「生成」,开始生成模型测试对比图。

通过对比生成结果,选出表现最佳的模型和权重值。

把选出的 LoRA 训练模型做一个规范化命名,比如 bighand_lora_v1,重新刷新 LoRA 模型列表就能加载使用啦。在实际应用中,我们可以结合 ControlNet 来使用,以提升可控性。

最后总结下 LoRA 模型训练的要点:

● 训练数据集准备(训练素材处理、图像预处理、打标优化)

● 训练环境参数配置(本地或云端训练环境、训练环境配置、训练参数配置)

● 模型训练(基于 kohya-ss 训练模型)

● 模型测试(通过 XYZ plot 测试模型)


加入「AI 绘画实验室」,共同探讨学习 AIGC 知识,无障碍使用 Stable Diffusion 服务:https://t.zsxq.com/0eApYMVCX



Copyright © 2024 aigcdaily.cn  北京智识时代科技有限公司  版权所有  京ICP备2023006237号-1