本文看了知乎训练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 Grabber或Hydrus Network。
这里我是在视觉中国视觉中国图片-视觉中国素材-视觉中国图片下载-视觉中国VCG.COM搜索FGO的斯卡萨哈,然后挑取合适的图片一张一张手动下载的图片,下载的图片如下:
2.2 裁剪图片
下载图片后,要将训练图片裁切成512x512像素。你可以选择用SD WebUI自动裁切,或是手动裁切。
2.2.1 自动裁剪图片
裁切图片不会用到显卡计算。
- 将要裁切的图片放到同一个目录下,例如
/home/user/桌面/input
。 - 打开SD WebUI,进到Train → Preprocess images页面
- 第一个字段
Source directory
填写原始图片的路径 - 第二个字段
Destination directory
填写输出路径,例如/home/user/桌面/cropped
- Width和Height设置为512x512
- 点击Preprocess ,图片即会自动裁切。在那之后原始图片就可以删除,只留下裁切后的图片。
2.2.2 手动裁剪图片
手动把图片转成512x512理由是避免重要的部分被裁掉。
- 1安装修图软件GIMP,点击文件→添加512x512像素的项目
- 2点油漆桶将其漆成白色
- 3将图片拖曳进画面,成为新的图层
- 4点击工具→变形工具→缩放,缩放图片使其符合目前画布大小,再按Enter。
- 5点击文件→Export,导出成png。
- 6为加快后面图片的处理速度,按右下角删除目前图层,再拖新的图片进来,重复操作。
- 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即可训练。
- SD WebUI应会显示剩余时间,通常是一小时起跳,每500步会在右边显示训练该步数的成果。
- 你也可以到SD WenUI根目录下的
texual_inversions
查看训练成果。里面image_embeddings
目录会存放第几步所训练的成果。
- 待训练完成后,至SD WenUI根目录下的
texual_inversions/embeddings
,对照image_embeddings
目录的图片挑选合适的成品。
- 例如觉得9500步的不错,那就将该pt档从里面挑出,将其放到SD WebUI程序目录下的
embeddings
。
3.2 embedding模型使用
- 于SD WebUI的生图界面,点击右上角
Show Extra Networks
- 接着选取要使用的embedding,点击将其加入提示词字段。Embedding只能配合训练时使用的模型来算图。
- 然后按照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为例。
- 安装Anaconda,创建虚拟环境
conda create --name loratraining python=3.10.6
conda activate loratraining
- 拷贝保存库
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
- 设置加速选项
accelerate config
#依序回答:
#- This machine
#- No distributed training
#- NO
#- NO
#- NO
#- all
#- fp16
- LoRA的训练数据目录结构不太一样,需创建目录结构如下。已经上好提示词的训练数据要放在
img_dir
下面,将目录名称取名为数字_概念
,目录名称前面加上数字代表要重复的步数。
- 添加训练设置档
trainingconfig.json
vim trainingconfig.json
- 填入以下内容(双斜线的注解记得删除) 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}}
- 输入以下指令,加载json设置档。
libnvinfer.so.7: cannot open shared object file
的警告可以暂时忽略。
accelerate launch main.py --load_json_path "/home/user/trainingconfig.json"
- 之后会自动开始训练。训练好的模型位于训练设置档所写的
output_dir
目录。将.safetensors
档移动至SD WebUI根目录下的/models/Lora
。
3. LoRA模型使用方式
- 点击SD WebUI右上角,Show extra networks
- 点击要使用的LoRA,将其加入至提示词字段
- 再加上训练时使用的提示词,即可生成使用LoRA风格的人物。