Instructions to use Aether258/pi05_bi_task1_all_step8000 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- LeRobot
How to use Aether258/pi05_bi_task1_all_step8000 with LeRobot:
- Notebooks
- Google Colab
- Kaggle
File size: 2,952 Bytes
6ce68fa | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | ---
license: apache-2.0
tags:
- robotics
- openpi
- pi05
- lerobot
- vla
---
# pi05_bi — task1_all — step 8000
openpi `pi05_bi` checkpoint, snapshot at **training step 8000**.
Task: *"Use the left hand to pick up the black tube, and then transfer it to the
right hand and place it into the rack."*
## Data
Merged from three LeRobot v2.1 datasets (30 fps, images embedded in parquet,
`total_videos=0`):
| source | episodes | frames |
|---|---|---|
| `KaiyueChen/task1_01` | 550 | 375,061 |
| `KaiyueChen/task1_02` | 200 | 130,902 |
| `KaiyueChen/task1_03` | 200 | 114,987 |
| **merged** | **950** | **620,950** |
`task1_01` shipped with the placeholder task string `perform manipulation task`
while 02/03 carried the full description. Since `prompt_from_task=True` feeds
this string to the model, all episodes were unified to the 02/03 wording at
merge time — otherwise 58% of the data would train against an uninformative
prompt.
Split (per-source 10% held out, seed 42): **train 855 / val_seen 95 /
val_unseen 95**. Normalization statistics were computed over the *train split
only*.
## Model & training
- 6 camera streams: `camera0`, `camera1`, `tactile_{left,right}_{0,1}`
- `state_dim=20`, `action_dim=20`, `action_horizon=50`
- LoRA on the PaliGemma LLM (rank 16) and the action expert (rank 32)
- **The SigLIP vision tower is fully fine-tuned, not LoRA** — openpi's
`get_freeze_filter()` matches `.*llm.*` only, so `PaliGemma/img/*` stays
trainable. That is 413M of the 463M trainable parameters (89.8%).
- batch size 128, FSDP over 2×A100-80GB, `ema_decay=None`
- `CosineDecaySchedule` defaults: peak_lr 2.5e-5, warmup 1000, decay_steps 30000
- init from `gs://openpi-assets/checkpoints/pi05_base/params`
One epoch is 4356 steps, so step 8000 ≈ **1.8 epochs**.
## Validation at this checkpoint
Loss is the flow-matching training objective evaluated with `train=False`
(image augmentation disabled), averaged over a fixed set of batches with a
fixed rng so successive points differ only by the model.
| step | val_seen | val_unseen |
|---|---|---|
| 2000 | 0.0575 | 0.0534 |
| 4000 | 0.0530 | 0.0501 |
| 6000 | 0.0497 | 0.0482 |
| **8000** | **0.0483** | **0.0470** |
`val_unseen` was still decreasing monotonically at this checkpoint — no
overfitting turn had occurred yet. (A previous run on a different dataset
bottomed out at step 8000 and then degraded, which is why this step was
snapshotted.)
**Caveat on the numbers:** validation used `val_batches=20` at batch size 128 =
2560 frames, and episodes here average 653 frames, so each evaluation covers
only the first ~4 episodes of each split (~5.4%). The *absolute trend* of
`val_unseen` is meaningful (identical episodes and rng every time), but the
seen-vs-unseen difference rests on 4 episodes per side and should not be read
as a generalization gap.
## Contents
Orbax checkpoint: `params/`, `train_state/`, `assets/`, `_CHECKPOINT_METADATA`.
|