SDXLの軽量版モデルからアニメモデルをつくる

SDXLの軽量版とかいうのが出てきたのでこれをアニメ化します。

できたモデル

はい

https://huggingface.co/furusu/SSD-1B-anime

モデルについて

 このモデルは説明には載ってないですが、おそらくこの論文から着想を得ています。なぜそう言えるかというと同じ人がこの論文通りのSDv1.5軽量版をアップロードしてるからです。そちらはあんまり話題になってないですね。ただしSDXL軽量版モデルの構造は論文の説明と異なります。後でこっち用の技術レポートも公開されるみたいです。

  モデル構造として、各Transformerのレイヤーを一部削除することで、軽量化しています。mid_blockのみ2番目のResNetも削除しています。コサイン類似度を使って調査した結果、以下のような感じだと思います。
IN7, IN8, OUT0, OUT1が 10層⇒4層(おそらく1,2,3,7番目を残している)
MIDが10層⇒0層
OUT4, OUT5が2層⇒1層(おそらく1番目の層を残している)

ただしOUT2について層は減っていないはずですが、コサイン類似度の結果が不可解なものになっていたので、ちょっと怪しいところあります。

keyの対応表

蒸留方法

 論文にある通り、元のモデルと軽量化後のモデルの出力差を損失とするほか、各ブロックごとの出力も比較して損失に加えていると思われる。

マージ

 一部削除されたとはいえ、SDXLから学習されている以上差分マージが有効だと思われます。今回はNekorayXLというモデルを使ってみました。
SSD-1B + 1.3 * (NekorayXL - SDXL)
 削除されたモジュールがあるからか、効果が薄めだったので、1.3倍してみました。

マージモデルの蒸留

 できたモデルをさらにNekorayXLへ近づけるため、二つの出力の差を損失とする学習をしました。学習データは適当に集めたイラストです。中間出力の比較は実装が面倒だったのでやりませんでした。今回は学習率1e-5でバッチサイズ4を23000ステップやりました。

結果

プロンプト:masterpiece, best quality, 1girl,solo,blonde hair, twintails, hair libbon, school uniform, blue sailor collar, blue skirt, black thighhighs, classroom
ネガティブプロンプト:適当
サンプラー:euler
CFG_scale:7.0
シード:4545
30ステップでやってみます。

元のモデル

目標とするNekorayXLの出力です。

なんか左上人体崩壊してますが、適当なシードでやっただけなのでしょうがないですね。

SSD-1B

プロンプトにアニメスタイルであることが全く含まれていないので、リアルなのかアニメなのか中途半端ですね。

マージ後

ちゃんとアニメキャラクターっぽくなりました。ただし背景の表現力は失われているような。

蒸留後

元のモデルにかなり近くなったぞう。でもなんか横を向きたがる傾向にあるような。

速度

ComfyUIのプログレスバーを見た感じ、先ほどのバッチサイズ4、画像サイズ832×1216の生成で34秒⇒23秒でした。公式にある60%の高速化程ではないですね。削除した層の多くがAttention層なので、xformersによる最適化があると効果が薄くなるのかも。VRAM使用量はバッチサイズ1で8.9GB⇒6.6GBでした。VRAM使用量が減少するということはよりバッチサイズをあげられるということなので、限界までバッチサイズをあげればもうちょっと速度に差がでるのかもしれませんねえ。ComfyUIはこういうときに勝手に計算時間をg犠牲にしてVRAM使用量を落とそうとする機能があるため、速度比較には使いづらいです。

LECO

先月あげた記事の内容をこのモデルでやってみました。LoRAはモデルと同じ場所にアップロードしています。

cfg_scale=1

まあまあできてます。SDXLってなんかcfg_scaleを下げると霧がかかっていくような画像になります。このLoRAはそれを晴らす効果がありますが、まだちょっと残ってますね。
 ネガティブプロンプト側の計算が不要になることから、速度は23秒⇒13秒になりました。理論値は半分なんですが、並列計算の片方がなくなるだけなので、理論通りにはいかないっぽい。あとLoRAを計算する部分もありますが。

cfg_scale=3

クオリティをあげるLoRAとしても使えます。ただしこの場合もcfg_scaleは通常より低めに設定した方がいいです。

なんか全体的に赤いような・・・。

ControlNet

 SSD-1Bは各ブロックの出力も元のモデルと同じになるように学習しているため、ControlNetは既存のものでも効くっぽいです。

SDv1との比較

 性能自体はもっと頑張らないと勝てないと思いますが、SDXLだからこそのメリットはあるかもしれません。思いつくものをあげていきます。

  • テキストエンコーダがより強力

  • SDXLは生成解像度をモデルに入力するため複数の解像度に対応しやすい。

  • Revisionが使える。

  • 設計が効率的(ダウンサンプリングされた内側の層にAttention層が集中している)

  • 例のリーク要素を含まない・・?(学習データにリークモデルで生成された画像が含まれている可能性はある)