Nano World Models: A Minimalist Implementation of Future Video Prediction

Paper: arXiv:2605.23993 Code: simchowitzlabpublic/nano-world-model Code reference: main @ 63052ceb (2026-05-25)

1. Motivation (研究动机)

当前 World Model 研究的主要瓶颈

这篇 paper 的出发点不是再提出一个全新的 video diffusion trick,而是指出一个更工程化、也更科学的问题:现代 World Model 已经能在工业级系统中展示很强的 interactive video generation / future prediction 能力,但学术社区缺少一个足够小、可复现、可扩展、能系统拆解设计选择的实现。作者认为 World Model 的核心技术栈正在逐渐收敛到 video diffusion、Diffusion Forcing、consistency distillation 等相对稳定的组件;下一阶段更重要的问题不是只堆新模块,而是回答“哪些设计选择真的重要”。

具体瓶颈有三类:

  • 实现碎片化:datasets、training recipes、evaluation protocols、downstream tasks 分散在不同 repo 或 paper 中;如果研究者想比较 prediction target、model scale、action injection、latent space,往往需要跨多个代码库重写训练 / 采样 / 评估。
  • 实验变量纠缠:很多系统同时改变 architecture、objective、data、rollout procedure,使得结果很难归因。例如一个模型长 rollout 好,可能来自更强 backbone,也可能来自 sampling budget 或 latent representation,而不是某个单独算法。
  • 缺少“world model as tool”的统一接口:future video prediction 本身只是第一步;同一个预测模型还应能服务 realtime simulation、MPC planning、video-to-3D reconstruction 等下游工具,但现有实现往往只覆盖单一任务。

这篇 paper 要解决的问题

作者提出 Nano World Models(NanoWM),目标是提供一个 minimalist、batteries-included 的 future video prediction / world modeling codebase。它以 Diffusion Forcing 为核心接口,把 generative objective、model scale、action-conditioning mechanism、latent observation space、dataset/environment、evaluation protocol、long-horizon rollout 都纳入同一套 Hydra 配置与训练采样管线中。

换句话说,这篇 paper 不是把 World Model 问题定义成“训练一个最强视频模型”,而是把它定义成“构造一个可控实验平台”:让研究者能在同一框架中切换 / / / flow prediction、NanoWM-S/B/L/XL、additive / AdaLN / FiLM / cross-attention action injection、VAE / Web-DINO / V-JEPA latent space,并观察它们对 prediction quality、autoregressive rollout、planning success 的影响。

为什么值得研究

如果这个平台成立,它能把 World Model 从“展示 demo 的大系统”转成“可做科学实验的 substrate”。这有两层价值:

  1. 研究价值:同一套 loader / model / sampler / evaluator 让 ablation 更干净,能更可靠地判断 prediction target、latent space、action conditioning 等因素是否真的有效。
  2. 应用价值:同一模型接口可以被用作 video predictor、3D scene asset generator、MPC simulator。World Model 不只是生成未来帧,而是变成可以被下游 planner / reconstruction tool 调用的 tool。

2. Idea (核心思想)

核心洞察

NanoWM 的核心洞察是:World Model 的很多研究问题可以被统一成“对带条件的 latent video sequence 做 Diffusion Forcing”。只要把不同帧放在不同 noise level,并把 action / text / goal 等条件接入同一个 transformer backbone,同一个训练和采样接口就能覆盖 teacher-forced prediction、masked future prediction、autoregressive rollout、planning rollout 等场景。

关键创新

  • 以 Diffusion Forcing 作为统一抽象:模型不再只一次性生成整段未来,而是允许同一 trajectory 中不同 frame 位于不同 denoising stage;context frame 可以保持 clean,future frame 可以处在更高 noise level。
  • 把设计轴都配置化:objective、backbone scale、latent codec、action injection、dataset、evaluation、rollout length 都可以通过 config 切换,而不是在多个代码库中分别实现。
  • 把 World Model 暴露成 tool-use interface:模型输出的 future rollout 可以继续送入 3D reconstruction,也可以在 CEM-style MPC 中作为 batched simulator 评估 action sequence。

与已有方法的根本差异

与只发布单一 task / 单一 dataset 的 video prediction repo 不同,NanoWM 的重点是“可控比较”。例如 Diffusion Forcing Transformer(DFoT)或 DINO-WM 更像特定方法或特定 latent/planning setting;NanoWM 则把这些方法背后的共性抽出来,提供统一 dataset/environment API、Diffusion Forcing sampler、action-conditioned transformer 和 evaluation scripts。它牺牲的是 SOTA 大模型规模,换来的是可复现、可替换、可诊断的实验平台。

3. Method (方法)

3.1 Overall framework:NanoWM 的总框架

Figure 1 解读:这张 overview 图展示 NanoWM 的完整接口:左侧是多种 training data / environments,中间是 modular NanoWM,右侧是 realtime simulation、planning、video-to-3D 等用途。关键不是某个单独模块,而是所有模块都汇入同一个 Diffusion Forcing prediction interface:observation 先被编码到 latent space,模型基于 context frame 与 action condition 预测 future latent,再由 decoder 或下游 tool 使用。

整体 pipeline 可以拆成五步:

  1. Observation encoding:输入 observation 不一定直接用 RGB,而是先编码成 。支持 Stable Diffusion VAE、Web-DINO、V-JEPA 2.1 等 latent space。
  2. Conditional sequence modeling:给定历史 latent 与条件 (例如 action sequence 或 text),学习
  3. Diffusion Forcing training/sampling:同一段 trajectory 中,不同 frame 可有不同 noise index ,从而统一 teacher forcing、masked future prediction 与 autoregressive rollout。
  4. Action-conditioned transformer:NanoWM 用 latent video tokens 上的 transformer backbone;action 可以通过 additive、AdaLN、AdaLN-fuse、FiLM、cross-attention 注入。
  5. Tool interface:生成的 future rollout 可直接作为 video prediction,也可被导出到 3D reconstruction pipeline,或作为 MPC 的 batched world simulator。

直觉上,这种设计有用是因为 future prediction 的困难不只来自生成质量,也来自实验系统的不统一。Diffusion Forcing 把“哪些 frame 是条件,哪些 frame 要生成,生成到哪个 denoising stage”显式变成 schedule;Hydra config 把“换模型 / 换 latent / 换 action injection / 换 dataset”变成小改动。于是同一个 code path 可以支持从简单 Maze 到 RT-1 robot video 的比较,降低变量混杂。

3.2 Preliminaries:world modeling 的概率形式

论文把 world modeling 定义为高维 observation sequence 的 posterior modeling。给定过去 observations 与条件 ,目标是补全未来 observations 。实际中模型预测的是 latent: 真实条件分布写作: 学习到的模型写作: 当 World Model 用于 planning 时,给定候选 action sequence 与 reward / utility ,planning 目标是: 这一定义把 World Model 明确接到 MPC:模型只负责预测 rollout,planner 负责搜索 action,reward/objective 可以因任务而变。

3.3 Diffusion Forcing:统一 training 与 rollout 的接口

Diffusion Forcing 的关键设定是给每一帧一个 noise index。设 noise index set 为 ,对 encoded trajectory ,每一帧 都有对应 ,schedule 为: 训练时模型看到 noised trajectory 与 noise-index schedule。context frames 可以保持 clean 或 nearly clean,future frames 可以被赋予更高 noise。只改变 schedule,就可以表达不同模式:

  • Teacher-forced prediction:context 与一部分 future 保持低噪声,模型学习局部预测。
  • Masked future prediction:未来帧高噪声,模型从 context 中补全。
  • Autoregressive rollout:每次生成一小段,再把生成结果滑入下一次 context window。

这就是 NanoWM 能把训练、验证、long rollout、planning rollout 复用同一 sampler 的原因。

3.4 Generative objectives: / / / flow prediction

NanoWM 在同一 Diffusion Forcing interface 下支持多种 generative objective:

  • -prediction:模型直接预测 clean latent /
  • -prediction:模型预测加到 latent 上的 Gaussian noise。
  • -prediction:模型预测 velocity-style target;released code 中 GaussianDiffusion.training_losses 通过 _predict_v(x_start, t, noise) 构造 target。
  • Flow matching:模型预测 data-noise interpolant 诱导的 velocity field;released code 中 src/diffusion/flow_matching.py 提供对应实现,dino_wm_pusht_flow.yamlpred_name 设为 flow

这些 objective 的共同点是 backbone、dataset loader、conditioning interface、sampling code 不变,只改变 noised input 与 target construction。released code 中 src/diffusion/gaussian_diffusion.py::training_losses 的核心逻辑是:先用 q_sample 得到 ,再根据 PredName 选择 target:START_X -> x_startEPSILON -> noiseV -> _predict_v(...),最后对 model output 与 target 做 MSE,并可加 Min-SNR weighting。

3.5 NanoWM architecture:latent video transformer + action injection

NanoWM 使用 transformer backbone 处理 latent video tokens。对 VAE-style encoding,每帧 latent 会被分成 spatial patches,投影到 hidden dimension,再经过 interleaved spatial-temporal attention。命名规则类似 image/video diffusion model:NanoWM-B/2 表示 Base family、latent patch size 为 2;NanoWM-B/4NanoWM-B/8 使用更粗的 latent patch。

released code 中模型 family 的实际定义在 src/models/nanowm.py

  • NanoWM-S/*:depth 12,hidden size 384,heads 6。
  • NanoWM-B/*:depth 12,hidden size 768,heads 12。
  • NanoWM-L/*:depth 24,hidden size 1024,heads 16。
  • NanoWM-XL/*:depth 28,hidden size 1152,heads 16。

Action conditioning 对 world model 很关键,因为模型需要回答“如果执行这串 actions,未来会怎样”。NanoWM 支持五种 action injection:

  1. additive:把 action embedding 加到对应 frame tokens 上;参数最少,是默认强 baseline。
  2. AdaLN:用 action 调制 layer norm 参数。
  3. AdaLN-fuse:把 action 与 timestep conditioning 融合。
  4. FiLM:用 action 产生 feature-wise modulation。
  5. cross-attention:video tokens 通过 cross-attention 读取 action tokens。

代码中 TransformerBlock 显式支持 additiveadaln_fuseadalnfilmcross_attention。在 NanoWM.forward 中,action 先过 ActionEmbedder,再根据 injection type 走不同分支:adaln_fuse 会把 action embedding 加进 timestep embedding c,其他类型则把 action_emb 传入 spatial / temporal transformer block。

3.6 Latent observation spaces:VAE vs semantic features

NanoWM 支持三类 latent observation space:

  • SD-VAE:重建导向,可以 decode 回 RGB,因此适合 video generation、PSNR/SSIM/LPIPS/FID 评估,也更适合目标状态要在视觉空间对齐的 planning。
  • Web-DINO:自监督 semantic/geometric representation,理论上对 downstream prediction 和 planning 有吸引力。
  • V-JEPA 2.1:video-pretrained predictive visual features,更偏 representation learning。

论文的实验表明,semantic latent 不会自动带来更好的 planning:在 PushT planning 中,SD-VAE latent 有 25.0% success rate,而 Web-DINO 与 V-JEPA 2.1 都是 0.0%。作者进一步用 ground-truth action rollout diagnostic 说明 semantic-latent checkpoint 几乎没有学会使用 action input。

3.7 Dataset / environment interface

Figure 2 解读:这张图把 GT sequence 与 NanoWM rollout 放在一起,覆盖 Point Maze、Wall、Rope、Granular、PushT、RT-1。它说明 NanoWM 的 dataset/environment interface 并不只服务一个 domain:grid-world navigation、deformable manipulation、tabletop pushing、real-robot video 都被统一成可训练 / 可采样的 trajectory 数据。图中不同 domain 的视觉复杂度逐渐上升,也对应后续结果中 PSNR/SSIM/LPIPS/FID 的明显差异。

支持的 environment / dataset 包括:

  • DINO-WM style environments:Point Maze、Wall、PushT、Rope、Granular。代码配置在 src/configs/dataset/dino_wm/*.yaml,例如 PushT 使用 frame_interval=5、2D action、relative action、action_scale=100.0
  • CS:GO game simulation:配置 src/configs/experiment/csgo.yaml 使用 50K steps、batch size 6、learning rate 1e-5;CSGO-specific model 使用 16-frame window、4 context frames。
  • RT-1 / Fractal robot datasrc/configs/dataset/rt1/rt1.yaml 指向 IPEC-COMMUNITY/fractal20220817_data_lerobot,action dim 为 7;代码注释说明训练集约 87K episodes,并使用 random slice sampling。

3.8 Evaluation / logging / reproducibility

Figure 3 解读:这张图展示 Weights & Biases 中的训练曲线、validation metrics 和 qualitative prediction panels。NanoWM 的重点是把 logging / checkpoint / evaluation 都纳入同一 callback-style pipeline:同一 run 里同时记录 PSNR、SSIM、LPIPS、FID、reconstruction videos、predicted rollouts、ground-truth clips。这对“可科学比较”很重要,因为 ablation 需要固定 seed、固定 validation clips、固定 evaluation code,而不是只看 cherry-picked rollout。

标准 evaluation protocol:除非特别说明,使用 256 fixed validation clips、seed 42、autoregressive sequential scheduling。标准 256-resolution model 每个 validation clip 有 4 frames:1 个 context frame + 3 个 generated frames;metrics 只在 generated frames 上计算。diffusion models 默认使用 250 DDIM sampling steps。

3.9 Long-horizon rollout

Figure 5 解读:这张图展示 CSGO checkpoint 的 50-frame autoregressive long rollout。模型从 4 个 ground-truth history frames 初始化,然后逐帧生成剩余 46 帧。可见 coarse scene geometry 与 camera motion 能保持一段时间,但 weapon appearance、local texture 等细节会逐渐漂移,说明 autoregressive rollout 的主要问题是误差累积而不是第一步预测完全失败。

Figure 6 解读:LPIPS 曲线把 Figure 5 的现象量化:随着自生成 rollout 变长,perceptual error 逐步上升;增加 DDIM sampling steps 可以降低整个 rollout horizon 上的 LPIPS。这支持 Finding #5:更强的 per-frame denoising 能部分缓解 autoregressive compounding error,但不能从根本上消除误差累积。

released code 的 long rollout launch script src/scripts/eval/long_rollout_csgo.sh 与论文描述一致:默认 ROLLOUT_LENGTH=50HISTORY_LENGTH=4NUM_SAMPLING_STEPS=50SCHEDULING_MODE=sequential,checkpoint 路径指向 CSGO 100K latest ckpt。src/sample/rollout.py 实现 sliding window:每一步取最近 history_length 个 latent 与对应 action window,调用 dfot_sample(..., n_generate_frames=1),再把新 latent 拼回 generated sequence。

3.10 World-modeling as tool-use:3D export 与 MPC

Figure 4 解读:这张图说明 NanoWM 的 rollout 可以被当成下游 3D pipeline 的输入:CSGO 生成帧先 decode 成 RGB,再交给 depth / camera estimation pipeline,输出 estimated depth 与 persistent point cloud。这里 NanoWM 不绑定某个 3D backend;它只负责生成时间一致的 visual rollout,几何估计由外部工具完成。

MPC planning 中,NanoWM 被包装为 batched rollout function。planner 接收当前 observation context、goal specification 和一组 candidate action sequences;world model 并行预测每个 action sequence 的 future trajectory;objective module 根据 goal distance、task progress 或 task-specific reward 给出 scalar score;CEM 更新 action distribution,执行最优 sequence 的第一个 action,然后重新观测与 replanning。

论文公式与 released code 实现差异:论文在 latent planning 文字中写到使用 64 CEM samples 和 5 CEM iterations;但 released code 的 src/scripts/eval/planning_pusht.sh 调用 planning=dino_wm_pusht,对应 src/configs/planning/dino_wm_pusht.yaml 里是 num_samples=300topk=30opt_steps=30num_sampling_steps=20src/configs/planning/base.yaml 也写的是 num_samples=100topk=10opt_steps=30。我未在 released code path 中找到与 paper 64/5 完全一致的 shipped config;因此 note 中把 paper 表格设置与 released config 分开记录。

3.11 Pseudocode:基于 released code 的关键组件

下面 pseudocode 不是复述 abstract,而是按 main@63052ceb 的实际代码路径抽象。

A. Diffusion Forcing training step
import torch
import torch.nn.functional as F
 
 
def nanowm_training_step(model, diffusion, batch, timestep_sampler, pred_name="v"):
    # src/experiments/train_experiment.py::NanoWMTrainingModule.training_step
    # batch contains latent/video tensor x and optional action tensor
    x = batch["video_latents"]              # [B, F, C, H, W]
    action = batch.get("action", None)      # [B, F, action_dim] or None
 
    # sample one timestep/noise index per frame for Diffusion Forcing
    t = timestep_sampler.sample(batch_size=x.shape[0], num_frames=x.shape[1])
    model_kwargs = {"action": action} if action is not None else {}
 
    # src/diffusion/gaussian_diffusion.py::training_losses
    noise = torch.randn_like(x)
    x_t = diffusion.q_sample(x_start=x, t=t, noise=noise)
    model_output = model(x_t, t, **model_kwargs)
 
    if pred_name == "x":
        target = x
    elif pred_name == "eps":
        target = noise
    elif pred_name == "v":
        target = diffusion._predict_v(x_start=x, t=t, noise=noise)
    else:
        raise ValueError(pred_name)
 
    loss = F.mse_loss(model_output, target, reduction="none")
    return loss.flatten(1).mean(1).mean()
B. Action-conditioned NanoWM forward
import torch
from einops import rearrange
 
 
def nanowm_forward(x, timesteps, spatial_blocks, temporal_blocks, action=None,
                   action_injection_type="additive"):
    # src/models/nanowm.py::NanoWM.forward / TransformerBlock
    # x: [B, F, C, H, W]
    B, F, C, H, W = x.shape
    tokens = patch_embed(x)                         # [B*F, N, D]
    c = timestep_embed(timesteps).reshape(B * F, -1)
 
    action_emb = None
    if action is not None:
        action_emb = action_embedder(action)         # [B, F, D]
        action_emb = action_emb.reshape(B * F, 1, -1)
 
    for spatial_block, temporal_block in zip(spatial_blocks, temporal_blocks):
        spatial_action = None
        temporal_action = None
 
        if action_emb is not None:
            if action_injection_type == "adaln_fuse":
                c = c + action_emb.squeeze(1)        # fuse action into timestep condition
            else:
                spatial_action = action_emb          # additive / adaln / film / cross_attention
 
        tokens = spatial_block(tokens, c, action_emb=spatial_action, is_causal=False)
        tokens = rearrange(tokens, "(b f) n d -> (b n) f d", b=B)
        tokens = temporal_block(tokens, c, action_emb=temporal_action, is_causal=True)
        tokens = rearrange(tokens, "(b n) f d -> (b f) n d", b=B)
 
    return final_layer(tokens, c)
C. DFOT sequential sampling / long rollout
import torch
 
 
def long_rollout(diffusion, model, init_context, actions, rollout_length=50,
                 history_length=4, num_sampling_steps=50):
    # src/sample/rollout.py + src/diffusion/df_sample.py
    generated = init_context.clone()  # first 4 frames are ground-truth history
 
    for t in range(history_length, rollout_length):
        context = generated[:, t - history_length:t]
        action_window = actions[:, t - history_length:t]
 
        pred_latents = dfot_sample(
            diffusion=diffusion,
            model=model.forward,
            shape=(context.shape[0], history_length + 1, *context.shape[2:]),
            context=context,
            n_context_frames=history_length,
            model_kwargs={"action": action_window},
            scheduling_mode="sequential",
            num_sampling_steps=num_sampling_steps,
            n_generate_frames=1,
            history_stabilization_level=0.02,
        )
        new_latent = pred_latents[:, history_length:history_length + 1]
        generated = torch.cat([generated, new_latent], dim=1)
 
    return generated[:, :rollout_length]
D. CEM-style MPC planning with world model rollout
import torch
 
 
def cem_plan(world_model, objective_fn, obs_0, goal, action_dim, horizon,
             num_samples=300, topk=30, opt_steps=30, sigma_min=1e-3):
    # src/planning/cem_planner.py and src/planning/diffusion_world_model.py
    mu = torch.zeros(horizon, action_dim)
    sigma = torch.ones(horizon, action_dim)
    z_goal = world_model.encode_obs(goal)
 
    for _ in range(opt_steps):
        action_samples = mu + sigma * torch.randn(num_samples, horizon, action_dim)
        pred_rollouts = world_model.rollout(
            obs_0=obs_0,
            act=action_samples,
            num_sampling_steps=20,
        )
        loss = objective_fn(pred_rollouts, z_goal)   # lower is better
        topk_idx = torch.argsort(loss)[:topk]
        elite = action_samples[topk_idx]
        mu = elite.mean(dim=0)
        sigma = elite.std(dim=0).clamp(min=sigma_min)
 
    return mu[0]  # execute first action, then observe and replan

3.12 Code-to-paper mapping

Code reference: main @ 63052ceb (2026-05-25) — pseudocode and mapping based on this commit

Paper ConceptSource FileKey Class/Function
Hydra entrypoint / task dispatchsrc/main.pymain(cfg)
Training loop and validation callbacksrc/experiments/train_experiment.pyNanoWMTrainingModule.training_step, validation_step
Diffusion objectives: / / src/diffusion/gaussian_diffusion.pyGaussianDiffusion.training_losses, PredName
Flow matching objectivesrc/diffusion/flow_matching.py; src/configs/experiment/dino_wm_pusht_flow.yamlFlowMatching, pred_name: flow
Diffusion Forcing schedule / samplersrc/diffusion/df_sample.pygenerate_sequential_schedule, generate_full_sequence_schedule, dfot_sample
NanoWM transformer backbonesrc/models/nanowm.pyNanoWM, TransformerBlock, NanoWM_B_2, NanoWM_L_2
Action injection variantssrc/models/nanowm.py; src/configs/model/nanowm_b2.yamlActionEmbedder, action_injection.type
Dataset/environment configssrc/configs/dataset/dino_wm/*.yaml, src/configs/dataset/rt1/rt1.yamlframe intervals, action dims, loader paths
Standard metrics evaluationsrc/sample/evaluate_metrics.py; src/utils/metrics.pyPSNR, SSIM, LPIPS, FID/FVD utilities
Long-horizon rolloutsrc/sample/rollout.py; src/scripts/eval/long_rollout_csgo.shsliding history window + dfot_sample
MPC planning wrappersrc/planning/diffusion_world_model.pyDiffusionWorldModel.rollout
CEM planner and objectivesrc/planning/cem_planner.py, src/planning/objective.pytop-k CEM update, goal latent objective

4. Experimental Setup (实验设置)

Datasets and scale

  • DINO-WM environments:Point Maze、Wall、Rope、Granular、PushT。论文未详细说明每个 environment 的 raw sample count;released configs 给出 frame/action settings,例如 PushT 使用 frame_interval=5、2D relative actions、action_scale=100.0
  • RT-1 / Fractal:论文在 ablation 中使用 RT-1 fractal;released src/configs/dataset/rt1/rt1.yaml 指向 IPEC-COMMUNITY/fractal20220817_data_lerobot,action dim 为 7,代码注释写训练集约 87K episodes。
  • CS:GO:用于 game simulation 和 long-horizon rollout;论文未详细说明 raw dataset count。CSGO-specific config 使用 16-frame training windows 与 4 context frames。
  • Evaluation clips:标准 evaluation 使用 256 fixed validation clips,seed 42;标准 256-resolution models 条件为 1 context frame + 3 generated frames。

Compared baselines / variants

这篇 paper 主要做内部 controlled ablation,而不是与一组外部 SOTA baseline 做排行榜比较。比较对象包括:

  • Prediction target-prediction、-prediction、-prediction。
  • Model scale:NanoWM-S/2、NanoWM-B/2、NanoWM-L/2。
  • Action injection:additive、AdaLN、AdaLN-fuse、FiLM、cross-attention。
  • Latent space:SD-VAE、Web-DINO、V-JEPA 2.1。
  • Sampling budget / long rollout:不同 DDIM steps 下的 LPIPS accumulation。

Evaluation metrics

  • PSNR:pixel-level reconstruction fidelity,越高越好。
  • SSIM:结构相似度,越高越好。
  • LPIPS:perceptual distance,越低越好。
  • FID:generated frames 与 ground-truth validation frames 的分布距离,越低越好。
  • FVD:用于足够长的视频,衡量 temporal video distribution similarity;论文只在 setup 中说明。
  • Planning success rate:PushT 中 final state 是否满足 environment-specific goal condition。
  • Latent MSE / cosine distance:用于诊断 final predicted latent 与 goal latent 的距离,判断模型是否真的使用 action input。

Training config / hardware / hyperparameters

  • RT-1 target / scale / action-injection ablations:论文写明使用 NanoWM-B/2、SD-VAE、element-wise addition 默认 action injection;每个 run 训练 50K steps,8 GPUs,每 GPU batch size 8,有效 batch size 64,1 context frame + 3 future frames。released code 对应 src/configs/experiment/ablation_rt1.yamlmax_steps=50000batch_size=8num_workers=16src/configs/model/nanowm_b2.yamlnum_frames=4n_context_frames=1num_sampling_steps=250latent_size=32latent_channels=4
  • Standard model defaultssrc/configs/experiment/default.yaml 使用 Adam-style optimizer LR 1e-4、weight decay 0.01、warmup 1000、gradient clip norm 0.1、default diffusion steps 1000、default pred_name=vsnr_gamma=5.0zero_terminal_snr=truehistory_stabilization_level=0.02
  • DINO-WM shipped checkpoints:Point Maze 30K、Wall 15K、Rope 15K、Granular 15K、PushT 100K;对应 config files src/configs/experiment/dino_wm_*.yaml
  • RT-1 shipped checkpointsrc/configs/experiment/rt1.yaml 使用 max_steps=300000、batch size 8、8 GPUs(论文说明)。
  • CSGOsrc/configs/experiment/csgo.yaml 使用 max_steps=50000、batch size 6、LR 1e-5;long rollout script 默认 checkpoint 为 CSGO 100K latest ckpt,rollout length 50、history length 4、DDIM steps 50。
  • Planning:paper latent planning 表格写 goal horizon 、64 CEM samples、5 CEM iterations;released dino_wm_pusht.yaml planning config 使用 horizon 5、replan every 5、50 evals、300 samples、top-30、30 iterations、20 DDIM steps。

5. Experimental Results (实验结果)

5.1 Prediction target ablation on RT-1 fractal

TargetSchedulePSNR ↑SSIM ↑LPIPS ↓FID ↓
cosine + ZTSNR23.070.7600.20742.27
cosine + ZTSNR23.370.7830.18442.99
linear21.890.7390.22548.86

Finding #1:-prediction 在这组 schedule 下明显落后;-prediction 的 reconstruction metrics 最好,-prediction 的 FID 更好且是 NanoWM 默认设置。作者特别说明, 使用 squared-cosine + ZTSNR,而 使用 linear schedule,因为 cosine + ZTSNR 在 terminal timestep 上对 -prediction 数值不稳定。

5.2 Model scale ablation on RT-1 fractal

ArchitectureParamsPSNR ↑SSIM ↑LPIPS ↓FID ↓
NanoWM-S/239.8M22.300.7390.23054.95
NanoWM-B/2158.6M23.070.7600.20742.27
NanoWM-L/2~460M23.620.7770.18636.31

Finding #2:model scale 带来单调收益,从 S/2 到 B/2 到 L/2,PSNR、SSIM、LPIPS、FID 全部改善。这说明在统一训练 recipe 下,capacity 仍然是 future video prediction 的重要因素。

5.3 Action-injection ablations

RT-1:

MethodPSNRSSIMLPIPSFIDParams
additive23.070.7600.20742.27158.6M
AdaLN23.190.7620.20643.62158.6M
AdaLN-fuse23.100.7620.20643.03158.6M
FiLM23.200.7630.20340.62172.8M
cross-attention20.820.7210.24251.12187.0M

PushT:

MethodPSNRSSIMLPIPSFIDExtra params
additive26.200.9620.05323.890
AdaLN-fuse26.170.9610.05130.280
AdaLN26.090.9600.05326.32~42.5M
cross-attention25.950.9590.05528.64~28.3M
FiLM25.880.9600.05625.45~14.4M

Finding #3:action injection 是 task-dependent。FiLM 在 RT-1 上视觉指标最好,但简单 additive 在 PushT 上整体最强且没有额外参数;cross-attention 在 RT-1 上反而明显退化。这个结果提醒:更复杂的 conditioning 不一定更好,尤其当 action 与视觉 dynamics 的耦合方式较简单时,轻量 additive 可能更稳。

5.4 Latent space and planning

Goal-conditioned planning on PushT:

Latent spaceBackboneLatent shapeSuccess rate
SD-VAENanoWM-B/2[4, 32, 32]25.0%
Web-DINONanoWM-B/1[1024, 16, 16]0.0%
V-JEPA 2.1NanoWM-B/1[1024, 16, 16]0.0%

Ground-truth action rollout diagnostic on PushT(32 goal-reaching episodes,,20 DDIM steps):

Latent spaceMSE init ↓MSE GT action ↓MSE zero action ↓MSE random action ↓Cos init ↓Cos GT action ↓Cos zero action ↓Cos random action ↓
SD-VAE0.0777140.0140150.0748300.0814120.0380730.0088850.0373220.042239
Web-DINO0.3116490.8340370.8340440.8340660.1117400.2800070.2800110.280025
V-JEPA 2.10.2064330.5840290.5840560.5841500.0476070.1388660.1388720.138893

Action embedding magnitude:

Latent spaceAction embedding RMS
SD-VAE0.1119
Web-DINO0.00214
V-JEPA 2.10.00129

Finding #4:semantic latent space 不会自动提升 planning。SD-VAE checkpoint 明显受 ground-truth actions 影响,GT action rollout 到 goal latent 的距离远小于 zero/random action;Web-DINO 与 V-JEPA 的 GT/zero/random 几乎一样,action embedding RMS 也接近 0,说明模型没有学到 counterfactual action-conditioned dynamics。

5.5 Long-horizon rollout and sampling budget

Finding #5:NanoWM 可以生成 plausibly coherent 的 long-horizon rollout,但 autoregressive generation 会随时间积累 perceptual error。CSGO long rollout 使用 4 history frames,逐帧生成 46 个未来 frames;50 DDIM steps 是 long rollout script 的默认设置。Figure 6 中 LPIPS 随 rollout horizon 增加而上升;增加 DDIM sampling budget 会降低 LPIPS,说明 per-frame denoising 更充分可以缓解但不能完全解决 compounding error。

5.6 Shipped checkpoints across domains

DatasetStepsPSNR ↑SSIM ↑LPIPS ↓FID ↓
Point Maze30K36.740.9840.0199.66
Wall15K34.050.9940.0102.64
Rope15K31.630.9530.05635.20
Granular15K26.080.9170.07340.05
PushT100K33.190.9820.01613.63
RT-1300K24.360.7870.18035.08

Finding #6:同一 training / evaluation recipe 可以跨 navigation、tabletop pushing、deformable manipulation、real-robot video 工作,但 domain complexity 对指标影响很大。Wall / Point Maze 这类简单环境指标最好;RT-1 和 Granular 更复杂,FID/LPIPS 明显更差。这与 Figure 2 的视觉复杂度一致。

5.7 Limitations and conclusions

论文没有把 NanoWM 包装成 SOTA closed-world simulator;它的主要限制也来自 minimalist research substrate 的定位:

  • 长程 rollout 仍有误差累积:即使 coarse geometry 和 camera motion 能维持,local texture / object details 仍会随 autoregression 漂移。
  • semantic latent planning 失败:Web-DINO / V-JEPA 并未自然学会 action-conditioned counterfactual prediction;如果 objective 不迫使模型使用 action,semantic representation 反而可能对 planning 不友好。
  • dataset scale 信息不完整:paper 对部分 raw dataset sizes 没有详细说明,复现实验需要依赖 released docs/configs/checkpoints。
  • released config 与 paper 部分 planning 描述不完全一致:planning CEM sample/iteration budget 需要按具体 commit 下的 configs 再确认。

总体结论是:NanoWM 的贡献不在于单项指标压倒所有方法,而在于提供了一个小而完整的 World Model science platform。它用统一 Diffusion Forcing interface 把 objective、scale、action injection、latent space、dataset、rollout、planning、3D export 连接起来,并通过 ablations 证明这些设计轴会显著影响 future video prediction 与 downstream tool-use 行为。