改进lora-scripts,支持SDXL训练,以及启动脚本

分享下自己改进的一个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=0batch_size=3xl_flag=0
fiif [ "$2" = "xl" ]; thenpretrained_model="/data/models/checkpoint/theAllysMixXSDXL_v10.safetensors" #25DXL模型resolution="768,896" #使用768,1024都会爆显存,催悲train_unet_only=1batch_size=1xl_flag=1
fiecho "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=3extArgs=()
launchArgs=()
if [[ $multi_gpu == 1 ]]; then launchArgs+=("--multi_gpu"); fiif [[ $is_v2_model == 1 ]]; thenextArgs+=("--v2")
elseextArgs+=("--clip_skip $clip_skip")
fiif [[ $parameterization == 1 ]]; then extArgs+=("--v_parameterization"); fiif [[ $train_unet_only == 1 ]]; then extArgs+=("--network_train_unet_only"); fiif [[ $train_text_encoder_only == 1 ]]; then extArgs+=("--network_train_text_encoder_only"); fiif [[ $network_weights ]]; then extArgs+=("--network_weights $network_weights"); fiif [[ $reg_data_dir ]]; then extArgs+=("--reg_data_dir $reg_data_dir"); fiif [[ $optimizer_type ]]; then extArgs+=("--optimizer_type $optimizer_type"); fiif [[ $optimizer_type == "DAdaptation" ]]; then extArgs+=("--optimizer_args decouple=True"); fiif [[ $save_state == 1 ]]; then extArgs+=("--save_state"); fiif [[ $resume ]]; then extArgs+=("--resume $resume"); fiif [[ $persistent_data_loader_workers == 1 ]]; then extArgs+=("--persistent_data_loader_workers"); fiif [[ $network_module == "lycoris.kohya" ]]; thenextArgs+=("--network_args conv_dim=$conv_dim conv_alpha=$conv_alpha algo=$algo dropout=$dropout")
fiif [[ $stop_text_encoder_training -ne 0 ]]; then extArgs+=("--stop_text_encoder_training $stop_text_encoder_training"); fiif [[ $noise_offset != "0" ]]; then extArgs+=("--noise_offset $noise_offset"); fiif [[ $min_snr_gamma -ne 0 ]]; then extArgs+=("--min_snr_gamma $min_snr_gamma"); fiif [[ $use_wandb == 1 ]]; thenextArgs+=("--log_with=all")
elseextArgs+=("--log_with=tensorboard")
fiif [[ $wandb_api_key ]]; then extArgs+=("--wandb_api_key $wandb_api_key"); fiif [[ $log_tracker_name ]]; then extArgs+=("--log_tracker_name $log_tracker_name"); fiif [[ $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" ]]; thenextArgs+=("--no_half_vae")script_file="sdxl_train_network.py"
elsescript_file="train_network.py"
fipython -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 &

对应的mylora.sh如下:

#!/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了解训练进度

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/226966.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

黑色翻页时钟HTML源码-倒计时单页翻页时钟

黑色翻页时钟HTML源码-倒计时单页翻页时钟这是一个类似fliqlo的黑色翻页时钟HTML源码&#xff0c;它仅包含一个HTML文件&#xff0c;上传到网站后即可使用。该时钟具有查看当前时间、秒表和倒计时功能&#xff0c;并且可以在页面的右下角进行设置。 红色动态炫酷数字时钟html网…

【已解决】在使用poi-tl生成的word文档时候,怎么添加目录?poi-tl生成目录解决办法

需求&#xff1a; 需求的报告模板中大概包括标题、目录、前言、章节&#xff08;根据模板动态生成的标题文字表格图片&#xff09;&#xff0c;其中目录需要根据章节的实际情况动态生成。在网上没有找到什么好的解决方案&#xff0c;请教一下实现思路&#xff0c;非常感谢。 …

MATLAB 计算两片点云间的最小距离(2种方法) (39)

MATLAB 计算两片点云间的最小距离 (39) 一、算法介绍二、算法实现1.常规计算方法2.基于KD树的快速计算一、算法介绍 假设我们现在有两片点云 1 和 2 ,需要计算二者之间的最小距离,这里提供两种计算方法,分别是常规计算和基于KD树近邻搜索的快速计算方法,使用的测试数据如…

为什么选择国产WordPress:HelpLook的优势解析

如今网站建设可以说已经是企业必备。而在众多的网站建设工具中&#xff0c;WordPress无疑是其中的佼佼者。作为一款开源的CMS&#xff08;内容管理系统&#xff09;&#xff0c;WordPress拥有丰富的插件和主题&#xff0c;以及强大的功能&#xff0c;使得用户可以轻松地构建出符…

vivado约束方法8

无交互的逻辑互斥时钟组 逻辑排他性时钟是指在不同源点上定义但共享部分的时钟由于多路复用器或其他组合逻辑&#xff0c;它们的时钟树。时间限制向导识别此类时钟&#xff0c;并建议在它们这样做时直接对其进行时钟组约束除了连接到其共享时钟的逻辑之外&#xff0c;彼此之间…

半导体:Gem/Secs基本协议库的开发(5)

此篇是1-4 《半导体》的会和处啦&#xff0c;我们有了协议库&#xff0c;也有了通讯库&#xff0c;这不得快乐的玩一把~ 一、先创建一个从站&#xff0c;也就是我们的Equipment端 QT - guiCONFIG c11 console CONFIG - app_bundle CONFIG no_debug_release # 不会生…

Python 直观理解基尼系数

基尼系数最开始就是衡量人群财富收入是否均衡&#xff0c;大家收入平平&#xff0c;那就是很平均&#xff0c;如果大家收入不平等&#xff0c;那基尼系数就很高。 还是给老干部们讲的言简意赅。 什么是基尼系数 我们接下来直接直观地看吧&#xff0c;程序说话 # -*- coding:…

Chart.js 实现实时动态折线图 并限制最大长度

<!DOCTYPE html> <html><head><title>模拟</title><script src"https://lib.sinaapp.com/js/jquery/3.1.0/jquery-3.1.0.min.js"></script><script src"https://cdn.staticfile.org/Chart.js/3.9.1/chart.js"…

12345、ABCDE项目符号列表文字视频怎么制作?重点内容介绍PR标题模板项目工程文件

Premiere模板&#xff0c;包含10个要点标题12345、ABCDE项目符号列表文字模板PR项目工程文件。可以根据自己的需要定制颜色。在视频的开头、中间和结尾使用。包括视频教程。 适用软件&#xff1a;Premiere Pro 2019 | 分辨率&#xff1a;19201080 (HD) | 文件大小&#xff1a;9…

基于Java SSM框架实现疫情居家办公OA系统项目【项目源码+论文说明】

基于java的SSM框架实现疫情居家办公OA系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识…

加油站“变身”快充站,探讨充电新模式——安科瑞 顾烊宇

摘要&#xff1a;新能源汽车规模化发展的同时&#xff0c;充电不便利的痛点愈发明显。在未来的新能源汽车行业发展当中&#xff0c;充电的矛盾要远远大于造车的矛盾&#xff0c;解决好充电的问题成为电动汽车行业发展的一个突出问题。解决充电补能问题&#xff0c;重要的方式之…

分库分表以后,如何实现扩容?

在实际开发中&#xff0c;数据库的扩容和不同的分库分表规则直接相关&#xff0c;今天我们从系统设计的角度&#xff0c;抽象了一个项目开发中出现的业务场景&#xff0c;从数据库设计、路由规则&#xff0c;以及数据迁移方案的角度进行讨论。 从业务场景出发进行讨论 假设这…

msvcrtd.dll下载安装方法,解决msvcrtd.dll找不到的问题

在这篇文章中&#xff0c;我们将详细讨论msvcrtd.dll文件的下载安装方法&#xff0c;并分析出现找不到msvcrtd.dll的情况及解决方法。如果你遇到了与msvcrtd.dll相关的问题&#xff0c;本文将为你提供全面且详细的解决方案。 一.什么是msvcrtd.dll文件 首先&#xff0c;让我们…

透明PP专用UV胶水粘接PP材料高效率的提升生产效率

使用透明PP专用UV胶水粘接PP材料是提高生产效率的方法。以下方法&#xff0c;可以助您在生产中实现高效的PP材料粘接&#xff1a; ​1.选用合适的透明PP专用UV胶水 选择经过专门设计用于透明PP的UV胶水。这种胶水具有透明性&#xff0c;能保证粘接后的清晰度和外观。 2.自动…

vue中预览pdf的方法

使用vue-pdf 备注&#xff1a;这里只介绍了一页的pdf <div class"animation-box-pdf"><pdf :src"http://xxxx" /> </div>import Pdf from vue-pdf // src可以是文件地址url&#xff0c;也可以是文件流blob&#xff08;将blob转成url&a…

W25N01GV 芯片应用

项目中处于成本考虑&#xff0c;要把Nor Flash换成低成本的Nand Flash。 这里总结下芯片应用。 总体概述&#xff1a; 1&#xff09;W25N01&#xff08;NandFlash&#xff09;和W25Q&#xff08;Nor Flash&#xff09;的操作大不一样。 NandFlash擦除以块&#xff08;128KB&…

外包干了3年,技术退步明显。。。

前言 简单说下我的情况吧&#xff01;普通本科的科班生&#xff0c;19年的时候通过校招进了一家小自研&#xff0c;工资还凑合&#xff0c;在里面带了一年多&#xff0c;公司没了&#xff0c;疫情期间找工作很麻烦&#xff0c;后面就开始自己近3年的外包生涯&#xff0c;这三年…

如果你找不到东西,请先确保你在正确的地方寻找

之前我们在几篇文章中描述了如何进行”思想”调试&#xff0c;今天的文章我将不会这样做。 因为下面的编程错误大部分人都会遇到&#xff0c;如果你看一眼下面的代码&#xff0c;你不会发现有什么问题&#xff0c;这仅仅是因为你的的大脑只给你希望看到的&#xff0c;而不是那…

多线程 (上) - 学习笔记

前置知识 什么是线程和进程? 进程: 是程序的一次执行,一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间&#xff0c;一个进程可以有多个线程&#xff0c;比如在Windows系统中&#xff0c;一个运行的xx.exe就是一个进程。 线程: 进程中的一个执行流&#xff0…

seaborn库图形进行数据分析(基于tips数据集)

Seaborn 是一个基于 matplotlib 的数据可视化库&#xff0c;可以用来绘制各种统计图表&#xff0c;包括散点图、条形图、折线图、箱线图等。Seaborn 提供了一些用于美化图表的默认样式和颜色主题&#xff0c;使得生成的图表更具有吸引力。下面是一些 Seaborn 库的常用功能和用法…