CoolFace
Modelpublic

Aether258/pi05_bi_bread_all3_step10000

sourceHugging Faceapache-2.0updated 1mo agoView on Hugging Face
0likes
Model Card

pi05_bi — bread (01+02+03 merged), step 10000

openpi pi05_bi checkpoint for a bimanual bread-and-ketchup task with tactile inputs. Step 10000 (1.98 epochs), held-out validation loss 0.0389.

The lowest held-out loss through step 12000 is step 12000 at 0.0379 (Aether258/pi05_bi_bread_all3_step12000); this checkpoint is 0.0003 behind, which is within noise. Published mainly as the second point of the plateau.

This is the three-source bread dataset. An earlier run on sources 01+02 only (775 episodes) is published under Aether258/pi05_bi_bread_all_step*; the two are different datasets and their loss values are not comparable (normalization statistics are computed per dataset).

Task

Single unified instruction for every episode:

Firstly, use the right hand to pick up the bread and put it on the table. Secondly, use the left hand to pick up the ketchup and squeeze it onto the bread.

bread_03 shipped with the placeholder string "perform manipulation task" in its meta/tasks.jsonl -- 587 of the 1,362 episodes, 43% of the merged set. Since prompt_from_task=True feeds this string straight to the model, all three sources were forced onto the instruction above at merge time; otherwise nearly half the data would have trained against an uninformative prompt.

Data

sourceepisodesframesmean frames/ep
KaiyueChen/bread_01293196,281670
KaiyueChen/bread_02482244,831508
KaiyueChen/bread_03587276,252471
merged1,362717,364527

LeRobot v2.1, 30 fps, robot_type=bimanual, images embedded in the parquet files (total_videos=0). Six camera streams: camera0, camera1, and four tactile sensors (tactile_left_0/1, tactile_right_0/1).

Split

Episodes are held out per source repo (10%, seed 42) so the held-out set keeps the same source mix as train:

splitepisodes
train1,226 (644,964 frames)
val_seen (subset of train)136
val_unseen (held out)136

Normalization statistics (quantile q01/q99) are computed over the train split only.

Training

configpi05_bi
hardware2 x A100-80GB, FSDP
batch size128
this checkpointstep 10000 (~1.98 epoch; 1 epoch = 5,039 steps)
planned length16,000 steps (3.18 epochs)
lrcosine decay, 1,000 warmup steps: peak 2.5e-5 -> 2.5e-6 over 30,000 steps
(CosineDecaySchedule defaults -- pi05_bi does not override lr_schedule)
LoRArank 16 on the LLM, rank 32 on the action expert
vision towerfully fine-tuned -- the freeze filter matches only .*llm.*

Validation curve

Flow-matching loss, 20 batches per split, evaluated on the same leading batches each time so successive points are comparable.

steptrainval_seenval_unseengap
0n/a0.67700.6380-0.0390
20000.05240.06810.0453-0.0228
40000.04740.05330.0415-0.0118
60000.04520.05070.0396-0.0111
80000.04340.04680.0386-0.0082
100000.04220.04680.0389-0.0079
120000.04100.04310.0379-0.0052

val_unseen fell steadily, paused at step 10000 (0.0386 -> 0.0389), then resumed and set a new low at step 12000 (0.0379). val_seen did the same thing: flat at 0.0468 across steps 8000-10000, then down to 0.0431.

That pause is worth dwelling on, because it looked like a turn and was not. Both validation curves stalling simultaneously while the training loss kept falling is normally a strong overfitting signal -- but with each validation pass covering only ~2,560 frames (about 4.9 episodes per split at ~527 frames each), a +0.0003 move sits inside the sampling noise, and two consecutive points are simply not enough evidence. The same false alarm occurred in the sibling two_tubes_0102 run at steps 6000-8000 and in task2_all at steps 8000-10000; in both cases the next point recovered. Three consecutive points with no trend, plus a monotonically widening gap, is the threshold worth acting on -- two is not.

On the negative gap

The gap is negative throughout, but note it starts at -0.0391 at step 0, before any training. That is the intrinsic difficulty difference between the two sampled episode subsets, not generalization. Its rapid early narrowing (-0.0391 -> -0.0228 -> -0.0118) is the model learning what both subsets have in common, not overfitting. Only the later behaviour -- narrowing again from -0.0112 to -0.0082 while val_unseen slowed -- carries information about overfitting.

Note the training loss is measured on augmented images (random crop to 95%, +-5 deg rotation, colour jitter, applied to all six streams including the four tactile ones) while validation runs with train=False, which skips augmentation. The two columns are therefore not directly comparable.

Contents

checkpoint/
  params/                      # inference weights
  train_state/                 # optimizer state, for resuming
  assets/bread_all3/
    norm_stats.json            # computed over the train split only