こんなことで悩んでいませんか?
- 画像生成速度が遅い…
- スペック不足でCUDA out of memoryでStable Diffusionが落ちる
- パフォーマンス改善のオプションが多すぎて迷う。
本記事ではパフォーマンスチューニングに関するStable Diffusion Web UI(AUTO1111)のオプション引数を実際に使ってみて、速度とVRAM消費量を調査しました。またそれに基づいたおすすめのコマンドライン引数について解説します。
重要!2024/3/20に追記
Stable Diffusion WebUI Forgeが登場したことによって最適化が不要になりました。Stable Diffusion WebUI Forgeを使うことをおすすめします。こちらの記事で解説しているので是非参考にしてください。
おすすめのコマンドライン引数(VRAM消費と速度改善)
これらのコマンドライン引数はNVIDIAに限らずAMDやMacでも利用できます。
VRAMメモリに余裕があるなら※1
--opt-sdp-attention
わずかに生成時間が延びるけどVRAMメモリの消費量を抑えたい場合は※2
--opt-sdp-attention --medvram
生成時間が大幅に延びるどメモリ効率を最優先したい場合は※3
--xformers --lowvram
※1: 生成時間41.4s→17.9s、消費メモリ9.2GB→6.2GB(デフォルトとの比較)
※2: 生成時間17.9s→19s、消費メモリ6.2GB→5.8GB。(–opt-adp-attentionとの比較)
※3: 生成時間17.9s→42.1s、消費メモリ6.2GB→4.3GB(–opt-adp-attentionとの比較)
どちらも検証環境と設定値は次の通りです。
- Windows11、RTX 3080Ti(16GB)
- 設定値: バッチ数4、解像度768×512、ステップ数:20
Attentionの最適化系の引数
Stable Diffusionモデルの部品の一部であるAttentionの最適化に着目した手法が次の4つあります。これらは同時に利用することができないのでどれか1つを選ぶ必要があります。ちなみに複数選択すると、どれか一つが選択される実装になっていました。(優先度が設定されており一番優先度が高いものが選ばれる。)
--opt-sdp-attention
--opt-sdp-no-mem-attention
--xformers
--opt-split-attention
どれを選ぶべきかという話ですが--opt-sdp-attention
を私は使っています。これを使うことで画像生成時間(41.4s→17.8s)が半分以下になり、VRAM消費は33%減(9.2GB→6.2GB)なのでかなり効率化されます。ただし、生成される画像が同じシードであってもわずかに細部がランダム性を持つようになるのは注意しましょう。それが気になる場合は--opt-sdp-no-mem-attention
かxformers
をおすすめします。
--opt-split-attention
は速度面でもVRAM消費量の観点でも、効果が小さいのでおすすめしません。
--opt-sdp-attention
,--xformers
はほぼ同じ性能。
--opt-sdp-no-mem-attention
がほんのわずかに劣る性能です。
--opt-split-attention
,--opt-sdp-attention
,--xformers
についてさらに詳細な情報を確認したい場合は次を確認してください。
–xformersについてはこちらで詳細に解説しています。
スペック不足に効くオプション: VRAM→RAM転送系の引数(—lowvram, –medvram)
VRAM上の処理を一部、RAMへ移すことでVRAM消費を抑えることができるのが次の2つです。
- –lowvram
- –medvram
lowvramのほうがmedvramよりもRAMに転送する量が大きいです。--lowvram
はかなり生成速度が悪化するのでVRAMが4GBしかない環境でのみおすすめします。--medvram
は生成速度への影響が少ないので、お手軽に導入することができます。
CPU単体で動かす
そもそもGPUが搭載されていないけど、お試しで動かしたい場合に使えるオプションがあります。
- –use-cpu all –no-half –no-half-vae –skip-torch-cuda-test
この場合、GPUを使わずにStable Diffusion Web UIを動かすことができます。記載してすべてのオプションを指定する必要があります。--use-cpu
だけだとlaunch.py: error: argument --use-cpu: expected at least one argument
というエラーが発生します。--half-vae
と--no-half-vae
をつけないとRuntimeError: "LayerNormKernelImpl" not implemented for 'Half'
というエラーが発生します。1枚の画像を生成するのに2分ぐらい時間がかかります。
PC買い替えの際の注意点
パフォーマンス改善にも限界はあります。もし、PCの買い替えを検討していたらこちらの記事も参考にしてください。私がPC購入で失敗して後悔した経験をもとに注意すべき点について解説しています。
Appendix(付録)
ベンチマークの詳細
以下の条件で検証を行ったベンチマーク結果です。
- Windows11、RTX 3080Ti(16GB)
- 設定値: バッチ数4、解像度768×512、ステップ数:20
引数 | 生成時間(s) | VRAM消費量(GB) |
---|---|---|
なし | 41.4 | 9.2 |
–opt-sdp-attention | 17.8 | 6.2 |
–opt-sdp-no-mem-attention | 17.9 | 6.2 |
–xformers | 17.7 | 6.1 |
–opt-split-attention | 23.1 | 11.4 |
–xformers –medvram | 18.7 | 5.7 |
–opt-sdp-attention –medvram | 19 | 5.8 |
–xformers —lowvram | 40.3 | 4.2 |
–opt-sdp-attention —lowvram | 42.1 | 4.3 |
以前、調査した時と生成時間については差があるのであくまで参考に。Windowsの設定や動作しているソフトウェアによって数秒ずれる可能性があります。xformersとopt-sdp-attentionについては順位が頻繁に逆転します。
参考資料
本記事ではStable Diffusion Web UI(AUTO1111)の公式wikiに記載のあるパフォーマンスチューニングの資料をもとに実際に検証を行いました。本記事では現在使われてない引数や–no-half時に効果を発揮する引数などを省いているので詳細を確認したい場合は参考にしてください。
コメント