| --- |
| license: apache-2.0 |
| tags: |
| - robotics |
| - robotwin |
| - pi0.5 |
| - vla |
| --- |
| |
| # RACE RoboTwin — π0.5 t5k showcase checkpoints |
|
|
| Single-task π0.5 (OpenPI) checkpoints on RoboTwin 2.0 (aloha-agilex, `demo_clean`, 50 demos/task), for 6 tasks: |
| `pick_dual_bottles`, `move_can_pot`, `place_dual_shoes`, `place_can_basket`, `blocks_ranking_rgb`, `stack_blocks_three`. |
|
|
| All fine-tunes start from the **5k-step teacher** (weak-teacher regime, "t5k"). |
|
|
| ## Layout |
|
|
| ``` |
| <task>/ |
| teacher_ac50/ # 5k-step teacher (JAX -> PyTorch conversion, float32) |
| vlmfreeze_ac50/{5000,10000}/ # phase-loc fine-tune, VLM frozen, action horizon 50 |
| vlmfreeze_ac75/{5000,10000}/ # action horizon 75 |
| vlmfreeze_ac100/{5000,10000}/ # action horizon 100 |
| ``` |
|
|
| Each checkpoint dir has `model.safetensors`, `assets/` (norm stats), and `metadata.pt` |
| (training config + step). Optimizer states are omitted. |
|
|
| ## Results — 100 episodes (seeds 0+1, demo_clean, 50 ep each) |
| |
| | task | teacher ac50@5k | ac50@5k | ac75 best | ac100 best | |
| |---|---|---|---|---| |
| | pick_dual_bottles | 58% | 62% | **67%** (@2k) | 59% (@2k) | |
| | move_can_pot | 58% | **76%** | 61% (@5k) | 54% (@8k) | |
| | place_dual_shoes | 29% | **48%** | 39% (@9k) | 28% (@9k) | |
| | place_can_basket | 45% | 47% | 40% (@4k) | **48%** (@7k) | |
| | blocks_ranking_rgb | 48% | **64%** | 43% (@10k) | 41% (@6k) | |
| | stack_blocks_three | 31% | **45%** | 36% (@9k) | 39% (@4k) | |
| | **mean** | 44.8% | **57.0%** | 47.7% | 44.8% | |
| |
| ac75/ac100 "best" steps were selected on the seed-0 dense sweep, so their totals |
| carry some selection bias; ac50@5k is a fixed step (no selection). Takeaway: |
| action horizon 50 at 5k steps is the sweet spot — vlm-freeze fine-tuning beats |
| the 5k teacher by +12.2%p on average. |
| |
| ### Best ac75 checkpoints |
| |
| `<task>/vlmfreeze_ac75_best/` holds each task's best-performing ac75 checkpoint, |
| selected over the 1k-10k dense eval sweep (demo_clean, seed 0, 50 episodes). |
| `BEST_INFO.txt` inside records the source training step and score: |
|
|
| | task | step | success | |
| |---|---|---| |
| | pick_dual_bottles | 2000 | 68% | |
| | move_can_pot | 5000 | 64% | |
| | place_dual_shoes | 9000 | 46% | |
| | place_can_basket | 4000 | 46% | |
| | blocks_ranking_rgb | 10000 | 46% | |
| | stack_blocks_three | 9000 | 40% | |
|
|
| ### Best ac100 checkpoints |
|
|
| Two selections from the ac100 dense sweep: `vlmfreeze_ac100_best/` (designated |
| best, used for the 100-episode report) and `vlmfreeze_ac100_max/` (per-row curve |
| maximum). Steps: best = 2000/8000/9000/7000/6000/4000, max = |
| 9000/2000/9000/2000/7000/7000 (task order as above). See each `BEST_INFO.txt`. |
|
|
| ## Serving / eval |
|
|
| Serve with OpenPI's `scripts/serve_policy.py` (PyTorch path): |
|
|
| ``` |
| python scripts/serve_policy.py --port <P> policy:checkpoint \ |
| --policy.config=st_<task>_phase_loc[_h75|_h100] --policy.dir=<downloaded dir> |
| ``` |
|
|
| `--policy.config` must match the action horizon (`st_<t>_phase_loc` = 50, |
| `_h75` = 75, `_h100` = 100); evaluate with RoboTwin 2.0 `script/eval_policy.py` |
| (`--pi0_step` = the same horizon, `demo_clean`, seed 0, 50 episodes). |
|
|
| Checkpoints are uploaded progressively as trainings/evals complete. |
|
|