GeforceならStable Diffusionが2倍速くなる!
と10/18に突如話題となったTensorRT
NVIDIA、Stable Diffusionを倍速にするTensorRT。新ドライバで対応 – PC Watch
本ドライバでは、WebUI「Automatic1111」版のStable Diffusionの処理速度を倍速にするTensorRTアクセラレーションを追加した。TensorRTアクセラレーションの使用には拡張機能「TensorRT Extension for Stable Diffusion」が別途必要となる。
とか
【TensorRT】Stable Diffusion Web UIを倍速にできるNVIDIA製の神AIツール | WEEL
Stable-Diffusion-WebUI-TensorRTは、Stable-Diffusion-WebUIでTensorRTを使用するための拡張機能で、RTXGPU上で最高のパフォーマンスで利用するためのものです。
その速度は超高速で、従来高速といわれていた手法よりさらに2倍以上も高速です!
TensorRTを動かすのに必要な要件ですが、以下の表に最小要件をまとめます。
GPU NVIDIA RTX GPUs with 8GB of VRAM RAM 16GB RAM Connection Internet connectivity during installation Driver NVIDIA Studio Driver 537.58, Game Ready Driver 537.58, NVIDIA RTX Enterprise Driver 537.58, and above
TensorRTを利用者目線でざっくり説明すると、
「手持ちのモデルをNVIDIA専用に書き換え、条件を限定する代わりに生成を爆速にする」
方法らしい。
すでに多くの人が試してるのだけど、自分に恩恵があるのか知りたくて試してみました。
TensorRTの基本的使い方
インストール
WebUIの拡張機能としてインストールします。
導入はこちらのガイドを参照しました。
stable-diffusion-webui の TensorRT 拡張(まさかのNVIDIA公式)を使うと早い!!!ので使い方など|ぶるぺん/blue.pen5805
自分の流れではこう
- Extensions – Install from URLに”https://github.com/NVIDIA/Stable-Diffusion-WebUI-TensorRT”を入れてInstall
- 数分待つ
- Setting – Stable Diffusion – “Upcast cross attention layer to float32″をチエック(必要時)
- Setting – User Interface – Quicksettings listへ”sd_unet”を追加
- Apply Setting
- WebUIのコマンドプロンプトを閉じて再度起動する
起動後、TensorRTのタブが増えていました。
なお起動時に”プロシージャエントリポイントが見つかりません”みたいなエラーが出るようになったけど、解消方法不明。
CUDA Deep Neural Network (cuDNN) | NVIDIA Developerを手で入れ直してもだめでした。とりあえずメッセージ飛ばしても動いてます。
モデル変換
いつも使っている.safetensor形式のモデルファイルを.trt形式に変換します。
- 変換したいモデルを左上”Stable Diffusion checkpoint”で選択
- TensorRTタブ – TensorRT Exporterタブ – PresetはDefault(後述)
- Export Engineを押す
変換が始まります。
自分の環境では4分ちょっとかかりました。
WebUIに”Exported Successfully”と表示されるか、プロンプトに
TensorRT engines has been saved to disk.
と出ていれば完了。
最下段の”Available TensorRT Engine Profiles”横の←ENDを押します。
作成されたProfileが表示されます。
ついでに右上に追加した”SD Unet”右の←ENDも押します。Automaticにしておきましょう。
このProfileですが、考え方としては「変換時に使える条件とエンジンが組み込まれたTensorRT形式のモデルファイル」といえます。
使ってみる
早速使ってみます。
TensorRTの利用はSD UnetをAutomatic⇔Noneと切り替える事で選べます。
一番良く使う4枚一気出力(512×768→1024×1536/4batch/2x hires.fix)をやってみた結果
TensorRT | 利用なし | |
時間 | 40秒 | 2分43秒 |
生成中のVRAM使用 | 18.6GB | 10.7GB |
たしかに爆走かも。けどちょっと絵は違います。
hires.fixの処理が重そうです。
Profileのカスタマイズ
上の通りPresetをDefaultにしたままExport Engineをすると1024pxなどは生成できません。
なので制限を緩めてExport Engineをする事ができます。
こんな感じで作ろう!
ただし、制限を緩めることは速度とメモリを犠牲にするそう。
速度に関しては明確な差を感じませんでした。最大公約的なProfileを一個つくって終わりでいいと思います。
メモリは使ってる3090Tiが24GBなのであまり考慮していません。
基本メモリは辛い方が多いと思うので必要時はリミットギリギリのカスタマイズも必要かと。
注意点ですが、自分は”Use static shapes.”をチェックすると動きませんでした。
よりメモリを節約できるようで期待していたのだけれど。
また、Optimal prompt token count(トークンの想定数)を75以外にするとエラーとなりました。
Max prompt token countで最大値を上げつつ、初期値は75のままがいいようです。
TensorRTのLoRA
画像生成には欠かせないLoRAについて試してみました
使えるLoRAは1個だけ
- 同時に使えるのは1個だけ
- TensorRT LoRAタブから事前に変換必要
- 必ずウェイト:1で適用される
という制限がある模様。
変換すると今選んでるモデルファイルに焼き込む形で.trtファイルが作られました。
事前変換必要はともかく、複数を同時利用できないのはなかなかに不便。
この点はゆくゆく改良されていくかもしれません。
複数使うにはLoRAのモデル焼き込み
探した限り、TensorRTで複数LoRAが効果を出すには
.safetensor形式の時点でLoRAを焼き込んだモデルをつくっておく
しかなさそう。
自分はWebUIの拡張、SuperMargerを使いました。
やり方はこちらを参考。
SuperMerger使いたい? #5 実践編「LoRAマージ」|elna
焼き込む時点でウェイト値は調節できるものの、以降の変更はできません。
ある程度ウェイトが固まって、ガチャする段階になったら使える手でしょうか。
TensorRTの謎
Profileの選択
Profileを作り直すとドンドン増えていくけれど、今のところ「どのProfileを使う」という項目はなし。
おまけに使えないProfileを作ってしまった場合、正しいものを後から作り直しても動かない事がありました。
後々改修されるかもしれません。
Profileの削除
作られたプロファイルは.\models\Unet-trtに作成されます。
これは同じフォルダのmodel.jsonで管理されています。
個別に消したりする機能はないようです。
消すときは両方一気に消す必要があります。
ということで正直不便に対して速度差は微妙かなというところ。
今後の改良があれば必須モジュールになるかもしれません。