NDM Gym weights
Trained policies and world models of NDM Gym, one folder per benchmark. Each folder holds the checkpoints behind that benchmark's published results; other benchmarks are added as their results are published.
| folder | benchmark | checkpoints |
|---|---|---|
g1_lafan1_tracking/ |
G1 / LAFAN1 motion tracking | SuperTrack and SuperMimic, MLP and RigidFormer world models, 12 runs |
G1 / LAFAN1 motion tracking
SuperTrack and SuperMimic on the Unitree G1 (29 DoF), all 40 LAFAN1 clips, 3 h of training on one A100 each.
| folder | algorithm | world model | seeds | iterations in 3 h |
|---|---|---|---|---|
g1_lafan1_tracking/supertrack-mlp |
SuperTrack | MLP | 1, 2, 3 | 12,661 / 12,610 / 12,740 |
g1_lafan1_tracking/supermimic-mlp |
SuperMimic | MLP | 1, 2, 3 | 13,606 / 13,688 / 13,326 |
g1_lafan1_tracking/supertrack-rf |
SuperTrack-RF | RigidFormer | 7, 8, 9 | 12,654 / 12,677 / 12,696 |
g1_lafan1_tracking/supermimic-rf |
SuperMimic-RF | RigidFormer | 7, 8, 9 | 10,710 / 10,694 / 10,726 |
Each seed<k>.pt is that run's 3 h checkpoint: pi (the policy, 9.1 M parameters), wm (the world model: MLP 8.8 M,
RigidFormer 0.88 M), args (the training arguments), iteration, wall_time, sim_steps and saved_at. Optimizer
states are not included, so training cannot be resumed from these files.
Mean ± std over the three seeds; each seed averages three standard evaluations (the push rows use one push test). Details: README and results.md.
MLP world model, the selected configurations (seeds 1-3):
| SuperTrack | SuperMimic | |
|---|---|---|
| normalized return | 0.832 ± 0.009 | 0.824 ± 0.013 |
| failed clips (of 40) | 0.9 ± 0.8 | 1.2 ± 1.2 |
| MPJPE, root-relative (mm) | 20.0 ± 0.7 | 28.4 ± 0.5 |
| joint-angle error (deg) | 2.32 ± 0.06 | 4.89 ± 0.03 |
| failed clips under root pushes of 1 m/s every 2 s | 7.7 ± 2.3 | 1.7 ± 0.6 |
| failed clips under root pushes of 2 m/s every 2 s | 24.7 ± 1.2 | 9.3 ± 1.2 |
RigidFormer world model, the final configurations with every speed option (seeds 7-9):
| SuperTrack-RF | SuperMimic-RF | |
|---|---|---|
| normalized return | 0.832 ± 0.003 | 0.804 ± 0.007 |
| failed clips (of 40) | 0.4 ± 0.5 | 0.8 ± 0.4 |
| MPJPE, root-relative (mm) | 21.0 ± 1.3 | 33.1 ± 0.5 |
| joint-angle error (deg) | 2.24 ± 0.05 | 6.05 ± 0.62 |
| failed clips under root pushes of 1 m/s every 2 s | 5.3 ± 1.2 | 1.3 ± 0.6 |
| failed clips under root pushes of 2 m/s every 2 s | 24.3 ± 3.1 | 9.0 ± 2.0 |
Each run's exact arguments are in its file's args.
Use
git clone --recursive https://github.com/Frank-ZY-Dou/ndm-gym.git && cd ndm-gym
bash scripts/setup.sh && source ~/ndm_gym/venv/bin/activate # also downloads the motions and the G1 into data/
hf download frankzydou/ndm-gym --include "g1_lafan1_tracking/*" --local-dir weights
W=weights/g1_lafan1_tracking
ndm-eval --run_dir $W/supertrack-mlp --ckpt $W/supertrack-mlp/seed1.pt --out_json st_seed1.json
ndm-eval --run_dir $W/supertrack-mlp --ckpt $W/supertrack-mlp/seed1.pt --record st_seed1.npz # for tools/compare_videos.py
In Python (torch.load with weights_only=True works):
import torch
from ndm_gym.algos import world_model_from_args
from ndm_gym.policies.tracking_policy import TrackingPolicy
from ndm_gym.tasks.tracking import OBS_DIM
ck = torch.load("weights/g1_lafan1_tracking/supertrack-mlp/seed1.pt", map_location="cpu", weights_only=True)
a = ck["args"]
pi = TrackingPolicy(OBS_DIM, 73 * a["goal_frames"], hist=a["hist"])
pi.load_state_dict(ck["pi"])
wm = world_model_from_args(a)
wm.load_state_dict(ck["wm"])
License
The weights are not covered by the MIT license of NDM Gym's code; each folder follows the terms of the data its weights
were trained on (LICENSE). g1_lafan1_tracking/: LAFAN1 motions (© 2018 Ubisoft Entertainment; CC BY-NC-ND
4.0; https://github.com/ubisoft/ubisoft-laforge-animation-dataset) retargeted to the G1 (LAFAN1 Retargeting Dataset), for
non-commercial research use only.
Citation
@misc{ndmgym2026,
title = {NDM Gym: Neural Dynamics Modeling Gym},
author = {{NDM Gym Contributors}},
year = {2026},
howpublished = {\url{https://github.com/Frank-ZY-Dou/ndm-gym}}
}