西川和久の不定期コラム
GeForce RTX 4090なら100fps超え?噂の爆速画像生成AI環境「StreamDiffusion」を試す
2024年1月11日 06:18
去年(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。予想通りといったところか。
次はscreen。起動すると半透明の矩形が出るので、そのエリア内に何か入れておくとリアルタイムimg2img作動の確認ができる。
ここではStable Video Diffusionで作った動画をループ再生するPlayerを置いてみた。各所にオーバーヘッドがあるのか、少し速度は落ちているものの、それでも9fps程度は出ている。
pip install -r screen/requirements.txt
python screen/main.py
次に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-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アドレス)
examplesから3本、demoから1本動かしてみたがいかがだろうか。デモのrealtime-txt2imgは少しコードを触れば、さらに楽しめそうな感じだ。個人的には4x4でなく1枚大きくで十分。ただし、リアルタイムでプロンプトを拾うとデモ効果としては抜群だが、スペルミスなどがあった場合、一瞬変な絵が出たりするので、実用的に使うなら[Enter]で確定した方がいいかと思う。
demo2本目のrealtime-img2imgは、Webカメラが使えるなら、自分をプロンプトで別キャラに変身させるのもあり。リアルタイムなStreamDiffusionを十分楽しめる。
以上、去年後半からのStable Diffusion高速化技術の簡単な紹介を経て、StreamDiffusionのインストール、サンプル/デモを動かしてみた。USB4接続と不利な条件でもRTX 3090で42fps(batch4)となかなか凄い結果となった。
今年2024年はまだ始まったばかり。この1年、さらなる高速化や高画質化などに期待したい。