π0.5 (LIBERO) for the RDK S100P BPU
openpi's
π0.5
vision-language-action policy, compiled for the D-Robotics
RDK S100P BPU and
packaged for
BLLM. Two camera frames and an
English instruction go in; a chunk of end-effector deltas comes out.
Everything runs on the board. No host, no GPU, no offload.
Results
Scored through openpi's own LIBERO evaluation harness:
| suite | this package | reference (openpi on GPU) |
|---|
| libero_spatial | 99 / 100 | 99 / 100 |
| libero_goal | 97 / 100 | — |
| libero_object | 95 / 100 | — |
The libero_spatial row is this package served straight to the harness, with
none of openpi's host-side transforms in the loop — the same code path you get.
On the board
| |
|---|
| action chunk | 1016 ms (mean of 10, board-timed) |
| ↳ SigLIP So400m, 2 cameras | 169 ms |
| ↳ PaliGemma prefill, 544 tokens | 602 ms |
| ↳ action expert, 10 denoising steps | 235 ms |
| output | 10 × 7 end-effector deltas, already unnormalised |
| control rate | ~1 Hz inference → ~5 Hz actions at replan-every-5 |
| graphs resident | 4.57 GB |
| process RSS | 16 MB — weights live in BPU/ION, not your address space |
| CPU while inferring | ~1.3 of 6 cores — the arithmetic is on the BPU |
The last two matter for robots: a policy that pinned six CPU cores would leave
nothing to drive the arm with. Here the cores stay free for perception and
control.
Use
1pip install bllm # or conda install -c <your channel> bllm; needs an RDK S100P
2huggingface-cli download ruisv/bllm-pi05-libero-224-s100p --local-dir pi05-libero-224-s100p
1import bllm
2
3policy = bllm.load_policy("pi05-libero-224-s100p")
4
5actions = policy.act(scene_rgb, # uint8[h, w, 3], any resolution
6 wrist_rgb, # uint8[h, w, 3]
7 "pick up the black bowl and place it on the plate")
8# float32[10, 7] — feed the rows to the arm one at a time
π0.5 is a flow model integrated from a Gaussian latent, so two calls on the same
observation legitimately differ. Pass noise= (float32[10, 32]) when you need
two runs to be comparable.
What is in here
| file | |
|---|
visual.hbm | SigLIP So400m vision tower |
model.hbm | PaliGemma prefill |
expert.hbm | action expert (flow matching) |
embed_tokens.bin | tied embedding table, fp16, mmapped |
tokenizer.json | PaliGemma tokenizer |
cond_table.f32 | flow-matching conditioning per denoising step |
model.json | manifest — shapes, action quantiles, scaling flags |
Quantisation
| graph | weights | activations |
|---|
| SigLIP tower | int8 per-output-channel | int16 static per-tensor |
| PaliGemma prefill | int8 per-output-channel | int16 static per-tensor |
| action expert | int8, int16 for action_out_proj + final adaRMSNorm | int16 static per-tensor |
The action head is 16-bit because the gripper command is bimodal (≈ ±1) and
action_out_proj alone decides it: int8 is fine away from the decision boundary
and fatal at the crossing.
Replaying this exact scheme inside openpi's own model costs 0.05 % of action
magnitude across all three graphs, so the quantisation is not where the port's
error budget goes.
Limits
- One configuration.
pi05_libero only — the one official π0.5 config with
discrete_state_input=False. pi05_droid / pi05_aloha discretise 32 state
values into the prompt (145 tokens against this graph's 32 slots), use 3
cameras rather than 2, and use action_horizon 15/50 rather than 10. Those are
compile-time shapes and need their own build.
- Instructions must fit 32 tokens. All four LIBERO suites run 6–21. A longer
one is a hard error, never a silent truncation.
- No proprioception, matching openpi:
pi05_libero sets
discrete_state_input=False and embed_suffix applies state_proj only when
!pi05, so the reference never reads the state vector either.
- Board only. These are
.hbm graphs for the RDK S100P BPU (nash-m). They do
not run on x86, CUDA, or other RDK boards without recompilation.
Provenance and licensing
These are derived weights: openpi's π0.5 pi05_libero checkpoint, quantised
and compiled to BPU graphs, plus Google's PaliGemma tokenizer as shipped by
openpi. The BLLM packaging and the conversion are ours; the model is not.
- π0.5 / openpi — Physical Intelligence,
code Apache-2.0
- PaliGemma tokenizer — Google, subject to the
Gemma Terms of Use
If you intend to use this commercially, check the upstream terms yourself rather
than relying on the license tag above.