【stable diffusion LORA训练】改进lora-scripts,命令行方式训练LORA,支持SDXL训练-程序员宅基地

技术标签: sdxl  lora  stable diffusion  lora-scripts  train  

分享下自己改进的一个lora训练脚本,在ubuntu下如果SD-WEBUI的环境已经搭好的话,只需要下载lora-script就可以支持训练了,直接命令行方式训练。

首先,我们需要克隆下项目:

git clone https://github.com/Akegarasu/lora-scripts

其次,更改项目里的train.sh脚本如下

#!/bin/bash
# LoRA train script by @Akegarasu

# Train data path | 设置训练用模型、图片
#pretrained_model="/data/models/checkpoint/theAllysMixXSDXL_v10.safetensors" # base model path | 底模路径 #绘画风XL
pretrained_model="/data/models/checkpoint/hellopure_V30a.safetensors" # base model path | 底模路径 #绘画风
#pretrained_model="/data/models/checkpoint/orangechillmix_v70Fixed.safetensors" # base model path | 底模路径 #真实风

is_v2_model=0                             # SD2.0 model | SD2.0模型 2.0模型下 clip_skip 默认无效
parameterization=0                        # parameterization | 参数化 本参数需要和 V2 参数同步使用 实验性功能
train_data_dir="/data/models/Train/image/"              # train dataset path | 训练数据集路径
reg_data_dir=""                           # directory for regularization images | 正则化数据集路径,默认不使用正则化图像。

# Network settings | 网络设置
network_module="networks.lora" # 在这里将会设置训练的网络种类,默认为 networks.lora 也就是 LoRA 训练。如果你想训练 LyCORIS(LoCon、LoHa) 等,则修改这个值为 lycoris.kohya
network_weights=""             # pretrained weights for LoRA network | 若需要从已有的 LoRA 模型上继续训练,请填写 LoRA 模型路径。
network_dim=128                 # network dim | 常用 4~128,不是越大越好
network_alpha=128               # network alpha | 常用与 network_dim 相同的值或者采用较小的值,如 network_dim的一半 防止下溢。默认值为 1,使用较小的 alpha 需要提升学习率。
#network_dim要和network_alpha一致,network_dim默认32,角色可以到96。画风可以到128,影响最终输出的模型文件尺寸

# Train related params | 训练相关参数
resolution="768,768"  # image resolution w,h. 图片分辨率,宽,高。支持非正方形,但必须是 64 倍数。
batch_size=4          # batch size
max_train_epoches=8  # max train epoches | 最大训练 epoch,5~10,一般为6
save_every_n_epochs=2 # save every n epochs | 每 N 个 epoch 保存一次

#train_unet_only=1            # train U-Net only | 仅训练 U-Net,开启这个会牺牲效果大幅减少显存使用。6G显存可以开启,训SDXL可以考虑开启
train_unet_only=0            # train U-Net only | 仅训练 U-Net,开启这个会牺牲效果大幅减少显存使用。6G显存可以开启
train_text_encoder_only=0    # train Text Encoder only | 仅训练 文本编码器
stop_text_encoder_training=0 # stop text encoder training | 在第N步时停止训练文本编码器

noise_offset="0" # noise offset | 在训练中添加噪声偏移来改良生成非常暗或者非常亮的图像,如果启用,推荐参数为0.1
keep_tokens=0    # keep heading N tokens when shuffling caption tokens | 在随机打乱 tokens 时,保留前 N 个不变。
min_snr_gamma=0  # minimum signal-to-noise ratio (SNR) value for gamma-ray | 伽马射线事件的最小信噪比(SNR)值  默认为 0

# Learning rate | 学习率
lr="1e-4" # learning rate | 学习率,在分别设置下方 U-Net 和 文本编码器 的学习率时,该参数失效
unet_lr="1e-4" # U-Net learning rate | U-Net 学习率
text_encoder_lr="1e-5" # Text Encoder learning rate | 文本编码器 学习率
lr_scheduler="cosine_with_restarts" # "linear", "cosine", "cosine_with_restarts", "polynomial", "constant", "constant_with_warmup", "adafactor"
lr_warmup_steps=0                   # warmup steps | 学习率预热步数,lr_scheduler 为 constant 或 adafactor 时该值需要设为0。
lr_restart_cycles=1                 # cosine_with_restarts restart cycles | 余弦退火重启次数,仅在 lr_scheduler 为 cosine_with_restarts 时起效。

# 优化器设置
optimizer_type="AdamW8bit" # Optimizer type | 优化器类型 默认为 AdamW8bit,可选:AdamW AdamW8bit Lion Lion8bit SGDNesterov SGDNesterov8bit DAdaptation AdaFactor prodigy

# Output settings | 输出设置
output_name="tblife-dzpg3"           # output model name | 模型保存名称
save_model_as="safetensors" # model save ext | 模型保存格式 ckpt, pt, safetensors

# Resume training state | 恢复训练设置
save_state=0 # save state | 保存训练状态 名称类似于 <output_name>-??????-state ?????? 表示 epoch 数
resume=""    # resume from state | 从某个状态文件夹中恢复训练 需配合上方参数同时使用 由于规范文件限制 epoch 数和全局步数不会保存 即使恢复时它们也从 1 开始 与 network_weights 的具体实现操作并不一致

# 其他设置
min_bucket_reso=256              # arb min resolution | arb 最小分辨率
max_bucket_reso=1024             # arb max resolution | arb 最大分辨率
persistent_data_loader_workers=1 # persistent dataloader workers | 保留加载训练集的worker,减少每个 epoch 之间的停顿
clip_skip=2                      # clip skip | 玄学 一般用 2
multi_gpu=0                      # multi gpu | 多显卡训练 该参数仅限在显卡数 >= 2 使用
lowram=0                         # lowram mode | 低内存模式 该模式下会将 U-net 文本编码器 VAE 转移到 GPU 显存中 启用该模式可能会对显存有一定影响

# LyCORIS 训练设置
algo="lora"  # LyCORIS network algo | LyCORIS 网络算法 可选 lora、loha、lokr、ia3、dylora。lora即为locon
conv_dim=4   # conv dim | 类似于 network_dim,推荐为 4
conv_alpha=4 # conv alpha | 类似于 network_alpha,可以采用与 conv_dim 一致或者更小的值
dropout="0"  # dropout | dropout 概率, 0 为不使用 dropout, 越大则 dropout 越多,推荐 0~0.5, LoHa/LoKr/(IA)^3暂时不支持

# 远程记录设置
use_wandb=0         # use_wandb | 启用wandb远程记录功能
wandb_api_key=""    # wandb_api_key | API,通过 https://wandb.ai/authorize 获取
log_tracker_name="" # log_tracker_name | wandb项目名称,留空则为"network_train"

# 根据参数决定输出的文件和训练参数
# 参数1为output_name 参数2不输则训练1.5的模型,输入"xl"则训练xl的模型,输入错误也还是训练1.5模型

if [ -n "$1" ]; then  
  output_name="$1" 

  pretrained_model="/data/models/checkpoint/hellopure_V30a.safetensors" # 25D模型
  resolution="768,1024"
  train_unet_only=0
  batch_size=3
  xl_flag=0
fi

if [ "$2" = "xl" ]; then
  pretrained_model="/data/models/checkpoint/theAllysMixXSDXL_v10.safetensors" #25DXL模型
  resolution="768,896" #使用768,1024都会爆显存,催悲
  train_unet_only=1
  batch_size=1
  xl_flag=1
fi

echo "extend by @Jim[231203]"
echo "==========将以以下参数训练模型=========="  
echo "输出文件:$output_name"
echo "底模模型:$pretrained_model"
echo "分辨率:$resolution"
echo "批量大小:$batch_size"
echo "训练深度:$network_dim"
echo "总epoch:$max_train_epoches"
echo "仅训练UNET:$train_unet_only"
echo "========================================"

# ============= DO NOT MODIFY CONTENTS BELOW | 请勿修改下方内容 =====================
export HF_HOME="huggingface"
export TF_CPP_MIN_LOG_LEVEL=3

extArgs=()
launchArgs=()
if [[ $multi_gpu == 1 ]]; then launchArgs+=("--multi_gpu"); fi

if [[ $is_v2_model == 1 ]]; then
  extArgs+=("--v2")
else
  extArgs+=("--clip_skip $clip_skip")
fi

if [[ $parameterization == 1 ]]; then extArgs+=("--v_parameterization"); fi

if [[ $train_unet_only == 1 ]]; then extArgs+=("--network_train_unet_only"); fi

if [[ $train_text_encoder_only == 1 ]]; then extArgs+=("--network_train_text_encoder_only"); fi

if [[ $network_weights ]]; then extArgs+=("--network_weights $network_weights"); fi

if [[ $reg_data_dir ]]; then extArgs+=("--reg_data_dir $reg_data_dir"); fi

if [[ $optimizer_type ]]; then extArgs+=("--optimizer_type $optimizer_type"); fi

if [[ $optimizer_type == "DAdaptation" ]]; then extArgs+=("--optimizer_args decouple=True"); fi

if [[ $save_state == 1 ]]; then extArgs+=("--save_state"); fi

if [[ $resume ]]; then extArgs+=("--resume $resume"); fi

if [[ $persistent_data_loader_workers == 1 ]]; then extArgs+=("--persistent_data_loader_workers"); fi

if [[ $network_module == "lycoris.kohya" ]]; then
  extArgs+=("--network_args conv_dim=$conv_dim conv_alpha=$conv_alpha algo=$algo dropout=$dropout")
fi

if [[ $stop_text_encoder_training -ne 0 ]]; then extArgs+=("--stop_text_encoder_training $stop_text_encoder_training"); fi

if [[ $noise_offset != "0" ]]; then extArgs+=("--noise_offset $noise_offset"); fi

if [[ $min_snr_gamma -ne 0 ]]; then extArgs+=("--min_snr_gamma $min_snr_gamma"); fi

if [[ $use_wandb == 1 ]]; then
  extArgs+=("--log_with=all")
else
  extArgs+=("--log_with=tensorboard")
fi

if [[ $wandb_api_key ]]; then extArgs+=("--wandb_api_key $wandb_api_key"); fi

if [[ $log_tracker_name ]]; then extArgs+=("--log_tracker_name $log_tracker_name"); fi

if [[ $lowram ]]; then extArgs+=("--lowram"); fi

#SDXL参数:1.train_unet_only必须打开(显存使用超过16G),(2.使用脚本sdxl_train_network.py),(3.使用参数--no_half_vae)
#python -m accelerate.commands.launch ${launchArgs[@]} --num_cpu_threads_per_process=8 "./sd-scripts/sdxl_train_network.py" \

if [[ $xl_flag == "1" ]]; then
  extArgs+=("--no_half_vae")
  script_file="sdxl_train_network.py"
else
  script_file="train_network.py"
fi

python -m accelerate.commands.launch ${launchArgs[@]} --num_cpu_threads_per_process=8 "./sd-scripts/$script_file" \
  --enable_bucket \
  --pretrained_model_name_or_path=$pretrained_model \
  --train_data_dir=$train_data_dir \
  --output_dir="./output" \
  --logging_dir="./logs" \
  --log_prefix=$output_name \
  --resolution=$resolution \
  --network_module=$network_module \
  --max_train_epochs=$max_train_epoches \
  --learning_rate=$lr \
  --unet_lr=$unet_lr \
  --text_encoder_lr=$text_encoder_lr \
  --lr_scheduler=$lr_scheduler \
  --lr_warmup_steps=$lr_warmup_steps \
  --lr_scheduler_num_cycles=$lr_restart_cycles \
  --network_dim=$network_dim \
  --network_alpha=$network_alpha \
  --output_name=$output_name \
  --train_batch_size=$batch_size \
  --save_every_n_epochs=$save_every_n_epochs \
  --mixed_precision="fp16" \
  --save_precision="fp16" \
  --seed="1337" \
  --cache_latents \
  --prior_loss_weight=1 \
  --max_token_length=225 \
  --caption_extension=".txt" \
  --save_model_as=$save_model_as \
  --min_bucket_reso=$min_bucket_reso \
  --max_bucket_reso=$max_bucket_reso \
  --keep_tokens=$keep_tokens \
  --xformers --shuffle_caption ${extArgs[@]} 
  

根据自己机器的显存适当调整下参数,例如我的16G显存的3070,就只能训练768x896的,然后根据1.5和SDXL的底模分开,这样就可以训练两个不同系列的大模型下的LORA了。区分起来很简单,命令行如下:

训练1.5的
nohup trainlora mylora &

训练SDXL的
nohup trainlora mylora xl &

对应的trainlora.sh如下(可以放到/usr/sbin下,输入命令直接启动):

#!/bin/bash
input_params=$@
cd /root/sd-webui-aki-v4.4
source venv/bin/activate
cd /root/lora-scripts/
./train.sh $input_params

用起来相当方便,在开始训练时,还可以打印相关的训练参数,以免弄错(错了就是至少半个小时啊。。。)

注意:

1)里面的pretrained_model路径对应大模型底模,根据自己的需要修改

2)训练的素材,是放到/data/models/Train/下的,所有的大模型数据等被我单独挂载到一个独立分区了,image_bak是备份历史训练数据

3)训练完成后,lora文件会输出到lora-scripts/output/里

4)你可以用tail -f命令查看nohup.out了解训练进度

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/applebomb/article/details/135037857

智能推荐

linux内存管理工具,Linux内存管理 (26)内存相关工具-程序员宅基地

文章浏览阅读230次。1. vmstat2. memstatmemstat可以通过sudo apt install memstat安装,安装包括两个文件memstat和memstat.conf。其中memstat.conf是memstat配置文件,指定memstat检索目录,里面应该包括主要的bin和lib目录。memstat通过遍历/proc下所有进程,然后解析内存使用情况。通过对比可以发现,memstat不会统计内..._memstat -p

计算机系统结构WINDLX实验——实验一-程序员宅基地

文章浏览阅读3.6k次,点赞6次,收藏38次。实验内容1. 首先将C 代码例子转化为DLX 代码,然后用DLX 代码进行简单的算术运算。 2. 提交DLX 代码的汇编文件。3. 依据你自己的汇编文件进行模拟,参考《WinDLX教程》的内容,记录模拟的相关结果。_windlx

推荐算法(六)—— xDeepFM 通俗理解及代码实战-程序员宅基地

文章浏览阅读6.2k次,点赞12次,收藏39次。目录1 介绍2 原理3 总结4 实验5 代码实践写在最后1 介绍本文为推荐系统专栏的第七篇文章,内容围绕 xDeepFM 的原理及代码展开。xDeepFM 是由中科大、北大、微软联合发表在 KDD’18 上的文章,颇为经典。论文传送门:xDeepFM: Combining Explicit and Implicit Feature Interactionsfor Recommender Systems代码传送门:xDeepFMxDeepFM 是 Wide & Deep 的改进版,在此基_xdeepfm

prometheus windows node-exporter安装_node exporter windows 版本-程序员宅基地

文章浏览阅读1.6w次,点赞2次,收藏2次。prometheus windowsserver端官网就有提供下载node-exporter这个应该是网友自己开发的。https://github.com/martinlindhe/wmi_exporter下载最新的版本。启动后的默认端口是9182..._node exporter windows 版本

在树莓派安装ubuntu20.04和ROS踩过的一些坑_command 'rosrun' not found, but can be installed w-程序员宅基地

文章浏览阅读3.8k次。关于SSH登录树莓派:我是先用外接屏幕连接树莓派,外接网线连接电脑,共享网络查得树莓派的IP地址。下载PUTTY,不得不说它的官网是真的拉胯...打开PUTTY,输入hostname -i,获取树莓派的IP地址。在PUTTY上输入地址:这样就在PUTTY上成功登录树莓派了。可以拔掉显示屏了,之后想用登录树莓派,得启动cmd,输入:arp -a第一个接口,挨个试IP,一般第一个是树莓派IP。关于换源update报错:问题:Er..._command 'rosrun' not found, but can be installed with: apt install rosbash

LinuxSSH和TCP Wrappers 访问控制_配置tcp wrappers ,对远程主机进行访问控制,仅允许-程序员宅基地

文章浏览阅读447次。文章标题SSH远程管理SSH定义SSH优点SSH配置文件SSH客户端和服务端OpenSSH配置OpenSSH 服务端配置Allowusers…… #仅允许某某用户登陆scp远程复制sftp安全FTPsshd服务支持验证方式TCP Wrappers 访问控制TCP WrappersTCP wrapper 保护机制的两种实现方式TCP wrappers 的访问策略SSH远程管理SSH定义SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程复制等功能。SSH协议_配置tcp wrappers ,对远程主机进行访问控制,仅允许

随便推点

VMware ESXi下载和安装_vmware esxi 6.0安装包下载教程-程序员宅基地

文章浏览阅读8.4k次。VMware ESXi下载和安装转载地址:VMware ESXI下载及安装转载地址https://blog.51cto.com/10802692/2409826_vmware esxi 6.0安装包下载教程

Spring的IOC原理以及思维导图_spring ioc工作原理图-程序员宅基地

文章浏览阅读1.8k次,点赞7次,收藏14次。什么是控制反转(IOC)?_spring ioc工作原理图

【NLP】华为推出了全球最大的中文语言模型-盘古-程序员宅基地

文章浏览阅读4k次,点赞3次,收藏9次。作者:金雪锋链接:https://www.zhihu.com/question/456443707/answer/1856014437这次HDC大会,华为联合鹏城发布了两个千亿的NLP大模..._华为手机的大语言模型

ERROR: Failed to resolve: com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.46-程序员宅基地

文章浏览阅读1.9k次。ERROR: Failed to resolve: com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.46忘记添加仓库,添加上就可以了_baserecyclerviewadapterhelper:2.9.46

VSAN 性能:使用许多低容量 SAS 还是使用一些高容量 SATA?-程序员宅基地

文章浏览阅读599次。原文:http://www.yellow-bricks.com/2013/11/14/vsan-performance-many-sas-low-capacity-vs-sata-high-capacity/注明:本文内容基于 VMware VSAN beta 版本撰写,请访问http://www.vmware.com/products/virtual-san/获得有关正式版..._vsan用sata还是sas盘

Java 使用LocalDate获取前一天_localdate 获取下一天-程序员宅基地

文章浏览阅读4.6w次,点赞11次,收藏10次。已经测试跨年跨月 LocalDate localDate = LocalDate.of(2019, 1, 1); LocalDate yesterday = localDate.plusDays(-1); System.out.println(yesterday.getDayOfMonth()); System.out.println(yesterday.g..._localdate 获取下一天

推荐文章

热门文章

相关标签