Pi0.5 policy for BEHAVIOR-1K task 38 spraying_for_bugs
"Pick up the pesticide atomizer in the garden and spray insectifuge to fully cover both potted plants in the garden."
This is a single-task vision-language-action policy for task 38 spraying_for_bugs of the BEHAVIOR-1K benchmark. It is Pi0.5-based, has 3.4B parameters, and controls the R1Pro robot from three 224×224 RGB cameras plus proprioception. It predicts 30-step action chunks.
It was fine-tuned for 25,000 steps on task 38 demonstrations only. The starting point was checkpoint_3 of the 1st-place 2025 BEHAVIOR Challenge solution (Larchenko, Zarin, Karnatak; paper). checkpoint_3 had been trained on 13 tasks (4, 27, 31–33, 35–39, 41, 46, 49), task 38 among them.
Status: training only. This model has not been evaluated in the BEHAVIOR simulator yet. Lower training loss does not guarantee a higher task success rate.
Files
| Path |
What it is |
params/ |
Model weights (orbax, ~12.6 GB), from the final training step (24,999) |
assets/IliaLarchenko/behavior_224_rgb/ |
Norm stats + FAST tokenizer, copied unchanged from checkpoint_3 |
changes.patch, behavior1k_decode.patch |
Code changes used for training (see below) |
metrics.json |
Logged training metrics every 100 steps |
Optimizer state is not included. Intermediate checkpoints (every 2,500 steps) are kept separately in jermo1120/b1k-task38-spraying-for-bugs.
Results (training metrics only)
|
start (steps 0–500 avg) |
end (last 1k steps avg) |
| action_loss |
0.051 |
0.045 |
The action loss rose to ~0.077 during the first ~3k steps, plateaued, then fell steadily as the learning rate decayed (2.5k-step averages: 0.067, 0.076, 0.075, 0.071, 0.073, 0.061, 0.057, 0.052, 0.049, 0.046). Two single batches (around steps 2,400 and 11,200) were outliers.
Final logged step (24,900): total loss 0.078, action loss 0.045, subtask accuracy 0.996, FAST token accuracy 0.793, grad norm 1.20. These are single batches of 16 with no held-out validation split.
Training setup
|
|
| Init |
IliaLarchenko/behavior_submission/checkpoint_3/params (all weights, incl. task embeddings) |
| Data |
Task 38 only: 200 episodes, ~1.30M frames (avg demo 3.6 min), from IliaLarchenko/behavior_224_rgb (224×224 RGB, 3 cameras) |
| Steps / batch |
25,000 steps × batch 16 (~31% of one epoch). Batch 32 runs out of memory on one 80 GB A100. |
| LR |
cosine: warmup 200 → peak 5e-6 → 5e-7 at 25k |
| Model config |
Same as the winners' pi_behavior_b1k_fast (FAST aux loss, correlated noise, 15 flow samples, frozen vision backbone) |
| Norm stats / tokenizer |
Reused from checkpoint_3 (not recomputed on task 38) |
| Hardware / time |
1× A100-SXM4-80GB, 3.0 s/step, ~21 h of training steps |
| Code |
behavior-1k-solution ca556f7 + changes.patch; BEHAVIOR-1K 684a83050 + behavior1k_decode.patch |
Deviations from the original data pipeline (read before comparing)
- Videos re-encoded. Task 38's HEVC videos were re-encoded to H.264, CRF 18,
-g 4, with frame counts verified identical, because random-frame decoding was the bottleneck. The re-encode is lossy but visually near-identical at 224px.
- Decoder seek backoff reduced from 5 s to 0.5 s (
behavior1k_decode.patch). This is safe only with the short-GOP videos above.
- Added a
tasks filter to DataConfig. A weight-loader fix was needed for orbax 0.11.13 (changes.patch).
Environment notes
- A fresh
uv sync today needed chex==0.1.89 (no longer pulled in by optax) and pyarrow==20.0.0 (newer versions require NumPy 2). Run training with uv run --no-sync so uv keeps them.
- On a container with a 125 GB RAM limit, saving the ~43 GB train state got the job killed for running out of memory. Setting
TORCHINDUCTOR_COMPILE_THREADS=1 (stops each data worker from spawning a compile pool) and num_workers=12 fixed it in most cases. The run was resumed from checkpoints 3 times after such crashes (from steps 2,500, 22,500 and 22,500); resuming restores the weights, optimizer state and step count, so the LR schedule continued as planned. Steps 22,500–25,000 were therefore trained on three times, and only the final attempt was kept.
Usage
Use with the winners' repo and config pi_behavior_b1k_fast (same architecture):
huggingface-cli download jermo1120/pi05-b1k-task38-spraying-for-bugs --local-dir ./ckpt
uv run scripts/serve_b1k.py policy:checkpoint --policy.config pi_behavior_b1k_fast --policy.dir ./ckpt
Then run the BEHAVIOR eval with task.name=spraying_for_bugs. The model's task embedding uses the 2025 numbering (task id 38). For the 2026 evaluator, override the incoming task id with 38.
Receding horizon control is done at inference time by the serving wrapper (B1KPolicyWrapper); training is unchanged. Defaults: execute 26 of the 30 predicted actions (--actions_to_execute 26), keep the next 4 to inpaint the start of the next chunk (actions_to_keep=4), and play the 26 actions back in 20 control steps (execute_in_n_steps=20).
Credits
Base model and training code: Ilia Larchenko, Gleb Zarin, Akash Karnatak (repo, checkpoints), built on Physical Intelligence's Pi0.5 / openpi. Benchmark: BEHAVIOR-1K, Stanford Vision and Learning Lab.