StreamDiffusion:リアルタイムインタラクティブ生成のためのパイプラインレベルのソリューション
(github.com/cumulo-autumn)- StreamDiffusionは、拡散ベースの画像生成をリアルタイムインタラクティブ生成向けに改善したパイプラインで、既存の拡散画像生成手法の性能向上を目指す
- 主な機能は、Stream Batch、Residual Classifier-Free Guidance、Stochastic Similarity Filter、IO Queues、KV-cacheの事前計算、モデル高速化ツールで構成される
- RTX 4090、Core i9-13900K、Ubuntu 22.04.3 LTS環境で、SD-turboは1 denoising step基準でTxt2Img 106.16fps、Img2Img 93.897fpsを記録
- リアルタイムデモは
demo/realtime-txt2imgとdemo/realtime-img2imgにあり、Img2ImgデモはWebブラウザでライブWebカメラフィードや画面キャプチャを使用する - Diffusersの
StableDiffusionPipelineをラップする形で使用し、LCM-LoRAのマージ、Tiny VAE、xformers、TensorRT高速化により、さらに高速な実行を構成できる
StreamDiffusionの目的と性能
- StreamDiffusionはリアルタイムインタラクティブ生成のための拡散パイプライン
- 現在の拡散ベース画像生成手法に対して性能向上を提供することを目指す
- 論文はarXiv 2312.12491とHugging Face Papersにリンクされている
- 提案パイプラインで画像を生成した性能測定環境は以下の通り
- GPU: RTX 4090
- CPU: Core i9-13900K
- OS: Ubuntu 22.04.3 LTS
- 性能表
- SD-turbo: denoising step 1、Txt2Img 106.16fps、Img2Img 93.897fps
- LCM-LoRA + KohakuV2: denoising step 4、Txt2Img 38.023fps、Img2Img 37.133fps
主な機能
-
Stream Batch
- 効率的なバッチ処理によってデータ処理を簡素化
-
Residual Classifier-Free Guidance
- 計算の重複を減らす改良されたguidanceメカニズム
-
Stochastic Similarity Filter
- 高度なフィルタリング手法によりGPU利用効率を改善
-
IO Queues
- 入力と出力の処理を効率的に管理し、より滑らかな実行を支援する機能
-
Pre-Computation for KV-Caches
- キャッシュ戦略を最適化して処理速度を高める
-
Model Acceleration Tools
- モデル最適化と性能向上のための複数のツールを使用
インストールと実行方法
- StreamDiffusionはpip、conda、Dockerでインストールできる
- 推奨Python環境の例は、
python=3.10ベースのconda環境またはvenv - PyTorchのインストール例はCUDA 11.8とCUDA 12.1を区別する
- CUDA 11.8:
torch==2.1.0、torchvision==0.16.0、xformers - CUDA 12.1:
torch==2.1.0、torchvision==0.16.0、xformers
- CUDA 11.8:
- ユーザー向けインストール方法
- 最新版推奨:
pip install git+https://github.com/cumulo-autumn/StreamDiffusion.git@main/…] - 安定版:
pip install streamdiffusion[tensorrt] - TensorRT拡張は
python -m streamdiffusion.tools.install-tensorrtでインストールする
- 最新版推奨:
- Windowsで安定版をインストールした場合、
pywin32を追加でインストールする必要がある場合がある - DockerインストールはTensorRT準備済み環境を対象とし、
docker build後に--gpus allオプションで実行する
デモと使用例
- サンプルは
examplesディレクトリで実行できる - リアルタイムTxt2Imgデモは
demo/realtime-txt2imgディレクトリにある - リアルタイムImg2Imgデモは
demo/realtime-img2imgディレクトリにある- WebブラウザでライブWebカメラフィードまたは画面キャプチャを使用できる
- 基本的な使用フローは、Diffusersの
StableDiffusionPipelineを読み込んだ後、StreamDiffusionでラップする形 - Img2Imgの例では
KBlueLeaf/kohaku-v2.1モデルを読み込み、t_index_list=[32, 45]でストリームを構成する- モデルがLCMでない場合は
load_lcm_lora()とfuse_lora()を使用する - 追加の高速化のために
madebyollin/taesdのTiny VAEを使用する enable_xformers_memory_efficient_attention()でxformersのメモリ効率の高いattentionを有効化する
- モデルがLCMでない場合は
- Txt2Imgの例では
t_index_list=[0, 16, 32, 45]を使用し、テキストから画像ではcfg_type="none"の使用を推奨する - ウォームアップ回数は
len(t_index_list) x frame_buffer_size以上である必要がある
TensorRT高速化
- より高速な生成のために、xformers有効化コードをTensorRT高速化コードに置き換えられる
streamdiffusion.acceleration.tensorrtのaccelerate_with_tensorrtを使用する- 構成例では
stream、"engines"、max_batch_size=2を渡す - TensorRT拡張が必要で、エンジンのビルドには時間がかかる
- エンジンビルド後は、先の例よりも高速に実行される
Stochastic Similarity Filter
- Stochastic Similarity Filterは、動画入力で前フレームからの変化が少ない場合に変換処理を減らす
- 変換処理を減らすことでGPU処理負荷を緩和する
- 使用方法は
stream.enable_similar_image_filter()を呼び出す形 - 設定可能な引数
similar_image_filter_threshold: 処理を一時停止する前の、前フレームと現在フレームの間の類似度しきい値similar_image_filter_max_skip_frame: 変換を再開するまで一時停止中に許容される最大間隔
Residual CFG
- RCFGは、CFGを使用しない場合と競争可能な計算複雑度でCFGを近似実装する方法
StreamDiffusionのcfg_type引数で指定できる- RCFGには2つの種類がある
- RCFG Self-Negative: negative prompt指定項目がない方式
- RCFG Onetime-Negative: negative promptを指定できる方式
- 計算複雑度の比較
- CFGなし: N
- 通常のCFG: 2N
- RCFG Self-Negative: N
- RCFG Onetime-Negative: N+1
cfg_typeの値は以下の通り- CFGなし:
"none" - 通常のCFG:
"full" - RCFG Self-Negative:
"self" - RCFG Onetime-Negative:
"initialize"
- CFGなし:
deltaはRCFGの効果を調整する緩和効果を持つ
使用モデルとリソース
- リポジトリの動画と画像デモは、LCM-LoRA + KohakuV2、SD-Turboを使用して生成された
- KohakuV2モデルはCivitaiとHugging Faceからダウンロードできる
- SD-TurboはHugging Face Spaceでも利用できる
1件のコメント
Hacker Newsのコメント
Arxiv論文はこちら: https://arxiv.org/abs/2312.12491
4090基準の標準ベンチマークより、もっと速くできそう。SDXL Turboを1回反復にして、最適化なしでも10fpsまでは出た
ただし不要な生成を防ぐ確率的類似度フィルタのような改善は、GPUを常に100%に張り付かせなくても高速な結果を得るのに良さそう
現実感がないほどだ。1年で10年が過ぎたような感じ
apt-get installする速度よりも速く進化しているrealtime-text2imgデモをさっき試したが、この用途にフロントエンドでnpmを使うのは大げさな気がする。16枚ではなく1枚だけ生成するように変えたところ、RTX-3080ノートPCでもうまく動いた。おそらく毎秒2枚くらい出ていると思う追記:
examples\screenデモは、ほとんどリアルタイムのように感じる。ウィンドウには4fpsと表示されているが、それが正確に何を意味するのかは分からない追記: ただしimg2imgのノイズ除去強度が非常に低いので、返ってくる画像は元画像とごくわずかしか違わない
生成モデルの論文は、自分で動かしてみるまでは判断がいつも難しい。査読者に見せる必要があるので、選別した結果を入れざるを得ないからだ。これが良いことだとは思わないが、今の現実はそういうものだと思う
ここでは小さなオートエンコーダを使っているのだろうか? Artspewもそうしていて、より高いFPSを出していたが、TensorRTは使わずTritonは使っており、品質はひどかった。それでも格好よかった
いずれにせよ、品質が表示されているものよりずっと劣っていたとしても印象的だが、実際のところは分かりにくい
100fpsというのは、10msごとに新しい入力を入れて、10msごとに新しい出力を受け取れるという意味なのか気になる。それとも平均スループットを得るには入力をまとめてバッチ処理する必要があるのか?
モデルで遅い部分はモデルをロードする段階だ。一度モデルが載ってしまえば、好きな入力を送れる
画像データをパースして送る処理が、ここでボトルネックになるとは直感的には思えない
ほぼドキュメントに書かれている通りにすぐ動いた。こういうデモの多くは壊れて、奇妙で深いエラーを出すことが多いが、これは大丈夫だった
よくできている。一度試す価値がある。アニメ風ではないものを作りたいなら、
realtime-txt2imgのserver.pyでモデルを変えればよい。たとえば https://huggingface.co/runwayml/stable-diffusion-v1-5 を指定してもうまく動く結果は本当に速い。素晴らしくはないが速い。LCM-LoRA経由でSDXLに変えると https://huggingface.co/latent-consistency より良い結果が出るかもしれないが、そこから難しくなり、前述の謎めいたクラッシュに遭遇し始める。実作業が必要になる地点だ
自分の環境は4090/3990x/CUDA 12.2/debian sidで、環境によって違うかもしれない
女の子キャラクターがフレームの内外へ動くデモはどう動いているのか? ControlNetなのか?
Apple Siliconではfpsはどの程度なのか?
ただし現在同じ価格帯である整備済み品基準の約1,800ドルでは、M1 Max 64GB StudioはSD1.5とSDXLの生成AIでRTX 4090 24GBより約13倍遅い
512x512、5ステップの画像は5秒で生成される。リファイナー、アップスケーラー、顔復元は使っていない
自分の知る限り、DrawThingsはまだSDXL Turboやパイプライン生成向けに最適化されていない
ちなみにSDXL Base+Refinerで顔復元をオンにし、2k x 2k、50ステップの画像を作ると約120秒かかる
特にアニメ風なら基本的に2フレームに1枚描く方式なので、12fpsでも耐えられそう
見られる動画はどこかにある?