Stable Diffusion WebUI メモリ削減&高速化(VRAM6GB環境)
Stable Diffusion WebUIで私が普段使用している設定について速度と出力を検証した。十分なVRAMを確保できない環境でStable Diffusionを使う人に役立つ内容をまとめた。結論のみを読みたい場合はまとめを読むと良い。
※個人の備忘録であり、正確性を完全に保証できない。
環境
CPU : i7-10875H
GPU : RTX3600-laptop (6GB)
stable-diffusion-webui version [4c1ad74]
Model : untitled-replicant
非推奨の設定
Webブラウザ
ハードウェアアクセラレーションを切る。
GPUがブラウザ関連の処理を行わなくなり、GPUメモリの消費をわずかに削減できる。生成時間には全く影響がないため、0.1GBすら惜しいような状況でもない限りわざわざ設定する必要はない。
グラフィックの設定
ハードウェアアクセラレータによるGPUスケジューリングを切るとわずかにパフォーマンスが上がるという噂があったが、全く効果がないことがわかった。少なくともこの環境では生成速度に変化が見られなかった。
ライブプレビュー
初期において、プログレスバーのレンダリングが生成を遅くするとの噂があった。現在では、プログレスバーの表示・ライブプレビューの表示はいずれも生成速度に影響しないようだ。
--medvram
VRAMの削減効果がある。後述するTiled vaeのほうがメモリ不足を解消する効果が高いため、使う必要はないだろう。生成を10%ほど遅くすると言われているが、今回の検証結果では生成速度への影響が見られなかった。
生成を高速化する設定
コマンドライン引数による最適化
--xformer
生成を高速化し、メモリ消費を大幅に削減する。wikiによると適用前後で出力が少し変化するようだが、高速化するメリットが大きいため使用を推奨する。
この環境では生成時間が約73%に短縮された。
--xformers-flash-attention
xformerと合わせて使うオプション。wikiによると、SD 2.0系統のモデルによる出力の再現性が上がるらしい。xformerのみを適用した場合と比べて生成時間が約92%に短縮された。
上記を見比べてみてほしい。ほとんど違いがないことがわかるだろう。
メモリ消費を削減する設定
拡張機能によるメモリ消費の削減
Tiled vae
メモリの最大消費量を大幅に削減し、OOM(CUDA out of memory)を解消する。
使用しない場合の最大解像度は1024x1024が限界で、それ以上はOOMを引き起こす。この拡張を使うことで1024x1024 to 2560x2560が生成可能になる。画素数でいうとおよそ6倍にあたる。
バッチ処理による高速化テクニック
バッチ処理とは
複数の画像の生成を並列処理することで、1回の生成で複数の画像を得ることである。バッチ処理を行い1度に複数枚を生成する場合、1枚あたりの生成速度が向上する場合がある。
バッチ回数とバッチサイズ
「バッチ回数」はバッチ処理を行う回数である。「バッチサイズ」は1度に生成する画像の数を表す。例えば、バッチ回数4、バッチサイズ1の処理では「1枚生成する処理を4回」行うが、バッチ回数1、バッチサイズ4の処理では「4枚生成する処理を1回」行う。後者はバッチ処理による高速化の恩恵を受けられる場合がある。
基本的にバッチサイズが大きくなるほど1枚あたりの生成時間は短縮されるが、その分VRAMを消費する。VRAMの余剰が少なくなると処理が低速になるため、それらが釣り合う点を探す必要がある。
最適なバッチサイズ
バッチサイズ1 1.11s/it 1枚あたり1.11s/it
バッチサイズ2 2.10s/it 1枚あたり1.05s/it
バッチサイズ3 3.07s/it 1枚あたり1.02s/it
バッチサイズ4 4.18s/it 1枚あたり1.04s/it
バッチサイズ5 5.27s/it 1枚あたり1.05s/it
バッチサイズ6 6.99s/it 1枚あたり1.16s/it
計測を行った結果、バッチサイズ3か4が最適なことがわかる。
wikiによれば、VRAMに余裕がある場合はバッチサイズ8までは最適化の余地があるようだ。
まとめ
コマンドライン引数は--xformers --xformers-flash-attentionが良い
Tiled vaeを使おう
バッチサイズは1024×1024の場合は4が高効率である
その他の設定は必要がない
上記の適用により、1024x1024の生成が68s -> 43sまで高速化する。
最大解像度が1024x1024 -> 2560x2560に増加する。