上篇【AIGC】Stable Diffusion Lora训练实践(云端训练篇),总结了如何白嫖Google Colab来进行Stable Diffusion Lora训练的流程,但是有时候Google Colab分配不到GPU资源,导致继续训练时会受阻,于是还是想利用本地显卡来做Lora训练,现将整个训练流程总结如下。
实践步骤
图片预处理
收集图片
收集自己想要训练的图像,至少15张以上效果会比较好,最好是高质量的高清图片。由于作者主要是想跑通整个Lora训练的流程,因此主要通过谷歌图片搜索和百度图片搜索下载图片,其中百度图片搜索可以直接下载图片,比较方便。
数据清理
-
批量重命名
现在下来的图片可能名字也比较乱,如果是mac系统的话,可以直接选中所有图片,然后“重新命名”
-
批量裁剪,推荐使用在线工具:birme,效果如下。最后点击“SAVE AS ZIP ”打包下载zip文件。
如果新版本打不开,可以考虑回退到V1版本
图像标注
可以使用Stable Diffusion Webui里面的“训练”功能做标注,如下所示:
填写源文件、目标文件、宽度/高度、勾选自动焦点裁切和“使用deepbooru生成文字说明(tags)”,点击预处理等待处理完成。
上面两种标注的方式区别如下:
BLIP caption:生成的标签文字是比较连贯的自然语言表示,示例:huggingface BLIP,主要关注在图像存储库中进行基于描述的搜索
deepbooru caption:生成的是一个个标签,参考:huggingface,适用与动漫风格的标注,主要用于实际生成图像描述或标签
最终生成的文件如下:
生成的tag,样例如下:
1girl, black_border, black_eyes, black_hair, letterboxed, makeup, pillarboxed, profile, red_lips, solo, water
开始训练
利用bmaltais/kohya_ss的GUI页面来训练,本来想本机安装,但是安装会有各种问题,看文档中也有docker安装方式,于是使用docker的方式安装
具体流程如下:
git clone https://github.com/bmaltais/kohya_ss.git
cd kohya_ss
docker compose build
docker compose run --service-ports kohya-ss-gui
最后会生成一个docker image镜像:kohya-ss-gui:latest
运行时的docker-comose.yaml
如下:
version: "3.8"
services:
kohya-ss-gui:
container_name: kohya-ss-gui
image: kohya-ss-gui:latest
build:
context: .
ports:
- 0.0.0.0:8860:7860
tty: true
ipc: host
environment:
CLI_ARGS: ""
SAFETENSORS_FAST_GPU: 1
tmpfs:
- /tmp
volumes:
- ./dataset:/dataset
- ./.cache/user:/home/appuser/.cache
- ./.cache/triton:/home/appuser/.triton
- ./.cache/config:/app/appuser/.config
- ./.cache/nv:/home/appuser/.nv
- ./.cache/keras:/home/appuser/.keras
deploy:
resources:
reservations:
devices:
- driver: nvidia
device_ids: ['0']
capabilities: [gpu]
如果需要可以在内网访问的话,可以修改ports成:0.0.0.0:xxxx:7860
可以重点关注下volumes
项目,里面会有目录映射关系,并且如果我们使用的是root权限运行的话,需要修改下目录权限,如下:
> chmod -R 777 .cache/
> chmod -R 777 dataset/
- .cache目录如下:
.cache/
├── config
├── keras
├── nv
├── triton
└── user
└── huggingface
├── diffusers
│ └── models--runwayml--stable-diffusion-v1-5
│ ├── blobs
│ ├── refs
│ └── snapshots
│ └── aa9ba505e1973ae5cd05f5aedd345178f52f8e6a
│ ├── feature_extractor
│ ├── safety_checker
│ ├── scheduler
│ ├── text_encoder
│ ├── tokenizer
│ ├── unet
│ └── vae
└── hub
└── models--openai--clip-vit-large-patch14
├── blobs
├── refs
└── snapshots
└── 8d052a0f05efbaefbc9e8786ba291cfdf93e5bff
- dataset对应到docker中的目录为:/dataset目录,里面一般就存放训练数据,目录结构如下:
dataset/
└── Lora
└── MyNvdi
├── img
│ └── 100_Hunzi
├── logs
│ └── 20230512104114
│ └── network_train
└── model
└── sample
- 文件命名规则:num_XXX,源码如下,可以看出来num代表图片的重复训练次数
# Loop through each subfolder and extract the number of repeats
for folder in subfolders:
try:
# Extract the number of repeats from the folder name
repeats = int(folder.split('_')[0])
# Count the number of images in the folder
num_images = len(
[
f
for f, lower_f in (
(file, file.lower())
for file in os.listdir(
os.path.join(train_data_dir, folder)
)
)
if lower_f.endswith(('.jpg', '.jpeg', '.png', '.webp'))
]
)
print(f'Folder {folder}: {num_images} images found')
# Calculate the total number of steps for this folder
steps = repeats * num_images
# Print the result
print(f'Folder {folder}: {steps} steps')
total_steps += steps
最终页面如下:
训练时需要重点填写:
- Source model
- Pretrained model name or path:本文选择GuoFeng3进行训练
- Folders
- Image folder,比如:/dataset/Lora/MyNvdi/img
- Output folder,比如:/dataset/Lora/MyNvdi/model
- Model output name,比如:MyXXX
- Logging folder,比如:/dataset/Lora/MyNvdi/logs
- Training parameter
- Train batch size:批次大小
- Epoch:迭代次数
- Save every N epochs:没几次迭代保存一下ckpt文件
- Max resolution:分辨率,(512,512)或者(768,768)
总步数,计算方法如下:
每一轮的步数: images sizes x repeats / batches size ,比如 27 x 10 / 2 = 135
比如:Train batch size=2,Image Size=27, Epoch=20, repeats=10
总步数=27 x 10 / 2 x 20 = 2700
采样设置:
- 后台查看训练记录
- 显卡内存占用率
- cpu和内存使用情况
- 当然本地运行过程中也生成了logs,应该也可以使用
TensorBoard
来可视化训练过程,后面再研究
测试验证
使用stable diffusion webui
进行验证,利用它的X/Y/Z plot
脚本来查看不同的权重下的复现情况,
- positive prompt:
<lora:MyNvdi:STR>,masterpiece, best quality, (1girl), in white shirts, upper body, looking at viewer, simple background
- Negative prompt
low quality, worst quality, bad anatomy,bad composition, poor, low effort
- X/Y/Z plot
Prompt S/R,value:STR,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0
最终效果如下:
可以看到权重在0.6时,不良人女帝的效果就开始显现(额头特有的标记显示),权重太大了之后可能就会有少量变形了。因此设置0.6-0.8的权重比较好。
由于本文使用的训练图片都是从网上搜索的,有一些质量不是很高,也导致了权重比较大时,呈现的效果不是很好。
总结
本文对本地部署训练一个Lora模型的简单总结,其中大部分参数都是使用默认的,还不是很理解其中的含义,可能训练的效果也不一定很好,可以看到和云端训练的效果还会有一些差别,应该也是两边默认的训练参数会有一些差别导致的,后续也将深入的学习了解这些参数,可以针对不同训练集做更好的训练,达到更好的效果。
参考
【AIGC】Stable Diffusion Lora训练实践(云端训练篇)
炼丹!训练 stable diffusion 来生成LoRA定制模型
详细的使用webui来训练的流程,可以重点参考里面的设置来训练