| --- |
| license: apache-2.0 |
| base_model: |
| - lerobot/pi0_base |
| - lerobot/pi05_base |
| tags: |
| - robotics |
| - vision-language-action |
| - vla |
| - pi0 |
| - pi05 |
| - vlash |
| - rlx |
| - gguf |
| pipeline_tag: robotics |
| --- |
| |
| # rlx-vlash weights (Οβ / Οβ.β
) |
|
|
| RLX-native repackaging of the [VLASH](https://github.com/mit-han-lab/vlash) |
| **Οβ** and **Οβ.β
** Vision-Language-Action robot policies, ready to load with the |
| [`rlx-vlash`](https://crates.io/crates/rlx-vlash) crate. The tensors are the |
| published `lerobot/pi0_base` / `lerobot/pi05_base` checkpoints, remapped to |
| rlx-vlash's canonical key names and re-encoded into GGUF / RLX-package formats |
| (no fine-tuning β same weights, different container + naming). |
|
|
| Both policies pair a **PaliGemma** backbone (SigLIP-So400m/14 @224 vision tower + |
| Gemma-2B text) with a **Gemma-300M action expert** running through 18 *joint* |
| transformer layers that share one attention, and generate action chunks by |
| **flow matching** (a 10-step Euler integration of a learned velocity field). |
|
|
| - **Οβ** β state is a suffix token, time is fused into the action embeddings, |
| standard Gemma RMSNorm. |
| - **Οβ.β
** β action-only suffix; time drives **adaptive RMSNorm** in the action |
| expert (`state_cond=false` for the base checkpoint). |
|
|
| ## Contents |
|
|
| Each variant ships in four precisions, in both GGUF and RLX-package containers: |
|
|
| ``` |
| pi0/ model.gguf model-q8_0.gguf model-q4_k.gguf model-f32.gguf |
| model.rlxp model-q8_0.rlxp model-q4_k.rlxp model-f32.rlxp config.json |
| pi05/ (same) |
| ``` |
|
|
| | file | format | precision | approx size | |
| |---|---|---|---| |
| | `model.gguf` / `model.rlxp` | GGUF / RLX pkg | **f16** (primary) | β 6.4 GB | |
| | `model-q8_0.gguf` / `model-q8_0.rlxp` | GGUF / RLX pkg | q8_0 (8-bit) | β 3.4 GB | |
| | `model-q4_k.gguf` / `model-q4_k.rlxp` | GGUF / RLX pkg | q4_K (4-bit) | β 1.9 GB | |
| | `model-f32.gguf` / `model-f32.rlxp` | GGUF / RLX pkg | f32 (lossless) | β 13 GB | |
|
|
| Pick whichever fits: **f16** is the recommended default (reproduces the action |
| trajectory exactly), **q8_0** / **q4_K** trade precision for size (norms/biases |
| stay f16 in the quantized variants), **f32** is bit-exact to source. |
|
|
| **Quantization quality (important).** Measured vs the original VLASH |
| implementation on `pi05_base`: per-step model outputs stay near-perfect at every |
| precision (image features & single-step velocity cosine β₯ 0.999 even at q4_K β |
| the quant/dequant is exact), but the **10-step flow-matching rollout amplifies** |
| small weight errors into the final action chunk: |
| |
| | precision | image features | 1-step velocity | **50-action chunk** | |
| |---|---|---|---| |
| | f16 | 1.0000 | 1.0000 | **1.0000** | |
| | q8_0 | 0.99998 | 0.99999 | **0.973** | |
| | q4_K | 0.9976 | 0.99946 | **0.807** | |
| |
| (cosine vs reference.) This is the known sensitivity of iterative flow/diffusion |
| samplers, not a quantization bug. **For faithful robot control use `f16`**; treat |
| `q8_0` / `q4_K` as size-first options where some action drift is acceptable. |
| |
| GGUF stores dims in the standard |
| GGML (llama.cpp) order and loads through rlx-vlash or any GGUF-aware runtime; the |
| `.rlxp` is the RLX flat-mmap package. All keep rlx-vlash's canonical key names, so |
| no remap happens at load. |
| |
| ## Usage (rlx-vlash) |
| |
| Put one variant's files in a directory (the runner prefers `model.gguf`), then: |
| |
| ```rust |
| use rlx_vlash::{VlashRunner, VlashVariant}; |
| use rlx_runtime::Device; |
| |
| let mut runner = VlashRunner::builder(VlashVariant::Pi05) |
| .device(Device::Cpu) |
| .num_images(1) |
| .prompt_tokens(200) |
| .model_dir("path/to/pi05") // dir containing model.gguf (+ tokenizer.json) |
| .build()?; |
| |
| let actions = runner.predict_action_chunk(&[image_nchw], &state, "pick up the cube", None)?; |
| ``` |
| |
| The language **tokenizer is not included** (PaliGemma's is gated): fetch |
| `google/paligemma-3b-pt-224`'s `tokenizer.json` and place it alongside the |
| weights, or supply token ids directly. |
| |
| ## Parity |
| |
| rlx-vlash reproduces the original VLASH implementation on these checkpoints at |
| **cosine = 1.000000** across every stage β SigLIP vision features, the |
| image+text prefix, a single flow-matching denoise step (joint attention + adaRMS |
| / state-token path), and the full 10-step action chunk β for **both** Οβ and |
| Οβ.β
(max |Ξ| β€ 1.1e-3, attributable to MPS-f32 reference vs CPU-f32 rlx). |
| |
| ## License & attribution |
| |
| Apache-2.0, inherited from the upstream [VLASH](https://github.com/mit-han-lab/vlash) |
| project and the `lerobot/pi0_base` / `lerobot/pi05_base` base checkpoints. These |
| files are a format/naming repackaging of those weights; please cite VLASH and |
| LeRobot. The `rlx-vlash` inference crate itself is GPL-3.0-only. |
| |