NovelAI 5ch Wiki - ローカル高速化メモ


注意

torch2

torch2化、torch.compile改造ともにVRAMの消費量が増えます。
高解像度生成などでVRAMがカツカツな人は取捨選択が必要かも。
何倍も速くなるわけではない。xformersよりは良いかなってくらい。

torch.compile()でさらに高速化するが、以下の欠点があるのでお勧めしない。
  • コンパイルそのものに時間がかかる
  • モデル、解像度、Batch size変更の度にコンパイルされる
    キャッシュされるので毎回コンパイルされるわけではない
  • WebUIにとって想定外の処理のため不安定。
  • Linuxのみ対応

CUDA使用率

画像生成速度には、CUDA使用率が大きく影響する。
アスカベンチで同じグラボの他人の結果より明らかに遅い場合、なんらかの原因でCUDAがフルに使われていない可能性もある。
(これを確認する場合、Win11なら、GPUスケジューリングをオフにしてタスクマネージャーで項目をクリックしてCudaに切り替えるのが簡単)
このページにある対策を行ってもアスカベンチで期待したパフォーマンスが出ない、という場合でも、高解像度やHires fixした場合は512x512単体生成よりもCUDAがフルに使われやすい傾向があるので、
もしそっちでCUDA使用率が100%近くなってて、そういう生成方法がメインだという場合は、アスカベンチで劣っていても気にしなくていい可能性もある。

ちなみに、速度が速いほどCPUのシングル性能の影響が大きくなる。旧世代CPUを使っているなら最新世代のCPUに買い替えるのもあり。

モジュールによる高速化


2023-03-19現在、たぶんこの順で速い。

1. torch2 cu118 --opt-sdp-no-mem-attention torch.compile(不安定)(Linux限定)
2. torch2 cu118 --opt-sdp-no-mem-attention
3. torch1 cu117 xformers cudnnのバージョンアップ

torch2 cu118 --opt-sdp-no-mem-attention/--opt-sdp-attention


RTX(2000〜4000番台)で高速化するらしい。
環境によっては--opt-sdp-attentionのほうが高速?

WebUIのTorchバージョンが2になったので以下の手順は不要になりました。
Attentionの最適化はWebUIの設定から有効化できます。

プレビュー版のインストール方法
あらかじめ古いバージョンをアンインストールしてから、venv内で以下のコマンドを実行する。
pip3 install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu118

詳細説明


導入した人たちの感想(ある程度集まったらまとめます)


xformers

Meta Researchが開発した最適化ライブラリ。高速化とVRAM消費減少効果がある。
インストールは1111の標準機能で簡単にできる。
このオプションをつけるとわずかに出力内容が変化し、常に同じ結果にならない。
とはいえ体感できるか難しいほど小さい変化のため気にする必要はない。

変化の検証ページ作ったので記録はこちらへ
→「xformersの検証
対応GPU
  • NVIDIA
  • GeForce 1000番台〜4000番台
  • GeForce 900番台以前でも動くけど逆効果だったという報告あり
導入方法
初めて導入する場合
set COMMANDLINE_ARGS= --xformers

古い環境から更新する場合
set COMMANDLINE_ARGS= --reinstall-torch --reinstall-xformers
venvを削除してからWebUIを起動する手もあり
開発版をインストールする
pip install --pre -U xformers
でコンパイル無しで導入できるようになったらしい。
なお、対応するTorchバージョンが入っている必要がある。

アスカテストのtime taken
--xformers --opt-sdp-attention 18.50
--xformers 20.30
--opt-sdp-attention 18.47
--opt-sdp-no-mem-attention 18.40
--xformers --opt-sdp-no-mem-attention 18.60
両方指定の場合はsdpが有効になってる雰囲気です

torch.compile

NVIDIAがTensorRTを使えるようにするExtensionを公開したのでそちらを推奨。改造不要でTensorRTが使える。

以下は上級者向け。
(TensorRTみたいな感じで)モデルの事前コンパイルを行うことによって、
生成処理を高速化する仕組みがtorch2には実装されている。
これを1111で使えるように改造する。

Windowsには対応していない(WSL2で動かすことになる)

手順

--opt-channelslast


これはつけるだけ。
--xformers や --opt-sdp-no-mem-attention と併用できる。
環境によっては効果が無かったり逆に遅くなったりするらしいので比較検討しましょう。

cudnnのバージョンアップ(torch1系の場合、RTX4000シリーズでは必須)

最近のWebUIはTorch2が標準でインストールされるためこの手順は不要です。
RTX4000シリーズで古いWebUIを使用している場合のみ必要。

手順

ハードウェアアクセラレーションによるGPUスケジューリング を無効にする

VRAM消費を減らす効果がある。速度も向上するかも。
やり方はこちら
公式wikiにも記載がある
redditによれば速度が30%くらいかわることがあるとかないとか

モデルを軽量化する

  • ckptとvae.ptをsafetensorsに変換する
    • 最近はckptよりsafetensorsで配布するほうが主流になった。
    • vae.ptはWindows Defenderが誤検出を起こすので回避のためにも変換するのが良さそう
      • 変換すると場合によって容量が約半分になる(NAIはそうだった)
  • pruneする
    • VRAMの節約になるかも?
  • fp16化する

fp16化の副作用として、modules.devices.NansException が発生する。
特にNovelAI系のVAEで発生しやすい(NovelAI,ClearVAE1.0,Nenhanceなどが該当)。

対策としては、fp32で計算するように強制する。(高速化としては本末転倒だけど)
--no-half や--no-half-vae を追加する。速度は落ちる。

たまに真っ黒画像が出てもいいから高速化したいのであれば、
disable-nan-checkを追加する手もある。
それと、黒画像は大体VAEが原因なのでNovelAI系VAEを使わない手もある。

VAEをckptに内蔵する


1111に標準で入っているCheckpoint Mergerでもできるようになっている
マージ対象Aに内蔵先モデルを指定して、Interpolation Method を No interpolation 指定
Bake in VAEで内蔵するVAEを選択してマージする

fp16化したモデルにマージするとVAE部分もfp16になる。
それによる高速化も起こりうるかも。
高速化しないと言っている人もいるので検証できたら追記お願いします。

ということでお気持ち表明に反証するで

Extensionsの退避

しばらく使わないときは Dreambooth Extension を削除する(もう使ってない?)
起動時間が劇的に変わる

Extensionにはinstall.pyが同梱されていて毎回起動するので、
不要なExtensionが沢山入ってるなら消すだけでだいぶ速くなるはず。

UIからオフにするだけではダメ
フォルダごと別の場所に退避させとくとか、いっそバッサリ消すとか

Stepsを減らす

出来るだけ少ないStepsでも期待通りの絵が出る方法を模索する。
Euler a以外(収束するサンプラー)で再現できないか試す。
DPM++ 2M Karrasは15Stepsでもそれなりに映えるのでおすすめ。
UniPCはもっと良い感じ。
LCMやTurboはさらに速い。10steps未満でまともな絵がでる。

メインメモリを使う


モデルのロード時間を短縮するために、あらかじめRAMに読みこんでおくことが出来る。

Settings - Stable Diffusion
  • Checkpoints to cache in RAM
  • VAE Checkpoints to cache in RAM

SuperMergeでもモデル3つのトリプルマージまでRamで高速化できるようになった。
詳しくは ローカルのExtensions の SuperMerger を参照。

新しい機能などのために RamDisk が使いたくなったら ImDisk Toolkit が使いやすい。
https://sourceforge.net/projects/imdisk-toolkit/

1111 全部 RamDisk に突っ込んで高速化するのは、必要RAMのわりに恩恵がほとんど無いからおすすめしない。

WSL2で使う


以前はLinuxにするだけで1〜2割速くなると言われていたが、ドライバやTorchの最適化が進んで速度やメモリ消費の差が小さくなった。
どっちが速いか比較検討してみるのが良さそう。

Linuxに入れる

仮想化ではなく生で挿入れる
Windowsと比べて多少高速化するらしい・・・?
虎の子のゲーミングPCでは厳しいやね
サブ機とかお古になったら検討してもいいかも
なおインストールが簡単かは謎

TensorRTを使う

https://github.com/NVIDIA/Stable-Diffusion-WebUI-T...
最適化で大幅に高速化するもので最大2倍速くなるらしい。NVIDIA専用。
1111のExtensionから導入できる。

けど以下の重大な欠点があるのでベンチ以外で使い道はないかな
  • あらかじめ設定した解像度のみ使用可能
  • TensorRTモデル変換に時間がかかるしVRAM消費が激しい
  • LoRAはTensorRT変換で埋め込んで使えるが1つしか使えない
  • ControlNetのようなU-netに干渉するものは一切使えない
  • Extensionのインストールが不安定で失敗しやすい

venvをいったん消して作り直す

Windows再インストール並みの最終手段。
最新の1111に必要なものしか入らなくなるので軽くなる、かも。
Extension試しまくってると肥大化するので月イチくらいでやるといいかも。

GPUを買い替える

ソフトウェア側であれこれ必死にやっても劇的に速くならないのが現実。結局ハードウェアの強化が一番。
場合によっては他のパーツの買い替えも必要になるが、最も効果的。
(give me money:3000.0)