- Psi0 Fine-Tune v4 — G1 Sneaker-in-Box, Bimanual + Lateral + Recovery + Negative
Psi0 Fine-Tune v4 — G1 Sneaker-in-Box, Bimanual + Lateral + Recovery + Negative
v4 community fine-tune of Psi0 (paper) on a Unitree G1 humanoid with Inspire RH56DFTP hands.
Same task as the v1, v2 and v3 fine-tunes — "Pick up the sneaker and place it inside the box." — but trained on the 385-episode v4 dataset (psi0-g1-sneaker-385ep-v4) which extends the v3 base with +60 negative episodes (no shoe and/or no box). v4 closes the third item on v1 Phase 14's punch list (negative scenes / no-go cue) — the carryover that v2 never addressed and v3 only partially handled. Trained at the CloudWalk Robotics Lab (CW-RL), 2026-05.
Status
Trained 2026-05-10. 160 000 steps on 8× B200 in 14 h 35 m, 172 effective epochs, final
eval/loss0.209. Open-loop eval section reserved asPending(mirror of v2 Phase 11.5; see the v4 runbook for the protocol).
Quick facts
| Base | Psi0 (Qwen3-VL-2B + flow-based MM-DiT action expert) |
| Pretrained | pre.fast.1by1.2601091803.ckpt.ego200k.he30k + postpre.1by1.pad36.2601131206.ckpt.he30k |
| Training dataset | cloudwalk-research/psi0-g1-sneaker-385ep-v4 (385 ep, 119 043 frames @ 30 Hz, 640×480 ego cam) |
| Episode composition | 60 negative + 94 v1-RIGHT + 111 v2-LEFT + 60 lateral + 60 recovery |
| Predecessor (v3) | cloudwalk-research/psi0-g1-sneaker-325ep-v3 (325 ep, all of the above minus negatives) |
| Robot target | Unitree G1 + Inspire RH56DFTP (NOT Dex3-1) |
| Action space | 36-D (6 hand + 1 pad / side, 14 arm, 4 torso, 4 locomotion) |
| State space | 32-D (padded to 36-D for the model) |
| Action chunk | 30 |
| Hardware | 8× NVIDIA B200 (sm_100 / Blackwell), system PyTorch 2.10 (NVIDIA build) |
| Mixed precision | bf16 |
| Optimizer | AdamW, lr=1e-4 cosine + min_lr 5e-7, warmup 1000, betas=(0.95, 0.999), wd=1e-6, grad-clip 1.0 |
| Steps / batch | 160 000 / global batch 128 (16 per GPU × 8 GPUs) |
| Effective epochs | ~172 (160 000 × 128 / 119 043) |
| Checkpointing | every 10 000 steps; max_checkpoints_to_keep=20 so all 16 saves (ckpt_10000 … ckpt_160000) survive |
| RTC | enabled, max_delay = 8 |
| VLM | frozen (only action header trained) |
| Wall-clock | 14 h 35 m on 8× B200 (vs ~14.7 h prediction) |
| Final eval/loss | 0.209 (vs v3 0.267 — 22% lower; details in Evaluation §) |
| W&B run | i8asi0n2 (CW-RL internal) |
Negatives — the v4-specific signal
v4 layers 60 negative episodes (no shoe and/or no box) onto the v3 base. The collection used the same task instruction as positives ("Pick up the sneaker and place it inside the box.") — the policy is meant to learn that the language instruction's target is missing from the visual scene and stay still. This directly attacks the v1-Phase-14 finding that "the policy moves identically when the shoe is removed" (uses time, not vision).
Frame-weighted vs episode-weighted exposure. Negatives are short by design (mean ~3 s vs ~11 s for positives), so 60 / 385 ≈ 16% by episode count but only ~5% by frame count. If real-robot behavior on v4 shows the policy still moves identically with the shoe absent, that's the load-bearing diagnostic — likely fix is to up-sample negatives at training time, lengthen them at collection time, or both. Tracked as a v4-specific open question.
Step-budget rationale (160 k vs v2's 40 k)
Same recipe as v3 — 4× v2's step count on a 1.9× larger and substantially more diverse dataset, with the 16-checkpoint ladder retained as the diagnostic input for post-hoc OOD-optimum location. See the v3 model card for the full rationale; v4 inherits it unchanged.
Repository contents
This repo carries 3 diagnostic checkpoints (storage-cap-aware decision, carry-over from v3):
checkpoints/ckpt_30000/model.safetensors(~5.9 GB) — early plateau, post-warmupcheckpoints/ckpt_90000/model.safetensors(~5.9 GB) — mid-training referencecheckpoints/ckpt_160000/model.safetensors(~5.9 GB) — finalrun_config.json(tyro-serialized launch config)argv.txt(full command line)README.md(this file)
Optimizer / scheduler / sampler / random-state files are intentionally omitted — training-resume only.
Storage-cap-aware retention. v3's first HF upload attempt with all 16 ckpts hit the cloudwalk-research private-storage cap. v4 follows the same 3-checkpoint reduction. Finer-grained ckpts (10k / 20k / 40k / 50k / 60k / 70k / 80k / 100k / 110k / 120k / 130k / 140k / 150k) for Phase 11.5 follow-up may be available internally at CW-RL on request.
Evaluation
In-process (training-time eval/loss, in-distribution)
| Metric | v2 (199ep, 40k) | v3 (325ep, 160k) | v4 (385ep, 160k) |
|---|---|---|---|
eval/loss |
0.0816 | 0.267 | 0.209 |
eval/err_l1_arm_joints |
0.114 | 0.0834 | 0.0821 |
eval/err_l1_hand_joints |
0.0117 | 0.0123 | 0.0124 |
eval/err_l1_height |
small | small | 1e-5 |
eval/err_l1_target_yaw |
small | small | 6.3e-4 |
| Wall-clock | 3 h 42 m | 14 h 46 m | 14 h 35 m |
| Effective epochs | 84 | 184 | 172 |
The eval/loss drop from v3. v4's headline eval/loss is 22% lower than v3 despite 1.9× the dataset and broader scene mix. The big driver is exactly the prediction in the v4 runbook: negatives are short (~3 s vs ~11 s for positives) and their ground-truth action is approximately constant — those frames have a much lower per-frame loss floor than positives, and they make up ~5% of frames. So part of the eval/loss reduction is "more easy frames in the average," not pure quality gain on positives. The clean per-axis comparison (arm / hand) shows: arm_joints ≈ flat vs v3 (0.082 vs 0.083), hand_joints ≈ flat (0.0124 vs 0.0123). The v4-specific signal is whether the policy stays still under negatives — that lives in the open-loop section below, not in eval/loss.
Open-loop evaluation (ID + OOD)
Pending — to be done in a follow-up session, mirror of v2 Phase 11.5. Recommended ckpts: 30 k, 60 k, 90 k, 120 k, 160 k. Two precondition options for the held-out probe:
- Reuse v2's eval set (
psi0-g1-sneaker-6ep-v2-eval) — its 6 episodes are byorig_episode_indexnot in v4 (the v4 base is the 205ep canonical without the 6 held-out, plus lateral / recovery / negative collections). Same OOD probe used for v2 / v3 → same comparable axis. - Build a v4-specific held-out set — carve a few episodes from each new collection class (negative, lateral, recovery) so the probe exercises v4-specific scene types. Stronger signal but a small dataset-engineering follow-up.
The v4-specific eval that matters most for behavioral correctness is the negative-scene check: with shoe and/or box absent, does the policy stay still? Open-loop L1 error against held-out negative episodes (where the ground-truth action is "stay still") is the cleanest measurable proxy.
How to download
import os
from huggingface_hub import hf_hub_download
repo = "cloudwalk-research/psi0-g1-sneaker-385ep-v4-finetune"
local_dir = ".runs/finetune/sneaker-real-v4"
for f in [
"run_config.json",
"argv.txt",
"checkpoints/ckpt_160000/model.safetensors", # one of {ckpt_30000, ckpt_90000, ckpt_160000}
]:
hf_hub_download(repo_id=repo, filename=f, repo_type="model",
local_dir=local_dir)
How to evaluate (closed-loop sim)
bash sim/scripts/run_closed_loop.sh \
"Pick up the sneaker and place it inside the box." \
.runs/finetune/sneaker-real-v4 160000 \
--fixed_base --live_viewer
For v4, watch (on top of v3's bimanual + recovery signals): does the policy stay still when the rendered scene is missing the shoe or the box? The most behaviorally-indicative test of the v4-specific intervention.
Known caveats
- Generalization is not yet validated. Trained but not evaluated open-loop or on the robot; numbers and decisions land post-eval.
- Hand commands are still lockstep across the 6 active Inspire DoF (per side). Unchanged from v2 / v3; a teleop-modality limitation, not a fine-tune limitation.
- Task is bimanual but stationary on positives, fully stationary on negatives. Action dims for locomotion (vx/vy/vyaw/target_yaw) and torso RPY are constant in the dataset.
- In-process
eval/lossis in-distribution. Psi0 default; the real generalization signal lives in the open-loop section above. - Inspire deploy bridge is required (resolved in v1, inherited in v2/v3/v4).
- Negative episodes under-weighted at the chunk level. ~5% of frames despite ~16% of episodes; if the policy still moves blindly with shoe absent post-train, this is the first thing to investigate.
Lineage
| Item | Repo |
|---|---|
| v1 fine-tune (RIGHT-hand only) | cloudwalk-research/psi0-g1-sneaker-94ep-v1-finetune |
| v2 fine-tune (bimanual) | cloudwalk-research/psi0-g1-sneaker-199ep-v2-finetune |
| v3 fine-tune (+lateral +recovery) | cloudwalk-research/psi0-g1-sneaker-325ep-v3-finetune |
| v4 fine-tune (this repo, +negative) | cloudwalk-research/psi0-g1-sneaker-385ep-v4-finetune |
| v4 training dataset (385 ep) | cloudwalk-research/psi0-g1-sneaker-385ep-v4 |
| v3 training dataset (325 ep) | cloudwalk-research/psi0-g1-sneaker-325ep-v3 |
References
- Psi0 — Generalist VLA model, base policy fine-tuned here. Paper, GitHub.
- Cluster runbooks (v2, v3, v4) — Container reuse strategy, full teardown, and 16-ckpt retention details; tracked internally at CW-RL.
- v3 fine-tune —
cloudwalk-research/psi0-g1-sneaker-325ep-v3-finetune. - v2 fine-tune —
cloudwalk-research/psi0-g1-sneaker-199ep-v2-finetune. - Pre-deploy checklist — Psi0 issue #39.
Attribution
Developed by cloudwalk-research in the CloudWalk Robotics Lab (CW-RL). Part of the Psi0 collection. Fine-tuned from the Psi0 base model; integrates with the LeRobot framework.
Citation
@misc{cwrl_psi0_sneaker_v4_2026,
title = {Psi0 Fine-Tune v4 --- G1 Sneaker-in-Box, Bimanual + Lateral + Recovery + Negative (Inspire RH56DFTP)},
author = {{CloudWalk Robotics Lab}},
year = {2026},
howpublished = {Hugging Face model repository},
url = {https://huggingface.co/cloudwalk-research/psi0-g1-sneaker-385ep-v4-finetune}
}
@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}
}
License
Released under Apache-2.0. This is a research preview: not intended for safety-critical use; closed-loop deployment on a physical humanoid requires human oversight.