皆さまいかがお過ごしでしょうか。歌乃です。
書いたつもりですっかり忘れていました( ゚Д゚)
タイトル通りの内容と、解決策というか対処法に関してです。
※今回は戯言少なめな内容でお送りしております。
まずは SVDQuant (Nunchaku) に関して。
要約すると、Dffusion モデルの新しい 4 ビット量子化手法です。
なんのこっちゃわかりませんね。わたしもよくわかってません( ゚Д゚)
技術的な内容は、開発元の hanlab のサイトで確認できます。
https://hanlab.mit.edu/projects/svdquant
要は「新しい方法で、生成モデルの大事な部分だけを圧縮したら、劣化を抑えて、爆速になったやん!」ということです。
んでこれを利用したモデル(と利用するためのライブラリ)が Nunchaku システムということです。
Nunchaku システムに関する資料はここで確認できます。
https://nunchaku.tech/docs/nunchaku/index.html
Nunchaku の python パッケージが必要になります。
Nunchaku の github リリースから環境に合わせた whl ファイルを入手して install します。
https://github.com/nunchaku-tech/nunchaku/releases
Nunchaku 用のカスタムノードが公開されてるので、そちらを ComfyUI にインストールします。マニュアルインストールでも ComfyUI manager からでもOKです。
システムに合わせた Nunchaku モデルをダウンロードします。
RTX50 シリーズは float4 、それ以外は int4 モデルが必要です。※うちは 3070 なので int4
Nunchaku カスタムノードに 含まれている sample work flow を使用して、画像生成できれば、一応目的達成です。
※基本モデルは Flux1 です。
Nunchaku カスタムノードにはLoRA Loader も含まれています。
使い方はいたって普通で 基本モデルにチェーンするだけです。
が、 エラーを吐いて止まります。再実行すると実行完了はしますが、LoRA が適用されません。
エラー内容は、LoRA ファイルのレイヤーに処理できない (見つからない、または余分な) Key (名前) があるとの事。
エラー内容でネット検索してみると、全く同じではないけれど、レイヤーの Key が見つからずエラーになる現象が散見されます。
ただし、すべての LoRA ファイル で起きているわけではなく、起きない LoRA もあるようで、たまたま、同じ LoRA を持っていたため試してみると、確かにエラーもなく適用されます。
自作 LoRA をいろいろ取り換えてみると、エラーを起こさないものがあったので、学習時の設定ファイルを確認してみたところ、text encoder の training を false にしたものがエラーを起こさないようでした。
その後、いろいろ調べてみると、Nunchaku は内部的に LoRA の形式を変換することで既存のLoRA をそのまま使用できるようにしている ということが判りました。
https://nunchaku.tech/docs/nunchaku/usage/lora.html#exporting-converted-loras
そしてこの変換時に、ライブラリでエラーを吐いているようです。
原因は分かったので、対処法として自作時に Text encoder の学習をしない。既存のものに関しては、Text encoder 部分の学習(重み) を切り離し(削除) してやればいいのでは、と思い至りました。
Text encoder weight 部分の切り離し方法として、何かないかしら、と調べたところ、Kohya_ss/sd-script 内に良いものがありました。
SD3 ブランチにある「convert_flux_lora.py」がそれです。Flux1 用の形式に変換するためのスクリプトですが、変換時に Text encoder 部分を Drop するようです。
使い方としては
python networks\convert_flux_lora.py --src_path lora_with_te.safetensors --dst_path lora_without_te.safetensors
のようにして使用します。
※09/23 追記。LoRA によっては変換に失敗するものもあります。私の学習環境は AI toolkit ですが、そちらで作成したファイルは問題なく変換できました。
これで既存の LoRA を Nunchaku で使用できるようになります (`・ω・´)