この記事ではToMe (Token Merging) を使い、Stable Diffusionの処理を高速化する方法について書いています。xFormersやSPDAと同じように出力物は変化する可能性があるようですが、高速化の一手法として試してみるのも良いのではないでしょうか。
ToMeとは
ToMe (Token Merging) とはredundant tokens(冗長なトークン)、つまり文中で意味を持たない(文脈的に不要な)トークンを除くことでトランスフォーマーの処理量が減り、高速化やメモリ効率の改善が期待できるというものです。元の論文はこちら。
xFormersやSPDAと同じように出力物は変化する可能性はあるものの、作者曰くトークンの半分以上をマージしても、ToMe for SDはオリジナルに近い画像を生成し、2倍速く、5.7倍少ないメモリの使用で済むようです。また、公式ではxFormersとの併用も可能であることが紹介されています。
SDの拡張機能としてのページは以下です。
ToMeの導入方法
\stable-diffusion-webui\venv\Scripts
にて右クリックからターミナルを開き、仮想環境の有効化を行います。
.\activate
続いてToMeをインストールします。
pip install tomesd
マニュアルインストールはこちら
GitHubのInstalling from sourceにもう一つ方法が記載されていますがこちらはpipを使えない場合などに使用するものと思いますので、基本的にはpipを使用した方法で十分かと思います。
以下マニュアルをやられる方向け。
仮想環境を有効化した状態で以下を一行ずつ実行。
git clone https://github.com/dbolya/tomesd
cd tomesd
\stable-diffusion-webui\venv\Scripts\tomesd
にてtomesdパッケージをセットアップを行う。
python setup.py build develop
以上です。
仮想環境を無効化してPowerShellでの作業は完了です。
deactivate
次にToMeの拡張機能を導入します。webuiを起動して「拡張機能」の「URLからインストール」で下記GitHubのリポジトリURLを入れてインストールしてください。
https://github.com/SLAPaper/a1111-sd-webui-tome
webuiを再起動してt2iのSeedの下に「Enable ToMe optimization」のチェックボックスが表示されていれば成功です。
ToMeの使い方
ToMeの設定はwebuiの「設定」→「ToMe Settings」から行うことができます。
【設定項目】
- ToMe merging ratio, higher the faster, it should not go over 1-(1/(sx*sy)), which is 0.75 by default
-
トークンをマージする割合を設定します。値が高いほど処理が高速になりますが、品質が低下する可能性があります。デフォルト値は0.75で、1-(1/(sx*sy))より大きくすることはできません。ここで、sx (Stride – X) とsy (Stride – Y) は画像のサイズに依存する定数です。
- Only activate tome if image width reach this value / Only activate tome if image height reach this value
-
ToMeを適用する画像の幅と高さの最小値を指定します。生成する画像のサイズに合わせて指定しなければいけないため、t2iで研究する際には面倒。ToMeは高解像度化のみで使用すると良いのかも。
- Use random perturbations – Disable if you see werid artifacts
-
トークンのマージを行う際に画像にランダム性を持たせる画像の品質を改善させるもののようですが、場合によっては画像の一部が歪んだり、不自然な形になることがあるようです。ただこれを有効化すると他のパラメーター(どこのことかわからない)の調整が必要だったりするらしく、よくわからない場合は触らなくていいかと思います。
- Merge attention (recommended)
-
Self-Attention層という層でトークンマージングを有効にするかどうかの設定のようです。推奨されているのでデフォルト使用が良いかと思います。
- Merge cross attention (not recommended)
-
Cross-Attention層という層でトークンマージングを有効にするかどうかの設定のようです。推奨されていないのでデフォルト使用が良いかと思います。
- Merge mlp (very not recommended)
-
MLP層という層でトークンマージングを有効にするかどうかの設定のようです。デフォルト使用が良いかと思います。
- Maximum down sampling
-
入力画像を事前に一定のサイズの縮小率で縮小したい場合に「1」以外を選択する感じです。入力画像のサイズを縮小することでToMeの処理の対象とする画像サイズの範囲を制限することができるようです。ただし、縮小率が大きくなりすぎると、画像が荒くなったり情報が失われたりする可能性があるため、適切な値を設定する必要がありそうです
- Stride – X / Stride – Y
-
フィルターの移動幅かと思います。ストライドが大きいと情報の欠落が生じ性能が低下しそうなので、デフォルトが「2」であることからもそのまま使用するのが良いのかと思います。
それと、
and other stuff, leave them default if U don’t know what you are doing
https://github.com/SLAPaper/a1111-sd-webui-tome#settings
「よくわからない場合はデフォルトのままにしておいてください」だそうです。
またOnly activate tome if image width reach this valueとOnly activate tome if image height reach this valueでも軽く書いたように、低解像度の生成ではあまりToMeを使うメリットはないと思います。基本高解像度で使いましょう。
組み合わせたら最強?
GitHubにも記載があるようにToMeはxFormersと組み合わせて使用することができます。なのでxFormersの設定をしっかり行い合わせて使えれば更なる高速化も狙えるのかもしれません。
またxFormersと同じく生成速度UPに役立ちそうなものにSPDAというものがあります。こちらもToMeと組み合わせることが可能らしいので試しみると良いかもしれません。
以上です。
コメント