4.Stable Diffusion WebUI 模型训练

发布于:2025-07-03 ⋅ 阅读:(70) ⋅ 点赞:(0)

        本文看了知乎训练Embedding - Stable Diffusion WebUI使用手冊 - Stable Diffusion文档中心的文章,这篇文章写的很详细,可能是我的SDW版本升级了,有的地方和这篇文章的不同,所以内容有部分的改动,但最后还是可以正常训练了,这里作为笔记用。

        如果要更全面了解Stable Diffusion WebUI 的使用,建议大家看上面那篇知乎的文章,文章写的很全,包括文生图、图生图的细节及模型训练、模型合并的细节,都讲的很详细。

1.为什么要训练模型?

        为什么要训练自己的模型?训练自己的模型可以在现有模型的基础上,让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,那就参考安装教学部署在本机,想训练多久就训练多久。训练数据不到50张图片的小模型训练时间约只要1~3个小时。

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

2.准备训练数据

2.1 取得高品质图片

训练用的图片最少最少要准备10张。重质不重量。因为我要训练的是单一人物且风格固定,图片不宜有复杂背景以及其他无关人物。

网络图片一张一张右键下载当然可以,不过要大量下载图片的话我会使用Imgrd GrabberHydrus Network

这里我是在视觉中国视觉中国图片-视觉中国素材-视觉中国图片下载-视觉中国VCG.COM搜索FGO的斯卡萨哈,然后挑取合适的图片一张一张手动下载的图片,下载的图片如下:

2.2 裁剪图片

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

2.2.1 自动裁剪图片

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

  1. 将要裁切的图片放到同一个目录下,例如/home/user/桌面/input
  2. 打开SD WebUI,进到Train → Preprocess images页面

  1. 第一个字段Source directory填写原始图片的路径
  2. 第二个字段Destination directory填写输出路径,例如/home/user/桌面/cropped
  3. Width和Height设置为512x512
  4. 点击Preprocess ,图片即会自动裁切。在那之后原始图片就可以删除,只留下裁切后的图片。

2.2.2 手动裁剪图片

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

  1. 1安装修图软件GIMP,点击文件→添加512x512像素的项目

  1. 2点油漆桶将其漆成白色

  1. 3将图片拖曳进画面,成为新的图层

  1. 4点击工具→变形工具→缩放,缩放图片使其符合目前画布大小,再按Enter。

  1. 5点击文件→Export,导出成png。

  1. 6为加快后面图片的处理速度,按右下角删除目前图层,再拖新的图片进来,重复操作。

  1. 7将33张Hara绘制的斯卡萨哈裁切后,统一放到名为raw的目录。

2.3 预先给图片上提示词

 1.进入 Extras页面

2.再进入Batch from Directory页面

在该页面的input directory下面输入自己裁剪好的图片路径文件夹路径,在out direcyory下面输入自己要输出图片的文件夹路径,然后勾选create flipped copies 和 Caption,再点击Generate。之后在输出图片的文件夹会有如下文件:

        里面的txt文件对应每张图片的标签,可以进入txt文件把一些不需要的标签删去。在这里,训练前的数据准备就结束了。

3.训练embedding

3.1 embedding 训练

接着要给图片预先上提示词,这样AI才知道要学习哪些提示词。由于我的版本和知乎文章的版本不同,这里与知乎文章的有一些不同,大家可以根据自己的版本自行看着完成这个步骤。

1.启动SD WebUI,进入Train页面。

2.进入Train页面的Create embedding页面

        在该页面的name下面写入heraembedding,并将Number of vectors per token改为7,然后按Create embedding.

完成以上步骤后,进入Train页面,如下图所示

        在该页面的embedding下面输入heraembedding,在Dataset directory下面输入刚才的那个有txt文件和图片的文件夹路径,然后点击最下面的Train Embedding即可训练。

  1. SD WebUI应会显示剩余时间,通常是一小时起跳,每500步会在右边显示训练该步数的成果。
  2. 你也可以到SD WenUI根目录下的texual_inversions查看训练成果。里面image_embeddings目录会存放第几步所训练的成果。

  1. 待训练完成后,至SD WenUI根目录下的texual_inversions/embeddings,对照image_embeddings目录的图片挑选合适的成品。

  1. 例如觉得9500步的不错,那就将该pt档从里面挑出,将其放到SD WebUI程序目录下的embeddings

3.2 embedding模型使用

  1. 于SD WebUI的生图界面,点击右上角Show Extra Networks

  1. 接着选取要使用的embedding,点击将其加入提示词字段。Embedding只能配合训练时使用的模型来算图。

  1. 然后按照Embedding训练时使用的提示词下提示词,这样算出来的图便会有该Embedding的人物了。

4.训练HyperNetwork

        HyperNetwork训练方式和embedding训练方式相同,只是在train页面选择Create hypernetwork即可。

5.训练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. 拷贝保存库
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下面,将目录名称取名为数字_概念,目录名称前面加上数字代表要重复的步数。

  1. 添加训练设置档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. 开始训练

有些系统需要指定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

  1. 点击要使用的LoRA,将其加入至提示词字段

  1. 再加上训练时使用的提示词,即可生成使用LoRA风格的人物。


网站公告

今日签到

点亮在社区的每一天
去签到