Waypoint-1: Overworld의 실시간 인터랙티브 비디오 디퓨전

Overworld는 Waypoint-1을 소개합니다. 이는 텍스트 프롬프트, 마우스 움직임, 키보드 입력을 사용해 생성된 세계에 들어가 상호작용할 수 있게 해주는 실시간 인터랙티브 비디오 디퓨전 모델입니다. 기존의 세계 모델이 제한된 제어를 가진 사전 학습 비디오 모델을 미세 조정하는 방식과 달리, Waypoint-1은 인터랙티브 경험을 위해 처음부터 설계되어 지연 없는 제어와 소비자 하드웨어에서도 실행 가능한 능력을 제공합니다.

Model Architecture and Training

Waypoint-1은 프레임-인과적 정정 흐름 트랜스포머를 기반으로 하는 잠재 모델입니다. 텍스트 캡션 및 제어 입력과 짝을 이룬 다양한 비디오 게임 영상 10,000시간 데이터셋으로 학습되었습니다.

Training Methodology

인터랙티브 기능을 달성하기 위해 Waypoint-1은 두 가지 주요 학습 단계를 활용했습니다:

  1. Diffusion Forcing: 모델은 diffusion forcing을 사용해 사전 학습되었으며, 과거 프레임을 기반으로 미래 프레임을 디노이즈하는 방법을 학습합니다. 인과적 어텐션 마스크는 프레임 내 토큰이 해당 프레임 또는 이전 프레임만을 참조하도록 하여 추론 시 새로운 프레임을 절차적으로 생성할 수 있게 합니다.
  2. Self-Forcing: 사전 학습 중 무작위 노이즈로 인해 발생하는 추론 불일치와 오류 누적(노이즈가 많은 장기 롤아웃)을 해결하기 위해 모델은 DMD를 통한 self-forcing으로 사후 학습되었습니다. 이 기법은 학습 체계를 추론 동작과 일치시켜 한 번의 패스 CFG와 몇 단계 디노이징을 가능하게 합니다.

WorldEngine Inference Library

Overworld는 인터랙티브 세계 모델의 저지연, 고처리량 스트리밍을 위해 설계된 고성능 Python 추론 라이브러리인 WorldEngine을 공개했습니다. WorldEngine은 컨텍스트 프레임, 텍스트, 키보드/마우스 입력을 받아 실시간으로 이미지 프레임을 출력합니다.

Performance Benchmarks

NVIDIA RTX 5090에서 Waypoint-1-Small(2.3B 파라미터) 모델을 실행할 때, WorldEngine은 다음과 같은 성능을 달성합니다:

  • Throughput: 프레임당 256 토큰을 한 번 디노이징하는 기준으로 초당 약 30,000 토큰 패스.
  • Frame Rate: 디노이징 4단계에서 30 FPS, 디노이징 2단계에서 60 FPS.

Technical Optimizations

WorldEngine의 성능은 네 가지 구체적인 최적화에 의해 좌우됩니다:

  • AdaLN Feature Caching: 프롬프트 조건과 타임스텝이 전방 패스 사이에 변하지 않을 때 AdaLN 조건부 투영을 캐시하고 재사용합니다.
  • Static Rolling KV Cache + Flex Attention: 중복 계산을 줄이기 위해 고급 캐시 및 어텐션 메커니즘을 구현합니다.
  • Matmul Fusion: QKV 투영을 결합하여 행렬 곱셈을 최적화합니다.
  • Torch Compile: torch.compile(fullgraph=True, mode="max-autotune", dynamic=False)를 사용해 그래프 최적화를 최대화합니다.

Availability and Implementation

Waypoint-1 가중치는 Hugging Face Hub에서 제공되며, 현재 Waypoint-1-Small 모델이 이용 가능하고 Waypoint-1-Medium이 곧 출시될 예정입니다. 사용자는 Overworld Stream을 통해 모델을 체험할 수 있습니다.

Implementation Example

개발자는 다음과 같은 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