利用本地显卡进行Stable Diffusion Lora训练实践

释放双眼,带上耳机,听听看~!
本文总结了利用本地显卡进行Stable Diffusion Lora训练的实践步骤,包括图片预处理、数据清理、图像标注和训练流程,旨在帮助读者优化Lora训练过程并解决Google Colab资源分配不足的问题。

上篇【AIGC】Stable Diffusion Lora训练实践(云端训练篇),总结了如何白嫖Google Colab来进行Stable Diffusion Lora训练的流程,但是有时候Google Colab分配不到GPU资源,导致继续训练时会受阻,于是还是想利用本地显卡来做Lora训练,现将整个训练流程总结如下。

实践步骤

图片预处理

收集图片

收集自己想要训练的图像,至少15张以上效果会比较好,最好是高质量的高清图片。由于作者主要是想跑通整个Lora训练的流程,因此主要通过谷歌图片搜索和百度图片搜索下载图片,其中百度图片搜索可以直接下载图片,比较方便。
利用本地显卡进行Stable Diffusion Lora训练实践

数据清理

  • 批量重命名
    现在下来的图片可能名字也比较乱,如果是mac系统的话,可以直接选中所有图片,然后“重新命名”
    利用本地显卡进行Stable Diffusion Lora训练实践

  • 批量裁剪,推荐使用在线工具:birme,效果如下。最后点击“SAVE AS ZIP ”打包下载zip文件。

利用本地显卡进行Stable Diffusion Lora训练实践

如果新版本打不开,可以考虑回退到V1版本

图像标注

可以使用Stable Diffusion Webui里面的“训练”功能做标注,如下所示:

利用本地显卡进行Stable Diffusion Lora训练实践
填写源文件、目标文件、宽度/高度、勾选自动焦点裁切和“使用deepbooru生成文字说明(tags)”,点击预处理等待处理完成。

上面两种标注的方式区别如下:
BLIP caption:生成的标签文字是比较连贯的自然语言表示,示例:huggingface BLIP,主要关注在图像存储库中进行基于描述的搜索
deepbooru caption:生成的是一个个标签,参考:huggingface,适用与动漫风格的标注,主要用于实际生成图像描述或标签

最终生成的文件如下:

利用本地显卡进行Stable Diffusion Lora训练实践

生成的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

最终页面如下:

利用本地显卡进行Stable Diffusion Lora训练实践

训练时需要重点填写:

  • 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

利用本地显卡进行Stable Diffusion Lora训练实践

  • 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

利用本地显卡进行Stable Diffusion Lora训练实践

采样设置:

利用本地显卡进行Stable Diffusion Lora训练实践

  • 后台查看训练记录

利用本地显卡进行Stable Diffusion Lora训练实践

  • 显卡内存占用率

利用本地显卡进行Stable Diffusion Lora训练实践

  • cpu和内存使用情况

利用本地显卡进行Stable Diffusion Lora训练实践

  • 当然本地运行过程中也生成了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

最终效果如下:

利用本地显卡进行Stable Diffusion Lora训练实践

利用本地显卡进行Stable Diffusion Lora训练实践
可以看到权重在0.6时,不良人女帝的效果就开始显现(额头特有的标记显示),权重太大了之后可能就会有少量变形了。因此设置0.6-0.8的权重比较好。

由于本文使用的训练图片都是从网上搜索的,有一些质量不是很高,也导致了权重比较大时,呈现的效果不是很好。

总结

本文对本地部署训练一个Lora模型的简单总结,其中大部分参数都是使用默认的,还不是很理解其中的含义,可能训练的效果也不一定很好,可以看到和云端训练的效果还会有一些差别,应该也是两边默认的训练参数会有一些差别导致的,后续也将深入的学习了解这些参数,可以针对不同训练集做更好的训练,达到更好的效果。

参考

【AIGC】Stable Diffusion Lora训练实践(云端训练篇)

炼丹!训练 stable diffusion 来生成LoRA定制模型

详细的使用webui来训练的流程,可以重点参考里面的设置来训练

本网站的内容主要来自互联网上的各种资源,仅供参考和信息分享之用,不代表本网站拥有相关版权或知识产权。如您认为内容侵犯您的权益,请联系我们,我们将尽快采取行动,包括删除或更正。
AI教程

如何让SLG游戏中的人机更智能?深度强化学习的技术方案解析

2023-12-18 23:30:14

AI教程

使用golang 基于 OpenAI Embedding + qdrant 实现k8s本地知识库

2023-12-19 0:30:14

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索