AUTOMATIC1111版Stable Diffusion web UIにおけるTensorRTの利用について
Last update 05-29-2023
現在はNVIDIAが公開した新しい拡張があるので、そちらをご利用ください。本記事は、参考のためそのまま残してあります。
0. 注意(必読)
本記事の内容について、一切サポートしません(質問にお答えできません)。また、既に利用中の環境に導入することは推奨されません(別途新規インストールする方法をとっています)。
手順の中では特に、TensorRT形式への変換時に多くのVRAMを消費するため、失敗しやすいです。初期設定(width=512, height=512, batch size=1, token count=75)の条件ではおよそ3GB程度、ただし瞬間的に7GB程度まで上がることがありました。
TensorRTが導入済みで環境変数Pathを設定している場合、TensorRT形式への変換時に失敗することがあります。PathにTensorRTのlibディレクトリが含まれていたら、削除してみてください。内容は「set path」のコマンドでも確認できます。
1. 概要
AUTOMATIC1111氏のStable Diffusion web UI(以下、web UI)にて、TensorRTがサポートされたとの情報がありました。ただし、現在は開発中のdev版に限定されるようです。
TensorRTを利用すると画像の生成が高速化しますので、試してみたいと思います。
2. 手順の検討
新規にweb UIをインストールする方法を選びました。これにはいくつかの理由があり、同じ方法を強く推奨します。
別のディレクトリにインストールすれば、既存の環境に影響が無い。
新規であれば、はじめから torch 2.0 の環境が構築できる。従来は torch 1.13.1 で、自分で手を加えない限り torch 2.0 にはならない。
web UIの全ての機能が動作するわけではない模様(未確認)。
既存の環境をdev版に変更して、不可逆な影響があれば困る。
3. 手順:環境の確認
PCにインストールされたCUDA Toolkit(以下、CUDA)は、11.8とします(12.xでの動作は未確認)。11.7以下の場合は、下記のURLより11.8を入手してインストールを行ってください。
https://developer.nvidia.com/cuda-toolkit-archive
4. 手順:TensorRTの入手
TensorRTをダウンロードするには、NVIDIA Developerのアカウントが必要です。アカウントを持っていない場合は下記のURLにアクセスして、右上の「Join」からサインアップを行ってください。
https://developer.nvidia.com/
次に、下記のURLにアクセスして、「Download now」「TensorRT 8」の順に進んで、「I Agree …」にチェックを入れてください。最後に、「TensorRT 8.6 GA」にある「TensorRT 8.6 GA for Windows 10 and CUDA 11.0 … and 11.8 ZIP Package」をダウンロードしてください。https://developer.nvidia.com/tensorrt
5. 手順:dev版web UIのインストール
適当なディレクトリを作成してから、コマンド プロンプト上でweb UIをダウンロードしてください。その後、dev版に切り替えます。なお、本記事ではインストール先を「C:\aiwork2\stable-diffusion-webui」としています。
>cd c:\aiwork2
>git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
>cd stable-diffusion-webui
>git checkout -b dev origin/dev
参考まで、コミットIDを確認しておきました。
>git log -1
commit b957dcfece29c84ac0cfcd5a69475ff8684c531f (HEAD -> dev, origin/dev)
Author: AUTOMATIC
Date: Sun May 28 10:39:57 2023 +0300
リモート側のコミットIDは、https://github.com/AUTOMATIC1111/stable-diffusion-webui/commits/dev で確認できます。
web UIの起動前に、任意のモデルを「stable-diffusion-webui\models\Stable-diffusion」にコピーしてください。これを行わないと、途中でモデル(runwayml/stable-diffusion-v1-5)のダウンロードが始まってしまいます。
最後に、web UIを起動してください。パッケージのダウンロード等で時間を要します。起動が完了したら、WebブラウザでUIにアクセスして動いていることを確認してから、「Ctrl+c」を押して終了してください。
>webui
...
Model loaded in ...
※Ctrl+cを押す
Interrupted with signal 2 in ...
バッチ ジョブを終了しますか (Y/N)? n
6. 手順:拡張機能のインストール
下記のURLにアクセスして、「Code」→「Download ZIP」の順に選択してTensorRT用の拡張機能をダウンロードしてください。その後、ファイルを解凍して「stable-diffusion-webui\extensions」にコピーしてください。
https://github.com/AUTOMATIC1111/stable-diffusion-webui-tensorrt
先ほどダウンロードしたTensorRTを解凍して、「stable-diffusion-webui\extensions\stable-diffusion-webui-tensorrt-master」にコピーしてください。最終的に、下記の画像と同じ状態にしてください。
7. 手順:モデルデータの変換
改めてweb UIを起動してください。途中で必要なパッケージがインストールされます。起動が完了したら、WebブラウザでUIにアクセスしてください。
cd \aiwork2\stable-diffusion-webui
>webui
...
Version: v1.3.0-72-gb957dcfe
Commit hash: b957dcfece29c84ac0cfcd5a69475ff8684c531f
Installing requirements
Installing TensorRT wheel
Installing pycuda
Installing onnx
...
Model loaded in ...
ONNX形式への変換
ここまでの手順が正しければ、「TensorRT」のタブがあるので選択してください。次に、使用したいモデルを選択して「Convert Unet to ONNX」をクリックしてください。筆者の環境では1分もかかりませんでした。ONNX形式への変換が終わると、右側にメッセージが表示されます。
変換後のファイルは「stable-diffusion-webui\models\Unet-onnx」に入っています。
TensorRT形式への変換(1)
タブを「Convert ONNX to TensorRT」に切り替えてください。
この画面の設定については、箇条書きで説明します。
変換したいONNX形式のファイルを、フルパスで入力する。
出力ファイル名は空白でも構わない(同じファイル名が設定される)。
TensorRTを使用して画像を出力する際の「width、height、batch size、token count」の値は、この画面で設定したMinimumからMaximumの範囲に制限されるので覚えておく。
値を大きくすると、変換時のVRAM消費量が増加する。足りない場合は変換に失敗する。
「Use half floats」のチェックを外すと、変換時のVRAM消費量が増加するものと思われる(未確認)。
設定が終わったら、「Convert…」ではなく「Show command for conversion」をクリックしてください(web UI自体が多くのVRAMを消費しているため、オンラインで変換しない)。画面の右側に、現在の設定での変換コマンドが表示されるので、コピーしてメモ帳等にペーストしてください。
TensorRT形式への変換(2)
web UIを起動したウインドウで「Ctrl+c」を押して終了してください。また、VRAMの空き容量を増やすために、不要なウインドウやアプリを閉じてください。ただし、必ずしも厳密に行う必要はありません。タスク マネージャーで、「専用GPUメモリ」の使用量を確認しながら判断してください。
web UIを終了したウインドウ(コマンド プロンプト)で、さきほど表示されたコマンドを順番に実行してください。下記は一例です。
set PATH=%PATH%;C:\aiwork2\stable-diffusion-webui\venv\lib\site-packages\torch\lib
set PATH=%PATH%;C:\aiwork2\stable-diffusion-webui\extensions\stable-diffusion-webui-tensorrt-master\TensorRT-8.6.1.6\lib
"C:\aiwork2\stable-diffusion-webui\extensions\stable-diffusion-webui-tensorrt-master\TensorRT-8.6.1.6\bin\trtexec.exe" --onnx="C:\aiwork2\stable-diffusion-webui\models\Unet-onnx\defacta5rd_5rd.onnx" --saveEngine="C:\aiwork2\stable-diffusion-webui\models\Unet-trt\defacta5rd_5rd.trt" --minShapes=x:2x4x64x64,context:2x77x768,timesteps:2 --maxShapes=x:2x4x64x64,context:2x77x768,timesteps:2 --fp16
変換の設定がデフォルトの場合、RTX 3060では15分程度かかりました。変換後のファイルは「stable-diffusion-webui\models\Unet-trt」に入っています。
8. 手順:web UIの設定変更
改めてweb UIを起動してWebブラウザでアクセスし、「Settings」→「User interface」の順に選択してください。「Quicksettings list」の欄の右側をクリックして、「sd_unet」を選択すると追加されます。
画面の最上部に戻り、「Apply settings」→「Reload UI」の順にクリックしてください。なお、この操作を行わなかった場合、設定項目は「Settings」→「Stable Diffusion」にあります。
9. TensorRTでの画像の生成
先ほどの続きです。画面がリロードされた後、上部に「SD Unet」が追加されました。こちらで変換したモデルを選択してください。
あとはPrompt等を設定して、「Generate」ボタンで画像が生成できれば成功です。おめでとうございます。なお、現在は「Hires. fix」が使用できないと思います。他の機能は未確認です。
生成速度をさらに上げる方法
batch sizeを増やして2枚以上の画像を同時に生成すると、さらに速度が上がるものと考えられます。まずは「Maximum batch size=2」でTensorRTモデルを作成して、生成の際に「Batch size」を2にしてみてください。
10. その他
私が書いた他の記事は、メニューよりたどってください。
noteのアカウントはメインの@Mayu_Hiraizumiに紐付けていますが、記事に関することはサブアカウントの@riddi0908までお願いします。