Stable Diffusion WebUI系列|训练模型

2024年2月13日 1072点热度 2人点赞 0条评论
本文是《Stable Diffusion WebUI系列》系列文章中的第16篇,共17篇

本章所討论的训练模型仅为自用用途,若要分享训练的模型也应遵照开源的原则分享。

为什么要训练自己的模型

训练自己的模型可以在现有模型的基础上,让AI懂得如何更景区生成/生成特定的风格、概念、角色、姿势、物件。

举例来说,如果喂给AI十几张我精挑细选的「Hara老师绘制的、不同角度、FGO的斯卡萨哈」做训练,那么就能让AI更懂得如何生成斯卡萨哈的脸部,风格也会比较固定。

以下是一个具体例子,透过使用自行训练的HyperNetwork,便改善单靠Anything模型无法生成出Hara老师画风的缺点。在不使用HyperNetwork的情况下,风格永远是左边那样;一使用HyperNetwork,右边的风格就能轻松生成出来了。

训练模型是复杂的议题,基于哪个现有模型,以及喂给AI学习的图片品质,还有训练时的参数,都会影响模型训练结果。

本文提及的Embedding、HyperNetwork、LoRA都是「小模型」,这是相对于网路动则好几GB的checkpoint「大模型」而言。这些小模型训练时间短,档案约几MB而已,训练成本不高。主要是用于生成特定人物/物件/画风,并且训练的模型可以多个混用。

如果硬件条件许可的话,汇集大量图片训练特定领域的checkpoint大模型,再上传到HuggingFace造福他人也很不错,只不过此任务过于庞大。要知道Stable Diffusion 1.5版的模型可是输入了23亿张图片训练出来的!网路上其他人训练的模型至少也准备了几万张图片。因此要生成特定的人物/物件/画风,训练小模型对一般人来说比较划算。

各个模型的原理差异请参考下图。技术原理以及训练参数设定请参阅「参考资料」一章,碍于篇幅无法一一细讲,本章以操作过程为主。

就训练时间与实用度而言,目前应是 LoRA > HyperNetwork > Embedding

本章节以AUTOMATIC1111开发的Stable Diffusion WebUI为中心撰写,因其图形化且好操作。后面简称SD WebUI。

部署方式:本机或是云端?

训练模型至少需要10GB的VRAM,也就是RTX3060等级以上的GPU。

如果你有Nvidia RTX3060以上等级的GPU,那就参考本系列安装教学将Stable Diffusion WebUI部署在本机,想训练多久就训练多久。训练资料不到50张图片的小模型训练时间约只要1~3个小时。

如果没有强力的GPU,那就用云端训练,例如 Google Colab。

准备训练资料

1. 取得高品质图片

训练用的图片最少最少要准备10张。重质不重量。因为我要训练的是单一人物且风格固定,图片不宜有复杂背景以及其他无关人物。网络图片一张一张右键下载当然可以,不过要大量下载图片的话可以使用 Imgrd Grabber或 Hydrus Network。这里我准备了33张Hara绘制的斯卡萨哈。

2. 裁切图片

下载图片后,要將训练图片裁切成512×512像素。你可以选择用SD WebUI自动裁切,或是手动裁切。

2.1. 自动裁剪

裁剪图片不会用到显示卡计算。

  1. 將要裁切的图片放到同一个目录下,例如/home/user/桌面/input
  2. 开启SD WebUI,进到Train → Preprocess images页面
  3. 第一个栏位Source directory填写原始图片的路径
  4. 第二个栏位Destination directory填写输出路径,例如/home/user/桌面/cropped
  5. Width和Height设定为512×512
  6. 点选Preprocess ,图片即会自动裁切。在那之后原始图片就可以刪除,只留下裁切后的图片。

2.2. 手动裁切

手动把图片转成512×512理由是避免重要的部分被裁掉。

  1. 安装修图软件 GIMP,点选档案→新增512×512像素的专案
  2. 点油漆桶将其漆成白色
  3. 将图片拖曳进画面,成为新的图层
  4. 点选工具→变形工具→缩放,缩放图片使其符合目前画布大小,再按Enter。
  5. 点选档案→Export,保存成png。
  6. 为加快后面图片的处理速度,按右下角刪除目前图层,再拖新的图片进来,重复操作。
  7. 將33张Hara绘制的斯卡萨哈裁切后,统一放到名为raw的目录。

3. 预先给图片上提示词

接着要给图片预先上提示词,这样AI才知道要学习哪些提示词。

  1. 启动SD WebUI,进入Train页面。
  2. 进入Preprocess页面,Source输入裁剪图片的路径,Destination填处理后图片输出的路径。
  3. 接着勾选Create Flipped Copies,建立翻转图片提升训练数量。

然后用Stable Diffusion训练真实图片的勾选Use BLIP for caption;训练动漫人物改勾选Use DeepBooru for caption

  1. 点选Preprocess,约几分钟后便会处理完成。输出的目录里面会含有每张图片对应的提示词txt文件。
  2. 点选开启txt文件,将你觉得无关的特征都刪除,例如2girls这类太笼统的提示词。
  3. 至此训练资料准备完成。

训练Embedding

Textual Inversion(文本倒置),又称Embedding(嵌入),适合让AI学习一个新的概念/物体。画风相较于HyperNetwork学习能力较差。

Anything这类基于NovelAI制作的模型不适合拿来练Embedding,成品会很诡异。从头开始训练的Waifu Diffusion或Stable Diffusion比较适合训练Embedding,因此这里使用的基础模型为Waifu Diffusion 1.4。

1. 操作过程

  1. 启动SD WebUI
  2. 切换至Train页面,在Create embedding输入名字。Number of vectors per token设定7以上。点选Create embedding
  3. 切换至Train页面,选择刚刚建立的embedding,在Dataset directory输入训练资料的路径
  4. Prompt template file选style_filewords.txt。Mx Step设定训练至10000步停止。当然你也可以调高一点,并看预览图决定品质差不多之后才按Interrupt中止训练,究竟要多少步数不得而知。
  5. 点选Train Embedding,开始训练。
  6. SD WebUI应会显示剩余时间,通常是一小时起跳,每500步会在右边显示训练该步数的成果。
  7. 你也可以到SD WenUI根目录下的texual_inversions查看训练成果。里面image_embeddings目录会存放第几步所训练的成果。
  8. 待训练完成后,至SD WenUI根目录下的texual_inversions/embeddings,对照image_embeddings目录的图片挑选合适的成品。
  9. 例如觉得9500步的不错,那就将该pt档从里面挑出,將其放到SD WebUI程式目录下的embeddings

2. Embedding模型使用方式

  1. 在SD WebUI的生图界面,点选右上角Show Extra Networks
  2. 接着选取要使用的embedding,点选将其加入提示词栏位。Embedding只能配合训练时使用的模型来算图。
  3. 然后按照Embedding训练时使用的提示词下提示词,这样算出来的图便会有该Embedding的人物了。

训练HyperNetwork

比起学习概念的embedding,HyperNetwork(超网络)更适合让AI学习图片整体画风。

HyperNetwork我是使用Anything当基础模型来训练。

1. 操作过程

  1. 启动SD WebUI
  2. 切换至Train页面,在Create hypernetwork输入名字。Number of vectors per token设定7以上。点选Create hypernetwork
  3. 切换至Train页面,选择刚刚建立的hypernetwork,在Dataset directory输入训练资料的路径。Prompt template file选hypernetwork.txt。
  4. Max Step设定训练至10000步停止。
  5. 最后点选Train HyperNetwork,开始训练。SD WebUI会显示剩余时间,HyperNetwork会比Embedding长一些。
  6. 同样可以到SD WebUI根目录下的texual_inversions/hypernetwork查看训练结果。里面会有images目录存放第几步所训练的成果。
  7. 待训练完成后,至SD WeBUI根目录下的texual_Inversions/hypernetworks,对照images目录下的图片挑选合适的成品。
  8. 例如觉得9500步的不错,就將pt档放到SD WebUI根目录下的models/hypernetwork

2. HyperNetwork模型使用方式

  1. 在SD WebUI的生图界面,点选右上角Show Extra Networks
  2. 接着选取要使用的Hypernetwork,点选将其加入提示词栏位
  3. 接着再使用训练时候使用的提示词,这样算出来的图便会有该HyperNetwork的人物了,并且画风还原很佳。

训练LoRA

LoRA (Low-rank adaptation)是用来微调大型模型的技术,其生成的模型训练时间短,档案更小。DreamBooth內含LoRA,可作为 SD WebUI的扩充功能安装。本机训练还可以用 LoRA_Easy_Training_Scripts,支持Linux和Windows系统。有用Google Colab的采用 Linaqruf/kohya-trainer会比较好上手。 Reddit有教学。

1. 安装环境

“LoRA Easy Training Scripts”这个Python程式Linux和Windows都可以用,下面以Ubuntu为例。

  1. 安装 Anaconda,建立虚拟环境
conda create --name loratraining python=3.10.6
conda activate loratraining
  1. 复制github代码仓库
git clone https://github.com/derrian-distro/LoRA_Easy_Training_Scripts.git
cd LoRA_Easy_Training_Scripts
git submodule init
git submodule update
cd sd_scripts
pip install torch torchvision --extra-index-url https://download.pytorch.org/whl/cu116
pip install --upgrade -r requirements.txt
pip install -U xformers
  1. 设定加速选项
accelerate config
#依序回答:
#- This machine
#- No distributed training
#- NO
#- NO
#- NO
#- all
#- fp16
  1. LoRA的训练资料目录结构不太一样,需建立目录结构如下。已经上好提示词的训练资料要放在img_dir下面,将目录名称取名为数字_概念,目录名称前面加上数字代表要重复的步数。
  2. 新增训练文档trainingconfig.json
vim trainingconfig.json
  1. 填入以下內容(双斜线的注解记得刪除) LoRA的总训练步数计算公式为: 训练图片数量 × 重复次数 ÷ train_batch_size × epoch
{
  //基於何种模型训练
  "pretrained_model_name_or_path": "/home/user/桌面/heralora/anything-v4.5-pruned.ckpt",
  "v2": false,
  "v_parameterization": false,
  //纪录档输出目录
  "logging_dir": "/home/user/桌面/heralora/log_dir/",
  //训练资料目录
  "train_data_dir": "/home/user/桌面/heralora/image_dir/",
  //註册目录
  "reg_data_dir": "/home/user/桌面/heralora/reg_dir/",
  //输出目录
  "output_dir": "/home/user/桌面/heralora/output_dir",
  //训练的图片最大长宽
  "max_resolution": "512,512",
  //学习率
  "learning_rate": "1e-5",
  "lr_scheduler": "constant_with_warmup",
  "lr_warmup": "5",
  "train_batch_size": 3,
  //训练时期
  "epoch": "4",
  "save_every_n_epochs": "",
  "mixed_precision": "fp16",
  "save_precision": "fp16",
  "seed": "",
  "num_cpu_threads_per_process": 32,
  "cache_latents": true,
  "caption_extension": ".txt",
  "enable_bucket": true,
  "gradient_checkpointing": false,
  "full_fp16": false,
  "no_token_padding": false,
  "stop_text_encoder_training": 0,
  "use_8bit_adam": true,
  "xformers": true,
  "save_model_as": "safetensors",
  "shuffle_caption": true,
  "save_state": false,
  "resume": "",
  "prior_loss_weight": 1.0,
  "text_encoder_lr": "1.5e-5",
  "unet_lr": "1.5e-4",
  "network_dim": 128,
  "lora_network_weights": "",
  "color_aug": false,
  "flip_aug": false,
  "clip_skip": 2,
  "mem_eff_attn": false,
  "output_name": "",
  "model_list": "",
  "max_token_length": "150",
  "max_train_epochs": "",
  "max_data_loader_n_workers": "",
  "network_alpha": 128,
  "training_comment": "",
  "keep_tokens": 2,
  "lr_scheduler_num_cycles": "",
  "lr_scheduler_power": "",
  "persistent_data_loader_workers": true,
  "bucket_no_upscale": true,
  "random_crop": false,
  "caption_dropout_every_n_epochs": 0.0,
  "caption_dropout_rate": 0
}

2. 开始训练

  1. 有些系统需要指定CUDA安装路径
export PATH=/usr/local/cuda/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
  1. 输入以下指令,载入json设定档。libnvinfer.so.7: cannot open shared object file的警告可以暂时忽略。
accelerate launch main.py --load_json_path "/home/user/trainingconfig.json"
  1. 之后会自动开始训练。训练好的模型位于训练设定档所写的output_dir目录。將.safetensors档移动至SD WebUI根目录下的/models/Lora

3. LoRA模型使用方式

  1. 点选SD WebUI右上角,Show extra networks
  2. 点选要使用的LoRA,將其加入至提示词栏位
  3. 再加上训练时使用的提示词,即可生成使用LoRA风格的人物。

予人玫瑰,手有余香。如果您觉得本文对您有帮助,请点赞或打赏。

文章评论

您需要 登录 之后才可以评论