Stable Diffusion web UIの高速化手法としてxFormersは聞いたことがあるのではないでしょうか。webuiをインストールした最初の段階でweb-user.bat
にオプションで--xformers
を追加された方もいると思います。
この記事で紹介するのは環境によってはxFormersよりも高速化するといわれている「SPDA」というものです。なし < xFormers < SPDAといわれていますがマイナーなのかあまり記事も書かれていないため、導入がてら備忘録として記事に残していきます。
SPDAとは
SPDAとはscaled dot product attentionの略称らしく、一般的にはAttentionと呼ばれるもののようです。以下元論文の引用です。
An attention function can be described as mapping a query and a set of key-value pairs to an output, where the query, keys, values, and output are all vectors.
The output is computed as a weighted sum of the values, where the weight assigned to each value is computed by a compatibility function of the query with the corresponding key.
https://arxiv.org/pdf/1706.03762.pdf
技術的な話はさっぱりなので丸投げします。気になる方はこの辺を読めば良いかもしれません。
Pytorch 2.0が正式にリリースされたことでSDにおいてもSPDAが使えるようになりました。前述しましたが環境によっては生成速度が「なし < xFormers < SPDA」の順に早くなるともいわれています。そのため暇なら試してみると良いかもしれないのがSPDAです。なお、SPDA使用で高速化するのはある程度のGPUを積んでいる場合かと思います。メモリがないと本領を発揮しないと思われるので。
注意点としては新しいものであるため記事も少なくトラブルが起きた際の対処が面倒だろうということ、高解像度の画像生成においては効果を発揮するが低解像度には効果がないらしいということです。
コマンドライン引数について
SPDAの導入を行う前にSPDA関連で用意されているコマンドライン引数について説明します。なお詳しいことは以下のGitHubを見てください。
ここでは--opt-sdp-attention
と--opt-sdp-no-mem-attention
のみ簡単に記載します。
--opt-sdp-attention
-
SPDAの計算においてメモリを使用するオプションのようです。SPDAにおいて計算されたAttentionを一時的にメモリに保存して後の演算に使用することで、計算効率が向上するようです。なお生成する度に絵が変わりやすい。
--opt-sdp-no-mem-attention
-
SPDAの計算においてメモリを使用しないオプションのようです。Attentionを一時的にメモリに保存しないことでメモリ使用量を減らすことができます。しかし、速度は
--opt-sdp-attention
よりも低下する可能性があるようです。こっちの方が絵の変化は少ない。
どちらのオプションを選択するべきかは環境によって異なります。例えばメモリが十分にある場合は--opt-sdp-attention
を選択することで計算速度を最適化することができると思われます。一方、メモリが不足している場合や、並列処理を行う際には--opt-sdp-no-mem-attention
を選択することでメモリ使用量を抑えながらSPDAを使用することができます。
メモリが不足している場合に無理して--opt-sdp-attention
をしようすると--opt-sdp-no-mem-attention
よりも速度が落ちる可能性も考えられますので、どちらのオプションが自身の環境に適しているかは独自に調査する必要がありそうです。
SPDAの導入方法
仮想環境の用意
仮想環境を上書きしてしまうとトラブルが起きた時に地獄をみると思いますので、現在使用しているものとは別の仮想環境を用意します。\stable-diffusion-webui\venv
のフォルダ名称を\stable-diffusion-webui\venv-xformers
などの適当なものに変更します。
続いて\stable-diffusion-webui
にて右クリックから (PowerShell) を開き以下を実行します。
python -m venv venv
すると\stable-diffusion-webui
直下にvenv
というフォルダが作成されます。
では以下のコマンドで作成した仮想環境に入ります。
venv\Scripts\Activate.ps1
仮想環境にPytorchをインストールします。
pip install torch==2.0.0 torchvision --extra-index-url https://download.pytorch.org/whl/cu118
このようになっていれば完了です。
なお有効化した仮想環境は以下のコマンドで無効化できます。
deactivate
webui-user.batの編集
webui-user.bat
をメモ帳で開き変更を加えます。set COMMANDLINE_ARGS=
からxFormers関係の引数(--xformers
など)を削除して以下を追加してください。
--opt-sdp-attention
前述したように--opt-sdp-attention
が駄目なようなら--opt-sdp-no-mem-attention
に変えて試してみると良いかもしれません。それと--opt-channelslast
も高速化に役立ったりしますので、SPDAの引数と一緒に追加してみると良いかもしれません。
@echo off
set PYTHON=
set GIT=
set VENV_DIR=
set COMMANDLINE_ARGS=--opt-sdp-attention --opt-channelslast
call webui.bat
動作確認
新規仮想環境の作成とwebui-user.bat
の編集が完了したら動作確認を行います。通常と同じくwebui-user.bat
を実行してwebuiが表示されればSPDAの導入は完了です。
- 初回起動時のみ時間が掛かります。
- 起動ログにNo module ‘xformers’.と表示されますが問題ありません。
- webui下部にxformers: N/Aと表示されますが問題ありません。
最後に
SPDAの導入について書いてみました。
前述したように--opt-sdp-attention
を試してみて絵柄の変化が気になる、生成速度変わらないなどであれば--opt-sdp-no-mem-attention
を試してみると良いと思います。
またxFormersもPytorch 2.0に対応したということで現状でどっちの方が良いのかはわかりません。SPDAで変化がなく、xFormersに戻すなどの場合はSPDA関連の引数を削除して、xFormers関係の引数を再度追加してください。もちろんvenv
も戻してください。
以上です。
コメント