Stable Diffusion – SPDAを使って画像生成速度をUPする

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も戻してください。

以上です。

コメント

コメントする

※ スパム対策のためコメントは日本語で入力してください。また、コメントは管理者による承認作業が完了次第、コメントエリアに掲載されます。

CAPTCHA

目次