orangeitems’s diary

40代ITエンジニアが毎日何か書くブログ

Stable Diffusionが最新のNVIDIAドライバで倍速になるときいて、導入に苦労した件

 

最新のNVidiaドライバで、Stable Diffusionの動作が速度2倍になるらしい。

 

pc.watch.impress.co.jp

 本ドライバでは、WebUI「Automatic1111」版のStable Diffusionの処理速度を倍速にするTensorRTアクセラレーションを追加した。TensorRTアクセラレーションの使用には拡張機能「TensorRT Extension for Stable Diffusion」が別途必要となる。

 

そりゃすんげえな、と思って既存の環境(RTX 3090)にこの拡張機能を入れてみたら、ダメです。入れたら、変なエラーが出るようになって困ったな、と。

んで、既存の環境も随分入れて時間が経つので、新規で作り直そうと思いました。

つまり、既存の環境には入れない方がいいですよ(少なくとも現時点では)。

 

以下、Automatic1111新規導入を含めての手順です。

NVidiaもAutomatic1111を含めた、今回のインストール方法を公開してくれていたので、この通りにやりました。

 

TensorRT Extension for Stable Diffusion Web UI | NVIDIA

 

上記のページを基本にお話しします。

「1. Install Stable Diffusion Web UI from Automatic1111」って段落の手順をそのままやってください。英語ですがブラウザの翻訳などで日本語にして読めばいいと思います。

 

で、このまま「2. Installing the TensorRT Extension for Automatic1111」に突き進んだら、下記のエラーが出てTensorRTタブが出てこないと思います。

*** Error loading script: trt.py
    Traceback (most recent call last):
      File "E:\StableDiffusion_2\webui\modules\scripts.py", line 382, in load_scripts
        script_module = script_loading.load_module(scriptfile.path)
      File "E:\StableDiffusion_2\webui\modules\script_loading.py", line 10, in load_module
        module_spec.loader.exec_module(module)
      File "<frozen importlib._bootstrap_external>", line 883, in exec_module
      File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
      File "E:\StableDiffusion_2\webui\extensions\Stable-Diffusion-WebUI-TensorRT\scripts\trt.py", line 10, in <module>
        import ui_trt
      File "E:\StableDiffusion_2\webui\extensions\Stable-Diffusion-WebUI-TensorRT\ui_trt.py", line 10, in <module>
        from exporter import export_onnx, export_trt
      File "E:\StableDiffusion_2\webui\extensions\Stable-Diffusion-WebUI-TensorRT\exporter.py", line 10, in <module>
        from utilities import Engine
      File "E:\StableDiffusion_2\webui\extensions\Stable-Diffusion-WebUI-TensorRT\utilities.py", line 32, in <module>
        import tensorrt as trt
      File "E:\StableDiffusion_2\system\python\lib\site-packages\tensorrt\__init__.py", line 18, in <module>
        from tensorrt_bindings import *
    ModuleNotFoundError: No module named 'tensorrt_bindings'

 

トラブルシューティングの方法は下記にありました。

 

github.com

※ベースの SD webui フォルダーをE:\StableDiffusion_2\webuiとします。

・.\extensions\stable-diffusion-webui-tensorrtフォルダーを消します。

・.\venvフォルダーを消します。

・コマンド プロンプトを開き、ベースの SD webui フォルダーに移動します。

・webui.bat を実行します。これにより、仮想環境 venv が再構築されます。

※時間がかかります。

・WebUI が表示されたらそれを閉じます。また、コマンド プロンプトも閉じます。

・コマンド プロンプトを開き、ベースの SD webui フォルダーに移動します。

・次のコマンドを入力します。

venv\Scripts\activate.bat

python.exe -m pip install --upgrade pip

python -m pip install nvidia-cudnn-cu11==8.9.4.25 --no-cache-dir

python -m pip install --pre --extra-index-url https://pypi.nvidia.com/

tensorrt==9.0.1.post11.dev4 --no-cache-dir

python -m pip uninstall -y nvidia-cudnn-cu11

venv\Scripts\deactivate.bat

webui.bat

・[URL からインストール] オプションを使用して TensorRT 拡張機能をインストールします。

・インストールしたら、[拡張機能] >> [インストール済み] タブに移動し、適用して再起動します。

 

上記をやったらwebuiがエラーなく起動し、ちゃんと「TensorRT」というタブが出てくれるようになりました!。

 

で、速いんか・・?

実行するモデルごとに、TensorRT Engine Profilesなるものを作成しなければならず、面倒ではありますが、超速いです。異次元の速さ。

ただ、「Hires. fix」を使って高解像度にしようと思ったら、このEngineをカスタマイズしなきゃいけないみたいですね。

 

github.com

開始イメージ サイズと終了イメージ サイズの両方をサポートできるエンジンが必要です。したがって、512x512 を使用し、2 倍のアップスケーリングを使用している場合は、開始画像である 512x512 をサポートするエンジンが必要になり (これはデフォルトのエンジンでカバーされます)、終了解像度である 1024x1024 をサポートするエンジンが必要になります。サイズ。(この範囲をカバーするには別のエンジンを作成する必要があります。) 拡張機能はデフォルトのエンジンを使用して起動し、1024x1024 までのスケールを処理する必要がある場合は、より大きな解像度のエンジンに切り替えます。

 

デフォルトで生成できるものは512~768までなので、もっとエンジンを作り込まないといけなそう。これは頑張ってみます。

あと、解像度は64の倍数にしなきゃいけないとか、いろいろ注釈が厳しいツールです。でも速さへの追求は、楽しいもんです。夜更かししてしまいました。