cloudwalk-research/psi0-g1-sneaker-199ep-v2
Psi0 G1 Sneaker-in-Box — 199 episodes (v2 training) Training subset of the 205-episode v2 canonical source, with 6 episodes held out for open-loop evaluation. Used as the input for the v2 Psi0 fine-tune (CloudWalk Research). Bimanual: roughly half LEFT-hand demos, half RIGHT-hand. Same task as v1 — "Pick up the sneaker and place it inside the box." — same Unitree G1 + Inspire RH56DFTP hardware. The held-out 6 episodes live in psi0-g1-sneaker-6ep-v2-eval. 199 + 6 = 205… See the full description on the dataset page: https://huggingface.co/datasets/cloudwalk-research/psi0-g1-sneaker-199ep-v2.
Psi0 G1 Sneaker-in-Box — 199 episodes (v2 training)
Training subset of the 205-episode v2 canonical source, with 6 episodes held out for open-loop evaluation. Used as the input for the v2 Psi0 fine-tune (CloudWalk Research). Bimanual: roughly half LEFT-hand demos, half RIGHT-hand. Same task as v1 — "Pick up the sneaker and place it inside the box." — same Unitree G1 + Inspire RH56DFTP hardware.
The held-out 6 episodes live in `psi0-g1-sneaker-6ep-v2-eval`. 199 + 6 = 205 reconstructs the canonical source exactly.
Quick facts
Bimanual coverage (verified post-build)
meta/stats_psi0.json — action.std:
Ill-conditioned (zero-range) action dims: {6, 13, 28, 29, 30, 32, 33, 34, 35}. (Compare v1's {0..6, 13, 28..30, 32..35} — the LEFT hand is no longer zero-range, which is the data-level signature of bimanual coverage.)
Renumbering and provenance
episode_indexis renumbered0..198contiguously; videos and parquet files match (episode_000000.mp4↔episode_index = 0, etc.).- Inside each parquet, the
episode_indexandindex(global frame index) columns were rewritten to match the new numbering.frame_index(within-episode) is unchanged. meta/episodes.jsonlcarries an extraorig_episode_indexfield per entry, mapping each new index back to its position in the canonical source. Use this for any cross-reference work.meta/stats.jsonandmeta/stats_psi0.jsonwere recomputed over the 199 frames in this dataset (NOT copied from the parent). This is the training-time normalization the v2 model will see — different from the canonical's stats by design.meta/tasks.jsonlis byte-identical to the parent (single task, unchanged instruction).
How to download
import os
from huggingface_hub import snapshot_download
snapshot_download(
repo_id='cloudwalk-research/psi0-g1-sneaker-199ep-v2',
repo_type='dataset',
local_dir='data/real/psi0-g1-sneaker-199ep-v2',
)After download, run scripts/data/patch_lerobot_meta.py to strip stale huggingface metadata keys (required for datasets==3.6.0).
How to use for training
The v2 fine-tune launches Psi0 with:
bash scripts/train/psi0/finetune-real-psi0.sh psi0-g1-sneaker-199ep-v2 sneaker-ext-left-real40 000 steps, batch 16/GPU × 8 GPUs (B200), bf16, cosine LR with 1e-4 peak, RTC enabled (max_delay=8), VLM frozen. Step count is intentionally kept the same as v1 despite the larger dataset — at 199 episodes this drops effective epochs from ~196 (v1) to ~89, an explicit intervention against v1's observed overfitting.
Open-loop eval (v2 fine-tune, 2026-05-07 summary)
This dataset is the training distribution (ID = in-distribution) anchor for the v2 fine-tune's open-loop eval. The held-out generalization signal (OOD) is on the partner dataset `psi0-g1-sneaker-6ep-v2-eval`. Both evals use byte-for-byte identical eval code (scripts/eval/openloop_eval_psi0.py, commit f094c20 on finetune-to-real); only the dataloader source changes.

Figure 1 — Glance view: each polygon is one checkpoint; bigger polygon area = better overall on that metric. Score per axis is `1 − (error / max_error_in_panel)`, so the outer edge = perfect (zero error) and the origin = worst observed. `hand_joints` panel: `ckpt_30k` (teal) and `ckpt_40k` (red) areas dominate; `ckpt_20k` (purple) collapses at OOD-RIGHT. `arm_joints` panel: every polygon is a thin spike pointing only at ID — all three ckpts collapse on every OOD axis, visualizing that OOD arm fails uniformly across training. Full per-side asymmetry on the [eval-set card](https://huggingface.co/datasets/cloudwalk-research/psi0-g1-sneaker-6ep-v2-eval).

Figure 2 — ID (blue, random 6 from this dataset) keeps improving 20k → 40k while OOD curves (red/green/orange, on `psi0-g1-sneaker-6ep-v2-eval`) plateau or regress past 30k. The growing ID-vs-OOD divergence IS the overfitting signature; the model decoded this dataset cleanly but did not generalize. `ckpt_30000` sits at the OOD optimum.

Figure 3 — Same data as Figure 2, laid out as bars for direct ckpt-by-ckpt magnitude comparison. ID (blue, on this dataset) drops monotonically while OOD bars (on the held-out partner) plateau or creep upward. The blue ID bar shrinks; the OOD bars do not. `ckpt_30000` is the Pareto-better deploy candidate.
Per-checkpoint denormalized L1 error norm (smaller is better). ID is a random 6-episode sample of this dataset (seed 42 → eps [17, 85, 86, 128, 150, 170], 1 771 frames). OOD is all 6 episodes of psi0-g1-sneaker-6ep-v2-eval (1 791 frames).
Reading specific to this training set:
- The ID curve is monotonically healthy (hand 0.042 → 0.017 → 0.014, arm 0.205 → 0.137 → 0.114). The model fits this dataset cleanly; the inference path is sane.
- The *OOD/ID gap grows with training: 2.9× → 5.8× → 7.2× on `hand_joints`. This dataset has the capacity for the model to memorize within 40 k steps; the gap-growth is the data-level fingerprint of memorization, not generalization. The headline implication is `ckpt_30000` is a better deploy candidate than `ckpt_40000`* (OOD arm regresses past 30k while ID arm keeps improving — see eval-set card for the full per-ckpt OOD numbers).
- Per-side coverage on this dataset is 108 LEFT / 91 RIGHT (1.19× LEFT-heavy). The OOD per-side breakdown (on the eval-set card, not duplicated here) shows
hand_jointson RIGHT-pickup episodes is 3× harder than LEFT-pickup. The 1.19× episode-count ratio cannot explain a 3× error gap by itself — the more likely contributor is scene-level diversity on the RIGHT side (sneaker pose, lighting, distractors). v3 dataset design should target RIGHT-side scene variation, not just RIGHT-side episode count. - Schedule implication for v3: at 199 episodes & batch 128, 40 k steps cover ~84 effective epochs and OOD already plateaus by ~30 k. A v3 with comparable step count will need ~1.5–2× more episodes (to keep effective-epochs lower) OR an OOD probe wired into the inner training loop as an early-stopping signal.
Full results, per-side breakdown tables, decision logic, and reproduce-snippet live on the eval-set card. Model decision: see the v2 model card.
# Reproduce the ID anchor (no flags = random 6 from this dataset, training distribution).
RUN_DIR=".runs/finetune/sneaker-ext-left-real-eval"
python scripts/eval/openloop_eval_psi0.py \
--run-dir "$RUN_DIR" --ckpt-steps 20000 30000 40000 \
--num-episodes 6 --stride 1 --num-inference-steps 10 \
--output openloop_id_v2.jsonRelated datasets
Attribution
Developed by cloudwalk-research in the CloudWalk Robotics Lab (CW-RL). Part of the Psi0 collection. Built to fine-tune the Psi0 base model; stored in the LeRobot v2.1 format.
Citation
@misc{cwrl_psi0_g1_sneaker_199ep_v2_2026,
title = {Psi0 G1 Sneaker-in-Box --- 199 episodes (v2 training, bimanual)},
author = {{CloudWalk Robotics Lab}},
year = {2026},
howpublished = {Hugging Face dataset},
url = {https://huggingface.co/datasets/cloudwalk-research/psi0-g1-sneaker-199ep-v2}
}
@article{psi0_2026,
title = {Psi0: A Generalist Vision-Language-Action Model for Humanoid Robots},
author = {Wei, Songlin and others},
year = {2026},
eprint = {2603.12263},
archivePrefix = {arXiv},
url = {https://arxiv.org/abs/2603.12263}
}
@article{black2024pi0,
title = {{$\pi_0$}: A Vision-Language-Action Flow Model for General Robot Control},
author = {Black, Kevin and Brown, Noah and Driess, Danny and others},
journal = {arXiv preprint arXiv:2410.24164},
year = {2024}
}
@software{lerobot2024,
title = {{LeRobot}: State-of-the-art Machine Learning for Real-World Robotics in {PyTorch}},
author = {{Hugging Face}},
url = {https://github.com/huggingface/lerobot},
year = {2024}
}