導入しないと損!xFormersの導入方法【Stable Diffusion 高速化】

本記事ではxFormersとStable Diffusoion Web UIへの導入方法について解説をします。次のような方におすすめの記事になっております。

  • 画像生成が遅くて時間を無駄にしている。
  • メモリが不足してRuntimeError: CUDA out of memory.が発生する。
  • xFormersを導入したいけどメリットとデメリットを把握したい。

xFormersとは

xFormersとはMeta社(旧: Facebook)が開発したオープンソースです。Stable DiffusionやChatGPTで使われているTransformerという部品を高速に計算できるようにする技術です。これを使うことでTransformerを利用しているディープラーニングモデルの時間効率とリソース効率が大幅に向上します。

GitHub - facebookresearch/xformers: Hackable and optimized Transformers building blocks, supporting a composable construction.
Hackable and optimized Transformers building blocks, supporting a composable construction. - facebookresearch/xformers

xFormersはStable Diffusion Web UIをインストールした時点でインストールされているので追加でインストールする必要はありません。そのためStable Diffusion Web UIだと簡単に利用することができます。

xFormersのメリットは?xFormers有無比較で画像生成の効果を測定!

画像の生成時間が改善

xFormersのメリットは画像の生成時間が改善される点です。これがどのぐらいの変化なのかを調査しました。解像度512×768の画像を生成してみた結果ですが6.4秒が4.9秒に縮まりました。33%改善されるのでかなり大幅な改善です。GPUはRTX 3080Ti(16GB)です。

消費GPUメモリの削減

もう一つの大きなメリットは消費されるGPUメモリが削減されることです。これも調査した結果、6.7GBから5.8GBに変わりました15%の削減になります。生成した画像の解像度512×768の画像、GPUはRTX 3080Ti(16GB)です。

xFormersのデメリット、注意点は?

xFormersは計算を効率化するだけの手法なのでデメリットと呼べるものはあまりないです。強いて挙げるとすれば次のような注意点があります。

xFormers導入前と比べてわずかに生成される画像が変わる

わずかにですが生成される画像がxFormersを導入すると変化します。目ではほとんどわからない些細なレベルです。

左: xFormersなし、右: xFormersあり

違う画像が生成されているかを確認するために差分をとった画像を作成してみました。目の周辺、あごのや服装や背景の表現方法が変わっているようです。着物のデザインがわずかに違う箇所があります。間違い探しですね。

左: xFormersあり、右: 差分画像

過去バージョンのデメリット(生成される画像が同じ設定でも非決定的)

The Xformers library provides an optional method to accelerate image generation. This enhancement is exclusively available for NVIDIA GPUs, optimizing image generation and reducing VRAM usage. Older versions below 0.0.20 will produce non-deterministic results.

https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Xformers

xformersを使うことで生成される画像が同じパラメータでも異なるランダムな結果になることがありました。wiki上の説明では非決定的(non-deterministic)となっています。これはバグだったようで現在のバージョンでは解消されました。手元での確認をしてみましたが、特に変化はありませんでした。
参考: xformers option has good and bad aspects

xFormersを導入できるのはNVIDIA製のGPUのみ

Stable Diffusion Web UIでxFormersを導入できるのはNVIDIA製のGPUのみだけです。AMD製のGPUではサポートされてません。あくまで2023年9月時点なので近い将来、AMDでも採用される可能性はあります。デメリットのないxFormersが標準で導入されてないのはこれが原因でしょう。なので、NVIDIA製のGPU搭載のPCをお持ちでしたらxFormersを導入しないと損です。

NVIDIA製じゃなければ–opt-sdp-attentionを使おう!

--opt-sdp-attentionというオプションがありこれも--xformersとほぼ同等の効果があります。

Stable Diffusion Web UIでのxFormersの導入方法

Stable Diffusion Web UIからxFormersを利用するのは起動時のコマンドの引数に–xformersを追加するだけです。

といっても起動スクリプト経由(webui-user.bat)で起動している人はコマンドをみたことがないかもしれないです。なのでどのようにするかを解説していきます。

起動時スクリプトに引数–xformersを追加してxFormersを有効化

メモ帳でwebui-user.batを開きます。開き方ですがメモ帳を開いてファイルをドラッグアンドドロップします。すると起動スクリプトの中身を見ることができて編集することができます。8行目に

set COMMANDLINE_ARGS=--xformers

の一行を追加します。

Before

@echo off

if not defined PYTHON (set PYTHON=python)
if not defined VENV_DIR (set "VENV_DIR=%~dp0%venv")

set SD_WEBUI_RESTART=tmp/restart
set ERROR_REPORTING=FALSE

mkdir tmp 2>NUL

After

@echo off

if not defined PYTHON (set PYTHON=python)
if not defined VENV_DIR (set "VENV_DIR=%~dp0%venv")

set SD_WEBUI_RESTART=tmp/restart
set ERROR_REPORTING=FALSE
set COMMANDLINE_ARGS=--xformers

mkdir tmp 2>NUL

保存してメモ帳を閉じましょう。するとxformersが使えるようになります。いつも通りにwebui-user.batを起動するとコマンドプロンプトに次のようなメッセージが表示されています。

Launching Web UI with arguments: --xformers

このようになっていればxformersが導入されています。

FAQ

他に性能を改善する方法はないの?

他には仮想メモリやスワップの拡張もおすすめしております。モデルのロード時にPCがフリーズしてしまう際などは有効な手法です。

Windowsユーザー向け

Mac、Linux系OSユーザー向け

Stable Diffusion重い…PCが落ちる場合は?

重いPCが落ちるなどギリギリな環境の場合はスペックを見直しましょう。

私もギリギリの環境でStable Diffusionを使っていたのですがPCを買い換えて時間が大幅に削減されてもっと早く買い換えておけば良かったと後悔しました。

Stable Diffusion SDXLで登場や円安が進んでいる今がスペックの見直しのタイミングです。もし気になる方は次の記事を参考にしてみてください。

「importerror no xformers / xformersがインストールされていないようです」、”No module ‘xformers’. Proceeding without it.”が表示される

これはxFormersを導入していない場合に表示されます。これ自体は表示されていても特に問題はないです。ただしxFormersを導入していないのはもったいないので本記事を参考にxFormersを導入してみましょう。

xFormersを無効化するには?

xFormersを無効化するには–xformersを引数から外します。もしスクリプト経由でStable Diffusion Web UIを起動している場合はファイルを次のように修正します。スクリプトをメモ帳で開いて次のような記載がある箇所を見つけて–xformersを削除してください。

set COMMANDLINE_ARGS=–xformers

の行を削除。

コメント