Stable Diffusion Lora模型训练具体教程

[复制链接]
发表于 2024-11-5 15:53:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
1. 介绍

通过Lora小模型可以控制很多特定场景的内容生成。
但是那些模型是别人训练好的,你肯定很好奇,我也想训练一个自己的专属模型(也叫炼丹~_~)。
乃至可以训练一个专属家庭版的模型(family model),非常有意思。
将自己的训练好的Lora模型放到stableDiffusion lora 目次中,同时配上美丽的封面图。

2. 模型训练步调

2.1 训练环境搭建



  • WebUI大概Diffuser
    https://github.com/AUTOMATIC1111/stable-diffusion-webui
  • Lora训练环境
    https://github.com/kohya-ss/sd-scripts
2.2 数据准备

从网上爬取一些想要的脚色图片,大概直接去截图。
这次我做的早春,找一些图片就行了,不需要很多,20张就可以,各个角度,满身,大头只管都有些。
脚色是这样子的,头上一定得有花,这个是脚色属性。

这些是我找的图:

2.3 数据清洗打标

得到数据后,第一步就是清洗,所谓清洗主要是把爬的垃圾数据删了,并且该抠图的抠图(脚色的Lora着实不扣也不太影响,真人是尽力抠图,功能性的lora基本上是要手动p图的)。
这里我给各人一个抠图脚本,用的阿里云API,非常方便:
  1. 链接:https://pan.baidu.com/s/1PdF2ocgqOBtRmQqtmij6RA?pwd=bjf4
  2. 提取码:bjf4
复制代码
总之清楚后数据就是干净的,最好是扣过的图,只有人物主体。
然后我们就要打标了,如果是真人大概风格类lora,可以学youtube里那些人做法,直接用BLIP做image caption,然后手动修改一些。但是二次元强烈发起直接上deepbooru,这是由于二次元SD的base model源头是NovelAI泄露的,而其时的模型就是这个风格的标签,以是二次元特别得当用booru风格的形貌。具体操作如下:
首先打开SD webui,找到如下地方:

至于说分辨率,着实512就可以了,可以调大一些,如果你显存够大,我用3090发现基本上拉到1024分辨率后就没有收益了,而低于512显着结果欠好。理论上图片分辨率高一些好,此外图片质量解析力也应该高。
打完勾后,就可以process了。

当程序主动走完流程我们就在目的文件夹里得到一组由image和text文件组成的对:

此中txt文件里就是对一幅图的形貌,如下:
  1. 1girl, blurry, solo, depth_of_field, hairband, blurry_background, building, torii
复制代码
然后就进行最重要的步调,打标。
所谓打标就是监视学习,告诉SD我们要它学什么。这里我们就是想学一个脚色,这个脚色有很多特征,好比她头上有花花,短发,眼睛样子等。
因此我们要把这些脚色特征的形貌词,从txt文件中的形貌中删除。
。。。。。。
然后我们再加入一个特定的脚色名,用来表示这个脚色。让这个脚色名学到刚才我们删除的特征。
换句话说,如果我们不删除那些特征,模型是不会把这些特征学给这个脚色名的,而是专门学给具体的形貌词。好比如果我们留下来头上的花,那么头上有花这个概念就不会学给早春这个脚色名。当我们生成图像时间,早春这个词是不会生成头上有花的女孩,但是早春必须头上有花!以是我们要干掉这个词,这样模型就认为早春头上一定有花。
着实就很简单,控制变量法,我们留下来的标签就是我们想让模型学习的。
但是编辑这玩意如果一个一个文件走会很烦,我这里有个简单的步调:
首先下载一个webui的插件“
stable-diffusion-webui-dataset-tag-editor-main
(请去Github搜,然后放进Webui的Extensions目次下),然后我们可以进行批量编辑了:


这就是可以批量编辑的地方,我们进行批量remove,即批量删除我们不想要的特征词:

这些词我认为都是早春特征,以是我都打勾删除,记得删除后保存下。
等到这些删除完了后,我们在每句形貌前面都加上uiharu_kazari,这个是早春的触发词。一旦我们在prompts写上这个词,早春就会出现!我认为很重要,固然有人说可以不加,着实我训练几十个lora很多方案都试过,现在我感觉也是可加可不加的,但是我喜欢加上,内里原因很难直接说,就是加上后出图结果会好一些。但是不一定,有时间会变差,我说的这个方案着实是有些晋级的了,新人发起全都不删除tags,标签出来直接都拿去train,最简单稳定。
为什么放在第一位,实际上tags是有顺序的,一般最开始的tags的权重最大,越靠后越小,以是我们要把我们最想学的这个人放在第一位,像是没有意义的概念,好比透明背景我们只管往后放。
此外我们需要看每张图的形貌,有一些形貌是含有显着错误的,由于毕竟是打标器,很多都是错的。我们一定要删除错误的标签,这些错误是会显着影响我们训练结果的(固然图多时间着实不影响了,但是话又说回来,图片质量>图片数量,风格、功能性Lora>真人>二次元,二次元是最简单的lora)。
2.4 训练

我们开始写一个训练脚本参数。
首先是Base Model概念,这个应该是最重要概念之一,就是我们是在什么模型基础上训练的。
好比我们训练真人,女性,社区目前首选Chilloutmix系列。如果是汽车之类的物体,首选可以是SD1.5 2.1等官方模型。如果是二次元,我们这次首选NovelAI系列的模型,我这里选的Acertain,由于它画风比力质朴,靠近动漫结果,我感觉用来训练比力好。
我这次直接把脚本参数都列出来了:
  1. # LoRA train script by @Akegarasu
  2. # Train data path | 设置训练用模型、图片
  3. $pretrained_model="D:\workspace\stable-diffusion-webui\models\Stable-diffusion\ACertainModel.ckpt" # base model path | 底模路径
  4. $train_data_dir="C:\Users\NUOSEN\Desktop\data\lora\Kazari
  5. "
  6. $reg_data_dir = "" # directory for regularization images | 正则化数据集路径,默认不使用正则化图像。
  7. # Train related params | 训练相关参数
  8. $resolution = "768,768" # image resolution w,h. 图片分辨率,宽,高。支持非正方形,但必须是 64 倍数。
  9. $batch_size = 2 # batch size
  10. $max_train_epoches = 10 # max train epoches | 最大训练 epoch
  11. $save_every_n_epochs = 1 # save every n epochs | 每 N 个 epoch 保存一次
  12. $network_dim = 64 # network dim | 常用 4~128,不是越大越好
  13. $network_alpha = 32 # network alpha | 常用与 network_dim 相同的值或者采用较小的值,如 network_dim的一半 防止下溢。默认值为 1,使用较小的 alpha 需要提升学习率。
  14. $clip_skip = 2 # clip skip | 玄学 一般用 2
  15. $train_unet_only = 0 # train U-Net only | 仅训练 U-Net,开启这个会牺牲效果大幅减少显存使用。6G显存可以开启
  16. $train_text_encoder_only = 0 # train Text Encoder only | 仅训练 文本编码器
  17. # Learning rate | 学习率
  18. $lr = "5e-5"
  19. $unet_lr = "5e-5"
  20. $text_encoder_lr = "6e-6"
  21. $lr_scheduler = "cosine_with_restarts" # "linear", "cosine", "cosine_with_restarts", "polynomial", "constant", "constant_with_warmup"
  22. $lr_warmup_steps = 50 # warmup steps | 仅在 lr_scheduler 为 constant_with_warmup 时需要填写这个值
  23. $lr_restart_cycles = 1 # cosine_with_restarts restart cycles | 余弦退火重启次数,仅在 lr_scheduler 为 cosine_with_restarts 时起效。
  24. # Output settings | 输出设置
  25. $output_name = "Kazari_v1" # output model name | 模型保存名称
  26. $save_model_as = "safetensors" # model save ext | 模型保存格式 ckpt, pt, safetensors
  27. # 其他设置
  28. $network_weights = "" # pretrained weights for LoRA network | 若需要从已有的 LoRA 模型上继续训练,请填写 LoRA 模型路径。
  29. # $network_weights = "D:\workspace\stable-diffusion-webui\models\Lora\koreanDollLikeness_v10.safetensors" # pretrained weights for LoRA network | 若需要从已有的 LoRA 模型上继续训练,请填写 LoRA 模型路径。
  30. $min_bucket_reso = 256 # arb min resolution | arb 最小分辨率
  31. $max_bucket_reso = 1024 # arb max resolution | arb 最大分辨率
  32. $persistent_data_loader_workers = 0 # persistent dataloader workers | 容易爆内存,保留加载训练集的worker,减少每个 epoch 之间的停顿
  33. # 优化器设置
  34. $use_8bit_adam = 0 # use 8bit adam optimizer | 使用 8bit adam 优化器节省显存,默认启用。部分 10 系老显卡无法使用,修改为 0 禁用。
  35. $use_lion = 1 # use lion optimizer | 使用 Lion 优化器
  36. # ============= DO NOT MODIFY CONTENTS BELOW | 请勿修改下方内容 =====================
  37. # Activate python venv
  38. .\venv\Scripts\activate
  39. $Env:HF_HOME = "huggingface"
  40. $ext_args = [System.Collections.ArrayList]::new()
  41. if ($train_unet_only) {
  42.   [void]$ext_args.Add("--network_train_unet_only")
  43. }
  44. if ($train_text_encoder_only) {
  45.   [void]$ext_args.Add("--network_train_text_encoder_only")
  46. }
  47. if ($network_weights) {
  48.   [void]$ext_args.Add("--network_weights=" + $network_weights)
  49. }
  50. if ($reg_data_dir) {
  51.   [void]$ext_args.Add("--reg_data_dir=" + $reg_data_dir)
  52. }
  53. if ($use_8bit_adam) {
  54.   [void]$ext_args.Add("--use_8bit_adam")
  55. }
  56. if ($use_lion) {
  57.   [void]$ext_args.Add("--use_lion_optimizer")
  58. }
  59. if ($persistent_data_loader_workers) {
  60.   [void]$ext_args.Add("--persistent_data_loader_workers")
  61. }
  62. # run train
  63. accelerate launch --num_cpu_threads_per_process=8 "./sd-scripts/train_network.py" `
  64.   --enable_bucket `
  65.   --pretrained_model_name_or_path=$pretrained_model `
  66.   --train_data_dir=$train_data_dir `
  67.   --output_dir="./output" `
  68.   --logging_dir="./logs" `
  69.   --resolution=$resolution `
  70.   --network_module=networks.lora `
  71.   --max_train_epochs=$max_train_epoches `
  72.   --learning_rate=$lr `
  73.   --unet_lr=$unet_lr `
  74.   --text_encoder_lr=$text_encoder_lr `
  75.   --lr_scheduler=$lr_scheduler `
  76.   --lr_warmup_steps=$lr_warmup_steps `
  77.   --lr_scheduler_num_cycles=$lr_restart_cycles `
  78.   --network_dim=$network_dim `
  79.   --network_alpha=$network_alpha `
  80.   --output_name=$output_name `
  81.   --train_batch_size=$batch_size `
  82.   --save_every_n_epochs=$save_every_n_epochs `
  83.   --mixed_precision="fp16" `
  84.   --save_precision="fp16" `
  85.   --seed="1337" `
  86.   --cache_latents `
  87.   --clip_skip=$clip_skip `
  88.   --prior_loss_weight=1 `
  89.   --max_token_length=225 `
  90.   --caption_extension=".txt" `
  91.   --save_model_as=$save_model_as `
  92.   --min_bucket_reso=$min_bucket_reso `
  93.   --max_bucket_reso=$max_bucket_reso `
  94.   --xformers --shuffle_caption $ext_args
  95. Write-Output "Train finished"
  96. Read-Host | Out-Null ;
复制代码
train_data_dir是我们放图片的目次,我们把刚才处置惩罚好的图片文件夹(内里有图片和笔墨对)放在这个目次下。
我的目次结构是这样的(此中2_images就是我们处置惩罚好的图片文件夹,为什么这么命名一会讲):
  1. C:\Users\NUOSEN\Desktop\data\lora\Kazari
  2. \2_uiharu_kazari
复制代码
以是我在上面的脚本里填写的目次为
  1. C:\Users\NUOSEN\Desktop\data\lora\Kazari
复制代码
训练的时间脚本主动在Kazari目次下找图片文件夹,它判断的是[NUM]_XXX命名的文件夹就是要输入给dataloader的图片文件夹。
我们一定要按照这个规则明明我们的文件夹,NUM表示我们一个epoch要遍历几遍这个目次,即repeats,而XXX就是我们默认的触发词。
而我们还会在脚本设置max_train_epoches这个参数,这个就表示我们要训练多少个epoch。
以是训练时间优化的次数Step就是num_images X repeats X max_train_epoches / batch_size
batch_size就是一次处置惩罚几张图片,也是我们在脚本里设置的,显卡有本事就别设置1。
更重要的参数就是学习率Lr了:
$lr=“5e-5”
$unet_lr=“5e-5”
$text_encoder_lr=“6e-6”
这个我们可以先设置成这样,然后看loss函数下降了没,再进行调整。
训练图片分辨率resolution这个参数也是非常重要的,它是我们训练时间图片的分辨率,显卡有本事设置大一些比力好,发起不要低于512,会很差。
network_dim表示我们训练出来的Lora模型巨细,一般不要大于128,由于没收益,小一些的dim可以抗过拟合。
clip_skip这个参数在二次元模型里就设置2大概3,但真人模型可以考虑设置1,但是需要测试结果,一般就2。这个参数着实是CLIP这个模型结构的原因,它着实是层级概念,好比上一层是“人”,那么下一层就是“男子”“女人”,逐渐细化。而二次元这个从NovelAI起源的模型,都沿用了2这个设定。我们也设置成2。
use_lion这个我设置成1,是由于我想启用Lion这个优化器,由于测试结果发现这个优化器泛化性好一些。
save_every_n_epochs这个我设置成1,就是每个epoch都保存模型,这样最后我有10个模型了。
设置好参数我们就一键运行脚本开始训练。

训练完毕。
2.5 检测结果

训练完的lora应该看下差别epoch的结果,排除欠拟合和过拟合的模型,用最合适的模型。
我们直接用简单的prompts遍历全部的模型和weights:

能出一张xy表:

我最后选了8epoch的模型,由于我感觉它在各种环境下最稳定。
2.6 生成图片

训练好的Lora就可以出图啦。

关于AI绘画技能储备

学好 AI绘画 岂论是就业还是做副业赢利都不错,但要学会 AI绘画 还是要有一个学习规划。最后各人分享一份全套的 AI绘画 学习资料,给那些想学习 AI绘画 的小伙伴们一点资助!
感爱好的小伙伴,赠送全套AIGC学习资料和安装工具,包含AI绘画、AI人工智能等前沿科技教程,模型插件,具体看下方。
   
      一、AIGC全部方向的学习门路
AIGC全部方向的技能点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。


二、AIGC必备工具
工具都帮各人整理好了,安装就可直接上手!

三、最新AIGC学习笔记
当我学到一定基础,有自己的明确本事的时间,会去阅读一些前辈整理的书籍大概手写的笔记资料,这些笔记具体记载了他们对一些技能点的明确,这些明确是比力独到,可以学到不一样的思路。


四、AIGC视频教程合集
观看全面零基础学习视频,看视频学习是最快捷也是最有结果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

五、实战案例
纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才气将自己的所学运用到实际当中去,这时间可以搞点实战案例来学习。

   
     
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表