cross attention vs xformers (on A1111)
数か月、基本プログラムの更新がなくすっかり影が薄くなった感のあるA1111ですが、私は、ただ一つの機能が存在するが故にいまだに使い続けています。
その一つとは以下の記事にて詳説していますが、SDS1.5のi2iにおいてTiled DiffusionとControlNet Tileを併用した顔の書き込みに関してです。
どういう訳か、この効果はComfyUIでは再現できず、ForgeとreForgeはそもそもTiled Diffusion拡張機能をインストールできません。
(ほぼ同じ機能が初期搭載されているが同じ能力を持っていない)
特に目の書き込みに関してはFlux1でさえ、このSD1.5に及びません。
(当然肌の質感に関してはFlux1には遠く及ばないし、SD1.5ベースであっても肌の質感向上に関してはKakudai V1の方が向いている。それでも、目の書き込みという一点に関しては、上記事の方法が最強)
私はFlux1で生成した全身絵に対して、顔部分だけA1111のi2iで処理したピースをAdobe photoshop CCで当て込む事すらやっている位です。
(この工程に関しては、ComfyUIのFlorence2とseg辺りを使えば自動化できる気がする…要研究)
…
とまあ…この辺は只の前置きなんですがね。
本稿の要点は、その先です。
私のPCは…結論としてはメモリーの故障だった…ことにより2か月ほど盛大にトラブっていた訳ですが、
身も蓋もない話ですが、そもそもオーバークロックもしてないのに永久保証付きのDDR4 RAMが4枚全滅するって何でよ…て理由を考えた時に、「4枚刺ししてたから」以外の理由が思い当たらないんですね。
通常の使用形態でVRAM128GB(32GB×4)なんて本来必要ないんですが…それが唯一あった方がいい状況て何ぞや…て、はい、その通りです。画像生成AIですよ。
特に、Flux1。
しかし自作PCの観点から言えば、メモリー4枚刺しは人によっては「絶対やんなよ」と言っている位の手段でしてね。
昔はそれほどでもなかったんですが(DDR3主流の時代迄は)、DDR4からDDR5が主流になりクロックが上がってきた最近になって、特に言われるようになって来た事です。場合によっては定格クロックですら動作保証外になる訳ですが。
んで、話の要点は何よ...て言えば、今回の修理にあたり、メモリーは128GBを諦めて、32GB×2=64GBに戻してるって事です。
システムの安全性から言えば、文句なしに最良の方法なんですが、一方でここまで画像生成AIにおいては、その巨大なメモリー量を活かして作業してきた部分がある訳で、早速いくつかその弊害が出ています。
(システム設定は勿論、フォールバック優先にしていますが、専用VRAMと共有VRAMの切り替えの辺りは正直よくわからん部分です)
まず、下記事で公開しているFlux1ベースのUpscaler、Face Detailerの部分で、OutOfMemoryエラーが多発するようになりました。元々RTX4070 12GBではギリギリのプログラムなんですが。
尚、エラーを起こしても繰り返し実行すると、大体2回目か3回目かで通ります…不細工な話ですが、是非に及ばず。
さて、前置きが超絶長くなりましたが…ここからが本稿のタイトルに沿った話です。
SD1.5ベースの割に、上記事にあるA1111のi2iでもエラーが多発するようになってしまった訳です。
(尚、私はA1111からFlux1まで、完成版絵のサイズは縦幅に対して8K、縦幅4320pixelで固定しています。そのサイズでの処理を前提にした話です)
ただ、これは予想していました。
以前、搭載メモリーがまた64GBだった時期に、この工程でのOutOfMemory発生多発は経験しており、かなりギリギリで動作していることはわかっていたからです。
そして、メモリーを64GBから128GBに増設した際に、この作業が劇的に安定して高確率で完走するようになった経緯もありました。
...しかし、Flux1 Upscalerは繰り返しクリックすれば何とか完走するのに対し、SD1.5 i2iの方がOutOfMemoryでコケる確率が非常に高く、ComfyUIと違い、繰り返しクリックすれば通る…訳でもない為に、作業効率が超絶悪化して困っていた訳です。
で、その対策ですが、
ここからは当然環境次第で結果が異なる話なんですが、ここまで過去記事で何度も繰り返してきたように、RTX4000以上のGPUの場合、基本的にはxformersよりもcross attentionを使用した方が高速です。A1111でも、ベンチマークをかけた時にこれははっきりしています。
メモリー消費量削減効果でも理屈の上では、RTX4000以上においてはcross attentionの方がxformersよりも勝る…と言われています。
(実際にはモニター上でも、ほとんど違いを感じないが)
しかしComfyUIにおいては、low-vramやno-vramモードを使用した時に、強制的にcross-attentionからxformersに切り替わる仕様になっています。
という事は、ComfyUIの作者殿はVRAM消費においてはxformersはcross-attentionに勝ると考えていることになります。
そこで、A1111でxformersを使うとか1年以上振り…ではあるんですが、設定変えてみました。
@echo off
set PYTHON=
set GIT=
set VENV_DIR=
set COMMANDLINE_ARGS=--xformers --opt-channelslast --ckpt-dir="D:\USERFILES\ComfyUI\ComfyUI\models\unet" --lora-dir="D:\USERFILES\StableDiffusion\models\Lora" --embeddings-dir="D:\USERFILES\StableDiffusion\embeddings" --vae-dir="D:\USERFILES\StableDiffusion\models\VAE" --skip-python-version-check
set PYTORCH_CUDA_ALLOC_CONF=garbage_collection_threshold:0.6,max_split_size_mb:128
call webui.bat
…I see….劇的に完走率上がりましたね。
当然ですが、Pytorchは最新の2.5.1+cu124を使い、かつCUDAとCuDNNの手動更新をかけた上でですよ。
(尤も、CuDNN9.xにおいては大して効果はないでしょうけど…但し、Pytorch2.3.1以前…というかCuDNN8.xの場合は、この作業は必須と言っても良い位です)
それにしても、バリバリFlux1の時代に、まさかA1111のSD1.5ベースでOutOfMemoryとか、この感覚久しく忘れてましたよ。
元々、A1111はメモリー節約に関してはForgeとreForgeには大きく劣る訳で、ある意味仕方ない部分ですがね。
作者のほーちみん先生…最早ご自身の役割は終わった…と考えておられるのかもしれません...が、それでも、ここまでの先生の功績は偉大というしかありません。
先生がおられたからこそ、オープンソースの画像生成AIはここまで普及したのですから。