西川和久の不定期コラム

GeForce RTX 4090なら100fps超え?噂の爆速画像生成AI環境「StreamDiffusion」を試す

 去年(2023年)後半にStable Diffusionを高速化する技術がいくつも登場したが、今回ご紹介する「StreamDiffusion」は、「GeForce RTX 4090なら100fpsを超える」という技術。早速試したのでレポートをお届けしたい。

去年後半のStable Diffusion高速化に関する流れをおさらい

 StreamDiffusionの話に入る前に、去年の後半からいきなり始まったStable Diffusionの高速化の流れに関して、簡単にまとめてみたい。

 第1弾は、10月18日に発表のあった「TensorRT」。Stable Diffusion用のModelをTensorRT用に変換し高速化する技術だ。AUTOMATIC1111用の拡張機能があり、約倍速になるのだが、変換に時間がかかり、変換後の容量はGB級。「ControlNet」などいろいろな機能と併用できない……など、弱点も多い。

 次に出てきたのが「SSD-1B」と「LCM(Latent Consistency Model)」。ただしどちらもModel内包型で使いにくい。この辺りの話は、以下に書いてあるので、興味のある人は合わせてご覧頂きたい。

 ここまでは速くはなるものの、いろいろ制限があり、特にお気に入りのModelをそのまま使えないこともあり、さほど盛り上がらなかった。

 この流れを一気に変えたのが「LCM LoRA」の登場だ。つまりLCMの部分だけLoRA化し、普段使っているModelに当てれば、生成時のStep数を減らし、2〜3倍の高速化を実現することを可能にしたのだ。

 以降、civitaiでは、少し手を加えたLCM LoRAや、LCM内包Modelなど、多くのModelで賑わっている。

 さらに11月29日、たった1 Stepで生成可能な「SDXL Turbo」が本家Stability AIから発表

 さすがに高速化はこれで打ち止めか……っと思っていた12月25日。GeForce RTX 4090なら100fps以上が生成可能なStreamDiffusionが発表された。少し前からXで予告していたこともあり、正式リリースを待ってた人も多かったのではないだろうか。

 前置きが長くなってしまったが、時期が年末のバタバタ的なタイミングだったこともあり、また今年の正月休みは短く、やっとこの3連休で試すことができた。

インストール

 今回使用した環境はRyzen 9/Windows 11+USB4接続のGPUボックス/GeForce RTX 3090。これだとPCIe接続GeForce RTX 4090の半分ほどのパフォーマンスなので、最大でも50fps行けば……というところだろうか。

 StreamDiffusionのgithubはここ。また日本語での解説がここにあるので参考にして欲しい。以下、インストール手順となる。

git clone https://github.com/cumulo-autumn/StreamDiffusion.git
cd StreamDiffusion
※ コードなどをローカルへ展開

conda create -n streamdiffusion python=3.10
conda activate streamdiffusion
※ pythonの環境構築

pip3 install torch==2.1.0 torchvision==0.16.0 xformers --index-url https://download.pytorch.org/whl/cu121
※ cuda関連

pip install streamdiffusion[tensorrt]
python -m streamdiffusion.tools.install-tensorrt
pip install --force-reinstall pywin32
※ tensorrtとstreamdiffusion本体

 最後のstreamdiffusion関連以外は、割とPython+CUDAでありがちなパターンなので特に難しい部分はないだろう。1点、サンプルプログラムを実行すると“tritonがない”と出るのでこれを入れておく

pip install .\triton-2.0.0-cp310-cp310-win_amd64.whl

 これで準備完了だ。

サンプルプログラムを動かしてみる

 StreamDiffusion/examplesにサンプルプログラムがあるのでいくつか実行してみた。まず、パフォーマンス確認は以下の2つを使用。TensorRTを使っている関係上、Model変換が終わるまで少し時間がかかる。

python optimal-performance/single.py
python optimal-performance/multi.py

 どちらも元々プロンプトが「cat with sunglasses and a hat, photoreal, 8K」だったので「a happy new year, dragon, photoreal, 8K」へ変更。百聞は一見に如かず。USB4接続のRTX 3090なので100fpsはさすがに出ないものの、singleで32fps、multi(batch4)で42fps。予想通りといったところか。

single.py実行中のデスクトップ。32fps出ている
動画だと32fpsでもかなり速い
1度に4枚生成するmulti.py。42fpsとさらに上がっている。エラーが出ているのが気になるところ
1度に4枚なので、その分、ゆっくりとした描画となる

 次はscreen。起動すると半透明の矩形が出るので、そのエリア内に何か入れておくとリアルタイムimg2img作動の確認ができる。

 ここではStable Video Diffusionで作った動画をループ再生するPlayerを置いてみた。各所にオーバーヘッドがあるのか、少し速度は落ちているものの、それでも9fps程度は出ている。

pip install -r screen/requirements.txt
python screen/main.py
screen実行中のデスクトップ
半透明枠内でループ再生しているStable Video Diffusionで作った動画
リアルタイムimg2img変換した動画

 次にdemo。WebUIになっていて、それなりに楽しめる。ただnodejsとpnpmを使うので入ってない場合は事前にインストールしておく。

iwr https://get.pnpm.io/install.ps1 -useb | iex

 demo/realtime-txt2img。これは文字通りリアルタイムでプロンプトに反応し、4x4の画像を生成する仕掛けとなっている。

pip install -r requirements.txt
cd frontend
pnpm i
pnpm run build
cd ..
python main.py
※ http://127.0.0.1:9090 でWebUIが開く
demo/realtime-txt2img作動中のデスクトップ
プロンプトに反応して4x4の画像が変わるのが分かる

 demo/realtime-img2img。これはWebカメラを入力として、img2imgする仕掛けなのだが、PCにWebカメラがないため作動しなかった。

cd frontend
pnpm i
pnpm run build
cd ..
pip install -r requirements.txt
python main.py  --acceleration tensorrt
※ http://0.0.0.0:7860 (0.0.0.0サーバーのIPアドレス)
demo/realtime-img2img作動中のデスクトップ。Webカメラがなくエラー

 examplesから3本、demoから1本動かしてみたがいかがだろうか。デモのrealtime-txt2imgは少しコードを触れば、さらに楽しめそうな感じだ。個人的には4x4でなく1枚大きくで十分。ただし、リアルタイムでプロンプトを拾うとデモ効果としては抜群だが、スペルミスなどがあった場合、一瞬変な絵が出たりするので、実用的に使うなら[Enter]で確定した方がいいかと思う。

 demo2本目のrealtime-img2imgは、Webカメラが使えるなら、自分をプロンプトで別キャラに変身させるのもあり。リアルタイムなStreamDiffusionを十分楽しめる。


 以上、去年後半からのStable Diffusion高速化技術の簡単な紹介を経て、StreamDiffusionのインストール、サンプル/デモを動かしてみた。USB4接続と不利な条件でもRTX 3090で42fps(batch4)となかなか凄い結果となった。

 今年2024年はまだ始まったばかり。この1年、さらなる高速化や高画質化などに期待したい。