WaveSpeedの効果とサンプラー、スケジューラーについて
高速化で話題のWaveSpeed、凄いですね。
確かに早くなっていて感動しました。
以前、torch compileとか試した事がありましたがほぼ効果ないパターンが続いている中でのこれはなかなか凄いかと思います。
GJLさんが、修正版を作成された記事があり、さらに高速化が出来るようになったのは嬉しいところです。今後試してみたいと思っています。
ちなみにWaveSpeedは、自作のpytorch2.5.1だとtritonが入ってたので、普通paperspaceでインストールして使えます。
以下本題です。
Hunyunvideoでは、サンプラーとスケジューラーでWaveSpeedの効果に違いがあります
この効果をWaveSpeedの理論や実際の検証結果を踏まえてこの記事では提示します。
以下が、Githubから読み取れるWaveSperdの理論です。
WaveSpeedで使用されているDynamic Caching (First Block Cache)
Dynamic Caching は、特に Transformer モデルや Neural Network モデルの効率的な推論に焦点を当てた技術です。この技術は、以下のような問題に対応します
①計算効率の改善: 通常のモデル推論では、すべての入力データを処理するたびにフルモデルの演算を行いますが、一部のデータは再計算の必要がない場合があります。
②キャッシュの活用: 初期ブロック(First Block)の計算結果は、特定の条件下で変化しないため、再利用可能です。
<基本的なアイデア>
①入力の固定部分を検出
推論時に、モデルの初期層(First Block)で計算される一部の結果が再利用可能である場合、それをキャッシュします。
②再利用戦略
キャッシュされたデータを動的に管理し、再計算を避けることで推論時間を短縮します。
③適用範囲
動的に変化しないデータセット(例:画像生成モデルでの固定ノイズ)や再利用可能なテンソル構造に有効です。
④利点
計算負荷の削減: 無駄な再計算を防ぎ、計算資源を節約。
リアルタイム性能向上: 推論スピードが向上し、特にインタラクティブなアプリケーションで効果を発揮。
Github内の「first_block_cache.py」が上のキャッシュ機能の中心的な実装が記載されています。
高速化しやすいのは、サンプラーだと以下のような部分が関連していそうな印象です。
固定キャッシュの再利用可能性
初期層や固定テンソル(ノイズ)の再利用が可能な場合、高速化が期待される。
ステップごとの動的変化の少なさ
ステップ間でテンソル構造や計算が安定している場合、キャッシュ効果が活きる。
<サンプラーとWaveSpeedによる高速化の効果の比較>
①DDIM 高い
決定論的サンプリングで動的変化が少ない。
キャッシュ再利用が可能で、wavespeedの効果が大きい。
②Euler 高い
シンプルな計算フローで固定キャッシュが活用可能。
wavespeedでステップ間の進行を大幅に高速化できる。
③DPM++ 2M 中等度
初期層のキャッシュが再利用可能だが、ステップ間の動的変化がやや多い。
wavespeedで一定の高速化が期待できる。
④LMS 中等度
線形多段法で計算は比較的安定しているが、ステップごとの変化が一定ある。
キャッシュ効果が部分的に発揮される。
⑤DDPM 中等度
動的変化が少なく、キャッシュが利用可能。ただしステップ数が多い場合は効果が薄れる。
⑥DEIS 中等度
中間ステップの推定により効率化が可能。wavespeedで顕著な高速化が期待される。
⑦sdeが付くやつ 低い
高速化しにくいようです。
以下、理由です。
(1) 確率的要素によるノイズ再生成
各ステップでノイズを新たに生成する必要があるため、計算負荷が高い。
再生成されたノイズはテンソル構造が変化するため、キャッシュ利用が難しくなる。
(2) ステップ間の動的変化
ステップごとに計算が動的に変化し、固定テンソルが再利用できない。
wavespeedで進行速度を速めても、計算の動的変化が高速化を妨げる。
⑧Euler a 低い
ステップごとに新しいノイズを生成するため、キャッシュ再利用が難しい。
動的変化が多く、wavespeedの効果が限定的。
⑨DPM2 A 低い
高精度な計算が必要で動的変化が多い。
キャッシュ再利用がほぼ不可能で、高速化が難しい。
<サンプラーごとの検証結果>
※以下は生成した品質は無視して、生成時間のみ評価したものです。
HunyuanVideoで25フレーム生成で検討
512 x 512、20ステップ
paperspace A4000
スケジューラー exponential
①DDIM:53秒
②Euler:52秒
③DPM++ 2M:55秒
④LMS:53秒
⑤DDPM:54秒
⑥DEIS:55秒
⑦2m sde:61秒
⑧Euler a:68秒
⑨DPM2 A:97秒
⑩Heun:57秒
という事で、⑦⑧⑨はWaveSpeedの効果は得られにくい事が分かりました。
次にスケジューラーについてはどうでしょうか?
ステップ数での変化も加えて評価すると以下のような感じでした。
①Karras 高い
初期ステップでのキャッシュ再利用が効率的で、wavespeedの効果が最大化される。
②Exponential 高い
シンプルな指数スケジューリングで、wavespeedの効果が安定している。
③Simple 中等度から高い
線形進行で動的変化が少なく、キャッシュ効果が大きい。
④Beta 低い
ベータ分布の複雑性により、wavespeed適用時の高速化が抑制される。
⑤KL Optimal 中等度
非線形進行の滑らかさがキャッシュ効果を一定程度活かせるが、ステップ増加で効率が低下。
<以下、上記と同じ条件での生成結果>
①Eular Karras 20ステップ:63s 40ステップ:72s
②Eular exponential 20ステップ:52s 40ステップ:66s
③Euler simple 20ステップ:59s 40ステップ:71s
④Eular beta 20ステップ:60s 40ステップ:90s
⑤Eular KL Optimal 20ステップ:60s 40ステップ:74s
<注意>
今回の検証は、時間のみの評価で、サンプラーとスケジューラーの効果だけを見ています。
実際には、まともな動画ができない設定ばかりですが、通常の画像生成の際などに活用できるかも知れません。
ここで重要なポイントは、ステップ数の増加と比較すると生成時間がそこまで伸びていないというところです。
残念ながらbetaスケジューラーのwavespeedの効果は限定的ですが、例えば前回記事にしたKL Optimalは、ステップ数が多くないと結像しませんので効果が期待されます。
KL Optimalについては、個人的に色々試していますが、設定がシビアなのが好みです。ステップ数が多すぎてもダメとか、解像度によっても違ったりするじゃじゃ馬感。。。。
ガイダンススケールやシフトの値でも変化するのが面白いですが、なかなかプロンプト通りにならないのは、私の技術的なところなのかなと。。。