Ο0.7-style low-level policy on BEHAVIOR-1K (Ο0.5 base, 200k steps)
Action expert of lerobot/pi05_base, fine-tuned for 200,000 steps on the BEHAVIOR-1K 2026 challenge demos
(R1Pro robot, 18 tasks) with a Ο0.7-style prompt (Task / Subtask / Speed / Quality / Mistake / Control Mode).
This is the low-level (LL) policy of a Ο0.7 reproduction. The high-level policy and the subgoal world model are
not in this repository.
The PaliGemma VLM was frozen during training and is not included. Use the PaliGemma weights from
lerobot/pi05_base unchanged and replace the action expert with the tensors in this repository.
Run id: pi07ll-pi05base-200k, checkpoint step-200000.
Files
| File | Content |
|---|---|
model.safetensors |
208 tensors, 430,098,464 parameters, float32 (1.72 GB). Gemma 300M action expert + action_in_proj, action_out_proj, time_mlp_in, time_mlp_out |
stats.json |
q01 / q99 / mean / std / min / max for the 25-dim state and 23-dim action (train split) |
config.json |
Input/output layout, prompt template, per-task instructions and runtime speed values, training settings |
NOTICE, GEMMA_TERMS.md, GEMMA_PROHIBITED_USE_POLICY.md |
Gemma license material (see License) |
Loading
Tensor names are the same as in lerobot/pi05_base/model.safetensors (parameter names of lerobot's PI05Pytorch).
All 208 names and shapes were checked against lerobot 0.5.2.
paligemma_with_expert.gemma_expert.lm_head.weight is not included; the expert does not produce tokens.
from huggingface_hub import hf_hub_download
from safetensors.torch import load_file
expert = load_file(hf_hub_download("hanbin5/pi07-ll-b1k-200k", "model.safetensors"))
# policy = lerobot PI05Policy loaded from lerobot/pi05_base (chunk_size=50, num_inference_steps=5)
missing, unexpected = policy.model.load_state_dict(expert, strict=False)
assert not unexpected # `missing` = PaliGemma tensors, kept from pi05_base
The lerobot pre/post-processors of pi05_base do not build the prompt and normalization this model was
trained with. Build the inputs as described below. The training and serving code is in
inner-king/policy, branch hanbin5/pi07
(models.py LLPolicy, dataset.py pi07_prompt, serve_pi07.py). It expects the local data index, so it does
not run as-is outside the original setup.
In the original setup PaliGemma is cast to bfloat16, the expert and projections stay float32, and the forward pass
runs under torch.autocast(bfloat16).
Inputs
Images β three views in this order: head (observation.rgb.zed_link_camera_0), left_wrist
(observation.rgb.left_realsense_link_camera_0), right_wrist (observation.rgb.right_realsense_link_camera_0).
RGB resized to 224Γ224 with area interpolation, scaled to [-1, 1].
State β 25 dims taken from the 61-dim R1Pro observation.state:
Slice of observation.state |
Dims | Content |
|---|---|---|
| 0:3 | 3 | base velocity |
| 53:57 | 4 | torso joints |
| 3:10 | 7 | left arm joints |
| 24:26 | 2 | left gripper |
| 28:35 | 7 | right arm joints |
| 49:51 | 2 | right gripper |
Normalize with stats.json["state"]: x_n = clip((x - q01) / (q99 - q01) * 2 - 1, -1.5, 1.5).
The state enters the model as text, Ο0.5 style: clip x_n to [-1, 1], np.digitize(x_n, np.linspace(-1, 1, 257)[:-1]) - 1,
join the 25 integers with spaces.
Prompt β tokenized with the PaliGemma tokenizer (google/paligemma-3b-pt-224, adds <bos>), max 256 tokens:
Task: {instruction}. Subtask: {subtask}. Speed: {speed}. Quality: 5. Mistake: false. Control Mode: joint. State: {25 ints};
Action:
instruction: task sentence, listed per task inconfig.jsonβprompt.instructions(trailing period removed, then added back).subtask: skill sentence such asmove to the top cabinet,pick up the plate from the fridge,open the fridge. Training dropped it with probability 0.1 (0.3 on samples with subgoal images); omit the wholeSubtask: β¦.part if not available.speed: at runtime the 15th percentile of training episode lengths for the task, rounded to 500 steps (config.jsonβprompt.runtime_speed). In training it was the episode's own length rounded to 500.Quality: 5andMistake: falseare constants; B1K has no quality or mistake labels.
Subgoal images (optional) β three more views appended after the text as a block-causal block: subgoal tokens attend to everything before them, observation and text tokens do not attend to them. Without subgoal images the prefix has the same layout as Ο0.5. 25% of training samples had subgoal images, taken from the same demo (the segment end frame with probability 0.25, otherwise a frame 0β4 s ahead). The results below use no subgoal images.
Output
Flow matching over a 50 Γ 32 chunk; the first 23 dims are used. Sampling: x ~ N(0, I) at t = 1, 5 Euler steps to
t = 0 (x β x β v(x, t) / 5). Unnormalize with stats.json["action"]: a = (x + 1) / 2 * (q99 β q01) + q01.
| Action dims | Content |
|---|---|
| 0:3 | base |
| 3:7 | torso |
| 7:14 | left arm (absolute joint positions) |
| 14 | left gripper |
| 15:22 | right arm (absolute joint positions) |
| 22 | right gripper |
At 30 Hz; the evaluations below executed the first 25 actions of each chunk, then sampled a new chunk.
Training
| Item | Value |
|---|---|
| Data | behavior-1k/2026-challenge-demos, 18 tasks (17 cooking tasks + clean_a_keyboard), 200 episodes each; split 3,420 train / 180 val episodes; 35,957,659 train frames |
| Subtask labels | B1K skill segment annotations converted to English sentences |
| Trained parameters | action expert + projections, 430.1M, float32. PaliGemma (SigLIP + Gemma 2B) frozen |
| Steps | 200,000 |
| Batch | effective 32 = 2 GPUs Γ 16 (12 without + 4 with subgoal images) |
| Optimizer | AdamW (Ξ² 0.9 / 0.95, weight decay 0.01), grad clip 1.0 |
| Learning rate | 2.5e-5 β 2.5e-6 cosine, 1,000 warmup steps |
| Prompt dropout | subtask 0.1 / 0.3 (without / with subgoal), metadata block 0.15, each metadata item 0.05 |
| Hardware | RTX 3090 Ti + RTX 3090 (24 GB each), data parallel, 1.74β1.95 s/step, 111.3 h |
Results
Validation, open loop (step 200,000; 96 samples without subgoal images and 32 with, from the 180 val episodes; fixed initial noise; L1 over the 50-step chunk in normalized action units):
| Model | Repeat-last-action baseline | |
|---|---|---|
| without subgoal (n=96) | 0.0445 | 0.0421 |
| with subgoal (n=32) | 0.0405 | 0.0347 |
| right arm, without subgoal | 0.0421 | 0.0356 |
The model does not beat the baseline that repeats the current action for all 50 steps.
Skill execution in simulation (OmniGibson, BEHAVIOR-1K). 15 validation episodes (5 cooking tasks Γ 3). For each skill segment the scene is restored by replaying the demo up to the segment start; the policy then runs for 9,000 steps (5 min) with the ground-truth subtask sentence, no high-level policy, no subgoal images. Counted only skills whose success is a single simulator state check; success = the check holds on two consecutive checks 15 steps apart. Segments where the demo itself failed the check or the check already held at the start are excluded.
| Skill | Success / valid |
|---|---|
| turn on | 9 / 11 |
| turn off | 0 / 3 |
| open | 4 / 22 |
| close | 13 / 24 |
| pick up | 17 / 48 |
| Total | 43 / 108 (40%) |
Full-task closed-loop success was not measured for this checkpoint.
Limitations
- Open-loop error stays above the repeat-last-action baseline after 200k steps. With the VLM frozen and only the expert trained, the error curve was flat between 140k (0.0456) and 200k (0.0445).
- Grasping is the weakest skill (17/48); opening articulated objects succeeds in 4/22.
- Trained and evaluated only in simulation on the R1Pro embodiment.
- Research use. The training demos are rendered with BEHAVIOR-1K assets, some of which come from sources with non-commercial or no-ML-training terms.
License
This model is a Model Derivative of Gemma (PaliGemma, via lerobot/pi05_base) and is distributed under the
Gemma Terms of Use. A copy is in GEMMA_TERMS.md, and the required notice is in
NOTICE.
- Modification notice: the action expert tensors in
model.safetensorswere modified fromlerobot/pi05_baseby fine-tuning on BEHAVIOR-1K demos as described above. - Use restrictions: use of this model is subject to the use restrictions in Section 3.2 of the Gemma Terms of
Use, including the Gemma Prohibited Use Policy
(copy in
GEMMA_PROHIBITED_USE_POLICY.md). Anyone you redistribute this model to is bound by the same restrictions.
Training data: behavior-1k/2026-challenge-demos (MIT).
- Downloads last month
- 25