見出し画像

Near-sighed Attention

試してみたいことに書いた HyperTile + SlothfulAttention ですが、 なんかいけそうな気がしたので試してみたいと思います。


HyperTileを調査

HyperTile 未適用で、1024x1536 のサイズで出力してみます。
(大きすぎるんで、512x768に縮小して掲載します)

HyperTile未適用

SD1.5モデルにはかなりオーバーサイズですが、(ちょいちょいおかしなところはあるけども)生成できてますね。

これに、HyperTileをデフォルトパラメータ(サイズ:256、一番浅い層のみ)で適用してみます

HyperTile適用

速度的には 80%以上高速化できているので、大サイズの画像生成にはかなり有用かもしれません。 ただ、ディテールがあまりよろしくない感じです。(ComfyUIで試した結果です。WebUI側は問題ないかもしれません)

で、ComfyUIのソースを読んでみましたら

  • Self-attentionの Q をタイル分割(分割数はある程度ランダム)

    • 分割で増えたぶんはバッチ側につける

  • K, V は分割の前のものを使う

という挙動しているみたいです。 (……あれ、なんでこの実装で速度向上しているんだろう……Q x K の組み合わせ減ってないような……)

ともかく、Self-attentionは画像全域を見ているような感じですね。

Localだけ見るようにしてみる

HyperTile使用/未使用にかかわらず、学習時より多くのサンプルをSelf-attentionで参照してしまうと 特徴量がうまく抽出できないなどでうまく描画できていないのかもしれません。

そんなわけで、タイル範囲内のみ参照するとどうなるか実験してみます。 HyperTileを改造して、タイル分割した Q を Q, K, V として利用するようにしてみます。

ローカルだけ見るように改造した HyperTile適用

はい。顔のディテールはかなり良くなりました。ここは想定通りですね。

ただし、襟の形状が途中から変化してしまうなど画像全域の一貫性が弱くなっていたり、服の形状や陰影が和服から離れていたりと問題もありそうです。

Localをメインに、Globalも少し見るようにしてみる

K, V の削減は SlothfulAttention で実装済みですので、これを応用してみます。

4分割にした場合、ローカルの K は グローバル(分割前)の K の 1/4 のサンプル数になります。 これらを単純に結合してしまうと 1:4 の比率になってしまいますが、グローバルのKを削減すればサンプル数の比率を調整できそうです。

ローカル-グローバル比 1:1

ローカル-グローバル比 1:1

ローカル-グローバル比 2:1

ローカル-グローバル比 2:1

あ、なんか良い感じかもしれません。
グローバルのKを混ぜることで、ローカルのみの問題を軽減できそうです。

また、比率を調整することで、ローカルの特徴を重視するかのコントロールもできてそうです。(顔の描写とか)

全域パーフェクトとはいきませんが、この方向でかなり改善できそうです。

カスタムノード作成

K, V を削減するという機構は共通ですので、ついでにSlothfulAttentionの機能と融合させてみます。

今回作ってみたカスタムノード

あー……ちょっとパラメータ数が多くなってしまいますね。

実用的には、フル機能のNear-sited Attentionは使わずに FreeU など併用して調整した方が良さそうです。

※もうちょっとテストしたら公開します。

Near-sighted Tile

前述の通りの ローカルだけではなく グローバルを結合して K, V として利用するカスタムノードです。
パラメータ数が少ないので、使いやすいかと思います。

タイルサイズを小さくすると近傍への注目が強くなりますので、ディテールが改善することがあります。 また、ややコントラストが強くなりテクスチャも強調されます。

global_ratio で グローバルを混ぜる比率を上げると、画像の一貫性が改善します。 服の模様などに問題が生じる場合は global_ratioを上げると改善するかもしれません。

Near-sighted Attenion

Near-sighted Tile + Slothful Attention のカスタムノードです。

peak_timeで 効果を強くするタイムステップを指定できます。
t2iの初期ステップであまり強く働いてほしくない場合など調整できます。

tile_size と global_ratio については 基本値と peak_time地点での値を指定できます。

peak_time: 0.2 などで初期段階にピークを設定し、大きな peak_tile_size, 大きな peak_global_ratio を指定することで 構図・ポーズへの影響を弱くし、
後半ステップでは 小さな base_tile_size、小さな peak_global_ratio として ディテールを確保するなどが考えられます。

また、Slothful attentionの機能も使えますので、 AVG モードのブレンド率を上げることでソフトな描画にするなどもできます。

Near-sighted Attenion (Simple)

あまり使わなそうなパラメータを削除したり統合したりしたノードです。

  • モードは 2D_AVG

  • depth_decayは 1.5

  • k_blend と v_blend は共通の値を利用

  • in_strengthとout_strength は共通の値を利用

これでもまだ多いですね……

SD1.5 まだまだいける

SDXLいいですね

SDXL。素の状態でも出てくる画像の品質がなかなかに高いですよね。
SD1.5出力をアップスケールするのとは繊細さとかが違うというか。

……なんですが、手元のGPUが 8GB VRAM なのでSDXLはギリギリ推論ができる程度。学習はもちろん無理。 カスタムノード適用すると、すぐメモリ不足という状況。

このマシンじゃ無理かなーと諦めてたんですが、SSD-1B登場 + lcm-lora 対応したことで希望が見えてきて、 SD1.5環境からの移行を検討していたのですが、これでも学習がかなり厳しくてですね……

U-Net のみの lora学習が、batch=2 が限界で、SD1.5の数倍の時間かかるうえ。 Text側を学習させていないためか、結果が芳しくないと。
また、画像セットも SD1.5用に集めたので 512pxあたりのサイズがほとんどで、1024px集めるのしんどいなー。という状況でした。

あ、 SD1.5 まだ頑張れそう

たぶん僕以外の人も SDXL のモデルサイズが厳しいと考えているのだと思います。 VRAMの問題だけじゃなくて U-Net1回の計算量も問題になるので、動画とかリアルタイム返還とかには厳しそうな感じです。

その影響なのか、パラメータ数で殴るのではなく U-Netとかを細工して品質を上げていく方法を模索しているようで、 そういった手法の実装がここ最近結構増えてきたなーと思ってます。

今回の Near-sighted tileで、少なくとも 1024x1024 クラスまでは実用範囲になったかなーと思ってます

あとは構図が変わってしまう問題ですが、サンプラー2段以上にするとか
大先生たちが実装 した謎技術使うなどで、解消できそうな感じですね。

そんなわけで、SDXL環境への移行はまだまだ先になりそうです。


いいなと思ったら応援しよう!