見出し画像

(sd-script)dynamic-methodを使用したLoRAリサイズの実験例


何これ

LoRAのリサイズに関する差異の設定ごとの影響を比較してみた。
バカデカいサイズのLoRAをある程度取り回し良くしたい時の変動具合を見たもの。
機能自体は数ヶ月前に既に実装されているので特段疑問もなく使いこなしている方々も多いとは思うが、ちょっと必要に迫られたのでついでに整理した。

事の発端

これを見ている人の中には、もしかしたら「1グロスのはずが10グロス注文してしまいました、助けて〜」などといった発注ミスのポストを旧Twitterで見たことがあるかもしれない。
その上で、「まさか自分はやらないだろう」と思ってはいないだろうか。
規模や被害状況を踏まえないなら、案外そうなり得る要素は各所に転がっている。

……なんて格好つけて序文を書いたが、単に自分が年初早々、LoRAを作るときに盛大に設定ミスを見逃して派手にやらかしたという話だ。

当初の予定:Kohya-Locon形式 (C3Lier) Dim/Alpha/ConvDim/ConvAlpha=128:32:32:16
実際の設定:Kohya-Locon形式  (C3Lier)Dim/Alpha/ConvDim/ConvAlpha=512:32:512:16

そう。最大でDim=128にしようとしていたところ、Dim=512になっているのを気づかずに学習させてしまっていたのだった。
この結果どうなるか?

容量1.16GBのフル学習でもしたんか? と言いたくなるLoRAが爆誕した。

SD1.5でこんなもん流石に常用したくない
が、何の因果か元のLoRAは破綻せず使えると言えば使える。
と、いうことでResize-LoRAで調整するか、というのが動機だ。

前提とリサイズ結果

前提

現在のsd-scriptには、リサイズ時に極力差異を減らすための仕組みが導入されている(らしい)。
細かいことはこのPRを見てもらうのがよさそうだ。なお実装はもう何ヶ月も前のことなので、当然多くの方々はすでに使いこなしていることだろう。

https://github.com/kohya-ss/sd-scripts/pull/243

リサイズのコマンド(基本的なもの)

例えばこんな感じで実行する。元・先のLoRAファイルや【】で囲った部分は適宜変更することになる。
なお見栄えのために改行を入れているのでコピペする際は修正のこと。

 ./venv/Scripts/python.exe "networks\resize_lora.py"
                         --save_precision 【fp16】 --save_to 
                         "N:/Picture/Train/after-Resize.safetensors"
                         --model
                         "N:/Picture/Train/before-Resize.safetensors" --new_rank
                         【新しいDim】 --device cuda --dynamic_method 【sv_fro】
                         --dynamic_param 【0.75】 --verbose

先ほどのPR内に記載があるが、Dynamic Methodの種類と推奨されるDynamic paramの値については一応以下で再掲する。

sv_ratio…2以上推奨。
sv_cumulative…0〜1の間。
sv_fro…0〜1の間。sv_cumulativeより高めの値を推奨とのこと。

https://github.com/kohya-ss/sd-scripts/pull/243#issuecomment-1454134947

今回はsv-ratioとDimの値を変えて差異を比較してみる。
なお、今回用意したLoRAではいくつか適当なキャラクターを覚えさせており、今回はそのキャラクターのうちの1人を呼び出している。一方で衣装についてはシンプルに「print kimono」で指定したもので、LoRA自体で追加学習しているものではないことは付記しておく。

sv-ratioを変えた例

まずは一覧から見てもらおう。一番左はリサイズ前の元のLoRAである。

一番左は元のLoRA

それぞれのリサイズに伴うファイル容量の推移は以下のようになった。
なお5があるのは元のPRで最初に5で実施した例があり、同一のサンプルを念の為用意したからだ。

sv-ratio=128…245MB
sv-ratio=96…199MB
sv-ratio=64…148MB
sv-ratio=32…88.6MB
sv-ratio=16…52.9MB
sv-ratio=8…30.9MB
sv-ratio=5…21.0MB
sv-ratio=4…17.3MB
sv-ratio=3…13.4MB
sv-ratio=2…8.91MB

全てfp16で実施

sv-ratio=128でリサイズしただけで(Dim未変更にも関わらず)ファイルサイズが1/4になっている。大きな差異が出ない範囲でとなると32くらいまでだろうか。ここまでくると元ファイルサイズの1/10以下になっていてありがたい。

sv-ratio=128としてDimを変えた例

こちらも同様にまずは一覧で比較結果を並べる。

一番左は元のLoRA

dim=16を境に大きな変化が出ている。
またファイルサイズの推移は以下の通り。

dim=256…241MB
dim=128…245MB
dim=64…129MB
dim=32…72.5MB
dim=16…37.0MB
dim=8…18.5MB
dim=4…9.75MB
dim=2…5.19MB
dim=1…2.91MB

dim=1とかが使い物になるかはテーマ次第と思われる

dim=128でなぜか256の時よりファイルサイズが大きくなった。
あえて深く考えないこととして、こちらも大きく差分がないくらいとするとdim=32あたりだろうか。

save_precisionを変更した例(おまけ)

こちらもまずは一覧で並べる。(ぶっちゃけ元キャラの特徴はだいぶん落ちているロットなので比較対象として微妙かもしれないが……)

無印はfp16

ほぼ間違い探しレベルだがbf16は太陽の位置など有意な差が見られる。
なおファイルサイズは以下の通り。

fp16…21.0MB
bf16…21.0MB
float…41.4MB

sv-ratio=5

floatに近い方をより正と仮に考えるならfp16でよさそう。

dynamic-methodを使わない場合との比較(おまけ2)

ついでにdynamic-methodを使わないリサイズの例を足しておこう。
それぞれのDimを128にリサイズした上で片方はdynamic-methodを使用せずにリサイズした。

左からリサイズ前、dynamic-mothod(sv-ratio=128)、dynamic-methodなし

それぞれのファイルサイズは(再掲含め)以下の通り。

リサイズ前…1.16GB
dynamic-methodあり…245MB
dynamic-methodなし…292MB

45MBほどの差が出た

間違い探しレベルではあるが、それぞれリサイズ前から微妙に差異がある。袖の模様、袖の形状、目の位置といった部分だ。
とはいえ差分箇所がより少ないのはこの例だとdynamic-methodありの方と言えそうで、さらに 45MBほど軽量化も実現できている以上、この例からは使用しない理由はない。

やってみての所感

PRの中でも言及があるが、「大きく作って小さく直す」ことが割と現実的そうだったので個人的には仕立て直しを真面目に検討しようと思った。
ただ今回の例はキャラの外見的特徴のみを主眼としているもので、追加学習した衣装の正確性までは含んでいない。
覚えさせたAというドレスの細かいパーツ再現を…という話になれば、今回結果よりもう少し上の値で設定する必要があるなどは当然想定される。

いずれにせよ、自分のやらかしで到底使えないくらいのサイズになってしまったLoRAを比較的影響ない範囲で仕立て直しができるような仕組みを提供してくれているkohya氏やPRの面々には感謝したいところである。

後自分自身は新年早々のやらかしなので少し実行ボタン押す前に気をつけようと思った。


この記事が気に入ったらサポートをしてみませんか?