LyCORIS

Last-modified: 2023-12-16 (土) 00:18:09

LyCORISとは

公式実装

https://github.com/KohakuBlueleaf/LyCORIS

概要

  • lycoris-Loraとは、sd-scriptsで利用可能な追加プログラム。
    学習用のアルゴリズムの集まり。
  • 開発者は、KohakuBlueleaf氏(琥珀青葉氏)。
  • lycoris-Loraの特徴は、パラメータ効率に優れた各種アルゴリズムを提供すること
    • LoRA(広義、学習の方式の意)の当初、アルゴリズムはLoRA-LierLa(狭義。旧名はLoRA)だけだった状況へ、
      より表現力が高いLoCon、LoHa等が登場する形となった。
  • その結果、アルゴリズムを提供するのは、下記のお二方が定着した(2023/6月時点)
    • KohakuBlueleaf氏がLyCORIS
    • kohya-ss氏(sd-scirptsの作者)がその他のアルゴリズム

発展の経緯

もっと見る
  • ('23/2/28) LoConちゃん誕生。sd-scriptを用いてのLoRA学習に利用可能な新しいアルゴリズム。1111用の拡張機能ではない。
  • 同時に、1111用の拡張機能a1111-sd-webui-locon(更新終了。a1111-sd-webui-lycorisが後継)も公開。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リポジトリ)の中に内包される形となった。
  • LyCORISになったことで1111用の拡張機能もa1111-sd-webui-lycorisに移行した。

LyCORISの機能

  • 追加アルゴリズム(オプション)
    アルゴリズムが新たに選択可能になる。
     
  • preset config system
    →学習する層を選択でき、より柔軟な学習が可能になる。

アルゴリズムの使い分け(早見表)

どれが一番ということはないが、下記の傾向はある。
詳細比較はこちら


LoRA/学習方法の学習結果で満足する出来だった。
 Yes → LyCORISは不要。(そのままLoRA-LierLaを使う)
 No  → LoConまたはNative Fine-Tuningを使う。

LoConのデータ重くね?
→LoKrやLoHaを使う。

VRAM消費が重い…
→LoKrやLoHaを使うか、
preset config systemで学習する層を減らす。

とにかく最高クオリティが良い(PCスペックには自信有り)
→Native Fine-Tuning + normから初めて、そこから学習する層を削っていくのが近道*1

Tips
アルゴリズムはウェイト行列の受け皿でしかなく、LyCORISはVRAM不足の人への救済措置的な立ち位置。
アルゴリズムはLoRAの汎用性や忠実性を変化させるものであり、学習失敗の救済手段ではない。という点に注意
LoRA作成は教師画像やタグ指定等の方が遥かに重要。LyCORISを過信しすぎないように。

 
過去の情報。2023/3~5月頃

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に当たるらしい リサイズ不可

導入~使い方

インストール方法

sd-scriptsの準備

lycoris-loraのインストール

インストール方法は、ここに書いてある通り。

https://github.com/KohakuBlueleaf/LyCORIS#for-kohya-script

 
解説をもっと見る

まずsd-scriptのvenvに入る(仮想環境をactivateする(詳細はこちら))

.\venv\Scripts\activate

そんで指定のURLからコピペしてインストール

git clone https://github.com/KohakuBlueleaf/LyCORIS
cd LyCORIS
pip install .
【解説】作業フォルダ(sd-scriptsフォルダ)に、LyCORISをgithubサイトからダウンロード。cdコマンドでLyCORISフォルダに移動。pip installでvenv仮想フォルダへインストール。

lycoris-loraのアップグレード

  • アップグレードするには、
    LyCORISをアンインストール(pip uninstall)して、再度導入するのが無難。

学習での使い方

  • 学習を実行するには、
    学習設定ファイルに--network_module指定部分の書き換えやら
    dimやalphaの設定などもあるのでREADME.mdをよく読んでほしい
  • batファイル内のnetwork_moduleにlycoris.kohyaを指定する。
    --network_module=lycoris.kohya ^
    さらに、セットで必要なオプションを追記する。下記は一例。
    --network_args "algo=lokr" "conv_dim=16" "conv_alpha=1" "dropout=0.1"

必要なオプションの記載内容はアルゴリズムによって異なります。記載内容はこのページか、下記を参照。
誘導→ LoRAの種類

学習データをStable Diffusion web UIで使う方法

アルゴリズムの種類と解説

LyCORISのネットワークモジュールに組み込まれているアルゴリズムの一覧です。
下に行くほど最新版です。(高機能・高性能とは限らない)

 

まずは、公式マニュアルを読みましょう。

LoCon

LoRA for Convolution Network、略してLoCon

解説

特徴その1.従来のLoRAよりも学習範囲が広い

  • 従来のLoRAでは学習できなかった層を学習でき、表現能力の限界が高い。
    図の黄色い層が新たに学習できるようになる。

221555165-7b0a1b96-0cc4-4ec4-bdd7-559a43002c65.png
引用:https://github.com/KohakuBlueleaf/LyCORIS/tree/locon-archive#difference-from-training-lora-on-stable-diffusion

  • 学習できる層の比較表
    LoRAは計17層に対し、LyCORISは計26層
    LoRABASEIN01IN02IN04IN05IN07IN08MIDOUT03OUT04OUT05OUT06OUT07OUT08OUT09OUT10OUT11
    LyCORISBASEIN00IN01IN02IN03IN04IN05IN06IN07IN08IN09IN10IN11MIDOUT00OUT01OUT02OUT03OUT04OUT05OUT06OUT07OUT08OUT09OUT10OUT11

特徴その2. 2次元畳み込みによる精細化&軽量化
こちらの画像1枚目を参照。LyCORIS Conventional Methods

画像1枚目に示すように…

画像1枚目に示すように、

  • 既存のLoRAの行列(リンク先の行列X,行列数はdim,これを解きたい)を、3行×3列のカーネル(行列W,これを解きたい)を用いて、行列Y(うまく言えないが教師画像をイメージするといい。固定値)に変換する。
  • 行列Xの一部に、カーネル(行列W)を重ねて行列Yを生む、という数式に変換する。
    カーネルWを行列X上で4回スライドさせて、それぞれY1~Y4を得る。
  • 一見パラメータ所要数はカーネルの分だけ増える(+行列W内の9個)。
    しかし実際は、カーネル行列1個がXの平均値(特徴)を担当することで、行列Xはカーネルとの差分(わずかな係数程度の情報)だけ担当すれば良いので、行列X内の各数値のムラは少なく計算の負荷は軽くなり、行列Xのdimを減らしても精度が保てるというカラクリ(たぶん)
  • その結果、
    LoRAアルゴリズムよりdimを減らしても同等以上の精度、具体的には教師画像の特徴(エッジやパターン)を正確に捉える。
    行列が単純であるメリットとして、短いEpoch数で計算が完了する(かも)

ちなみに、これはカメラのフィルタ(エッジ検出)でも使われている考え方です。
※意図的に技術を流用したのか、結果として似ているのかは知らん。

特徴その3. 行列の非線形→線形変換による計算効率化

上記の画像2枚目に示すように…

画像2枚目に示すように、行列Xの列数,カーネルWの行数を統一することで、
行列計算を簡単にします(大学で線形代数を勉強した人なら、手計算でも解きやすくなるのがわかるはず)

  • そのために、学習の際は、その階数を指定する必要があります。
    conv_dim,conv_alpha

※専門家ではないので上記には多分説明ミスがあります。ブログ等へのリンクは避けてね

 

としあきによる情報提供

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書き換えるだけで動いてくれる

LoConには3種類ありました

ちょっと紛らわしいのですが、LoConには3種類あります。
kohakuBlueleaf氏作のLyCORIS以外にも、kohya-ss氏のも含めた2種類あります。
効果はほぼ同じだと思いますが、3つ目のLoCon(LoRA-C3Lierとも言う)は、併用できるオプションが多いのでオススメかも*2

もっと見る

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' を指定しないと容量が少し減る恩恵があるけどリサイズが不可能になる

公式推奨設定

  • dim <= 64
  • alpha = 1 (またはそれ以下,たとえば 0.3)

LoHa

LoRA with Hadamard Product representation、略してLoHa
アダマール積表現によるLoRAの扱い。

  • アダマール積の解説。こちら
  • 教師画像に対する忠実さこそ他の方式に劣るが、過学習しにくい性質があるため、柔軟さが高い。複数の概念を学習するのに向いている*3
  • ファイルサイズは約100MBかそれ以下。軽量。
  • 海外の説明サイトによるとキャラ学習には向かない(?)らしい
もっと見る

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でも平気っていう実験結果に落ち着いた



変数の設定例 ※batファイル向け

  --network_module=lycoris.kohya ^
  --network_args "algo=loha" "conv_dim=16" "conv_alpha=1"

※dropoutに関しては未サポートにつき使えない。

公式推奨設定

  • dim <= 32
  • alpha = 1 (またはそれ以下)
  • なお、dim>64は未サポートです。Stable diffusionでは対応できないサイズです。

ただし、としあきコメントや検証結果等から分かる通り、
行列の構造上、単純計算でdim^2で効くため、
LoHa dim=8はLoCon≒64に相当する、とも言われています。
(厳密には違いますが、LoConよりも要求dimがずっと小さいのは経験上明らか)

(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(LoKR)

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

  • クロネッカー積を使用している。
  • このアルゴリズムはかなり敏感なので、lrをチューニングする必要があるかもしれません。
  • このアルゴリズムは、キャラクターとスタイルの両方を学ぶことができます。
  • 比較的小さなファイル(0.9MB~2.5MB)を生成します。
    • しかし、学習時と異なるモデルを使って生成するとパフォーマンスは下がる*4
  • factor値を小さくするほど、より大きなファイルが作成される。パフォーマンスを下げたくない場合はfactor値を下げると良い。
 

変数の設定例 ※batファイル向け

  --network_module=lycoris.kohya ^
  --network_args "algo=lokr" "factor=4"
  • factor値の公式推奨値は1~8。
    factorが大きいほどファイルサイズは小さくなるが、学習の忠実さは下がるとのこと。
  • Netrowk dim,conv dimは指定しない*5

さらにお好みでオプションを追加する。下記は一例

--network_args "algo=lokr" "factor=4" "train_norm=True"

※dropoutに関しては未サポートにつき使えない。

DyLoRA

2023年4月にリリースされたアルゴリズム。
https://github.com/KohakuBlueleaf/LyCORIS#dylora

Unitを指定できて、同時に複数のパターンを学習したあとから抜粋することが可能。
さらに学習後複数のDimに分割したLoRAを作成できる。

 

例 Dim32 Unit 4 の場合 分割は(4,8,12,16,20,24,28,32)になる。
よってUnit数は低ければ低いほどその分の効果向上が期待できると予測。
が、同時に1stepの所要時間もそれに応じて倍増してしまう。

Native Fine-Tuning(full)

Ver.1.9.0でリリースされたアルゴリズム。
プログラム上では「full」と呼ばれる。

  • 他の方式のように、解きたい追加ウェイト⊿Wを⊿W=A✕Bのように行列分解を行わない(=少ないパラメータでの近似・データ圧縮をしない)。
    LoRAのメリットである軽量さを損なうが、表現力の劣化は最小限…かも*6
    例:分解した場合とそうでない場合

    ⊿Wが3✕3行列だったとすると、

    • LoRA-LierLa:⊿W=A✕B。Aは3行1列、Bは1行3列で、パラメータは合計6個。
    • Native Fine-Tuning:⊿Wが3行3列なので、パラメータは合計9個
      このように、必然的にNative Fine-Tuningはパラメータが大きくなる。

特徴

  • 学習対象の層:LoKr,LoHaと同じ*7
  • 学習品質*8
    • 忠実さ:良好
    • 柔軟さ:良好
  • 学習速度: 速い。パラメータこそ多いが、ウェイトの行列積の計算が無いため。
  • VRAM消費:最も大きい
  • ファイルサイズ:最も大きい*9

設定方法

--network_module=lycoris.kohya
--network_args "algo=full"

さらにお好みでconv dim等を追記する。下記は一例で、値は適当です。

--network_args "algo=full" "conv_dim=32" "conv_alpha=1" "dropout=0.05"

使用上の注意

  • 学習パラメータが多い=1step辺りの学習進行速度(システム全体のウェイト累積)が大きいため、Learning rateは他のアルゴリズムよりも小さい値が要求されます。
    ※論文では、Lr=5.0✕10e-6程度の値が使われています。*10
  • VRAM量不足になる可能性が高い*11
    その場合は、後述のPreset選択を活用すると良い。

norm

Ver.1.9.0でリリースされたアルゴリズム
LayerNormとGroupNormを学習対象として追加する。
Normモジュール単独ではなく、ほかのアルゴリズムと併用します。

設定方法

有効化するには、"train_norm=True"を追記します。
algoはfull以外でも良いです。

--network_args "algo=full" "train_norm=True"

学習実行時に'NormModule'が表示されればOKです。

module type table: {'FullModule': 274, 'NormModule': 64}
 

GLoRA(開発中)

Ver.1.8.3現在開発中のアルゴリズムです。
GLoRAのソースコードは公開済みであり、試用可能です。

試用するには、最新版(main,devブランチどちらでも可)にgit pullした上で、下記に変更します。

 --network_args "algo=glora"
 

sd-scripts併用による学習は可能ですが、画像生成においては、SD web-UI (AUTOMATIC1111),gen_img_diffusers.py(sd-scripts)共に未対応で、生成できません。
唯一、sd-scripts学習時のサンプル出力を使えば、効果の検証ができます。

 

GLoRAに関する文献は、こちらにある通りです。
https://github.com/KohakuBlueleaf/LyCORIS/issues/68
深く目を通していませんが、学習中のウェイト計算にフィードバックを掛けて推論精度を向上させているようです。これはあくまで論文の話であって、LyCORIS制作陣が推論方法をどうコードに落とし込むかは検討中のようです。

 
検証結果 Ver.1.8.3時点

※まだ開発中のため、下記TIPS-「学習、検証結果」項ではなく、この項に書きます。

公開されている東北ずん子さんで学習しました。
GLoRAとそれ以外のアルゴリズムについて、学習の時系列順に並べています。

設定値:
file230808_5_training_command_zunko_GLoRA学習設定値(公開用).bat.txt
プロンプト(注:sd-scripts専用書式です。):
zunko, 1girl, solo, japanese clothes, muneate, tabi, hairband, kimono, smile, open mouth, very long hair, weapon, polearm, short kimono, full body, white background, standing on one leg, dark green hair, looking at viewer, standing, sandals, simple background, sash, tasuki, :d, obi, naginata, geta --n low quality, worst quality --d 1 --s 50 --w 704 --h 800

アルゴリズムdim←エポック1   エポック8→学習データ容量
GLoRAnetwork dim:28230808_zunko_GLoRA.jpg61.9MB
C3Lier
(≒LoCon)
network dim:64
conv dim:32
230808_zunko_C3Lier_dim32.jpg118.2MB
network dim:32
conv dim:32
230808_zunko_C3Lier_dim64.jpg76.2MB
LoKrnetwork dim:28230808_zunko_LoKr.jpg2.6MB

考察

  • GLoRAでは、早い段階でポーズ・画風・衣装の方向性が決定し、以降のハンチング感が少ない。学習のばらつきが少なく直線的に進む。
    それがウェイト推論を使うという独自技術の恩恵なのかも?
    • トップスが白、ボトムスが緑であることが3Epochで最終形と同じ。
      (オリジナルの着物の色とは違いますが、今回は上記と同配色の制服も学習させたのでやむなし。)
    • 片足上げは、3Ecpoh時点で最終形に近い
    • 早い段階で多くの特徴を認識して安定すると結果は、実用上、過学習しない好きなタイミングで学習データを回収しやすくなるというメリットをもたらします。
  • C3Lier(LoCon)の売りである高精細さは、LR設定を見誤ると、かえって所々破綻を生じさせがちなのが欠点でした。片足上げ崩壊、衣装太もも周り、あほ毛等
  • LoKrの特徴であるポーズ学習の強さ(不純物が混入しにくく、覚えが良い)にも劣っていない。
  • LoKrは教師画像と異なるアニメ塗りになってしまうが、GLoRAの方が画風に関してはオリジナルに近い。
  • 学習データの容量は、
    C3Lier(LoCon)>GLoRA>>LoKr @同等精度の出力結果で比較した場合。
    さすがにLoKrほどではないですが、小さいです。
    これについては開発中のGLoKrで解決するでしょう。
  • 学習速度は1it辺りの速度はどれも同じですが、C3LierのみVRAM消費が大きいため、batch sizeを減らした結果1.3倍程度時間がかかりました。
    つまり、LoKr同等の学習速度でLoCon並みの結果が得られます。
  • GLoRAはまだ推論用パラメータを開発中とはいえ、現段階でも十分な進化を予感させます。

    …上記検証結果だと、認知バイアスが入っているように見えますね。
    別途、自作のキャラ絵を何種類か学習させて、多人数を登場させると不純物の混入が明らかに少なく、よりGLoRAの良さが顕著でした。
    東北ずん子さんは学習素材としての絵の情報が、アルゴリズムの複雑さに対してシンプル過ぎるせいか、差異を体感しにくいみたいです。

Preset config system

Ver.1.9.0で追加されたシステム。
学習する層を任意に選択できる。

利用するメリット

  • VRAM消費量の削減
    • 一例として、RES層またはconv層の学習を制限するだけで、
      6.0GB→4.9GB(いずれもbatch size=1)まで低下する。
    • 層を削減した分、当然ながら表現力は落ちるが、
      学習の目的次第では気にならない場合がある。

使い方

Presetの選択

  • 下記のように、"preset=(preset名)"を追記します。
      --network_args "algo=lokr" "preset=full"
      --network_args "algo=full" "preset=full-lin"
  • preset未記入は「preset=full」選択時と同じ動作。
    これは、従来のLyCORIS動作と同じ*12
  • 選択できる登録済みpresetは下表の通り。
     
    学習対象preset名
    fullfull
    -lin
    attn
    -mlp
    attn
    -only
    unet
    -only
    unet
    -transformer-only
    unet
    -convblock-only
    enable_convTrueFalseFalseFalseTrueFalseTrue
    unet_target
    _module
    Transformer2DModel
    ResnetBlock2D
    Downsample2D
    Upsample2D
    CrossAttention
    unet_target_nameconv_in
    conv_out
    time_embedding
    .linear_1
    time_embedding
    .linear_2
    text_encoder
    _target_module
    CLIPAttention
    CLIPMLP
    text_encoder
    _target_name
    ※◯:学習対象、ー:学習対象外
    引用:lycoris/config.py
    各プリセットの公式解説はこちら
 

Presetの編集

Presetにない設定を試したい場合は、下記のようにプログラムを編集すると良い。
(非公式の方法)

  • config.pyを開きます。場所は、
    sd-scripts\venv\Lib\site-packages\lycoris\config.py
    • 下記の文章が表示されます。
      PRESET = {
          'full':{
              'enable_conv': True,
              'unet_target_module':[
                  "Transformer2DModel",
                  "ResnetBlock2D",
                  "Downsample2D",
                  "Upsample2D"
              ],
              'unet_target_name':[
                  "conv_in",
                  "conv_out",
                  "time_embedding.linear_1",
                  "time_embedding.linear_2",
              ],
              'text_encoder_target_module': [
                  "CLIPAttention", "CLIPMLP"
              ],
              'text_encoder_target_name': [],
      ※後略
  • 既存のPresetをコピペして、新しいPresetを作りましょう。
    Preset名*13は何でも良いです。
  • 学習しない層を除去しましょう。
  • 特にVRAM消費が大きいのは、下記です。
    はじめは、このあたりをコメントアウトすると良いのではないでしょうか。
    (学習にどのような影響が発生するかは、各自で要検証)
    • ResnetBlock2D → 削除
    • enable_conv: True → False
        "conv_in" → 除去
        "conv_out" → 除去

学習、検証結果

学習や検証を行った際の結果やTIPSを記載します。
体験談等随時募集中

としあきによる検証

  • LoConとLoHaの推奨設定
    LyCORISの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くらいで推移。

  • LoConとLoHaの使用感
    LoConとLoHaの使用感

    LoConとLoHaの使用感
    東北ずん子さんのアセットが公開されたのを知り「これ使えばもっと分かりやすく説明できね!?」と思い
    とりあえず低ステップで学習を回したときの覚えの良さを比較してみようと思いLoRaをいくつか作って検証してみました。
    lora_traning_locon_loha_1.jpg
    画像枚数61枚 ループ1回 エポック20回 総ステップ数 1220回
    プロンプト: zunko,standing,outdoor,<lora:zunko_xxx>
    縦軸の文字が使用した学習方式とdim値。横軸上の青の数値はそのlora出力時のステップ数(概算)です。
    やはりLoCon dim64は最高の画質を見せてくれますね。dim32も悪くない。LoHaの線の拾い方も的確です。
    …って最小値の305step時点でこんなに覚えてんのおかしくね? なんかバグってない?
    気になったのでさらに細かい段階に分けてloraを出力してみました。
    lora_traning_locon_loha_2.jpg
    224 step時点で明らかにキャラの特徴を掴み初め、次の305 stepではずん子の特徴的な色合いをした髪を確かに学習しているのが確認できます。
    すげえ…LyCORISアルゴリズムってこんな低ステップでキャラクターを覚えちゃうんだ。

    ちなみに何故LoConとLoHaの比較だけして旧来のLoRaを比較に含めなかったかと言うと
    どうしてもバグが出てしまい正常なLoRaの出力が出来なかったからです。何故か線の崩壊した画像しか出ないLoRaでした。
    しかし実際のところLoConが今の通常LoRaといえる存在ですし…不完全な検証を許してほしい。
    最後に、検証に使ったLoRaのそれぞれのファイルサイズは
    LoCon(dim64)が148MB、LoCon(dim32)が74.4MB、Loha(dim8)が37.3MB。
    互換性と安定性をとればLoCon、ファイルサイズと画質の良パフォーマンスをとればLoHa。
    今なら、このふたつの中から選択していいと思います。

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

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

    • 教師画像50~200枚、正則化なし、バッチ=1、clip_skip=2
    • resolution=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
  • LoKrの使用感
    もっと見る

    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>

    LoKrLoHa(比較参考)
    zunko_comparison_lokr.jpgzunko_comparison_lokr_loha.jpg

    私感:
    顔はそれなりに学習出来ているものの、枝豆のヘアバンドの再現度が低く10枚出したうちの2、3枚程度しか形を再現できなかった。
    胸当てもほとんど覚えることが出来ていない。など服装のフォルムが全体的に甘いようである。
    この辺りはLoKR独自の学習率の調整が必要ということなのだろう。
    ファイルサイズは 1.27MB。一般的なLora(144MB)の113分の1という小ささは凄い。

    比較参考用のLoHaは、シード値とプロンプトも同一にしましたがLoRAが変わったことにより若干の変化が絵に生じてしまいました。

LyCORIS公式で提供された検証報告

各アルゴリズムの比較

どのアルゴリズムを選択するべきか、参考になる情報を提示します。

使い勝手

LyCORIS公式による早見表

https://github.com/KohakuBlueleaf/LyCORIS/blob/main/docs/Guidelines.md#summary-table

VRAM,ファイルサイズ

学習時間、VRAM消費量、ファイルサイズ比較表

https://github.com/KohakuBlueleaf/LyCORIS/blob/main/docs/Guidelines.md#training-time-vram-usage-file-size

各アルゴリズムのマージ可否(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

コメント

  • AttributeError: 'ExtraNetworksPageLyCORIS' object has no attribute 'get_sort_keys'
    というエラーになってしまい、lycorisが使えません。解決方法わかる方がいらっしゃったら教えていただきたいです。 -- 2023-06-04 (日) 18:57:37
    • 私も同様の現象になりgit-hubを確認すると、すでに多くの報告があがってました。現時点では作者の方が修正版をアップされ、その報告スレッドも閉じられてます。 -- 2023-06-05 (月) 07:34:03
  • ちなみにloconの方はなぜか使えます -- 2023-06-04 (日) 19:07:49
  • ページのレイアウト、特に順番を変更しました。はじめての人向けの可読性向上が目的です。今後時間を見つけて、学習時に指定するパラメータ一覧表を追記する予定です。 -- 2023-06-21 (水) 17:54:24
  • Prodigyの登場により、LoKRがかなり使いやすくなりました。
    Lr自動調整型オプティマイザーという特性がLoKRの敏感な特性に合っている。
    かつ、LoHaよりも自然な絵になりやすいです。
    大胆なLr調整しにくかったり、装飾品等の学習といった細かい所は未検証だけど、低容量2.5MB程度なので、ライトユーザーなら常用するのはアリです。 -- 2023-06-24 (土) 10:12:37
  • 最新(v1.4.1)だとLoraは使えてLycorisは使えないですね -- 2023-07-18 (火) 03:08:39
    • ↑訂正、再起動したら使えるようになりました -- 2023-07-18 (火) 03:59:16
    • 1.5.2時点でLoraフォルダでLycorisが使えるのを確認。 -- 2023-08-27 (日) 21:09:08
  • 既存の学習率の公式を当てはめても、LyCORISを使うとステップ数やエポック数が全然違うから、適切な学習率を求めることができない。一応、既存の学習率を当てはめてるけど、ステップ数が何倍も違うから困った。書き出されたckptでその都度様子を見てるんだけど、どこで破綻するかわかったもんじゃない。 -- 2023-07-20 (木) 12:52:47
  • 昨日の夕方頃から急にLycorisが動かなくなった、何も弄ってないのに10分前と同じプロンプトで生成ボタンを押したらエラー吐くようになったがまた何かあったのか? -- 2023-09-03 (日) 06:22:22
  • sd-scripts本体の2023年10月1日版readmeにて導入するpytorchが2.0.1となりましたが2.0.1だとfullモジュールが上手くいかないみたいです。(Out of memory表示) -- 2023-10-03 (火) 23:20:09
    • その説明ですと、fullを使ったせいでVRAM不足(Out of memory)になっているみたいですね、Pytorchは関係ない気がします。現に私の環境(下図)では動いています。
      コメントページ_20231003_pip_list結果.png
      色々な事が遠因で動いていないのかもしれませんが。昨日、kohya氏がX(旧Twitter)で「不具合あればご報告ください」って言ってましたよ。; -- 2023-10-03 (火) 23:41:11
      • 失礼、言葉足らずでした。RTX4090で解像度512のバッチサイズ2でoutofmemoryは流石におかしいだろうとpytorchのバージョン戻したら学習動作したのでこれが原因かと思ったところ。pytorchを2.0.1にして再度検証して報告する形にします。 -- 2023-10-04 (水) 09:20:07
  • fullについて情報を追記しました。
    画像で検証結果を示したかったのですが、わかりやすい比較条件が見つからないので断念しました。文字説明だけで勘弁してください。 -- fullの筆者? 2023-10-07 (土) 20:12:58
    • fullの品質が高いのか、低いのか、反例があれば情報が欲しいです。(できれば理論的な理由も添えて) -- fullの筆者? 2023-10-07 (土) 20:18:35
  • full ってSDXL対応してますか? -- test? 2023-11-01 (水) 15:46:51
    • どんな目線と覚悟で質問しているかによるけれど、SDXLは非対応。
      一応理由を書いておくと、LyCORIS制作陣はSD1でしかテストしていない。kohya氏及び琥珀青葉氏の所有グラボ(せいぜいRTX4090だったはず)ではNFT(Native fine tuning)✕SDXLの検証は到底無理。家庭向け最強のRTX4090ですらSD1のNFTの全層学習がほぼ限界(某スレ報告より)。一般には、未検証=非対応扱い。
      NFTはSDXLに2つあるテキストエンコーダを学習対象にしていないので、本質的に対応できていない。SDXLしたいなら、まずLyCORIS以外で学習するスキルがあることが前提。
      preset configで学習層削ればSDXL使えるのかもしれないが、それは本質的にNFTと言えるか微妙。LoRA-C3LierやLoRA以外(ガチのfine tuning)でいいじゃん、となる。 -- 2023-11-01 (水) 21:10:03

(Tips)

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

*1 手持ち画像の種類や、それを完全にトレースすることが目的でないなら、単に全層使うのはデメリットにも成り得る。学習元の事前学習モデルのほうが、スタイル再現が理想通りというなら、そこに関連する層へはウェイトを加算しない方が理想通りになるはず。詳しいことはやってみないとわからない(それだけ選択肢が多いということが大事で、kohya-ssもKohakuBlueleaf氏もどれが一番良いとは断言していない)
*2 たとえば、Max Norm Regularizationとか
*3 引用:https://github.com/KohakuBlueleaf/LyCORIS/blob/main/docs/Guidelines.md#extended-version
*4 https://github.com/KohakuBlueleaf/LyCORIS/blob/main/docs/Guidelines.md#extended-version
*5 ただし、dim値は全く無意味というわけでもなく、factor値が未指定だった場合に、dim値を元にウェイト行列の大きさが決まる
*6 当たり前だが、低品質なデータセットを使って、おかしなdim値指定をユーザーがしたり、過学習させなければの話。その辺を明確にして初めてfullを評価できる。
*7 学習実行時の表示「create LyCORIS for U-Net: XXX modules」のXXX値が同じであることから、同じと判断した。
一方、後述preset等で学習レイヤーを削ったりするとXXX値が減ったり、NormModuleをONにするとXXX値が増えるなどすることから、そのXXX値は層の数と相関があるのは間違いなさそうだった。

*8 引用:https://github.com/KohakuBlueleaf/LyCORIS/blob/main/docs/Guidelines.md#summary-table
*9 学習するパラメータが多いので、これは仕方ない。
*10 参考:https://arxiv.org/abs/2309.14859
*11 少なくとも、既存のLoCon等と比べても格段にVRAM消費量が多い
*12 presetを使わないユーザーのことを考えるとおそらくそうなるべき。LyCORIS公式の解説がないので不明。実はちょっと違うかも。
*13 full,full-linの部分