PC WatchにNVIDIA、Stable Diffusionを倍速にするTensorRT。新ドライバで対応という記事があったので、試してみました。
インストール手順
公式サイトTensorRT Extension for Stable Diffusionに手順がありますが、簡単にポイントを解説します。
必要スペック
GPUメモリ(VRAM)が8GB以上、メインメモリが16GB以上必要です。
ドライバーのインストール
NVIDIAのドライバーが537.58以上が必要です。インストールしたら一度再起動しておきましょう。
Stable Diffusion web UIの準備
もとのStable Diffusion web UIは推定でバージョン1.4.0以降でないとダメだと思います。ダメもとですでに入れてあった1.3.2に入れようとしたところ、必要なモジュールが足りない、というエラーが出てしまいました。エラーに表示されたモジュール(sd_unet)は1.4.0で実装されていました。
既存のバージョンを更新する場合、インストールされているフォルダで「git pull」コマンドを実行するとアップデートできます。なお、自分のように一部ファイルを編集していると、編集しているファイルの変更を破棄するか、または編集しているファイルのファイル名を変更しないとpullできないと怒られます。
元の手順にあるように新しいフォルダに最新バージョンを入れるのは確実です。自分の場合は既存のフォルダをコピー(バックアップ)して実行しました。
Stable Diffusion web UIでExtensionsを追加
Stable Diffusion web UIのExtensionsタブでExtensionを追加します。元の手順で「Install from URL」が紹介されていますが、10/21時点で「Available」タブからでもインストール可能でした。
残念ながらこれだけでうまく動かないケースがあります。
ワークアラウンド1:pip install protobuf==3.20.2 --prefer-binaryで止まる
ググると良く起きる事象のようです。いったんインストールフォルダ内の「extensions」にある「Stable-Diffusion-WebUI-TensorRT」フォルダを削除(web UI上アンインストールに相当)します。 WebUIをリロードし、再度Extensionタブからインストールをすると、protobufの続きからインストールが実行されます。
ワークアラウンド2:python.exe エントリポイントが見つかりませんというエラーメッセージが出る
Stable Diffusionが最新のNVIDIAドライバで倍速になるときいて、導入に苦労した件 - orangeitems’s diaryにある情報を参考に、下記手順を実行します。
- WebUIを動かしているコマンドプロンプトを閉じます
- 「extensions」にある「Stable-Diffusion-WebUI-TensorRT」フォルダを削除します。
- インストールフォルダ内にある「venv」を削除します。
- 新しいコマンドプロンプトでインストールフォルダに移動します。
- webui.bat を実行します。これにより、venv が再インストールされます(数十分かかります)。
- WebUIが出てきたら、閉じて、WebUIのコマンドプロンプトも閉じます。
- コマンドプロンプトでインストールフォルダに移動します。
- 下記コマンドを実行します(@remはコメントなのでコピペ不要です。一緒にコピペしても動くようにしてあります。)
@rem pythonのvenv環境の中に入る
venv\Scripts\activate.bat
@rem (venv)という表示に代わります
@rem pipの更新
python.exe -m pip install --upgrade pip
@rem Successfully installed pip-23.3 が出ればOK
@rem cuDNNツールのインストール
python -m pip install nvidia-cudnn-cu11==8.9.4.25 --no-cache-dir
@rem tensorRTのインストール
python -m pip install --pre --extra-index-url https://pypi.nvidia.com/ tensorrt==9.0.1.post11.dev4 --no-cache-dir
@rem cuDNNツールのアンインストール
python -m pip uninstall -y nvidia-cudnn-cu11
@rem Successfully uninstalled nvidia-cudnn-cu11-8.9.4.25 が出ればOK
@rem pythonのvenv環境を終了
venv\Scripts\deactivate.bat
@rem (venv)表示が消えます
- webui.batを実行します。
- 起動したWebUIで再度Extensionタブからインストールします。
- 「installed」タブの「Apply and restart UI」で有効化します。
- うまくいくと「TensorRT」というタブが現れます
使い方
TensorRTの画面に書いてある通りですが、「TensorRT Exporter」の「Export Default Engine」を押すとWebUIの上に表示されているモデルがTensorRTバージョンにエクスポートされます。5分以上待ちました。
「Settings」 >「User Interface」とたどり、「Quick Settings」に「sd_unet」を追加し、WebUIを再起動すると、TensorRTバージョンにエクスポートしたしたモデルが「[TRT]」付きで表示されます。
「sd_unet」の選択を「Automatic」にしておくと使えるモデルの場合は自動的にTensorRTバージョンを利用してくれます
Loraの使い方
Loraは通常のようにプロンプトに記入しても機能しません。同じようにTensorRTバージョンを作る必要があります。
「TensorRT Exporter」の隣に「TensorRT Lora」タブがあります。ここでLoraを選んでTensorRTバージョンを作成します。
この時、Loraは既存のTensorRTバージョンのモデルに焼きこまれる形になります。
「sd_unet」の選択を「[TRT]」のついたLoraが書かれたモデルを選ぶことで利用できました。
感想
実際に使ってみると、自分の環境では2倍の速度にはなりませんでしたが、1.5倍の速度くらいにはなりました。スピードの面での改善ははっきりと感じられます。
ただ、通常(pytorch)版とTensorRT版では出てくる絵柄にだいぶ違いがあります。同じシード値を与えても違う絵柄が出てきます。
また、Loraは焼き込みになってしまうため、プロンプトで数字を使った強度の調整ができません。また複数のLoraを使った重ね掛けもできません。
同じモデルを中心に利用する方、またLoraを1種類しか利用しない方であれば、変換して出てきた絵柄に納得できれば追加コストなしに性能アップするのは魅力的だと思います。
自分の用途には合わなかったのでお蔵入りとなりました。