本章所討论的训练模型仅为自用用途,若要分享训练的模型也应遵照开源的原则分享。
为什么要训练自己的模型
训练自己的模型可以在现有模型的基础上,让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. 自动裁剪
裁剪图片不会用到显示卡计算。
- 將要裁切的图片放到同一个目录下,例如
/home/user/桌面/input
。 - 开启SD WebUI,进到Train → Preprocess images页面
- 第一个栏位
Source directory
填写原始图片的路径 - 第二个栏位
Destination directory
填写输出路径,例如/home/user/桌面/cropped
- Width和Height设定为512×512
- 点选Preprocess ,图片即会自动裁切。在那之后原始图片就可以刪除,只留下裁切后的图片。
2.2. 手动裁切
手动把图片转成512×512理由是避免重要的部分被裁掉。
- 安装修图软件 GIMP,点选档案→新增512×512像素的专案
- 点油漆桶将其漆成白色
- 将图片拖曳进画面,成为新的图层
- 点选工具→变形工具→缩放,缩放图片使其符合目前画布大小,再按Enter。
- 点选档案→Export,保存成png。
- 为加快后面图片的处理速度,按右下角刪除目前图层,再拖新的图片进来,重复操作。
- 將33张Hara绘制的斯卡萨哈裁切后,统一放到名为
raw
的目录。
3. 预先给图片上提示词
接着要给图片预先上提示词,这样AI才知道要学习哪些提示词。
- 启动SD WebUI,进入Train页面。
- 进入Preprocess页面,
Source
输入裁剪图片的路径,Destination
填处理后图片输出的路径。 - 接着勾选
Create Flipped Copies
,建立翻转图片提升训练数量。
然后用Stable Diffusion训练真实图片的勾选Use BLIP for caption
;训练动漫人物改勾选Use DeepBooru for caption
。
- 点选Preprocess,约几分钟后便会处理完成。输出的目录里面会含有每张图片对应的提示词txt文件。
- 点选开启txt文件,将你觉得无关的特征都刪除,例如
2girls
这类太笼统的提示词。 - 至此训练资料准备完成。
训练Embedding
Textual Inversion(文本倒置),又称Embedding(嵌入),适合让AI学习一个新的概念/物体。画风相较于HyperNetwork学习能力较差。
Anything这类基于NovelAI制作的模型不适合拿来练Embedding,成品会很诡异。从头开始训练的Waifu Diffusion或Stable Diffusion比较适合训练Embedding,因此这里使用的基础模型为Waifu Diffusion 1.4。
1. 操作过程
- 启动SD WebUI
- 切换至Train页面,在
Create embedding
输入名字。Number of vectors per token
设定7以上。点选Create embedding
。 - 切换至Train页面,选择刚刚建立的embedding,在
Dataset directory
输入训练资料的路径 Prompt template file
选style_filewords.txt。Mx Step
设定训练至10000步停止。当然你也可以调高一点,并看预览图决定品质差不多之后才按Interrupt中止训练,究竟要多少步数不得而知。- 点选
Train Embedding
,开始训练。 - SD WebUI应会显示剩余时间,通常是一小时起跳,每500步会在右边显示训练该步数的成果。
- 你也可以到SD WenUI根目录下的
texual_inversions
查看训练成果。里面image_embeddings
目录会存放第几步所训练的成果。 - 待训练完成后,至SD WenUI根目录下的
texual_inversions/embeddings
,对照image_embeddings
目录的图片挑选合适的成品。 - 例如觉得9500步的不错,那就将该pt档从里面挑出,將其放到SD WebUI程式目录下的
embeddings
。
2. Embedding模型使用方式
- 在SD WebUI的生图界面,点选右上角
Show Extra Networks
- 接着选取要使用的embedding,点选将其加入提示词栏位。Embedding只能配合训练时使用的模型来算图。
- 然后按照Embedding训练时使用的提示词下提示词,这样算出来的图便会有该Embedding的人物了。
训练HyperNetwork
比起学习概念的embedding,HyperNetwork(超网络)更适合让AI学习图片整体画风。
HyperNetwork我是使用Anything当基础模型来训练。
1. 操作过程
- 启动SD WebUI
- 切换至Train页面,在
Create hypernetwork
输入名字。Number of vectors per token
设定7以上。点选Create hypernetwork
。 - 切换至Train页面,选择刚刚建立的hypernetwork,在
Dataset directory
输入训练资料的路径。Prompt template file
选hypernetwork.txt。 Max Step
设定训练至10000步停止。- 最后点选
Train HyperNetwork
,开始训练。SD WebUI会显示剩余时间,HyperNetwork会比Embedding长一些。 - 同样可以到SD WebUI根目录下的
texual_inversions/hypernetwork
查看训练结果。里面会有images
目录存放第几步所训练的成果。 - 待训练完成后,至SD WeBUI根目录下的
texual_Inversions/hypernetworks
,对照images
目录下的图片挑选合适的成品。 - 例如觉得9500步的不错,就將pt档放到SD WebUI根目录下的
models/hypernetwork
。
2. HyperNetwork模型使用方式
- 在SD WebUI的生图界面,点选右上角
Show Extra Networks
- 接着选取要使用的Hypernetwork,点选将其加入提示词栏位
- 接着再使用训练时候使用的提示词,这样算出来的图便会有该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为例。
- 安装 Anaconda,建立虚拟环境
conda create --name loratraining python=3.10.6
conda activate loratraining
- 复制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
- 设定加速选项
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风格的人物。
文章评论