–opt-sdp-attention,–opt-sdp-no-mem-attentionの使い方、xFormersとの併用についてを調査。

本記事ではStable Diffusion Web UIの画像生成を高速にする–opt-sdp-attentionや–opt-sdp-no-mem-attentionについて解説をします。次のような方におすすめの記事になっております。

  • Stable Diffusion Web UIの画像生成の時間を短縮したい。
  • opt-sdp-attentionについて詳しい背景を知りたい。
  • xformersを導入したいけど、GPUがNVIDIA製じゃなくてできない。
  • xformersと併用できるかどうかを知りたい。

opt-sdp-attentionとは?

opt-sdp-attentionは”Optimize Scaled Dot-Product Attention”の略です。Scaled Dot-Product Attentionを最適化するということです。–opt-sdp-attentionをStable Diffusion Web UIを起動するときのコマンド引数として指定するとStable Diffusion Web UIの画像生成を高速化することができます。

Scaled Dot-Product Attentionとは?

Scaled Dot-Product Attentionはディープラーニングモデルの部品のことで、入力のどこに注目すべきかどうかを判断する仕組みです。Attentionという言葉を聞いたことがあるかもしれないですが、それの一種です。Attentionが初めて世に出た論文”Attention Is All You Need“の中でAttentionの形状が2つ提案されてて、それの1つがScaled Dot-Product Attentionです。

–opt-sdp-attentionの使い方

メモ帳などのテキストエディタでStable Diffusionの起動スクリプトであるwebui-user.bat(MacやLinuxの場合はwebui-user.sh)を開きます。開き方ですがメモ帳を開いてファイルをドラッグアンドドロップします。すると起動スクリプトの中身を見ることができて編集することができます。8行目に

set COMMANDLINE_ARGS=--opt-sdp-attention

の一行を追加します。これで--opt-sdp-attentionが設定されます。後ほど、紹介しますがほぼ同じ手法である--opt-sdp-no-mem-attentionというオプションもあって、これも同様に指定することで適用されます。

set COMMANDLINE_ARGS=--opt-sdp-no-mem-attention

xFormersとの違いは?

xFormersもattentionの最適化です。ただし、最適化手法に違いがあります。

--opt-sdp-attentionの方が計算速度が速いという記載がStable Diffusion Web UIのgithubのwikiにあります。

May results in faster speeds than using xFormers on some systems but requires more VRAM. (non-deterministic)

Optimizations · AUTOMATIC1111/stable-diffusion-webui Wiki (github.com)

私の環境で検証した結果では速度の違いはほんのわずかな差でした。

–opt-sdp-attentionのメリット

  • NVIDIA以外でも動作する
  • xFormers未対応のコードに対しても有効。AnimateDiffなど

–opt-sdp-attentionのデメリット

  • メモリ消費(VRAM)がxFormersよりも大きい。
  • 非決定的(non-deterministic):同じ設定値でも生成される画像にランダム性が加わる。
    • 決定的にしたかったら–opt-sdp-no-mem-attentionも指定できます。性能は–opt-sdp-attentionに比べると計算速度、メモリ効率がほんのわずかに悪化します。

–xformers, –opt-sdp-attentionは併用できるのか?

–opt-sdp-attentionの気になる点としてはxFormersを併用したらもっと良くなるじゃない?ということです。そこでstable diffusion Web UIのソースコードを確認してみました。その結果、実装上はどちらか一方が採用されます。現時点(2023/9/20)では、両方を引数に指定するとxfomersが採用されます。つまり、両方を指定することに意味はありません。

検証してみた結果

最後に私の環境での検証結果について記載します。

  • GPU: RTX 3080Ti(16GB)
  • 解像度: 768×512
  • Batch count: 4

この設定で–xformers,–opt-sdp-attention,–opt-sdp-no-mem-attentionの違いについて調査しました。それぞれ5回生成してみた結果の中央値を記載します。

  • –opt-sdp-attention: 生成時間13.2s VRAM消費: 6.2GB
  • –opt-sdp-no-mem-attention: 生成時間13.7s VRAM消費: 6.2GB
  • –xformers: 生成時間13.7s VRAM消費: 6.2GB

正直どれもほぼ変わらないです。

–opt-sdp-attentionの非決定性を調査(non-deterministic)

生成される画像がどのぐらい非決定性が働くかを確認してみました。何度も生成して違いを確認しました。そのうちのサンプルが以下の画像です。手が若干違ったり、顔への光の当たり具合が違います。

全部で10回ぐらい試したのですが細部が若干変わる程度で、全体の構図には影響がない程度の非決定性なのであまり気にしなくても良さそうです。むしろこのぐらいの違いなら手の形がきれいになるまで繰り返し生成できるので逆に良いかもしれません。

結局どれを選べば良いか?

計算速度やメモリ消費、非決定性に関してはどれもほとんど変わらないです。なので、以下の2点を加味して–opt-sdp-attentionがおすすめです。

  • NVIDIA以外でも動作する
  • xFormers未対応のコードに対しても有効。AnimateDiffなど

非決定性が問題になるケースがあるときは–opt-sdp-no-mem-attentionを使うので良いかなと思いました。

コメント