Downloads · 30 days
0
Dimios45/yam-world-model
yam-world-model is a video-to-video model from Dimios45. Use it for the video-to-video task on the model card, and read the license before you ship it in a product. It is set up for jax. The card lists the license as apache-2.0.
An action-conditioned latent video world model for the YAM robot arm (single-arm 7-DoF and bimanual 14-DoF), trained from scratch on a single RTX 4090. Given a few frames of context and a stream of joint commands, it…
Downloads · 30 days
0
Access
Public
Updated Aug 23, 2026
Repo size
967 MB
Likes
0
Public
Click a slice to open those files.
Other957 MB · 99%
From the Hugging Face model README
An action-conditioned latent video world model for the YAM robot arm (single-arm 7-DoF and bimanual 14-DoF), trained from scratch on a single RTX 4090. Given a few frames of context and a stream of joint commands, it imagines the future.
Built on the visionary Dreamer-4 implementation, retargeted from SO-101 to YAM.
<p align="center"> <img src="assets/yam_action_control.webp" alt="The same clip imagined under true, shuffled, and zero actions" width="800"> </p>This is the property that matters and the one that is easy to fake. A world model trained on a single repetitive scene learns to predict the future from pixels alone and quietly ignores the action input. The control is to re-run the same clip, same seed, and change only the actions:
--action_source | PSNR | SSIM | rollout motion | vs ground truth |
|---|---|---|---|---|
true | 15.03 | 0.6675 | 3.684 | 1.6x |
shuffled (another episode's actions) | 14.55 | 0.6484 | 5.311 | 2.3x |
zero | 17.85 | 0.7459 | 1.264 | 0.55x |
| ground truth | — | — | 2.295 | 1.0x |
true beats shuffled on both metrics.⚠️
zeroscores highest on PSNR, and that is a metric artifact. On a mostly static scene a near-frozen prediction beats sharp-but-slightly-misaligned motion, because pixel metrics reward blur. PSNR alone would have scored this model as ignoring its actions. Pair the action control with a motion statistic.
| stage | metric | value |
|---|---|---|
| tokenizer | held-out PSNR | 25.6 dB |
| tokenizer | mse / lpips | 0.0009 / 0.0166 |
| tokenizer | dead latent channels | 0 / 16 |
| dynamics | rollout PSNR / SSIM | 24.82 / 0.913 |
| dynamics | flow_mse (baseline 1.0) | 0.0048 |
Rollout quality saturates at the tokenizer's own reconstruction ceiling — past that, the dynamics model is limited by what the tokenizer can decode.
Two stages, both JAX/Flax, following Dreamer 4.
Video tokenizer — masked-autoencoder spatiotemporal transformer. 144×192
frames, patch 16, → 96 latent tokens × 16 channels per frame, tanh bottleneck.
Video only; never sees actions. 8 encoder + 8 decoder layers, dim 512. MSE + LPIPS,
Muon optimizer, 12,000 steps.
Dynamics — shortcut/flow-matching transformer over the frozen latents, conditioned on a continuous action vector through a per-embodiment MLP projection plus an embodiment embedding. 8 layers, dim 768, 24-frame context (4.8 s at 5 Hz). 6,000 steps, EMA 0.999 (exports carry EMA weights).
Two embodiments share one video backbone: yam_absolute_joint_7d_v1 (7-D) and
bi_yam_absolute_joint_14d_v1 (14-D), max_action_dim: 14.
from predict import WorldModel # scripts/robot/predict.py
wm = WorldModel(
tokenizer_dir="yam_tokenizer",
dynamics_dir="yam_dynamics",
latent_stats="latent_stats.json",
dynamics_step=6000,
)
# context_frames: (T0, H, W, 3) uint8 actions: (T0+horizon, 7) normalized to [-1,1]
frames = wm.imagine(context_frames, actions, embodiment_id=0)
5.4 fps warm on an RTX 4090 (first call ~28 s of JIT compile; 4.4 s per 24-frame rollout thereafter). Trained at 5 Hz, so it imagines at roughly the rate the data was recorded — enough for single-trajectory lookahead in a 5 Hz control loop, not for dense multi-rollout MPC.
| Corpus | Robot | Action | Episodes | Frames |
|---|---|---|---|---|
yam-pick-duster + -200 | YAM | 7-D joint, radians | 250 | ~104k |
yam_towel_fold | bi-YAM | 14-D joint, radians | 11 | 9,468 |
molmo_eval_90cmtopcam + _hitl | molmoact dual-arm | 14-D joint, radians | 5 | 13,003 |
266 packed records / 118,982 frames, 0 invalid. All are LeRobot v3.0. Only verified-fixed cameras are kept; wrist cameras are dropped. Episodes are trimmed to their non-idle span, actions normalized q01–q99 → [-1,1], video packed at 240×320 and decoded to 144×192 at 5 Hz.
Adding 39 episodes from rerun/abc-130k
(a Rerun conversion of the gated XDOF/ABC-130k)
more than doubled the corpus to 260,731 frames and turned the starved bimanual
embodiment into the larger one — and made the model worse. The single-arm side
lost its action-conditioning (shuffled began outscoring true) and the
bimanual side never gained any.
Two unseparated causes: the two bimanual robots were merged into one embodiment (same action convention, different kinematics — identical joint angles produce different pixel motion on a different robot), and the combined tokenizer reconstructs ABC at only 19.0 dB against YAM's 25.6, a gap that widened with training as ABC's dense two-arm scenes saturated the 96-latent bottleneck.
The weights published here are the single-corpus YAM model, which passes the action control.
abc130k/ — an ABC-130k bimanual modelA second pair of checkpoints trained from scratch on ABC-130k (240 episodes across 48 tasks, streamed from a 33.75 TB Rerun bucket without bulk downloading). Larger tokenizer: 192 latents x 24 channels.
abc130k/tokenizer | 24k steps, 28.31 dB held-out reconstruction |
abc130k/dynamics | 16k steps, EMA rollout 19.10 dB |
Doubling bottleneck width lifted reconstruction 22.90 -> 28.31 dB on identical eval clips — a decisive answer to whether ABC's dense two-arm scenes were capacity-limited. They were.
It did not produce action-conditioning. Feeding another episode's actions
yields motion closer to ground truth than the true actions (2.34x vs 3.12x of
ground-truth motion), so the model is not following its commands. Rollouts sit at
17.02 dB against a 28.31 dB tokenizer ceiling — the dynamics model, not the
tokenizer, is the binding constraint. Full analysis in
docs/abc130k_world_model.md.
Use abc130k/ for bimanual reconstruction; use the YAM weights above if you need a
world model that responds to actions.
Full recipe, per-stage commands, and the failure modes encountered are documented
in docs/yam_world_model.md.