Waypoint-1: Overworld のリアルタイムインタラクティブ動画拡散

Overworld は Waypoint-1 を発表しました。これはリアルタイムインタラクティブ動画拡散モデルで、テキストプロンプト、マウスの動き、キーボード入力を用いて生成された世界に入り込み、操作できるようにします。従来の世界モデルが限られた制御で事前学習済み動画モデルをファインチューニングするのに対し、Waypoint-1 はインタラクティブ体験向けにゼロレイテンシ制御と一般消費者向けハードウェア上での実行を可能にするよう設計されています。

モデルアーキテクチャとトレーニング

Waypoint-1 はフレーム因果的整流フロー変圧器に基づく潜在モデルです。10,000 時間に及ぶ多様なビデオゲーム映像とテキストキャプション、制御入力のペアからなるデータセットで学習されました。

トレーニング手法

インタラクティブ機能を実現するために、Waypoint-1 は主に 2 つのトレーニング段階を採用しました。

  1. 拡散フォーシング: モデルは拡散フォーシングで事前学習され、過去フレームが与えられたときに将来フレームをデノイズする方法を学習します。因果的アテンションマスクにより、フレーム内のトークンは自フレームまたは過去フレームのみに注意を向け、推論時に新しいフレームを手続き的に生成できるようになります。
  2. セルフフォーシング: 事前学習時のランダムノイズ付与によって生じる推論時のミスマッチとエラー蓄積(ノイズの多い長ロールアウト)を解消するため、モデルは DMD によるセルフフォーシングで事後学習されました。この手法はトレーニングレジームを推論挙動と合わせ、ワンパス CFG と少ステップデノイズを可能にします。

WorldEngine 推論ライブラリ

Overworld は WorldEngine をリリースしました。これは低レイテンシ・高スループットなインタラクティブ世界モデルのストリーミング向けに設計された高性能 Python 推論ライブラリです。WorldEngine はコンテキストフレーム、テキスト、キーボード/マウス入力を受け取り、リアルタイムで画像フレームを出力します。

パフォーマンスベンチマーク

NVIDIA RTX 5090 上で Waypoint-1-Small(2.3B パラメータ)モデルを実行した場合、WorldEngine は以下の性能を示します。

  • スループット: 1フレームあたり256トークンの単一デノイジングパスに基づき、約30,000トークンパス/秒です。
  • フレームレート: デノイジングステップ4で30 FPS、ステップ2で60 FPSです。

技術的最適化

WorldEngine の性能は以下の 4 つの最適化に支えられています。

  • AdaLN フィーチャーキャッシング: プロンプト条件付けとタイムステップが前方パス間で一定の場合、AdaLN 条件付け射影をキャッシュし再利用します。
  • 静的ロール KV キャッシュ + Flex Attention: 冗長計算を削減する高度なキャッシュとアテンション機構を実装します。
  • Matmul フュージョン: 結合された QKV 射影を使用して行列乗算を最適化します。
  • Torch Compile: torch.compile(fullgraph=True, mode="max-autotune", dynamic=False) を利用して最大のグラフ最適化を行います。

入手可能性と実装

Waypoint-1 の重みは Hugging Face Hub で入手可能で、現在 Waypoint-1-Small モデルが提供されており、Waypoint-1-Medium は近日公開予定です。ユーザーは Overworld Stream を通じてモデルを体験できます。

実装例

開発者は以下の WorldEngine パターンを用いて Waypoint-1 を統合できます。

from world_engine import WorldEngine, CtrlInput

# Create inference engine
engine = WorldEngine("Overworld/Waypoint-1-Small", device="cuda")

# Specify a prompt
engine.set_prompt("A game where you herd goats in a beautiful valley")

# Optional: Force the next frame to be a specific image
img = pipeline.append_frame(uint8_img)  # (H, W, 3)

# Generate 3 video frames conditioned on controller inputs
for controller_input in [
        CtrlInput(button={48, 42}, mouse=[0.4, 0.3]),
        CtrlInput(mouse=[0.1, 0.2]),
        CtrlInput(button={95, 32, 105}),
]:
    img = engine.gen_frame(ctrl=controller_input)

Sources