見出し画像

誰も使っていないらしいStable Diffusion高速化技術TensorRT

TensorRTのインストールのやりかた

Stable-Diffusion-WebUI-TensorRTは、Stable-Diffusion-WebUIでTensorRTを使用するための拡張機能です。
2023年10月にいきなり発表された、NVIDIA謹製の拡張機能になります。
2024年1月にv0.2.0、3月にv0.2.1にバージョンアップしています。

誰も使っていないとか抜かしていますが、使っている人がいたらゴメンナサイ…だって全く情報がないんだもの…。
拡張機能の開発などを行っている技術畑の人の中には、利用している人がいるのかもしれませんし、いないのかもしれません。
私はAIイラストのコミュニティなどには属していないので、ひょっとしたら使ってる人がいるのかもしれませんが、少なくとも私が探した限りではインストール方法などがわかる日本語情報は見つかりませんでした。

紹介している記事や投稿はよく見かけたのですが、「動いた人はラッキー」程度の言及にとどまり、どうすれば使えるようになるかまで追求した人は見つかりませんでした。
ひょっとしたら、LoRAのトレーニング環境を作っているとか、拡張機能の開発者の環境は自然に(必然的に)TensorRTが動くようになっているのかもしれません。

最近はLCMという高速化技術が人気だと聞きますが、LCMは少し画質が落ちる代わりに爆速だと聞きました。
LCMはTensorRTとは異なるアプローチのようです。

専用に最適化したモデル(TensorRTエンジン)を作り高速化

TensorRTはNVIDIA社が開発している、推論を高速に実行するためのソフトウェア開発キット(SDK)です。
SDKですので、『学習済みのモデルを最適化すること』に主眼が置かれており、TensorRTは、学習済みのモデルをさらに最適化して推論エンジンを作成します。

学習済みモデルとは、「大規模なデータセットを用いて事前にトレーニングされた機械学習モデル」です。
この中でも、入力された自然言語(あるいはキーワード=プロンプト)からその記述に近いと思われる画像を生成する「text-to-imageモデル」がStable Diffusionというわけですね。

TensorRTは推論専用のSDKのため、学習済みモデルは自分で用意しなければなりません。
まあ私もみなさんもいつも画像生成に使っているモデルが、学習済みモデルということになります。
そして、学習済みモデルをTensorRT形式のモデル(TensorRTエンジン)へ変換することで、高速に推論が実行できるようになります。

どういう仕組みで高速化されるのかは非常に難しいので、ディープラーニングの研究者でもなく、趣味でAIイラストを作っている私ごときが説明できるものではありません。

NVIDIAの技術ブログとマクニカのコラムで紹介されていたものを読むと、「学習済みモデルをTensorRT形式のモデル(TensorRTエンジン)へ変換する」ことで、高速に画像生成を可能にする技術のようです。


TensorRTの概略
https://www.macnica.co.jp/business/semiconductor/articles/nvidia/136485/
TensorRT で最適化される前(上図)と最適化後(下図)
https://developer.nvidia.com/ja-jp/blog/accelerating-stable-diffusion-inference-with-tensorrt/

動作要件

NVIDIAはTensorRTの動作要件として下記のスペックを挙げています。

8GB以上のVRAMを搭載したNVIDIA製GPU
16GB以上のメインメモリ
NVIDIA Studio Driver 537.58 以降、Game Ready Driver 537.58 以降、
NVIDIA Enterprise Driver 537.58 以降
インターネット接続

https://nvidia.custhelp.com/app/answers/detail/a_id/5487/~/tensorrt-extension-for-stable-diffusion-web-ui

TensorRTエンジンは流用できないし配布もできない

注意しなければならないのは、TensorRTエンジンはGPUアーキテクチャ、TensorRTバージョンごとに異なるため、環境ごとに作らなければならないという点です。
ドライバのやCUDAのバージョンによっても違いがあるかもしれません。
ですからcivitaiなどで配布できるものではありません。

技術的なものに興味がおありの方には、私が説明しようにも力不足ですので上記のような学術系・技術系の記事などを読んで頂くとして、では具体的にstable-diffusion-webuiにはどのようにインストールするのかについて書いておきます。
個人的に、動作要件に必要パッケージを書いていないので使う人がいないのではないかと思っています。
ただし、これも先述の通りTensorRTバージョンが異なるものは使えないため、「自分で確認よろ」というスタンスなのかもしれません。

必要パッケージ

まず、インストールに必要なパッケージは
nvidia-cudnn-cu11
nvidia-cudnn-cu12
nvidia-cuda-runtime-cu11
nvidia-cuda-runtime-cu12
tensorrt
polygraphy
onnxruntime
onnx-graphsurgeon
colored
protobuf
以上のパッケージが必要です。

cudnnは11と12があるので、PCにインストールされているCUDAのバージョンが11なら11を、12以降なら12をインストールして下さい。
CUDAのバージョンは環境変数で確認できます。
面倒くさいので、後述の手順ではまとめてインストールしています。

[スタートメニュー]-[設定]-[システムの詳細設定]から環境変数を確認

ただし、cudnnはインストールする時にその他のパッケージをビルドするためにだけ必要で、TensorRTをインストールしたあとはcudnnをアンインストールしておかないと、動作に問題が出るみたいです。

stable-diffusion-webuiのインストール

今回はstable-diffusion-webuiのインストールから行います。
stable-diffusion-webuiのインストール方法は私が解説するまでもなく大勢の人がが解説しておられますので、もっとわかりやすいページをご覧下さい。
…とか抜かしていますが、こんなものを読む人はもうstable-diffusion-webuiに慣れ親しんでいることだと思いますから、「はやく本題に入れ」と言われそうなのでさっさと進めます。

1.9がリリースされたのは知ってしまいたが、git cloneで落ちてきたものはv1.9.3になっていました。(※2024年4月23日現在)

git cloneでstable-diffusion-webuiを新規インストール
v1-5-pruned-emaonly.safetensorsはさすがにダウンロード時間がかかる…
何事もなく起動しました(当たり前)

どうやらパッケージのバージョンが重要らしい…

ここでPowerShellは一旦閉じて、stable-diffusion-webui\venv\Scriptsで改めてPowerShellを開き、パッケージを突っ込んでいきます。
TensorRTはxformersとは排他利用になりますので、xformersのインストールは省略します。

長い時は三日間くらい試行錯誤を繰り返していたこともあるのですが、TensorRTはパッケージのバージョンが重要で、指定して入れないとうまく動いてくれません。
バージョン指定しないと最新版が入るのですが、それではうまく動作しませんでした。
(おま環という可能性もありますが…)

pipのアップデートとxformersのインストール

まずはactivateしてから、とりあえずpipをアップデートします。アップデートをやらないと、起動するたびにpipを新バージョンにしろと怒られます。
必要な人はさっき飛ばしたxformersもインストールしましょう。

.\activate

python.exe -m pip install --upgrade pip

python.exe -m pip install xformers==0.0.23.post1
pipのアップデートとxformersのインストール

cudnnのインストール

続けてcudnnを入れるのですが、11と12を一度に入れても大丈夫でしたので、まとめてインストールします。
なお、私が試行錯誤を繰り返していた時点(2024年2月頃)では、このバージョンを指定しないとTensorRTが正常に動作しませんでした。
理由はわからないのですが、この後にインストールするtensorrtのバージョンとも関係しているのかもしれません…。
また、他にもNVIDIAが作っているパッケージがいろいろ必要なのですが、このバージョンに合わせて必要なものを自動的にインストールしてくれます。

python.exe -m pip install nvidia-cudnn-cu11==9.1.0.70 nvidia-cudnn-cu12==9.1.0.70 --no-cache-dir
2GBものダウンロード量になるので時間がかかります

tensorrtのインストール

次がこの拡張機能の中核部分であるtensorrtです。
これがまた問題でした。
Redditや技術系のブログなどでは、pip の --pre オプションをつけてバージョン9以降という情報が飛び交っていたのですが、このパッケージの安定バージョンは8.6.1とされており、9以降はパッケージ名に .dev とつけられているように開発版のようです。

ところが、どういうわけか8.6.1をインストールしようとしてもエラーになってしまいます。
どうも「tensorrt-libs と tensorrt-bindings がないとインストールできないから一緒に入れろや」と怒られているようなので、その2つのパッケージも合わせてインストールすることにします。

しかし、またしてもエラーになってしまいました。「tensorrt-libsには8.6.1なんてバージョンはないよ」というエラーです。
ええぇ…。

今度はtensorrt-libsのバージョンで怒られた

エラーメッセージを読んでいると、どうもCUDAのランタイムがないからそもそもビルドできないことがわかってきました。
それなら先に言えよ…という感じですが、私の準備不足と言われたらそれまでです。
愚痴っていても仕方がないのでCUDAランタイムをインストールしましょう。

python.exe -m pip install nvidia-cuda-runtime-cu11 nvidia-cuda-runtime-cu12 --no-cache-dir

改めてtensorrtをインストールしようとしますが、ここでもさらなる罠が待ち構えていました。
tensorrt と tensorrt-libs は9.3.0.post12.dev1が最新版ですが、tensorrt-bindings は最新版が10.0.0b6なのです。
バージョン指定しなければ tensorrt-bindings だけバージョン違いがインストールされてしまうので、ここも tensorrt の最新版 に合わせる形で9.3.0.post12.dev1をインストールすることにします。

python.exe -m pip install --pre tensorrt==9.3.0.post12.dev1 tensorrt-libs==9.3.0.post12.dev1 tensorrt-bindings==9.3.0.post12.dev1 --extra-index-url https://pypi.nvidia.com --no-cache-dir

protobufのインストール

protobuf というパッケージも必須なのですが、ぶっちゃけこのパッケージがなんなのかはよくわかりませんでした。
PyPIに行っても『このパッケージの作者はプロジェクトの説明を提供していません』と、にべもありません。

重要なのは protobuf が3.x系でなければダメだということです。
これは本家NVIDIAのTensorRTのスレッドで得た情報です。
PyPIで確認すると3.xの最終版は3.20.3なので、これをバージョン指定で入れることにします。

 python.exe -m pip install protobuf==3.20.3 --prefer-binary

onnxruntimeその他のインストール

その他の必須パッケージをまとめて突っ込みます。
途中のダウンロード容量がでかすぎでもう疲れてきました。

python.exe -m pip install onnxruntime

python.exe -m pip install colored

python.exe -m pip install polygraphy --extra-index-url https://pypi.ngc.nvidia.com/

python.exe -m pip install onnx-graphsurgeon --extra-index-url https://pypi.ngc.nvidia.com/
onnxruntimeをインストールしようとすると結局onnxも入ります

cudnnのアンインストール

必須パッケージを突っ込んだら、cudnnはアンイストールします。
これ本当に消していいの?と思っているのですが、TensorRTに必要なパッケージをビルドするためには必要だけど、パッケージをインストール後は逆にTensorRTの動作の邪魔になるそうです。
複数のサイトで見た情報なので、詳しい人がそう言うのならそうなのでしょう(投げやり)。

 python.exe -m pip uninstall -y nvidia-cudnn-cu11 nvidia-cudnn-cu12
cudnnはアンインストール

Stable-Diffusion-WebUI-TensorRTのインストール

以上で必要とされているパッケージのインストールは完了です。
deactivate と入力て終了しましょう。

\stable-diffusion-webui\extensions フォルダに行って、git clone で Stable-Diffusion-WebUI-TensorRT をインストールします。
別にWebUIからインストールしても大丈夫ですが、PowerShellを開いているのでコマンドでインストールしました。

\stable-diffusion-webui\extensions> git clone https://github.com/NVIDIA/Stable-Diffusion-WebUI-TensorRT.git

WebUIからインストールする場合は、他の拡張機能と同じようにリポジトリのURLを入力してインストールして下さい。

https://github.com/NVIDIA/Stable-Diffusion-WebUI-TensorRT と入力

これでインストールは完了しましたので、webui-user.batを少し書き換えます。

webui-user.batのカスタマイズ

webui-user.batを編集して、以下の2行を加えます。

set POLYGRAPHY_AUTOINSTALL_DEPS=1
set CUDA_MODULE_LOADING=LAZY

webui-user.batに2行書き加える

POLYGRAPHY_AUTOINSTALL_DEPS=1 と書いておくと、もしonnxかtensorrt関係で不足しているパッケージがあった場合、polygraphy が自動的にインストールしてくれるようになります。
CUDA_MODULE_LOADING=LAZY は、CUDAが全モジュールを読み込まずに必要時に適宜読み込むようになるそうです。

https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#lazy-loading

CUDA C++ Programming Guide

これで起動してみます。

やけに起動に時間がかかると思ったら、まだ何かいろいろ突っ込まれました。
まだ必要なパッケージあるのかよ…。

まだ何かインストールされる

これでwebUIにTensorRTのタブが現れ、TensorRTが利用可能になりました。

やっとTensorRTタブが現れました

これで準備が整いましたので、次回はTensorRTエンジンを実際に作ってみます。
お疲れさまでした。

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