使用Linux训练LoRA模型

原文:使用Linux训练LoRA模型 - 知乎

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模型了~

猜你喜欢

转载自blog.csdn.net/javastart/article/details/129847500
今日推荐