1 ポイント 投稿者 GN⁺ 2023-12-25 | 1件のコメント | WhatsAppで共有
  • 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-txt2imgdemo/realtime-img2imgにあり、Img2ImgデモはWebブラウザでライブWebカメラフィードや画面キャプチャを使用する
  • DiffusersのStableDiffusionPipelineをラップする形で使用し、LCM-LoRAのマージ、Tiny VAE、xformers、TensorRT高速化により、さらに高速な実行を構成できる

StreamDiffusionの目的と性能

  • StreamDiffusionはリアルタイムインタラクティブ生成のための拡散パイプライン
  • 現在の拡散ベース画像生成手法に対して性能向上を提供することを目指す
  • 論文はarXiv 2312.12491Hugging 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.0torchvision==0.16.0xformers
    • CUDA 12.1: torch==2.1.0torchvision==0.16.0xformers
  • ユーザー向けインストール方法
  • 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/taesdTiny VAEを使用する
    • enable_xformers_memory_efficient_attention()でxformersのメモリ効率の高いattentionを有効化する
  • Txt2Imgの例ではt_index_list=[0, 16, 32, 45]を使用し、テキストから画像ではcfg_type="none"の使用を推奨する
  • ウォームアップ回数はlen(t_index_list) x frame_buffer_size以上である必要がある

TensorRT高速化

  • より高速な生成のために、xformers有効化コードをTensorRT高速化コードに置き換えられる
  • streamdiffusion.acceleration.tensorrtaccelerate_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を近似実装する方法
  • StreamDiffusioncfg_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"
  • deltaはRCFGの効果を調整する緩和効果を持つ

使用モデルとリソース

1件のコメント

 
GN⁺ 2023-12-25
Hacker Newsのコメント
  • Arxiv論文はこちら: https://arxiv.org/abs/2312.12491
    4090基準の標準ベンチマークより、もっと速くできそう。SDXL Turboを1回反復にして、最適化なしでも10fpsまでは出た
    ただし不要な生成を防ぐ確率的類似度フィルタのような改善は、GPUを常に100%に張り付かせなくても高速な結果を得るのに良さそう

  • 現実感がないほどだ。1年で10年が過ぎたような感じ

    • これが自分の仕事を代わりにできるようになったら、PCで動かしてSlackにつないでおける日を待っている。そうすれば雇用主は自分が手でやったのと同じような結果を受け取り、自分は実際に働く時間を使わずに給料をもらえて、ようやく趣味に集中できる気がする。結局みんなこういう流れになるんだよね?
    • 今のオープンソースAIエコシステム全体がこんな感じ。ほぼ毎日、不可能だと思われていたことを可能にする新しい進展が出てきて、その変化についていくのが本当に難しい
    • フロントエンド開発者として、フロントエンド界隈の変化が速すぎてついていけないと不満を言っていた人たちの気持ちが、今では分かるようになった
    • これらのソフトウェアは、自分がapt-get installする速度よりも速く進化している
    • インクリメンタルゲーム(https://www.reddit.com/r/incremental_games/)を思い出す。でも、ああいうゲームは始めない方がいい。休日が台無しになるかもしれない
  • realtime-text2imgデモをさっき試したが、この用途にフロントエンドでnpmを使うのは大げさな気がする。16枚ではなく1枚だけ生成するように変えたところ、RTX-3080ノートPCでもうまく動いた。おそらく毎秒2枚くらい出ていると思う
    追記: examples\screenデモは、ほとんどリアルタイムのように感じる。ウィンドウには4fpsと表示されているが、それが正確に何を意味するのかは分からない
    追記: ただしimg2imgのノイズ除去強度が非常に低いので、返ってくる画像は元画像とごくわずかしか違わない

    • 実際の品質、多様性、プロンプトとの整合性がどうなのか気になる。数日間GPUを使えない状態なので、自分では確認できていない
      生成モデルの論文は、自分で動かしてみるまでは判断がいつも難しい。査読者に見せる必要があるので、選別した結果を入れざるを得ないからだ。これが良いことだとは思わないが、今の現実はそういうものだと思う
      ここでは小さなオートエンコーダを使っているのだろうか? Artspewもそうしていて、より高いFPSを出していたが、TensorRTは使わずTritonは使っており、品質はひどかった。それでも格好よかった
      いずれにせよ、品質が表示されているものよりずっと劣っていたとしても印象的だが、実際のところは分かりにくい
  • 100fpsというのは、10msごとに新しい入力を入れて、10msごとに新しい出力を受け取れるという意味なのか気になる。それとも平均スループットを得るには入力をまとめてバッチ処理する必要があるのか?

    • 自分で試したわけではないが、推測ではバッチ処理は必要ないと思う
      モデルで遅い部分はモデルをロードする段階だ。一度モデルが載ってしまえば、好きな入力を送れる
      画像データをパースして送る処理が、ここでボトルネックになるとは直感的には思えない
  • ほぼドキュメントに書かれている通りにすぐ動いた。こういうデモの多くは壊れて、奇妙で深いエラーを出すことが多いが、これは大丈夫だった
    よくできている。一度試す価値がある。アニメ風ではないものを作りたいなら、realtime-txt2imgserver.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なのか?

    • ビデオ入力だ。記事によると、確率的類似度フィルタがビデオ入力のうち前フレームからの変化が少ない場合に変換処理を減らし、GPU処理負荷を下げるという。上のGIFの赤いフレームがその例だ
    • 現在ControlNet対応を追加するGitHub Issueが開いているので、ControlNetではなさそう。単にプロンプトとrcfgスケールを使ったimg2imgに見える
    • では左が元画像で、右が結果画像という意味なのか?
  • Apple Siliconではfpsはどの程度なのか?

    • MPSサポートがないので0だ
      ただし現在同じ価格帯である整備済み品基準の約1,800ドルでは、M1 Max 64GB StudioはSD1.5とSDXLの生成AIでRTX 4090 24GBより約13倍遅い
    • M1 Proと32GB RAMでDrawThingsを使ってSDXL Turboを動かしている
      512x512、5ステップの画像は5秒で生成される。リファイナー、アップスケーラー、顔復元は使っていない
      自分の知る限り、DrawThingsはまだSDXL Turboやパイプライン生成向けに最適化されていない
      ちなみにSDXL Base+Refinerで顔復元をオンにし、2k x 2k、50ステップの画像を作ると約120秒かかる
    • 少なくとも1/8程度にはなりそうだが、Appleで最低24fpsで動けばすごいことになりそう。ある程度補間を使えば可能かもしれない
      特にアニメ風なら基本的に2フレームに1枚描く方式なので、12fpsでも耐えられそう
  • 見られる動画はどこかにある?