# π0.5 Piper picnic-bag LoRA run ## Pinned implementation - Official OpenPI: `Physical-Intelligence/openpi` - Commit: `15a9616a00943ada6c20a0f158e3adb39df2ccac` - Vast SSH alias: `vast-pi05-6000ada` - GPU: RTX 6000 Ada 48GB The remote checkout is `/workspace/openpi`. Local OpenPI overlay files are under `src/openpi/` in this directory. ## Data contract - Source: `/home/yannan/workspace/ros1_docker-main/rosbag_data/Picnic_Bag_revised` - FPS: 30 - Task: `pack the items into the picnic bag` - Three RGB views, aspect-preserving letterbox to 224x224 - State/action order: `[L_j1..j6, L_gripper_m, R_j1..j6, R_gripper_m]` - State/action dimensions: 14/14 - Joint units: radians; raw action targets are absolute joint angles - Grippers: clip commands to `[0, 0.08]` m and map to `[0, 1]` - Model action representation: 12 joint dimensions are `action - current_state`; two gripper dimensions stay absolute - Delta mask: `make_bool_mask(6, -1, 6, -1)` Datasets: - Train: `local/picnic_bag_revised_pi05_train40_rgb224_v21` (40 episodes, 60,261 frames) - Validation: `local/picnic_bag_revised_pi05_val4_rgb224_v21` (4 episodes) - Overfit gate: `local/picnic_bag_revised_pi05_overfit3_rgb224_v21` (3 episodes) Remote LeRobot root: `/workspace/lerobot_data`. ## Model and optimizer - `pi05=True`, action dim 32, horizon 30, max token length 200 - PaliGemma: `gemma_2b_lora` (rank/alpha 16) - Action expert: `gemma_300m_lora` (rank/alpha 32) - Batch 16, 20,000 steps - AdamW: beta `(0.9, 0.95)`, eps `1e-8`, weight decay `1e-10`, grad clip `1.0` - Cosine LR: 1,000-step warmup, `2.5e-5` peak, `2.5e-6` final - Quantile q01/q99 normalization; EMA disabled - Save every 2,000; retain milestone 10,000 plus newest checkpoint ## Remote services and monitoring ```bash ssh vast-pi05-6000ada supervisorctl status pi05_overfit pi05_gatekeeper pi05_train tail -f /workspace/logs/pi05_overfit.log tail -f /workspace/logs/pi05_formal.log nvidia-smi ``` The gatekeeper starts `pi05_train` only after the overfit checkpoint at step 1999 has been finalized. Formal checkpoints are stored at: ```text /workspace/checkpoints/pi05_piper_picnic_lora/picnic_bag_lora_20k_seed42 ``` The Vast instance has no persistent volume. Copy selected checkpoints to the local 5090 workstation before stopping or destroying the instance. ## Throw-into-tank replay-40 run - Vast SSH alias: `vast-pi05-pro6000ws` - GPU: RTX PRO 6000 Blackwell Max-Q Workstation Edition, 96 GB - OpenPI config: `pi05_piper_throw_tank_replay40_lora` - Dataset: `local/throw_replay_currentcamera_ep32fix_40_right7d_pi05_rgb224_v21` - Prompt: `throw the object into the tank` - Run name: `throw_tank_replay40_lora_5k_seed42` - Source demonstrations: only the 40 episodes from `Throw_Into_Tank_Clean_Background_Replay_Current_Camera` (15,658 frames); no holdout split. Do not mix in `Throw_Into_Tank_2`, `_3`, or `_4` for this run. - The replay-current-camera session supersedes `Throw_Into_Tank01`. Its `episode_032` is the hash-verified corrected teleoperation from `Throw01_episode32_fixing/episode_001`. - Right-arm-only data contract: state/action are `[R_j1..j6, R_gripper_m]` (7/7), with top and right-wrist RGB only. - The six joint actions are deltas from current state; the gripper remains an absolute target (`make_bool_mask(6, -1)`). - Do not train this task through the 14-D dual-arm picnic-bag transform. - Long-running training is managed by supervisor service `pi05_throw_tank_train`. - First round: batch 16, 5,000 steps, 250-step warmup, cosine LR `2.5e-5 -> 2.5e-6`, save every 1,000 steps and retain 2,000-step milestones. This is about 5.1 complete passes over the 15,658-frame dataset. - This Vast instance has no persistent volume, so the final checkpoint must be synced locally and uploaded before the instance is destroyed or recycled. ### Local 5090 deployment The Hugging Face checkpoint is installed at: ```text /data/LFV/openpi_checkpoints/pi05_piper_throw_tank_replay40_lora/throw_tank_replay40_lora_5k_seed42/4999 ``` The LFV TUI Policy menu has a direct `VLA / OpenPI pi0.5 投桶 replay-40 右臂` entry. It uses the same two-Enter/Ctrl-C interaction as Picnic Bag: Enter moves both arms to the rollout start (inactive left at zero, right at the 40-replay mean first-frame pose), the second Enter starts inference, Ctrl-C stops inference and returns to zero, and Ctrl-C at zero returns to Policy selection. The policy sees only right 7-D state plus top/right-wrist RGB; the client continuously holds the inactive left arm and routes predictions only to the right command topic. The local checkpoint has passed SHA256 verification, RTX 5090 load/inference smoke (`30x7` finite absolute actions), policy-server health, and a one-cycle ROS observation-only websocket smoke. ## Confirmed task arm contracts - Throw into tank and pick up bowl: right arm only (7-D). - Throw plush ball: left arm only (7-D). - Take off cup: mixed single-arm demonstrations, with each episode retaining its real left/right identity; do not canonicalize both sides into one 7-D slot. - Peg, picnic bag, and toothbrush: dual arm (14-D). Confirmed first-round dataset scopes: - Throw into tank: replay-current-camera 40 only (15,658 frames). - Pick up bowl: raw episodes 009–040, right-arm 32 only (18,129 frames), not all 40 raw bags. - Peg insertion: 40-episode version (42,614 frames), not the 80-episode version. The π0.5 cup source is the corrected short16 set only: eight left-arm and eight right-arm episodes. The original 48-episode dataset contains 32 genuinely bimanual long episodes and is not the requested mixed-single-arm dataset. The existing Stereo-ACT `short16_fixed_activearm` derivative is also not a π0.5 source because it renames both sides into a canonical right-arm slot. ## Remaining-task serial queue Supervisor service `pi05_remaining_serial_train` runs these independent LoRA models in order. Each task has its own dataset, normalization statistics, checkpoint directory, smoke test, and Hugging Face repository. | Order | Task | Data | Exact prompt | Contract | Steps | Preserved checkpoints | |---:|---|---:|---|---|---:|---| | 1 | Bowl into bag | 32 eps / 18,129 frames | `pick up the bowl and place it in the bag` | right 7-D | 8,000 | `6000`, `7999` | | 2 | Plush ball into tank | 74 eps / 23,008 frames | `pick up the plush ball and throw it into the tank` | left 7-D | 8,000 | `4000`, `6000`, `7999` | | 3 | Cup off rack | 16 eps / 9,065 frames | `take the cup off the rack and place it on the plate` | mixed single-arm demos in physical 14-D | 5,000 | `3000`, `4000`, `4999` | | 4 | Peg insertion | 40 eps / 42,614 frames | `pick up the gray peg and insert it into the hole in the orange block` | dual 14-D | 12,000 | `8000`, `10000`, `11999` | | 5 | Toothbrush into cup | 32 eps / 31,484 frames | `put the toothbrush into the cup` | dual 14-D | 10,000 | `6000`, `8000`, `9999` | The queue validates the prompt and geometry, computes task-specific quantile normalization, runs a two-step train/load/inference smoke, and trains from the π0.5 base checkpoint. Every preserved checkpoint gets its own load/inference smoke and SHA256 verification. Intermediate checkpoints are uploaded to `checkpoints//` in the task's Hugging Face model repository; the final checkpoint remains at the repository root. Redundant periodic checkpoints are removed only after all selected checkpoints have passed smoke, checksum, and HF upload. The queue stops on the first failure and is safe to restart: completed uploads are skipped and interrupted formal runs resume from their newest checkpoint. Prepare and sync the datasets from the 5090 workstation: ```bash scripts/prepare_remaining_datasets_local.sh scripts/sync_remaining_datasets_to_vast.sh ``` Install and start the queue on the Vast instance after the repository is present at `/workspace/pi05-piper-training` and its OpenPI overlay has been copied into `/workspace/openpi`: ```bash cp /workspace/pi05-piper-training/supervisor/pi05_remaining_serial_train.conf \ /etc/supervisor/conf.d/ supervisorctl reread supervisorctl update supervisorctl start pi05_remaining_serial_train tail -f /workspace/logs/pi05_remaining_serial.log ```