分享下自己改進的一個lora訓練腳本,在ubuntu下如果SD-WEBUI的環(huán)境已經(jīng)搭好的話,只需要下載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 | 參數(shù)化 本參數(shù)需要和 V2 參數(shù)同步使用 實驗性功能
train_data_dir="/data/models/Train/image/" # train dataset path | 訓練數(shù)據(jù)集路徑
reg_data_dir="" # directory for regularization images | 正則化數(shù)據(jù)集路徑,默認不使用正則化圖像。
# Network settings | 網(wǎng)絡設置
network_module="networks.lora" # 在這里將會設置訓練的網(wǎng)絡種類,默認為 networks.lora 也就是 LoRA 訓練。如果你想訓練 LyCORIS(LoCon、LoHa) 等,則修改這個值為 lycoris.kohya
network_weights="" # pretrained weights for LoRA network | 若需要從已有的 LoRA 模型上繼續(xù)訓練,請?zhí)顚?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 | 訓練相關參數(shù)
resolution="768,768" # image resolution w,h. 圖片分辨率,寬,高。支持非正方形,但必須是 64 倍數(shù)。
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 | 在訓練中添加噪聲偏移來改良生成非常暗或者非常亮的圖像,如果啟用,推薦參數(shù)為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 和 文本編碼器 的學習率時,該參數(shù)失效
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 | 學習率預熱步數(shù),lr_scheduler 為 constant 或 adafactor 時該值需要設為0。
lr_restart_cycles=1 # cosine_with_restarts restart cycles | 余弦退火重啟次數(shù),僅在 lr_scheduler 為 cosine_with_restarts 時起效。
# 優(yōu)化器設置
optimizer_type="AdamW8bit" # Optimizer type | 優(yōu)化器類型 默認為 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 | 保存訓練狀態(tài) 名稱類似于 <output_name>-??????-state ?????? 表示 epoch 數(shù)
resume="" # resume from state | 從某個狀態(tài)文件夾中恢復訓練 需配合上方參數(shù)同時使用 由于規(guī)范文件限制 epoch 數(shù)和全局步數(shù)不會保存 即使恢復時它們也從 1 開始 與 network_weights 的具體實現(xiàn)操作并不一致
# 其他設置
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 | 多顯卡訓練 該參數(shù)僅限在顯卡數(shù) >= 2 使用
lowram=0 # lowram mode | 低內存模式 該模式下會將 U-net 文本編碼器 VAE 轉移到 GPU 顯存中 啟用該模式可能會對顯存有一定影響
# LyCORIS 訓練設置
algo="lora" # LyCORIS network algo | LyCORIS 網(wǎng)絡算法 可選 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"
# 根據(jù)參數(shù)決定輸出的文件和訓練參數(shù)
# 參數(shù)1為output_name 參數(shù)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 "==========將以以下參數(shù)訓練模型=========="
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參數(shù):1.train_unet_only必須打開(顯存使用超過16G),(2.使用腳本sdxl_train_network.py),(3.使用參數(shù)--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[@]}
根據(jù)自己機器的顯存適當調整下參數(shù),例如我的16G顯存的3070,就只能訓練768x896的,然后根據(jù)1.5和SDXL的底模分開,這樣就可以訓練兩個不同系列的大模型下的LORA了。區(qū)分起來很簡單,命令行如下:
訓練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
用起來相當方便,在開始訓練時,還可以打印相關的訓練參數(shù),以免弄錯(錯了就是至少半個小時啊。。。)
注意:
1)里面的pretrained_model路徑對應大模型底模,根據(jù)自己的需要修改
2)訓練的素材,是放到/data/models/Train/下的,所有的大模型數(shù)據(jù)等被我單獨掛載到一個獨立分區(qū)了,image_bak是備份歷史訓練數(shù)據(jù)
3)訓練完成后,lora文件會輸出到lora-scripts/output/里文章來源:http://www.zghlxwxcb.cn/news/detail-775419.html
4)你可以用tail -f命令查看nohup.out了解訓練進度文章來源地址http://www.zghlxwxcb.cn/news/detail-775419.html
到了這里,關于【stable diffusion LORA訓練】改進lora-scripts,命令行方式訓練LORA,支持SDXL訓練的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!