--- title: Orbis 2 β€” Hierarchical World Model Rollout Demo emoji: πŸš— colorFrom: indigo colorTo: gray sdk: gradio sdk_version: "5.9.1" app_file: app2.py pinned: false license: mit --- # Orbis 2: A Hierarchical World Model for Driving Upload a short driving mp4 β†’ the model takes the tail of the clip as context β†’ rolls out several plausible futures β†’ returns them as videos. This Space runs **Orbis 2**, the hierarchical L1–L2 model (`app2.py`). The previous single-level Orbis 1 demo is still in the repo as `app.py`; switch `app_file` above to serve it instead. A Space runs exactly one entrypoint. ## How it works Orbis 2 splits prediction across two levels of abstraction: - **L2 β€” abstract predictor.** Sees a long, low-rate context window and forecasts a future scene state in latent space (long-horizon dynamics, steering). - **L1 β€” detail predictor.** Conditioned on the L2 forecast, generates fine-grained high-rate frames, so local fidelity stays grounded in long-range context. A shared **tokenizer** encodes frames to (and decodes them from) latents. **Pipeline.** The uploaded clip is re-encoded to a constant 10 fps β€” the rollout script requires the video's native frame rate to be an exact integer multiple of the L1/L2 sampling rates. It then samples the L1 window at 10 Hz and the L2 window further back at the frozen L2 predictor's own trained rate (2 Hz), resizing to 288Γ—512. Frames are generated autoregressively; `NUM_VIDEOS` futures are rolled out from the same context **in a single minibatch**, each with independently drawn initial noise, so they diverge. Note the clip must be long enough to cover the L2 look-back window β€” short clips are rejected with an explicit error. ## Models The three checkpoints (~20 GB total) are **not in this repo**. They live on the Hub at [`sud0301/orbis2_test`](https://huggingface.co/sud0301/orbis2_test), laid out as: ``` L1/ config_distill.yaml + checkpoints/last.ckpt # detail predictor L2/ config.yaml + checkpoints/last.ckpt # abstract predictor (frozen) tok/ config.yaml + checkpoints/last.ckpt # tokenizer (shared by L1 and L2) ``` `app2.py` downloads them at startup into the HF cache and exports `$ORBIS2_MODELS_DIR`, which L1's and L2's configs expand to locate their dependencies (L1β†’tok, L1β†’L2, L2β†’tok). It uses the cache path directly rather than copying into the Space, so the weights are stored once. ## Setup 1. **Persistent storage.** Enable it in Space settings so the ~20 GB download lands on `/data` and survives restarts. Without it the cache is ephemeral and the models are re-fetched on every cold start. 2. **`HF_TOKEN` secret.** Required while `sud0301/orbis2_test` is a **private** repo β€” otherwise the startup download 401s. Add it under Settings β†’ Variables and secrets; `huggingface_hub` picks it up automatically. Not needed if the model repo is public. 3. **Hardware.** ZeroGPU works for short rollouts (keep *Rollout steps* low; the `@spaces.GPU` budget is 300 s). Use an L40S/A100 for long-horizon rollouts. ### Environment variables | Variable | Default | Purpose | |---|---|---| | `ORBIS2_HF_REPO` | `sud0301/orbis2_test` | Hub repo holding `L1/`, `L2/`, `tok/` | | `ORBIS2_MODELS_DIR` | `./models` | Use a local model tree instead of downloading | | `HF_TOKEN` | β€” | Needed while the model repo is private | Point `ORBIS2_MODELS_DIR` at a complete local tree to skip the Hub entirely β€” useful for running against a training run on a GPU box. ## Controls - **Rollout steps** β€” autoregressive steps. Each emits `num_pred_frames` (5) image frames, so the output clip is longer than the step count. - **Diffusion steps** β€” flow-matching solver steps per frame. - **Seed** (Advanced) β€” `-1` draws a fresh seed each run; set it to reproduce a run. - **Eta** (Advanced) β€” `0` is the deterministic ODE; `>0` injects noise per step (SDE).