はじめに
私は Stable Diffusion WebUI をアイキャッチ画像の生成に利用していますが、Stable Diffusion WebUI の省VRAM、高速化の fork が公開されたとの記事を見つけました。
Stable Diffusion WebUI Forge という名称で、Stable Diffusion WebUI の新機能を積極的に取り入れる開発版という立ち位置になるかと思います。画像生成 AI で著名な lllyasviel 氏の fork という事で注目を集めています。
README.md を一部引用します。
https://github.com/lllyasviel/stable-diffusion-webui-forge
- 8GB VRAM のような一般的な GPU を使用した場合、推論速度 (it/s) は約30~45%高速化し、GPUメモリピーク (タスクマネージャ) は約700MB ~ 1.3GB減少し、最大拡散解像度 (OOMしない) は約2倍から3倍に増加し、最大拡散バッチサイズ (OOMしない) は約4倍から6倍に増加することが期待できます。
- 6GB VRAM のような性能の低いGPUを使用した場合、推論速度 (it/s) は約60~75%高速化し、GPUメモリピーク (タスクマネージャ) は約800MB ~ 1.5GB減少し、最大拡散解像度 (OOMしない) は約3倍に増加し、最大拡散バッチサイズ (OOMしない) は約4倍に増加することが期待できます。
- 24GBのVRAMを搭載した4090のような強力なGPUを使用した場合、推論速度 (it/s) が約3~6%高速化し、GPUメモリピーク (タスクマネージャ) が約1GB ~ 1.4GB低下し、最大拡散解像度 (OOMしない) が約1.6倍に増加し、最大拡散バッチサイズ (OOMしない) が約2倍に増加することが期待できます。
VRAM の少ない環境ほど、Stable Diffusion WebUI Forge の高速化の効果が大きく発現するとの事です。
私の環境は nVidia RTX3060 12GB ですので大きなメリットは得られないかもしれませんが、SDXL 1.0 を使用し始めてから画像の生成時間が長くなっていましたので、Stable Diffusion WebUI Forge を試してみる事にしました。
なお、タイトルにはバージョンは f0.0.16 と記載しましたが、正確には 'f0.0.16v1.8.0rc-latest-238-g437c3489' であり、Stable Diffusion WebUI の v1.8.0rc からの fork である事が分かります。
Stable Diffusion WebUI Forge のインストール方法
ググると Windows 環境へのインストール手順の記載が多いですが、Linux や WSL2 でも問題なくインストールできます。というか、Stable Diffusion WebUI のインストール方法とほぼ同一です。
相違点のみ記載しますので、インストール手順につきましては下記のリンク先を参照下さい。
ディレクトリ構成等はリンク先の内容を前提として説明します。
github より clone
clone する前段階の3つについては変更ありません。Stable Diffusion WebUI が動作していれば、そのままの環境で OK です。
- 前提となる環境
- Stable Diffusion WebUI 用のディレクトリの作成
- 必要な package のインストール
Stable Diffusion WebUI Forge の github より clone します。
$ cd ~/Generation_AI/SDXL
$ git clone https://github.com/lllyasviel/stable-diffusion-webui-forge
$ cd stable-diffusion-webui-forge
clone した directory で作業します。
webui-user.sh の編集
Stable Diffusion WebUI では --medvram-sdxl 等の VRAM 使用量を減らす Option が不要となっています。
Forge バックエンドは、リソース管理に関連するすべての WebUI のコードを削除し、すべてを作り直しました。medvram、lowvram、medvram-sdxl、precision full、no half、no half vae、attention_xxx、upcast unet などの以前の CMD フラグはすべて削除されました。これらのフラグを追加してもエラーは発生しませんが、現在は何もしません。私たちは、Forge ユーザーがすべての cmd フラグを削除し、Forge にモデルをロードする方法を決定させることを強く推奨します。
https://github.com/lllyasviel/stable-diffusion-webui-forge?tab=readme-ov-file#forge-backend
また、--cuda-malloc 等の高速化の Option が追加されています。webui-user.sh の内容は、コメントを除外して以下の内容としました。
export COMMANDLINE_ARGS="--cuda-malloc --cuda-stream --pin-shared-memory --opt-sdp-attention"
export TORCH_COMMAND="pip install torch==2.1.2+cu121 --extra-index-url https://download.pytorch.org/whl/cu121"
高速化 Option の内容については後述します。私の環境では大丈夫でしたが、もし Stable Diffusion WebUI Forge が異常終了する場合には、COMMANDLINE_ARGS の先頭3つの Option を削除して下さい。
PyTorch は 2.1.2+cu121 を指定しています。
SDXL 1.0 学習済みモデルの準備
既に Stable Diffusion WebUI に SDXL のモデルを download してありますので、こちらから cp します。モデル (safetensor) と VAE の両方です。
$ cp ../stable-diffusion-webui/models/Stable-diffusion/*.safetensors models/Stable-diffusion/
$ cp ../stable-diffusion-webui/models/VAE-approx/vaeapprox-sdxl.pt models/VAE-approx/
$ cp ../stable-diffusion-webui/models/VAE/sdxl_vae.safetensors models/VAE/
webui.sh の実行
Stable Diffusion WebUI と Forge の WebUI は、ほぼ同じ内容です。
- AMD GPU 用の設定
- Huaway GPU への対応
- TCMalloc のチェックに glibc のバージョンチェックが追加
が変更になっている箇所でした。
初回の webui.sh の実行時に
- Python 仮想環境の設定
- Python の依存 package のインストール
が実行されます。私の環境では約3分間を要しました。
正常に起動できれば、Web ブラウザが自動で起動して Stable Diffusion WebUI Forge の画面が表示されます。
Stable Diffusion WebUI Forge の設定
以下のリンク先の内容と同様です。
- 自動でウェブブラウザが起動するのを止める
- Config-Presets 拡張機能の導入
- stable-diffusion-webui-localization-ja_JP 拡張機能の導入
- sd-webui-bilingual-localization 拡張機能の導入
VAE の選択欄は、Stable Diffusion WebUI Forge の場合は標準で表示されていました。
ここまでの作業で、Stable Diffusion WebUI Forge がこれまで通り使う事ができるようになります。
画像生成速度と VRAM 使用量の比較
Stable Diffusion WebUI と Stable Diffusion WebUI Forge の画像生成速度と VRAM 使用量を比較しました。
- nVidia RTX 3060 12GB
- SDXL モデルを使用 (base + refiner)
- 画像サイズ 1216x832
- Sampling method : DPM++ 2M Karras
- Sampling steps : 40
- Batch size : 4 (4枚を一度に生成)
- CFG Scale 7
Name | GPU VRAM [GB] | 生成時間 [sec] |
Stable Diffusion WebUI | 9.6 | 147 |
Stable Diffusion WebUI Forge | 8.1 | 113 |
減少率 [%] | 15.8% | 23.1% |
VRAM は 16%、生成時間は 23% 減少しました。VRAM の少ない GPU と比較すれば減少率は少ないですが、4枚生成で30秒以上短くなりましたので体感できるほと生成時間を短縮できました。
Stable Diffusion WebUI Forge の高速化 Option
先にも記載しましたが、Stable Diffusion WebUI Forge では、省 VRAM の Option が無効化されて、高速化 Option が追加されました。
--always-offload-from-vram(このフラグは物事を遅くしますが、リスクは少なくなります)。このオプションは、Forge が常に VRAM からモデルをアンロードするようにします。これは、複数のソフトウェアを一緒に使用していて、Forge がより少ない VRAM を使用し、いくつかの VRAM を他のソフトウェアに与えたい場合、または Forge と VRAM を競合させる古い拡張機能を使用している場合、または(非常にまれですが)OOM が発生する場合に便利です。
https://github.com/lllyasviel/stable-diffusion-webui-forge?tab=readme-ov-file#forge-backend
--cuda-malloc(このフラグはより高速になりますが、よりリスクが高くなります)。これはテンソルのmallocにcudaMallocAsyncを使うようにpytorchに要求します。いくつかのプロファイラではミリ秒レベルの性能向上を観測できますが、ほとんどの私のデバイスでは実際の速度向上は気づかれないことが多いです(画像あたり0.1秒程度かそれ以下)。非同期mallocがプログラムをクラッシュさせるという問題が多くのユーザーから報告されているため、これはデフォルトでは設定できません。ユーザーは自己責任でこのコマンドフラグを有効にする必要があります。
https://github.com/lllyasviel/stable-diffusion-webui-forge?tab=readme-ov-file#forge-backend
--cuda-stream(このフラグは物事を速くしますが、よりリスクが高くなります)。これは pytorch CUDA ストリーム(GPU 上の特殊なスレッド)を使ってモデルの移動とテンソルの計算を同時に行います。これにより、モデル移動の時間をほとんどなくすことができ、VRAM の少ない 30XX/40XX デバイス(例:RTX 4050 6GB、RTX 3060 Laptop 6GB、など)上の SDXL を約 15% から 25% 高速化できます。しかし、2060では真っ黒な画像(Nan出力)の可能性が高く、1080と2060ではOOMの可能性が高いため、これは残念ながらデフォルトでは設定できません。解像度が大きい場合、1つのアテンションレイヤーの計算時間が、モデル全体をGPUに移動する時間よりも長くなる可能性があります。そうなるとGPUがモデル全体でいっぱいになり、別のアテンションレイヤーを計算するための空き領域がなくなるため、次のアテンションレイヤーはOOMになります。ほとんどのオーバーヘッド検出方法は、(私のテストでは)古いデバ イスでは信頼できるほどロバストではありません。ユーザーは自己責任でこのコマンドフラグを有効にする必要があります。
https://github.com/lllyasviel/stable-diffusion-webui-forge?tab=readme-ov-file#forge-backend
--pin-shared-memory(このフラグをつけると高速になるが、よりリスクが高くなる)。--cuda-streamと併用した場合のみ有効です。これは、モデルをオフロードするときに、システム RAM ではなく、共有 GPU メモリにモジュールをオフロードします。小さな VRAM を持ついくつかの 30XX/40XX デバイス(例えば RTX 4050 6GB、RTX 3060 Laptop 6GB など)では、SDXL の大幅な(少なくとも 20% の)スピードアップが観察できます。しかし、共有 GPU メモリの OOM は一般的な GPU メモリの OOM よりもはるかに深刻な問題であるため、残念ながらこれをデフォルトに設定することはできません。Pytorch は、共有 GPU メモリをアンロードまたは検出する堅牢な方法を提供していません。共有 GPU メモリの OOM が発生すると、プログラム全体がクラッシュし(GTX 1060/1050/1066 の SDXL で確認)、クラッシュを防止したり回復したりする動的な方法はありません。ユーザーは自己責任でこのコマンドフラグを有効にする必要があります。
https://github.com/lllyasviel/stable-diffusion-webui-forge?tab=readme-ov-file#forge-backend
私は後者3つを有効にして使用していますが、今の所は不具合はありません。ただし、これらの Option は VRAM の少ない GPU で効果が大きいので、nVidia RTX3060 12GB では殆ど効果が見られませんでした。
まとめ
Stable Diffusion WebUI から fork された Stable Diffusion WebUI Forge をインストールしました。
- Windows 環境でのインストール例が多いですが、WSL2 Ubuntu でも問題なくインストール・使用できました。
- インストール手順は Stable Diffusion WebUI v1.7.0 とほぼ同様です。
- Option が一部変更になり、省 VRAM の Option が不要になりました。
- VRAM の少ない環境で効果が大きいらしく、nVidia RTX3060 12GB では VRAM 使用量は 16% の減少、生成時間は 23% の減少という結果でした。
- とはいえ、4枚生成で30秒短縮ですので、体感できる位の効果がありました。
他にも追加された機能は使い切れていませんが、少しずつ試してみたいと考えています。
今回のアイキャッチ画像
Stable Diffusion WebUI Forge の SDXL で雪の中を歩く風景を生成しました。幼い頃~20歳頃までは、2月は未だ雪の記憶が多い月です。関東は雪が積もっても水分の多い重い雪ですので、雪玉を作ろうとしても締まらないサラサラした雪が懐かしいです。
HUB とその上の Mini PC を有線で接続する為に、0.3m の Ethernet cable を購入しました。1本では販売しておらず2本組で購入し、1本が余っています。HUB も2口空いているので、そのうち N100 CPU の Mini PC を2台購入して、色々と遊ぼうと画策中です。
コメント