商意经

 找回密码
 立即注册
查看: 76|回复: 9

使用Linux训练LoRA模型

[复制链接]

1

主题

1

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2023-3-25 16:47:54 | 显示全部楼层 |阅读模式
2022年十一之后一直在关注AI绘图的进展,包括waifu,novelai等模型层出不穷,一点点刷新着AI绘图的能力。
关于LoRA:
2022年12月份开始,在reddit网站上,一直有人在聊LoRA与Dreambooth的结合,我当时并没有特别注意到LoRA这个名词,以为只是Dreambooth的一种新的训练方法,随后LoRA更新到了Stable Diffusion webui的Dreambooth extension中,大大压缩了Dreambooth的训练时间和所需要的训练资源,使得Dreambooth训练只需要一个游戏本就可以承担的起。
2023年春节后,我发现Stable Diffusion webui更新了LoRA模块,突然间LoRA这个名词在AI绘图中火了起来,civita网站也突然间多了很多各式各样的模型,这时候LoRA彻底火出圈了~然后,特么尴尬的来了,Stable Diffusion webui中的Dreambooth extension训练所产生的LoRA小模型,无法在webui中的LoRA模块进行加载,这大大限制了原友们的创作热情。
长话短多,本文主要介绍的就是如何在linux环境下进行LoRA模型的训练,windows环境移步这里使用GUI训练更完美
首先需要git拉取代码:https://github.com/kohya-ss/sd-scripts
pip install -r requirements.txt在安装好所需要的环境之后(其实装环境这一步挺麻烦的,python版本以及cuda版本的要求都比较苛刻)
lora模型的训练在原作者那里预留了两种训练方式,
一种是使用Dreambooth的训练方式,需要在训练时留有concept这个的概念,例如说,我预留了一个角色名klee,在输入文本klee时,正好可以生成我的女儿可莉~



罩子越大,模型越涩

另外一种是使用标签或者文本(captions)对模型进行一种风格化的画风训练,可以学到画风或者各种奇奇怪怪的信息,这样在准备数据的时候就需要图片文本对,我习惯使用webui中预设的danbooru或者BLIP方法生成文本对:



webui中的Train选项卡

下面主要以上述的两种方式分别讲述训练方法:
一.以Dreambooth的方式训练角色
1.数据准备
原作者写脚本时对数据的文件夹的命名方式做了规定:
训练数据文件夹的命名方式为
<数据重复次数>_<角色名> <类别名>正则化数据文件夹的命名方式为
<数据重复次数>_<类别名>数据的重复次数决定了两个事项,一个是训练中的每个epoch的图片大致有多少,另外一个是决定了训练图片(train)与正则化图片(reg)的比例是多少;举个可莉的例子,训练数据文件夹共有10张数据图片,正则化数据文件夹共有100张图片,那么可以把两个文件夹分别命名为:
20_klee girl
1_girl通常来说,要保证正则化图片的数量少于训练图片的数量
2.直接开训
accelerate launch --num_cpu_threads_per_process 1 train_network.py
    --pretrained_model_name_or_path=..\models\model.ckpt
    --train_data_dir=..\data\klee --output_dir=..\lora_train1
    --reg_data_dir=..\data\girl_reg --prior_loss_weight=1.0
    --resolution=512,512 --train_batch_size=1 --learning_rate=1e-4
    --max_train_steps=400 --optimizer_type=AdamW8bit --xformers --mixed_precision=fp16
    --save_every_n_epochs=1 --save_model_as=safetensors --clip_skip=2 --seed=42 --color_aug
    --network_module=networks.lora--pretrained_model_name_or_path是以ckpt为结尾的基础模型的路径,例如说sd_v1.5的基础模型
--train_data_dir是刚才设置的20_klee girl文件夹的上一级文件夹的路径
--output_dir是预设输出文件夹的路径;
--reg_data_dir是刚才设置的1_girl文件夹的上一级文件夹的路径;
--prior_loss_weight是dreambooth中提到的正则项损失的权重,可以设为1.0,也可以调的更小些,对于初级玩家来说,这项设为0或者reg_data_dir填“”,可以获得更好的第一眼效果;
--resolution=512,512这项填写的是你数据中所有图片的分辨率,我在数据预处理时,都将图片处理成了正方形,所以这里就写了最常见的512,512,这里的分辨率一定要与数据相匹配,否则会报错;
--train_batch_size=1 --learning_rate=1e-4这两项掠去不说,只是提醒下,这两项在调整时需要联动调整,size调大往往学习率也要调大;
--max_train_steps=400训练终止步数;
--optimizer_type=AdamW8bit --xformers这两项由于我的服务器是cuda10.2的,都启用不了,我就直接砍掉不要了,否则会报错;
--后面的就都照readme正常写就可以了,略;
--seed=42是随机种子,可以写一个自己幸运数。
然后我们将生成的safetensor模型移动到webui路径下的/webui/models/Lora/ 就可以在webui中加载了:



具体操作顺序如图

二.训练lora画风模型(使用caption进行训练)
训练lora画风模型需要预先准备打好标签的数据,数据的文件夹名称没有特殊要求,也可以用sd-scripts中的脚本生成标签数据
打标签的步骤可以使用webui中的方法,也可以使用sd-scripts中的脚本
首先cd到finetune文件夹下
python tag_images_by_wd14_tagger.py --batch_size 4 <训练数据路径>我使用的是webui中的打标签工具,没有使用上面的代码,但是生成的都是.txt文件,然后接下来很重要的一步是将标签文件.txt转为.json
python merge_dd_tags_to_metadata.py <训练数据路径> meta_cap.json然后会在当前文件夹得到一个meta_cap.json,然后返回上一级路径,将命令相对于Dreambooth的方式训练角色稍作修改
accelerate launch --num_cpu_threads_per_process 1 train_network.py
    --pretrained_model_name_or_path=../models/model.ckpt
    --train_data_dir=../data/lora_style --output_dir=../lora_train1
    --reg_data_dir=""
    --resolution=512,512 --train_batch_size=1 --learning_rate=1e-4
    --max_train_steps=400 --mixed_precision=fp16
    --save_every_n_epochs=1 --save_model_as=safetensors --clip_skip=2 --seed=42 --color_aug
    --network_module=networks.lora
    --in_json=finetune/meta_cap.json在这里我删除了会导致cuda10.2报错的加速配置,删去了正则化数据以及对应的prior_loss_weight,之后加了in_json项,然后就可以开启lora的画风训练,得到画风lora模型了~
回复

使用道具 举报

1544

主题

3862

帖子

6960

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
6960
发表于 2023-3-25 16:48:07 | 显示全部楼层
大佬你好,我看都是lora训人的,可以训物品吗?比如一辆特定的车、一张特定的桌子?
回复

使用道具 举报

3

主题

9

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 2023-3-25 16:48:55 | 显示全部楼层
可以的啊,把基础模型换成开源的stable diffusionv1.5模型就可以了
回复

使用道具 举报

1

主题

4

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2023-3-25 16:49:50 | 显示全部楼层
训练图片和正则化图片按什么性质或规则划分,按文中说的比例做随机划分是否可行?
回复

使用道具 举报

2

主题

3

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2023-3-25 16:50:15 | 显示全部楼层
正则化文件夹里是否需要有非 可莉 的其他女孩图?
回复

使用道具 举报

1544

主题

3862

帖子

6960

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
6960
发表于 2023-3-25 16:51:10 | 显示全部楼层
大佬您好,请问正则化数据文件夹放的什么数据
回复

使用道具 举报

1544

主题

3862

帖子

6960

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
6960
发表于 2023-3-25 16:51:31 | 显示全部楼层
根据Dreambooth来说,如果你训的目标是可莉,那么正则化文件夹放的就是可莉的上一级的大类,可以是女孩(girl),那么就需要生成一部分女孩的图片放在正则化文件夹里,如果是特定的桌子,给起一个比较特别的名字,那么正则化文件夹可以放其他的各种类型的桌子。比例的话,原作者说的是,正则化图片数量不超过原始数据的数据量(在乘以文件夹前面的倍增数之后),没有什么具体的要求。
回复

使用道具 举报

1

主题

4

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2023-3-25 16:52:25 | 显示全部楼层
不过,如果是第一次训这个的话,我建议直接不加正则项,正则化传入的路径直接设置为空就好,这样出图的效果会比较好,后面熟了,再考虑正则项和打标签的事情。
回复

使用道具 举报

1544

主题

3862

帖子

6960

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
6960
发表于 2023-3-25 16:53:15 | 显示全部楼层
类别数据,如果训练的是女角色,正则化文件夹放girl的图片,男角色就放boy的图片。
回复

使用道具 举报

1544

主题

3862

帖子

6960

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
6960
发表于 2023-3-25 16:53:42 | 显示全部楼层
大佬您好,正则化数据必须有吗?比如我拿张学友的照片做训练数据,那正则化就要放一些其他boy的图片?他的作用是什么?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|商意经

GMT+8, 2025-4-8 13:31 , Processed in 0.533901 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.. 技术支持 by 巅峰设计

快速回复 返回顶部 返回列表