很多同学都想要自己的专属AI模型,但是大模型的训练比较费时费力,不太适合普通用户玩。AI开发者们也意识到了这个问题,所以就产生了微调模型,LoRA就是其中的一种。在AI绘画领域,只需要少量的一些图片,就可以训练出一个专属风格的LoRA模型,比如某人的脸、某个姿势、某种画风、某种物体,等等。
训练模型经常被大家戏称为“炼丹”,这个词既给我们带来了美好的期待,也体现了模型创作过程的不易。如同炼丹需要精心呵护,AI模型的训练也需要耐心和细致。然而,即使付出了辛勤的努力,最终的结果也未必能如人意。这是大家需要做好的心理准备。
LoRA的原理网上已经有很多介绍,我就不说了。本文专门介绍在云环境怎么训练LoRA模型,所谓云环境就是租用云服务器,而不是在本地电脑上,这特别适合想一展身手但是手里又没有一块好显卡的同学。
这里的云环境选择我经常使用的AutoDL:https://www.autodl.com , 关于AutoDL的使用方法,本文只围绕训练LoRA模型做一些简单的介绍,想了解更多的同学请看我写的另一篇文章:手把手教你在云环境部署 Stable Diffusion WebUI 。
本文将使用 kohya_ss 这个开源项目来训练LoRA模型, 下面正式开始。
AutoDL上需要先充值然后才能租用服务器,可以先来2块钱的,以便完成本次训练。
简单说下,计费方式选择“按量计费”,地区选择“内蒙A区”,GPU型号选择“RTX A5000”,GPU数量选择“1”,然后选择1个有空闲GPU的主机。
镜像这里选择“社区镜像”,输入“yinghuoai-kohya”,在弹出的菜单中选择我发布的这个镜像。
然后点击“立即创建”就可以了。
在 AutoDL 控制台等待服务器实例开机,开机成功后,在快捷工具这里可以看到一些操作项,点击其中的“JupyterLab”。
在 JupyterLab 中点击笔记本上方的双箭头按钮,它会进行一些初始化操作,并启动 kohya_ss,待看到“Running on local URL”的提示后,就说明启动成功了。
然后回到 AutoDL 控制台,点击快捷工具中的“自定义服务”,即可启动 kohya_ss 的Web界面。
为了有效的管理模型训练,我在镜像中创建了几个目录,可以通过“JupyterLab”查看,它们都在 /root/autodl-tmp 下边,autodl-tmp 挂载的是 AutoDL 的数据盘,可以节省宝贵的系统盘空间。
实际效果如下图所示:
我在镜像中内置了一份训练数据和训练配置,可以让大家快速体验 Lora 炼丹。
通过 AutoDL 的自定义服务启动页面后,依次点击“LoRA”->“Training”。
训练的进度需要去 JupterLab 中查看,大约需要8分钟,当看到 steps 显示 100%的时候就说明训练完成了,模型已经保存到目录:/root/autodl-tmp/train/dudu/model
训练过程中会生成几张采样图片,保存在 /root/autodl-tmp/train/dudu/model/sample ,可以打开看看训练的效果:
为了实际体验,需要把模型文件先下载到本地,然后再上传到 Stable Diffusion WebUI,使用文生图生成图片,参考参数:
注意:如果你要重新训练这个项目,需要先删除 model 目录下的内容,然后再重新开始训练。
快速体验只能让大家简要领略炼丹的魅力。然而,要炼就一颗完美的丹药,还需备足图片素材、洞悉工具参数设置,以及不断测试优化模型。接下来,我将为大家详细解析如何步步为营,精心打造你的LoRA模型。
主要就是准备好要训练的图片,以及为图片生成提示词。然后才能把它们送进丹炉进行炼制。
训练LoRA模型到底需要几张图片?我没找到具体要求,建议至少10张以上,并且要求图片清晰有质感,如果是针对某种个体的,拍摄目标的角度要多样,这样才可能训练出比较好的模型。
如果你手头没有合适的图片,可以自己拍摄,也可以去百度图片等图片网站找高清大图。
网上的教程大多是训练美女脸的,估计大家也都看烦了,所以我选择了一个狗子的图片进行训练,它的名字叫dudu,样子大概是下图这样的。我准备的图片数量有20张,已经内置到我发布的 AutoDL 镜像中。
图片需要处理成一样的尺寸,尺寸可以是 512*512、512*768,512*640,都是64的倍数。显存低的可以用 512,显存高的可以用 768。这里给大家分享一个裁切图片的网站:https://www.birme.net/ ,操作方式如下图所示:
注意 RENAME 可以让输出的图片名称更加有序,方便训练程序使用,xxx 代表三位数字,下边的 starting number 代表从哪个数字开始排序。
图片处理成功后,需要放到特定的目录中。
我们先在 /root/autodl-tmp/train 下创建一个项目目录,我这里就用狗子的名字:dudu,然后在这个目录下再创建一个 img 目录,用于放置处理好的图片,不过图片还不能直接放到 img 下,还需要创建一个子目录:100_dudu,这个目录的名字是有讲究的,前边的100代表每张图片需要学习100次,后边的 dudu 就是图片的主题名字。
这里的学习次数没有固定的标准,真实图片建议50-100,二次元15-30。如果最终训练出的模型出现过拟合的问题,比如生图提示词写了蓝眼睛但是生成的都是黑眼睛,可以降低下学习次数试试。
把裁切好的图片上传到 /root/autodl-tmp/train/dudu/img/100_dudu 这个目录,如下图所示:
所谓打标就是给图片编写提示词,一般先使用提示词反推工具生成提示词,然后再根据实际情况修改生成的提示词。
启动 kohya_ss 后,进入打开的 Web 页面,依次进入“Utilities”->“Captioning”->"BLIP Captioning"。
“Image folder to caption”中输入待打标的图片目录,我这里就是:/root/autodl-tmp/train/dudu/img/100_dudu。
“Caption file extension”是生成的提示词文件的后缀名。
“Prefix to add to BLIP caption”是添加到生成提示词中的固定前缀,训练中如果使用了这些前缀,生成图片时就可以使用这些前缀比较方便的触发Lora模型,但是根据经验也不能保证一定触发。后边还有一个参数“Postfix to add BLIP caption”,这个是固定后缀。前缀在处理图片时的优先级更高一些。
其它参数都用默认就好了,有兴趣的可以研究下,我这里就不展开了。
最后点击“Caption images”。
注意这个工具的页面中都没有进度跟踪,需要到 shell 或者控制台界面查看,看到 100% 的进度条,以及“captioning done”的提示就说明打标完成了。
此时我们进入待训练的图片目录,就可以看到这些打标文件了。可以看到,每张图片都生成了对应的打标文件。
我们可以双击打开这些 txt 文件,查看其中的内容;如果感觉写的不好,可以修改它。
生成的提示词一般多多少都会有些问题。
修改提示词是个大工程,这里为了尽快演示,就不修改提示词了。
另外在这个工具中,我们可以看到,除了 BLIP,还有三个给图片打标的方法,不过我都没有跑成功,有兴趣的可以一起研究下。
如果你不使用 kohya_ss 自带的打标工具,也是完全可以的,比如 SD WebUI 的“训练”功能中也可以裁切图片并反推提示词,只是需要手动上传打标文件到这里的训练目录中。这里再推荐一个提示词编辑工具:https://github.com/starik222/BooruDatasetTagManager,有兴趣的可以去试试。
训练模型的参数很多,还会涉及到深度学习的一些概念,之前没接触过的同学可能会感觉头疼,不过没关系,我会尽量把主要的参数说清楚。
kohya_ss 启动后,依次进入“LoRA”->“Training”。
设置训练使用的 Stable Diffusion 大模型,“Model Quic Pick”这里可以选择一些 SD 的基础大模型,训练的时候会先去 HuggingFace 下载,不过我实际测试跑不同,所以这里选择 custom,然后自己上传一个模型,因为训练图片是真实世界的狗子,所以这里使用了realisticVisionV51(使用AutoDL镜像的同学不用再上传,已经内置了),这是一个真实视觉模型。
设置训练模型时的输入输出目录。
进入到真正的参数设置环节了,前边只是些开胃小菜。
先来看基本参数(Basic):
这一行都是有关学习率的参数设置,也就是怎么让模型收敛的又快又好,都是一些算法,先用我这里默认的吧,不好使再换。
高级参数(Advanced)中我们看下这几个:
最后还有个采样参数(Samples),使用它可以跟踪训练效果:
Sample every n steps:每学习N步,生成一张图片。
Sample every n epochs:每学习N轮,生成一张图片,实测开启这个会覆盖 Sample every n steps。
Sample sampler:采样器,和SD WebUI中默认的采样器相同。
Sample prompts:采样提示词,这里包括了提示词、反向提示词、图片尺寸、采样步数等。
点击“Start Training”之后,还是到控制台中查看处理进度。
因为每张图片学习100步,同时训练的数量是1,所以25张图片训练一次就要学习2500步,同时指定了轮次是3,所以总计是7500步。
训练完成后,可以看到 100% 的提示,模型已经保存到相应的目录。
模型训练好了,怎么知道好不好使呢?那当然要做测试时,实际抽抽卡。
笨点的办法就是挨个测试,测试不同权重、提示词、大模型等情况下的表现。
这里分享一个快速对比测试的方法,使用 X/Y/Z图表。
在提示词中增加变量,如下图所示的样子引用Lora模型:
注意这里的:<lora:dudu_log-NUM:WEIGHT> ,NUM和WEIGHT是两个变量。
X/Y/Z图表在文生图、图生图页面的最下方:
脚本类型选择:X/Y/Z图表:
X轴类型选择:Prompt S/R,X轴值填写:NUM,000001,000002
Y轴类型选择:Prompt S/R,Y轴值填写:WEIGHT,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1
空格边距填写:2,生成的图片之间做个分割。
然后我们去生成图片,生成图表如下:
然后我们就可以对比不同模型、权重下的出图效果,我这里模型 000002 更接近真实图片,权重 0.5-0.9 效果会比较好,1.0就有点过拟合了。
X/Y/Z图表中还有很多的维度可以测试,比如大模型、迭代步数、采样器、提示词引导系统等等,有兴趣的可以多去尝试下。
仅分享我的一点经验和体会。上面也提到了一些,这里做个总结。
本文使用的模型、插件,生成的图片,都已经上传到了我整理的SD绘画资源中,后续也会持续更新,如有需要,请关注公众号:萤火遛AI(yinghuo6ai),发消息:SD,即可获取下载地址。
以上就是本文的主要内容,如有问题欢迎留言讨论。