CuDNN更新によりStable Diffusion WebUIの一部を高速化しVRAM消費を抑制する方法

最新のCuDNN用dllファイルを利用して、Stable Diffusion WebUIの一部動作におけるVRAM消費を抑え、それによって高速化を図る方法をご紹介します。

本稿はA1111を前提にしておりますが、基本的なロジックはForgeでも同様なのでForgeでも適用できます。
(但し、VRAM消費の節約効果は同じではない可能性があります)

ここで解説している手法は決して新しいものではなく、約一年前、とある日本人エンジニアが発見し紹介した技術と記憶しております。

また、LoRAを作成する為のGUI、Kohya’s GUIでも同様のCuDNN更新技術が使用されていることは、一部で知られている通りです。

一方、その後約一年の間にPytorchライブラリーのバージョンアップによってSD A1111でこの技術を使用する意味がやや低下し、現在ほぼ忘れられている技術にもなっている気がします。

しかし先日、私は偶然この技術が現行の最新Pytorch(現時点で最新は2.3.0)を使用していても尚、A1111における一部の、かつ重要な動作においては絶大なVRAM消費効果がある事に気づきました。

その為、改めてここでそのCuDNN更新方法について解説をしておこうと思います。

...

その前に、前述の「一部の、かつ重要な動作」とは何かについて書いておこうと思いますが、その動作とは下図のようにi2iでのアップスケール(MultiDiffusion拡張機能使用)において「Controlnetのtile処理を併用する場合」です。
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661150/21b8465b-ee13-b071-2ebf-66a1294fc11f.png)
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661150/e9165a84-32a6-373d-1126-b73b1eb85d6f.png)
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661150/d5eef9e5-5f95-5ab3-47ea-7ad94f6bdf0b.png)

しかも、4Kサイズ以上の一定サイズ以上へのアップスケール処理を行う際に、このCuDNN更新の有無による差異は明確に発生します。

私が使用するGPUはRTX4070 12GBですが、4Kサイズ超へのアップスケールにおいて最新のPytorchを使用しても尚、CuDNNの手動更新をしない状態ではVRAM消費が12GBを越えて共有GPUメモリを使用してしまい、大幅に処理速度が遅滞したことにより、その際に気付いた次第です。

※但し、CuDNN更新を実行しても、上記アップスケールに際して全工程においてVRAM消費が12GBに収まる訳ではありません。下図のように初期動作において短時間は共有VRAMを使用する瞬間があります。
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661150/78083f4e-c2ed-2fe0-32c9-257e48cddda0.png)

...

前置きはこの位にして本題に入りますが、

A1111内のCuDNNファイルを更新する為には、まずnVidiaのCuDNNサイトアーカイヴ(https://developer.nvidia.com/rdp/cudnn-archive
)から、8.9.xシリーズの最新版である8.9.7をダウンロードする必要があります。CUDA12.xをインストールしている場合にはCUDA12.x対応版をダウンロードしてください。
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661150/163f9d48-3ed2-73b5-4977-942d34bd9b6b.png)

尚、現在CuDNNの最新版は9.1.1がリリースされていますが、CuDNN9.xは現在Pytorch側が対応していません。

今後、Pytorchを構成するファイル内のCuDNNが9.xに対応するまでは、本稿における記載が有効という意味でもあります。

また、ここで重要な事は、「Windowsに仮に最新のCuDNN9.1.1以降がインストールされていても、仮想環境で動作するA1111とは何の関係もない」という点です。

現に私は、Windows11にはCuDNN9.1.1をインストールし、環境変数も設定していますが、それとこれとは全く無関係です。
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661150/6f5ddf76-c7ab-ebee-96ba-c36a56e0e9fd.png)

次に下図のように、ダウンロードしたCuDNN構成ファイルを解凍し、エクスプローラーに展開し、その中のbinフォルダを開いてください。ここでは、この7つのdllファイルを使用します。
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661150/e275bc44-7fcd-9f36-ceca-c851c03f6511.png)

次に下図のように、A1111フォルダ内のtorch用ファイルのフォルダを開きます。パスは「stable-diffusion-webui\venv\Lib\site-packages\torch\lib"」になります。ここでやることは、下図のように赤線で囲っている7つのdllファイルを、上記でダウンロードしておいた、最新の8.9.7内のdllファイルに置き換える事です。
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661150/d1a81a38-21d4-5f8e-cb64-3bf50690b668.png)

ここで、上書きは推奨しません。確実を期する為には、A1111側の7つのdllファイルを削除してから8.9.7側のdllをコピーしてください。

この後、A1111を起動し起動が成功すれば、更新は成功しています。仮にここまでの作業で何か失敗していた場合は、WebUI自体がエラーで起動しません。

更新作業は以上で完了です。

関心がある方は、更新前と更新後で、Controlnetのtile処理を併用した4Kサイズ以上のアップスケール時におけるVRAM消費量を比較してみると良いでしょう。

このCuDNN更新後の状態では、余程巨大なサイズへのアップスケールでない限り、VRAM消費量が12GBを超えることはなくなり、このクラスのGPUを使用している場合は作業の高速化に寄与している筈です。

そしてこれは私の推測に過ぎませんが、VRAM 16GBクラスのGPUにおいても、本文にて紹介した技術は有効だと思います。CuDNN更新を行わない場合の上記作業において、VRAM消費量が16GBを越えてくるからです。