見出し画像

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版に限定されるようです。

A1111 just added support for TensorRT for webui as an extension!

https://www.reddit.com/r/StableDiffusion/comments/13tg3p6/a1111_just_added_support_for_tensorrt_for_webui/

Meanwhile, I made an extension to make and use TensorRT engines for Unet: https://github.com/AUTOMATIC1111/stable-diffusion-webui-tensorrt

https://github.com/AUTOMATIC1111/stable-diffusion-webui/discussions/10684

 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 で確認できます。

執筆時点の最新はb957dcf…(後ろの部分は省略されている)

 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」にコピーしてください。最終的に、下記の画像と同じ状態にしてください。

拡張機能とTensorRTをコピーしたところ



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形式への変換が終わると、右側にメッセージが表示されます。

ONNX形式への変換が完了したところ

 変換後のファイルは「stable-diffusion-webui\models\Unet-onnx」に入っています。

ONNX形式のファイルが生成された

TensorRT形式への変換(1)

 タブを「Convert ONNX to TensorRT」に切り替えてください。

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」に入っています。

TensorRT(TRT)形式のファイルが生成された



8. 手順:web UIの設定変更

 改めてweb UIを起動してWebブラウザでアクセスし、「Settings」→「User interface」の順に選択してください。「Quicksettings list」の欄の右側をクリックして、「sd_unet」を選択すると追加されます。

「sd_unet」を追加する

 画面の最上部に戻り、「Apply settings」→「Reload UI」の順にクリックしてください。なお、この操作を行わなかった場合、設定項目は「Settings」→「Stable Diffusion」にあります。



9. TensorRTでの画像の生成

 先ほどの続きです。画面がリロードされた後、上部に「SD Unet」が追加されました。こちらで変換したモデルを選択してください。

「SD Unet」でTensorRT形式のモデルを選択する

 あとはPrompt等を設定して、「Generate」ボタンで画像が生成できれば成功です。おめでとうございます。なお、現在は「Hires. fix」が使用できないと思います。他の機能は未確認です。

TensorRTを使用して画像が生成できた

生成速度をさらに上げる方法

 batch sizeを増やして2枚以上の画像を同時に生成すると、さらに速度が上がるものと考えられます。まずは「Maximum batch size=2」でTensorRTモデルを作成して、生成の際に「Batch size」を2にしてみてください。



10. その他

 私が書いた他の記事は、メニューよりたどってください。

 noteのアカウントはメインの@Mayu_Hiraizumiに紐付けていますが、記事に関することはサブアカウントの@riddi0908までお願いします。

この記事が気に入ったらサポートをしてみませんか?