LyCORIS

Last-modified: 2023-05-27 (土) 16:27:07

LyCORISとは

https://github.com/KohakuBlueleaf/LyCORIS
1111用の拡張機能…ではない。
kohya-ss氏のsd-scriptで利用可能な、学習用のアルゴリズムの集まり。そのプロジェクト名。
具体的にはLoConやLoHaを含んでいる。

LoRAと共通する部分についてはLoRAのページも参考にしてください。

使い分け

409 無念 Name としあき 23/03/26(日)15:31:59 ID:pBMSpCYM No.1080413981 del そうだねx1

>それぞれの用途がわからなくて…
LoRAで作って満足する出来だった→LoRAでいい
 1ファイルdim128で144mb リサイズ可
LoRAで作ったのじゃ満足出来ない→conv2d、旧LoCon、lycoris_lora
 linerとconv両方dim128だと1ファイル297mb リサイズ可
LoCon重くね?→lycoris_loha
 dim値を2乗した数値がLoConの時のdimに当たるらしい リサイズ不可

経緯

  • ('23/2/28) LoConちゃん誕生。sd-scriptを用いてのLoRA学習に利用可能な新しいアルゴリズム。1111用の拡張機能ではない。
  • 同時に、1111用の拡張機能a1111-sd-webui-loconも公開。1111上でLoCon学習データを用いた画像生成を可能にするための拡張機能。この時点では1111本体の🎴やQuicksettingsからの利用にのみ対応。
  • ('23/3/2) 拡張機能a1111-sd-webui-loconがアプデされた。これによりAdditional Networks拡張機能からLoCon学習データによる画像生成を行うことも可能になった。
  • ('23/3/8) Additional Networks拡張機能がアプデされ、ANのみでLoCon学習データによる画像生成が可能になった。
  • ('23/3/9) LoRA学習に利用可能な新しいアルゴリズムとしてLoHaが公開。作者はLoConと同じ。
    これに伴ってLoConとLoHaはLyCORISというプロジェクト(≒GitHubリポジトリ)の中に内包される形となった。

LoHa

LoRA with Hadamard Product representation、略してLoHa

もっと見る

115 無念 Name としあき 23/03/09(木)17:08:17 ID:sKm9Ipgc No.1074467413 del そうだねx4
LyCORISのloha一発目のやつ完成した
network_dim=16,conv_dim=0
かなり覚えがいいように感じるしクオリティも高い
ちなみにWebUIの内臓機能には対応してるけどcomposable-loraの拡張とぶつかるから使う時はこれオフにしないと止まるね

125 無念 Name としあき 23/03/09(木)17:14:48 ID:sKm9Ipgc No.1074469129 del そうだねx3
同じdim16で比較するとLoConよりLyCORISの方が4MB多いな
ただ再現度は段違いだよこれ
ブルアカの学習したことがあればわかると思うけどヘイロー学習させるの難しいじゃん
かなりしっかり学習しててかなり驚いた

232 無念 Name としあき 23/03/09(木)17:59:30 ID:lg/ZS1k6 No.1074480979 del そうだねx4
LyCORISは複数のアルゴリズムを追加していくプロジェクトで今は
LoRA 今までのLoRA(LoConを含む)
LoHa ハダマード積表現によるLoRA(新作)
って感じかな

412 無念 Name としあき 23/03/09(木)19:20:54 ID:cFfpfOSc No.1074507811 del そうだねx1

>network_dimとconv_dimを両方128にしたら容量が594MBとかになりました・・・

>どう見ても過剰なのでrankをもっと低くしないとだめらしい

>サンプル見るかぎり(8,4)とかでいいのかな

LoConでdim8,alpha4だと38,169kbとかになるよ
それで完成度というか再現度はこのくらい
まぁ今まさにその上位?のLycorisとやらが出てるけど…

544 無念 Name としあき 23/03/09(木)20:14:51 ID:sKm9Ipgc No.1074531000 del そうだねx2
数パターンのLycoris作ってみたけど服のデザインとかちゃんと学習させたいならnetwork_dim16, conv_dim16は必要な感じ
服はどうでもいいならdim8でも平気っていう実験結果に落ち着いた

学習環境に導入する方法

  • まずLoRAを導入する必要があります。LoRAでの学習がまだできてない人はまずそっちからやろう。
  • ここに書いてある通り。
    https://github.com/KohakuBlueleaf/LyCORIS#for-kohya-script
    ざっと言うと、まずsd-scriptのvenvに入る(activateする)
    そんで指定のURLからコピってくる
  • 単純に「LoCon同様にlycorisフォルダをsd-scriptの中に置くだけでOKだった」という報告もある

他に--network_module指定部分の書き換えやら
dimやalphaの設定などもあるのでREADME.mdをよく読んでほしい

学習バッチ LoHa版
rem ----LoRA学習起動バッチ(LoHa対応暫定版)------------------------------------------------------
rem 学習対象のフォルダ内に置いて使用する
rem 10_AAA, 5_BBBフォルダがある場所の一つ上

rem 動作確認環境はメモリ48GB、VRAM12GBのPCを使用しているため
rem パフォーマンスモニターでメモリの使用状況をみながら
rem 各設定を少なめの数値から初めて動作確認してください

rem 以下のデフォルト設定は使用メモリ22GB、VRAM7.8GBで動作しました

rem SD-Scripts 2023/3/21版対応

rem 2023/03/29更新
rem   --min_snr_gammaオプションを追加

rem 2023/03/24更新
rem   Loha学習 暫定対応版(問題があったら修正してください)
rem   --network_argsオプションを追加
rem   --persistent_data_loader_workersオプションをついでに追加

rem 2023/02/23更新
rem   オプティマイザー変更について追記

rem 2023/02/01更新
rem   ファインチューン対応

rem 2023/01/31更新
rem   --lr_scheduler_num_cyclesオプション対応
rem   --lr_warmup_stepオプション対応

rem 2023/01/25更新
rem   --network_alphaオプション対応

rem 2023/01/18更新
rem   個別学習レート対応

rem 2023/01/17更新
rem   sd-scripts23/01/15版の新オプション使用(必要ならgit pullしてください)
rem   正則化対応

setlocal enabledelayedexpansion

rem ----ここから自分の環境に合わせて書き換える----------------------------------

rem sd-scriptsの場所
set sd_path="X:\stable-diffusion\sd-scripts"

rem 学習のベースモデルファイル
rem fp32よりもfp16の方が消費VRAMを抑えられるので推奨
set ckpt_file="X:\stable-diffusion\stable-diffusion-webui\models\Stable-diffusion\xxxx.ckpt"

rem 学習のベースVAE(必須ではないので使用しない場合は--vae=...の行を削除)
set vae_file="X:\stable-diffusion\stable-diffusion-webui\models\VAE\xxxx.vae.pt"

rem 学習画像フォルダ このフォルダ内に10_AAAなどのフォルダが入っていること
set image_path="X:\data\traning"

rem 正則化画像フォルダ(必須ではないので使用しない場合は reg_path="" とすること)
set reg_path=""
rem set reg_path="X:\data\reg"

rem メタデータjsonファイル(このファイルを指定するとファインチューン動作になり、json_file="" で従来のDBになる)
set json_file=""
rem set json_file="X:\data\marge_clean.json"

rem ファインチューンでのリピート数を指定 DBでのフォルダ名の数字は無視される
set ft_repeats=1

rem 学習結果の出力先
set output_path="X:\stable-diffusion\stable-diffusion-webui\extensions\sd-webui-additional-networks\models\lora"

rem 学習結果のファイル名
set file_prefix="last"

rem 学習パラメータ
set learning_rate=1e-3
rem 学習開始時にlearning_rateが指定値に到達するまでのステップ数 デフォルトは0
set lr_warmup=0

rem 個別の学習パラメータ デフォルトにしたい場合は全て上のlearning_rateと同じ値にする
set text_encoder_lr=1.5e-4
set unet_lr=1.5e-3

rem epoch数と何epochごとに保存するかの設定 1epoch=全フォルダの(画像数xループ数)の合計
set num_epochs=2
set save_every_n_epochs=1

rem スケジューラー 以下の文字列から選択: linear, cosine, cosine_with_restarts, polynomial, constant, constant_with_warmup
rem どれがベストかは要検証
set scheduler="cosine_with_restarts"
rem cosine_with_restartsのリスタート回数 デフォルトは1
set scheduler_option=1

rem 次元数 デフォルトは1 大きくすると学習能力が上がるが出力ファイルサイズが大きくなる
set network_dim=32

rem アンダーフローを防ぐための値 デフォルトは1
rem これによって計算結果がnetwork_alpha/network_dimとなって学習量が小さくなるため
rem learning_rateの方を大きくすることでバランスを取るといい
set network_alpha=1

set clip_skip=2
set seed=23

rem LyCORIS(LoCon,LoHa)用追加オプション
rem 上記の network_dim, network_alpha と合わせて設定するよう注意
rem 公式推奨値
rem LoConはdim=64以下、alpha=1~0.3
rem LoHaはdim=32以下、alpha=1以下
rem dropoutに関しては "LoHa doesn't support dropout yet." とのこと
set dim_for_conv=32
set alpha_for_conv=1
set dropout_rate=0.2

rem =========================================================================
rem VRAMなど環境に影響されるパラメーター 余裕があれば増やすと速度や精度が改善

rem CPUスレッド数 CPUのコア数がいいらしい
rem 増やすと生成速度が上がる代わりにメインメモリの消費が増えるので
rem メモリ32GBの人はCPUのコア数よりも減らした方が安定するかも
set cpu_thread=4

rem データローダーのワーカー数
rem デフォルトは8、減らすとメインメモリの使用量が減り、学習時間が増加
set workers=4

rem バッチサイズ: 増やすと計算が早く終わるがVRAM消費が増える
set train_batch_size=1

rem 学習素材の解像度: 大きくすると細部まで学習するが消費VRAMが増える
rem VRAM12GBなら768くらいまで増やせる
set resolution=512,512

rem 最小、最大バケットサイズ: 画像が正方形でなくてもresolutionの面積を超えない範囲で
rem 縦長、横長の画像も扱えるのでresolutionを増やしたらmax_bucketも合わせて増やすといい
set min_bucket=320
set max_bucket=960

rem 学習の改善に有効?
rem 詳細はsd-scriptsのgithubを参照
rem 推奨値は5
set min_snr_gamma=5
rem =========================================================================

rem ----書き換えここまで--------------------------------------------------------


set train_mode=""
if %json_file%=="" (
rem DBモード
  if %reg_path%=="" (
    set train_mode=--train_data_dir=%image_path%
  ) else (
    set train_mode=--train_data_dir=%image_path% --reg_data_dir=%reg_path%
  )
) else (
rem ファインチューンモード
  set train_mode=--train_data_dir=%image_path% --in_json=%json_file% --dataset_repeats=%ft_repeats%
)

rem 学習実行
cd /d %sd_path%
call venv\Scripts\activate.bat & call :main & pause & exit

:main

accelerate launch --num_cpu_threads_per_process %cpu_thread% train_network.py ^
    --network_module=lycoris.kohya ^
    --pretrained_model_name_or_path=%ckpt_file% ^
    %train_mode% ^
    --output_dir=%output_path% ^
    --caption_extension=".txt" ^
    --shuffle_caption ^
    --prior_loss_weight=1 ^
    --resolution=%resolution% ^
    --enable_bucket ^
    --bucket_no_upscale ^
    --min_bucket_reso=%min_bucket% ^
    --max_bucket_reso=%max_bucket% ^
    --train_batch_size=%train_batch_size% ^
    --learning_rate=%learning_rate% ^
    --lr_warmup_steps=%lr_warmup% ^
    --text_encoder_lr=%text_encoder_lr% ^
    --unet_lr=%unet_lr% ^
    --max_train_epochs=%num_epochs% ^
    --mixed_precision="fp16" ^
    --save_precision="fp16" ^
    --xformers ^
    --persistent_data_loader_workers ^
    --max_data_loader_n_workers=%workers% ^
    --save_every_n_epochs=%save_every_n_epochs% ^
    --save_model_as=safetensors ^
    --output_name=%file_prefix% ^
    --clip_skip=%clip_skip% ^
    --seed=%seed% ^
    --network_dim=%network_dim% ^
    --network_alpha=%network_alpha% ^
    --network_args "conv_dim=%dim_for_conv%" "conv_alpha=%alpha_for_conv%" "dropout=%dropout_rate%" "algo=loha" ^
    --max_token_length=150 ^
    --cache_latents ^
    --lr_scheduler=%scheduler% ^
    --lr_scheduler_num_cycles=%scheduler_option% ^
    --vae=%vae_file% ^
    --use_8bit_adam ^
    --min_snr_gamma=%min_snr_gamma%

exit /b

rem ※オプションの追加、削除時は^記号に注意
rem 最後の行には^は付けずにそれ以外は ^(半角スペースと^)を付ける

rem オプティマイザーを変更する方法
rem --use_8bit_adamの行を--optimizer_type="AdaFactor"に置き換える
rem ただし、消費VRAMが増えるためギリギリの環境では動かなくなる可能性があります
rem オプティマイザーに対する設定の--optimizer_argsは必須ではないので興味のある人は公式のReadme参照

rem LoConを出力する場合   --network_module=locon.locon_kohya ^
rem Lohaを出力する場合    --network_module=lycoris.kohya ^
rem network_argsのalgo=も loha と lora で切り替えられるらしい?(それぞれLoHaとLoConになる)

rem その他よく使いそうな追加オプション
rem --keep_tokens=数値
rem   トークンのシャッフルを有効にした際にシャッフルから除外するトークン
rem   公式によればトークン数はカンマで区切られた1ワード単位(usada,hikaruなら2トークン)
rem   webuiのトークンの概念とは異なるようなので注意(webuiではusadaはusa daと分けられて2トークン)

rem --no_metadata
rem   メタデータを記録しない

rem --training_comment=""
rem   コメントを埋め込む

学習データを画像生成に利用する方法

  • 拡張機能a1111-sd-webui-loconを導入し、🎴またはQuicksettingsからLoRAと同様に指定する。
  • 現時点ではAdditional Networks拡張機能はLoHaには未対応
    →解決済み。今からDyLoRA含む全種の学習データを使用するには、拡張機能a1111-sd-webui-lycorisを導入すると良さそう。
  • フォルダ階層例や使い方は、
    誘導→ 学習ファイルの使用方法

LoCon

LoRA for Convolution Network、略してLoCon

この部分を読むと分かる
「従来のLoRAでは学習できなかった層を学習させられるよ」ということ

290 無念 Name としあき 23/02/28(火)18:36:46 ID:nwLNMBGc No.1071572918 del +
LoConはこれだよ
LoRAだと学習させてない部分あるからsd-scriptsでそこも学習させちゃおうっていうアプローチ
かなりdim下げても学習するからLoRAよりファイルサイズ減らせると思う
https://github.com/KohakuBlueleaf/LyCORIS/tree/locon-archive

もっと見る

35 無念 Name としあき 23/02/28(火)01:16:17 ID:A9L5bLj. No.1071420022 del そうだねx10
LoConで学習させてきた
学習箇所が倍になるからLoRAと同じdimだと容量は2倍になるよ
しょんぼりルドルフで試した感じdim128のAdafactorでやったらいい感じ
もっとdim低くて平気だと思うわ
あとLoRAだと出力が汚くなったのがLoConだとダウンスケールとアップスケール部分も学習させてるからか線がくっきりになった
スゴく出力がきれい!すごい

255 無念 Name としあき 23/02/28(火)18:18:16 ID:nwLNMBGc No.1071567131 del そうだねx5
LoConがどんな性能なのかチェックするためにジャックオーチャレンジで実験したよ
dimを128から2まで7パターン作成して生成してみた
結果はdim2でも崩れることなく学習できた
LoRAで前に学習させたときは崩れたり過学習になったり苦戦したけどLoConだと打率がとんでもなく高い結果になった
実験でつくったジャックオーチャレンジLoCon全部と比較画像とかパラメータ詰め合わせ貼っておくね
これからの研究実験の参考にどうぞ
https://mega.nz/folder/JjJkEJaS#b7aTysH37HMqHOZG1K9lDg

299 無念 Name としあき 23/02/28(火)18:42:02 ID:rsACSD4k No.1071574679 del +
loconちゃんsd-scriptsにフォルダ突っ込んで--network_module書き換えるだけで動いてくれる

357無念Nameとしあき23/03/27(月)00:52:54 ID:GMGFHLIo[11]No.1080638411No.1080638411 ng+
現状loconの構造をするものは3つ存在している

・1つ目は旧locon kohakuBlueleaf氏作でlycorisに合併された奴
 ネットワークモジュールはlocon.locon_kohya --network_args 'conv_dim=XXX' 'conv_alpha=XXX'

・2つ目はkohakuBlueleaf氏作のlycorisでアルゴリズムLoRAにした時のやつ
 ネットワークモジュールはlycoris.kohya --network_args 'conv_dim=XXX' 'conv_alpha=XXX' 'algo=lora'

・3つ目はKohya氏がloconの有用性を確認したので取り入れたやつ
 ネットワークモジュールはnetworks.lora --network_args 'conv_dim=XXX' 'conv_alpha=XXX'


1つ目と3つ目は構造はほぼ同じだけどマージするときは専用のマージスクリプトが必要
リサイズもかけられる
2つ目のが少し厄介で、判明したオプション 'disable_conv_cp=True' を指定しないと容量が少し減る恩恵があるけどリサイズが不可能になる

LoRA学習環境にLoConを導入する方法

1つ目: 旧locon kohakuBlueleaf氏作でlycorisに合併された奴

https://github.com/KohakuBlueleaf/LyCORIS/tree/locon-archive
の中のloconフォルダだけsd-scriptsに突っ込む


次にこの部分↓を

--network_module=networks.lora


こう↓ 書き換える

--network_module=locon.locon_kohya

LoConで学習したLoRAデータを1111で画像生成に利用する方法

  • 🎴派、もしくはQuicksettings派の人
    まずこの拡張機能を導入する。
    https://github.com/KohakuBlueleaf/a1111-sd-webui-locon
    そんで1111の🎴、もしくはQuicksettingsからLoRAのように呼び出す。
  • Additional Networks拡張機能派の人
    2023/3/8のsd-webui-additional-networksアプデにより、LoConに対応した。
    なのでsd-webui-additional-networksを更新して2023/3/8以降のバージョンにするだけで、LoRAのように画像生成に利用可能になる。
  • フォルダ階層例や使い方は、
    誘導→ 学習ファイルの使用方法

(IA)^3

LyCORIS 0.1.5.dev1 より使えるようになったアルゴリズム。

  • このアルゴリズムは、より高い lr を必要とします (約 5e-3~1e-2)。
  • このアルゴリズムは素晴らしい学習様式ですが転用するのは困難です
  • (学習に使用したモデルでしか妥当な結果を得られません。)
  • このアルゴリズムは非常に小さなファイル (約 200 ~ 300 KB) を生成します。
  • 実験的
もっと見る

https://mobile.twitter.com/t_zunko/status/1641779055413579776
にて公式アセットを配布している東北ずん子のデータを無加工で使いLoRAを制作してみた。
画像枚数61枚 リピート1回 エポック数36回 バッチ数1 (総ステップ数:2196) 学習レート:1e-2
dim=8 cov_dim=8 alpha=1 conv_alpha=1 min_snr_gamma=5 optimizer:AdamW8bit
今回の目的は IA3 LoRA 生成テストのため高画質を目指した設定の詰めを一切行っていない。

サンプル用プロンプト:
zunko, 1girl, solo, school uniform, hairband, black thighhighs, serafuku, green skirt, full body, zettai ryouiki , shoes, very long hair, green hair, long sleeves, outdoor,<lora:zunko_ia3_7th_anime_v3_A:1>
zunko_ia3.png
7th_anime_v3_Aをベースモデルにしたもの
anything-v4.5をベースモデルにしたもの
両方とも同じ方法で制作し、ベースモデルのみを変えた。ファイルサイズも同じく208KB。

zunko_ia3_hires.jpg
(上記の画像とは別シード値のもの。Hires. fix 2.0倍: R-ESRGAN 4x + Anime6B 適応)

LoKR

LyCORIS 0.1.5.dev2 より使えるようになったアルゴリズム。
基礎となる部分はLoHaと同じで、下記が違う。

  • このアルゴリズムはかなり敏感なので、lrをチューニングする必要があるかもしれません。
  • このアルゴリズムは、キャラクターとスタイルの両方を学ぶことができます。サイズは小さいですが、転用するのは困難です。
  • 比較的小さなファイル(900~2500KB)を生成します。
  • 小さなファクターを使用すると、より大きなファイルが作成されます。2.5Mで十分でないと思われる場合は、調整することができます。
もっと見る

https://mobile.twitter.com/t_zunko/status/1641779055413579776
にて公式アセットを配布している東北ずん子のデータを無加工で使いLoRAを制作してみた。
画像枚数61枚 リピート1回 エポック数36回 バッチ数1 (総ステップ数:2196)
学習レート=1e-3 text_encoder_lr=1.5e-4 unet_lr=1.5e-3
dim=8 cov_dim=8 alpha=1 conv_alpha=1 min_snr_gamma=5 optimizer:AdamW8bit
今回の目的も LoKR の LoRA 生成テストのため高画質を目指した設定の詰めを一切行っていない。

生成に使用したプロンプト:
zunko, 1girl, solo, japanese clothes, muneate, tabi, hairband, very long hair, short kimono, full body, standing, green hair, tasuki, obi, outdoor,<lora:zunko_lokr:1>
zunko_comparison_lokr.jpg
私感:
顔はそれなりに学習出来ているものの、枝豆のヘアバンドの再現度が低く10枚出したうちの2、3枚程度しか形を再現できなかった。
胸当てもほとんど覚えることが出来ていない。など服装のフォルムが全体的に甘いようである。
この辺りはLoKR独自の学習率の調整が必要ということなのだろう。
ファイルサイズは 1.27MB。一般的なLora(144MB)の113分の1という小ささは凄い。

比較のためLoKRと同設定、同ステップ数で出力したLoHAの画像を添付します。
シード値とプロンプトも同一にしましたがLoRAが変わったことにより若干の変化が絵に生じてしまいました。
zunko_comparison_lokr_loha.jpg

(↓のバッチは初期設定がLoHaになっていますので任意で生成するLoRAの形式に変更するようご注意下さい)

LoRA学習起動バッチ 6タイプ+TOML対応テスト版
rem ----LoRA学習起動バッチ(6タイプ+dataset対応テスト版)------------------------------------------------------
rem 学習対象のフォルダ内に置いて使用する
rem 10_AAA, 5_BBBフォルダがある場所の一つ上

rem 動作確認環境はメモリ48GB、VRAM12GBのPCを使用しているため
rem パフォーマンスモニターでメモリの使用状況をみながら
rem 各設定を少なめの数値から初めて動作確認してください

rem 以下のデフォルト設定は使用メモリ22GB、VRAM7.8GBで動作しました

rem SD-Scripts 2023/4/19版対応

rem 2023/05/11更新
rem   データセットファイルに対応

rem 2023/04/20更新
rem   DyLoRA用パラメータ block_size に対応
rem   LyCORISのドキュメント更新に合わせLoCon生成のパラメータを以下のように修正した
rem     --network_args の algo を algo=lora から algo=locon に変更

rem 2023/04/12更新
rem   DyLoRAアルゴリズムに仮対応

rem 2023/04/09更新
rem   LoKRアルゴリズムに仮対応

rem 2023/04/05更新
rem   IA3アルゴリズムに仮対応

rem 2023/04/04更新
rem   ネットワークモジュールをオプションで切り替えられるように変更
rem   optimaizerのtypeとargsをオプションで切り替えられるように変更
rem   今までのコマンドラインを直接書き換える方式よりは手軽なはず

rem 2023/03/29更新
rem   --min_snr_gammaオプションを追加

rem 2023/03/24更新
rem   Loha学習 暫定対応版(問題があったら修正してください)
rem   --network_argsオプションを追加
rem   --persistent_data_loader_workersオプションをついでに追加

rem 2023/02/23更新
rem   オプティマイザー変更について追記

rem 2023/02/01更新
rem   ファインチューン対応

rem 2023/01/31更新
rem   --lr_scheduler_num_cyclesオプション対応
rem   --lr_warmup_stepオプション対応

rem 2023/01/25更新
rem   --network_alphaオプション対応

rem 2023/01/18更新
rem   個別学習レート対応

rem 2023/01/17更新
rem   sd-scripts23/01/15版の新オプション使用(必要ならgit pullしてください)
rem   正則化対応

setlocal enabledelayedexpansion

rem ----ここから自分の環境に合わせて書き換える----------------------------------

rem sd-scriptsの場所
set sd_path="X:\stable-diffusion\sd-scripts"

rem 学習のベースモデルファイル
rem fp32よりもfp16の方が消費VRAMを抑えられるので推奨
set ckpt_file="X:\stable-diffusion\stable-diffusion-webui\models\Stable-diffusion\xxxx.ckpt"

rem 学習のベースVAE(必須ではないので使用しない場合は--vae=...の行を削除)
set vae_file="X:\stable-diffusion\stable-diffusion-webui\models\VAE\xxxx.vae.pt"

rem 学習画像フォルダ このフォルダ内に10_AAAなどのフォルダが入っていること
set image_path="X:\data\traning"

rem 正則化画像フォルダ(必須ではないので使用しない場合は reg_path="" とすること)
set reg_path=""
rem set reg_path="X:\data\reg"

rem メタデータjsonファイル(このファイルを指定するとファインチューン動作になり、json_file="" で従来のDBになる)
set json_file=""
rem set json_file="X:\data\marge_clean.json"

rem ファインチューンでのリピート数を指定 DBでのフォルダ名の数字は無視される
set ft_repeats=1

rem データセットファイル(json,toml形式)
rem(このファイルを指定するとデータセットモード動作になる。使用しない場合は""とすること)
set dataset_file=""

rem 学習結果の出力先
set output_path="X:\stable-diffusion\stable-diffusion-webui\extensions\sd-webui-additional-networks\models\lora"

rem 学習結果のファイル名
set file_prefix="last"

rem 学習パラメータ
set learning_rate=1e-3
rem 学習開始時にlearning_rateが指定値に到達するまでのステップ数 デフォルトは0
set lr_warmup=0

rem 個別の学習パラメータ デフォルトにしたい場合は全て上のlearning_rateと同じ値にする
set text_encoder_lr=1.5e-4
set unet_lr=1.5e-3

rem epoch数と何epochごとに保存するかの設定 1epoch=全フォルダの(画像数xループ数)の合計
set num_epochs=2
set save_every_n_epochs=1

rem スケジューラー 以下の文字列から選択: linear, cosine, cosine_with_restarts, polynomial, constant, constant_with_warmup
rem どれがベストかは要検証
set scheduler="cosine_with_restarts"
rem cosine_with_restartsのリスタート回数 デフォルトは1
set scheduler_option=1

rem 次元数 デフォルトは1 大きくすると学習能力が上がるが出力ファイルサイズが大きくなる
rem 推奨設定 LoRA:128程度 LoCon:64以下 LoHa:32以下
set network_dim=8

rem アンダーフローを防ぐための値 デフォルトは1
rem これによって計算結果がnetwork_alpha/network_dimとなって学習量が小さくなるため
rem learning_rateの方を大きくすることでバランスを取るといい
rem 推奨設定 LoRA:network_dimの半分 LoCon:1かそれ以下0.3がお薦め LoHa:1かそれ以下
set network_alpha=1

set clip_skip=2
set seed=23

rem LoRA学習アルゴリズム指定
rem いずれかをコメントアウトして使用
rem 通常のLoRAなら networks.lora を有効化
rem LoCon、LoHa、IA3なら lycoris.kohya を有効化
rem set net_module=networks.lora
set net_module=lycoris.kohya

rem LyCORIS(LoCon,LoHa)用追加オプション
rem 上記の network_dim, network_alpha と合わせて設定するよう注意
rem 公式推奨値
rem LoConはdim=64以下、alpha=1~0.3
rem LoHaはdim=32以下、alpha=1以下
rem dropoutに関しては "LoHa doesn't support dropout yet." とのこと
set dim_for_conv=8
set alpha_for_conv=1
set dropout_rate=0.2

rem DyLoRA用で追加されたオプション
rem 下位ランクの複数同時学習の重みを1ステップごとに変える仕様のため低ステップ学習を行う場合は
rem 設定値を大きくして変化量を増やす必要がある…とのこと(よくわかってない)
rem デフォルト設定値は0
rem …のはずなのにそう設定するとエラーになるし、ソースを見ると1が初期値になっている
rem とりあえず今は block_size=8 ということにしておいて後々修正します
set block_size_dylora=8

rem 出力するLoRAについてのパラメータ指定
rem LoRAアルゴリズムで lycoris.kohya を指定した場合
rem LoHaを出力する場合は最上段のオプション(algo=loha)を有効化
rem LoConを出力する場合は上から2段目のオプション(algo=locon)を有効化
rem IA3を出力する場合は上から3段目のオプション(algo=ia3)を有効化
rem LoKRを出力する場合は上から4段目のオプションを(algo=lokr)を有効化
rem DyLoRAを出力する場合は上から5段目のオプション(algo=dylora)を有効化
rem network.lora で旧来のLoRAを出力する場合は最下段のオプションを有効化する
rem --以下1つのみコメントアウト--
set net_args= "algo=loha" "conv_dim=%dim_for_conv%" "conv_alpha=%alpha_for_conv%" "dropout=%dropout_rate%"
rem set net_args= "algo=locon" "conv_dim=%dim_for_conv%" "conv_alpha=%alpha_for_conv%" "dropout=%dropout_rate%"
rem set net_args= "algo=ia3" "conv_dim=%dim_for_conv%" "conv_alpha=%alpha_for_conv%" "dropout=%dropout_rate%"
rem set net_args= "algo=lokr" "conv_dim=%dim_for_conv%" "conv_alpha=%alpha_for_conv%" "dropout=%dropout_rate%"
rem set net_args= "algo=dylora" "conv_dim=%dim_for_conv%" "conv_alpha=%alpha_for_conv%" "dropout=%dropout_rate%" "block_size=%block_size_dylora%"
rem set net_args=


rem *** IA3 アルゴリズムの注意 ***
rem *** ある程度の時期が経ったらこの文章は削除して下さい ***
rem (IA)^3
rem This algo need much higher lr (about 5e-3~1e-2)
rem This algo is good at learning style, but hard to transfer(You can only get reasonable result on the model you trained on).
rem This algo produce very tiny file(about 200~300KB)
rem Experimental
rem (日本語訳)
rem このアルゴリズムは、より高い lr を必要とします (約 5e-3~1e-2)。
rem このアルゴリズムは素晴らしい学習スタイルですが転用するのは困難です
rem (学習に使用したモデルでしか妥当な結果を得られません。)
rem このアルゴリズムは非常に小さなファイル (約 200 ~ 300 KB) を生成します。
rem 実験的


rem オプティマイザーのタイプ変更
rem Adam,AdamW8bit,Lion,SGDNesterov,SGDNesterov8bit,DAdaptation,AdaFactor
rem の中から指定できる
set opti_type="AdamW8bit"

rem 以下の設定は optimizer_args のオプション指定
rem いずれかのひとつだけremを外して有効化するよう注意

rem オプション無指定
rem Adam,AdamW8bitのように追加オプション指定が不要の場合に有効化
rem 不安になる表記だがこれであっている
set opti_args=

rem DAdaptation用のオプション
rem テキストエンコーダとU-Netの学習比率を0.0から1.0の範囲で変えられる
rem 下の記述はテキストエンコーダの学習レートをU-Netの半分の値にして学習するという意味
rem set opti_args= --text_encoder_lr=0.5 --unet_lr=1.0

rem AdaFactor用オプション
rem 上側は学習レートの自動調整を有効にしたオプション。下側は無効にしたオプション
rem set opti_args= "relative_step=True" "scale_parameter=True" "warmup_init=False"
rem set opti_args= "relative_step=False" --lr_scheduler="constant_with_warmup" --max_grad_norm=0.0

rem =========================================================================
rem VRAMなど環境に影響されるパラメーター 余裕があれば増やすと速度や精度が改善

rem CPUスレッド数 CPUのコア数がいいらしい
rem 増やすと生成速度が上がる代わりにメインメモリの消費が増えるので
rem メモリ32GBの人はCPUのコア数よりも減らした方が安定するかも
set cpu_thread=4

rem データローダーのワーカー数
rem デフォルトは8、減らすとメインメモリの使用量が減り、学習時間が増加
set workers=4

rem バッチサイズ: 増やすと計算が早く終わるがVRAM消費が増える
set train_batch_size=1

rem 学習素材の解像度: 大きくすると細部まで学習するが消費VRAMが増える
rem VRAM12GBなら768くらいまで増やせる
set resolution=512,512

rem 最小、最大バケットサイズ: 画像が正方形でなくてもresolutionの面積を超えない範囲で
rem 縦長、横長の画像も扱えるのでresolutionを増やしたらmax_bucketも合わせて増やすといい
set min_bucket=320
set max_bucket=1024

rem 学習の改善に有効?
rem 詳細はsd-scriptsのgithubを参照
rem 推奨値は5
set min_snr_gamma=5
rem =========================================================================

rem ----書き換えここまで--------------------------------------------------------


set train_mode=""
if %dataset_file%=="" (
rem データセットファイルの有無を確認。なければjsonファイルの存在チェック
  if %json_file%=="" (
rem DBモード
  if %reg_path%=="" (
    set train_mode=--train_data_dir=%image_path%
  ) else (
    set train_mode=--train_data_dir=%image_path% --reg_data_dir=%reg_path%
  )
 ) else (
rem ファインチューンモード
  set train_mode=--train_data_dir=%image_path% --in_json=%json_file% --dataset_repeats=%ft_repeats%
)
) else (
rem データセットモード
   set train_mode=--dataset_config=%dataset_file%
)

rem 学習実行
cd /d %sd_path%
call venv\Scripts\activate.bat & call :main & pause & exit

:main

accelerate launch --num_cpu_threads_per_process %cpu_thread% train_network.py ^
    --network_module=%net_module% ^
    --pretrained_model_name_or_path=%ckpt_file% ^
    %train_mode% ^
    --output_dir=%output_path% ^
    --caption_extension=".txt" ^
    --shuffle_caption ^
    --prior_loss_weight=1 ^
    --resolution=%resolution% ^
    --enable_bucket ^
    --bucket_no_upscale ^
    --min_bucket_reso=%min_bucket% ^
    --max_bucket_reso=%max_bucket% ^
    --train_batch_size=%train_batch_size% ^
    --learning_rate=%learning_rate% ^
    --lr_warmup_steps=%lr_warmup% ^
    --text_encoder_lr=%text_encoder_lr% ^
    --unet_lr=%unet_lr% ^
    --max_train_epochs=%num_epochs% ^
    --mixed_precision="fp16" ^
    --save_precision="fp16" ^
    --xformers ^
    --persistent_data_loader_workers ^
    --max_data_loader_n_workers=%workers% ^
    --save_every_n_epochs=%save_every_n_epochs% ^
    --save_model_as=safetensors ^
    --output_name=%file_prefix% ^
    --clip_skip=%clip_skip% ^
    --seed=%seed% ^
    --network_dim=%network_dim% ^
    --network_alpha=%network_alpha% ^
    --network_args %net_args% ^
    --max_token_length=150 ^
    --cache_latents ^
    --lr_scheduler=%scheduler% ^
    --lr_scheduler_num_cycles=%scheduler_option% ^
    --vae=%vae_file% ^
    --optimizer_type=%opti_type% ^
	--optimizer_args %opti_args% ^
    --min_snr_gamma=%min_snr_gamma%

exit /b

rem ※オプションの追加、削除時は^記号に注意
rem 最後の行には^は付けずにそれ以外は ^(半角スペースと^)を付ける

rem その他よく使いそうな追加オプション
rem --keep_tokens=数値
rem   トークンのシャッフルを有効にした際にシャッフルから除外するトークン
rem   公式によればトークン数はカンマで区切られた1ワード単位(usada,hikaruなら2トークン)
rem   webuiのトークンの概念とは異なるようなので注意(webuiではusadaはusa daと分けられて2トークン)

rem --no_metadata
rem   メタデータを記録しない

rem --training_comment=""
rem   コメントを埋め込む

rem --network_weights="X:\stable-diffusion\stable-diffusion-webui\models\lora\xxxx.safetensors"
rem 追加学習させる学習データをフルパスで指定する

rem --weighted_captions
rem (abc)や[abc]や(abc:1.3)など重み付けしたキャプションによる学習に対応させる
rem 使用するベースモデルによっては警告文が表示されるので注意

DyLORA

2023年4月に導入した新しいアルゴリズム。
Unitを指定できて、同時に複数のパターンを学習しあとから抜粋することが可能。
さらに学習後複数のDimに分割したLoRAを作成できる。
例 Dim32 Unit 4 の場合 分割は(4,8,12,16,20,24,28,32)になる。
よってUnit数は低ければ低いほどその分の効果向上が期待できると予測。
が、同時に1stepの所要時間もそれに応じて倍増してしまう。

TIPS

体験談等随時募集中

学習、検証結果

学習や検証を行った際の結果やTIPSを記載します。

  • LoConとLoHaの推奨設定
    CORISのREADMEにある推奨設定でLoConとLoHaを比較した際の結果。
    もっと見る
    • マシンスペック
      CPU:i7-12800HX
      RAM:DDR5-4800 64GB
      GPU:RTX3070ti 8GB
    • 共通設定
      総step数2100
      教師画像30枚、正則化なし、繰り返し=1、バッチ=1、epoch=70、clip_skip=2
      resolution=768,768、min_bucket=320、max_bucket=1472
      thread=1、workers=8
      オプティマイザー adafactor、relative_step=True、scale_parameter=True、warmup_init=False
      lrは未指定
      タグはtaggerで付けて、キャラ名や作品名、重複しているものを排除
    • LoCon
      network_dim=64、network_alpha=0.3
      conv_dim=64、conv_alpha=0.3
    • LoHa
      network_dim=32、network_alpha=1
      conv_dim=32、conv_alpha=1
      LoCon-LoHa.jpg

    LoHaはキャラの顔学習だけなら600stepくらいでも良さそう。
    学習時間はVRAMが8Gと少ないのでどちらも3~4時間くらい。
    VRAM LoHaは学習中残り300Mくらい、LoConは600Mくらいで推移。

  • LoHaの使用感
    LoHaはdim=8の学習で服装やキャラを充分再現できる
    もっと見る

    筆者が学習に使用している設定

    • 教師画像50~200枚、正則化なし、バッチ=1、clip_skip=2
    • r-esolution=768,768、min_bucket=320、max_bucket=1472
      ※小さい画像は拡大した
    • オプティマイザー adafactor、relative_step=True、scale_parameter=True、warmup_init=False
    • lrは未指定
    • タグはtaggerで付けてキャラ名や作品名、重複しているものを排除
    • network_dim=8、network_alpha=1
    • conv_dim=8、conv_alpha=1
    • epochは20固定で繰り返しで1epochが200~300stepになるように調整
      LoHa1.jpg LoHa2.jpg LoHa3.jpg LoHa4.jpg
  • 1枚のイラストからコピー機学習
    1枚のイラストからコピー機学習でLoRA(LoHa)を作成した際の記録。
    もっと見る
    • ベースのイラスト
      copy01.jpg
    • 学習の手順
    1. 顔の学習
      最初はベースとなるイラストから顔部分を切り取ってi2iで表情差分を数枚作成する。
      copy02.jpg copy03.jpg
      作成した顔イラストで学習を行う。
      dimは32で過学習になるかならないかくらいのステップ数とする。
    2. 胸から上の学習
      顔を学習させたLoRAを使用して胸から上くらいのイラストを数枚生成する。
      これも表情、服装、ポーズ、構図の差分を数枚作成する。
      いきなり全身を出力させようとすると顔の書き込みが著しく下がったため、
      まずは胸から上を学習させた。
      copy04.jpg copy05.jpg
      生成したイラストを追加して再度学習を行う。
    3. 全身の学習
      胸から上LoRAを使用して全身のイラストを数枚生成する。
      copy06.jpg copy07.jpg copy08.jpg
      生成したイラストを追加して学習を行って完成。
      LoHaの場合、ここでdimは8や16に下げたほうが良い。
  • Lycorisのアルゴリズムにおけるマージ可否の比較表(2023/4/9)
    もっと見る

    395 無念 Name としあき 23/04/09(日)05:21:09 ID:d4xtadB6 No.1084932402 del そうだねx2
    Lycorisのマージの話が上であったから現状のLycorisのアルゴリズムまとめ

    lora/loconマージ可
    lora/locon use_conv_cp=True指定マージ可
    lohaマージ可
    loha use_conv_cp=True指定不可
    ia3不可
    lokr不可
    lokr use_conv_cp=True指定不可

    補足
    use_conv_cp=True時に作られるものはlora用の層が一つ追加された構造変更が入ってる
    現在のデフォはuse_conv_cp=False

コメント

  • lohaの次元数の指定(dim,con_dim)はかなり小さくていいらしい。loraと比べると2乗程度の違いがあるのでdim=8でもloraのdim=64程度の影響力があるとか -- 2023-03-27 (月) 01:09:02
  • ちょうど今日LoConってなんだ?と思って調べたらwikiにまとめてある
     神としか言いようがない -- sabu? 2023-03-27 (月) 22:33:56
  • ~--network_module= を書き換えるファイル名教えてくれませんか -- 2023-03-28 (火) 15:42:14
    • 俺はエスパーじゃないから、君の手元にあるバッチファイルの名前まではわからないなあ… -- 2023-03-28 (火) 16:45:09
  • コピー機学習ってこういう技法だったんですね。名前は知っていましたが手順までは知りませんでした。勉強になります -- 2023-04-07 (金) 20:43:47
  • DyLoRAのメモ
    DyLoRAは複数のDimを同時に学習できる仕組み、これにより学習後複数のDimに分割したLoRAを作成できる 例 Dim32 Unit 4 の場合 分割は(4,8,12,16,20,24,28,32)になる。使い方としては適正Dimを探るときの時間短縮か? -- 2023-04-21 (金) 04:29:35
    • Unitサイズは通常のDyLoRAでは1層ごとに学習しているのを指定した倍数の層のみ学習する?
      なのでUnitはDimを割り切れる数字で指定しないといけない、1stepで1層しか学習できないので通常のLoRAよりは学習に時間がかかる。 -- 2023-04-21 (金) 05:06:25
  • Lycorisは推奨設定使っても今一つパッとしなかったけど、間違ってどっちも64dim/32alphaにしたら何か好みの感じになった、LoRaもそうだけど正直ブラックボックス過ぎてよく分からん…ゆくゆくはこの辺りも整理されて最適解で作ってくれるアルゴリズムみたいなのが出てくるのかな -- 2023-04-22 (土) 21:36:53
  • LycorisってもしかしてLoraみたいに複数の概念を覚えさせるのって無理なのかな?トリガーワード使っても服装やキャラが呼び出されん・・。 -- 2023-05-16 (火) 18:42:48
  • ネットにあるLoRAにサイズ軽くて再現度かなり高いものもあるしLycorisがLoRAより小さいサイズで再現度高いってのは厳密には違うような気がする。 -- 2023-05-18 (木) 18:56:49
  • 本体の39ec4f0のコミットで拡張機能が動かなくなってるらしい https://github.com/AUTOMATIC1111/stable-diffusion-webui/issues/10342 -- 2023-05-21 (日) 22:22:14
  • 動かなくなったのはlocon廃止したのでLycorisを入れろとの事。あとLycoris・DyLoRAは複雑な設定が出来るLoRAという位置付けっぽいので上級者じゃなければ無理して使う必要はないかも。 -- 2023-05-27 (土) 16:27:07

(Tips)

  • 既存コメントの先頭にあるラジオボタンをONにすると、そのコメントの下にぶら下げ返信する形になります(ツリー構造)。
  • コメントの文中で↵ボタン(下の画像参照)を押すと「&br;」の文字列が挿入されます。これは送信後に改行として機能するので、文章の整形に役立ちます。
    br.png