| --- |
| license: mit |
| base_model: openvla/openvla-7b |
| tags: |
| - robotics |
| - vision-language-action |
| - openvla |
| - openvla-oft |
| - recurrent-memory |
| - pomdp |
| - mikasa-robo |
| - maniskill |
| pipeline_tag: robotics |
| --- |
| |
| # mu-VLA (OpenVLA-OFT + recurrent memory), MIKASA-Robo, 64 memory tokens, TBPTT K=8 |
|
|
| mu-VLA extends [OpenVLA-OFT](https://github.com/moojink/openvla-oft) with a recurrent memory |
| module so that the policy can act in partially observable Markov decision processes (POMDPs), |
| where the information needed for the current action appeared earlier in the episode and is no |
| longer visible. Vanilla OpenVLA-OFT is a per-step policy and cannot solve such tasks. |
|
|
| Memory is implemented as a set of learnable memory tokens that are injected into the multimodal |
| prefix of the transformer sequence and carried across environment steps. Gradients flow through |
| a truncated backpropagation-through-time (TBPTT) window; the memory state is reset at episode |
| boundaries. |
|
|
| This checkpoint corresponds to experiment 4 in the mu-VLA experiment matrix: multitask training on |
| 5 MIKASA-Robo-VLA environments, 64 memory tokens, TBPTT window K=8. |
|
|
| Sibling checkpoints: |
|
|
| - [mu-vla-openvla-oft-mikasa-robo-5-tasks-m64-k2-tbptt](https://huggingface.co/mu-vla/mu-vla-openvla-oft-mikasa-robo-5-tasks-m64-k2-tbptt), same setup with K=2 |
| - [mu-vla-openvla-oft-libero-4-tasks-m64-k8-tbptt](https://huggingface.co/mu-vla/mu-vla-openvla-oft-libero-4-tasks-m64-k8-tbptt), same memory setup on LIBERO |
|
|
| ## Memory configuration |
|
|
| | Setting | Value | |
| |---|---| |
| | `num_mem_tokens` | 64 | |
| | `memory_update` | `tbptt` | |
| | `tbptt_length` | 8 | |
| | `attention_mask_mode` | `custom` | |
| | `ema_alpha` | 0.1 (unused when `memory_update=tbptt`) | |
|
|
| The same values are shipped in `memory_meta.json` so that the evaluation scripts in the code |
| repository pick them up automatically. |
|
|
| ## Training setup |
|
|
| Base model: `openvla/openvla-7b`, fine-tuned with the OpenVLA-OFT recipe (L1 regression action |
| head, proprioception projector, two input camera views, no FiLM, no diffusion). |
|
|
| | Setting | Value | |
| |---|---| |
| | Checkpoint step | 150000 | |
| | Dataset | `MIKASARoboVLAEpisodicDataset`, `mikasa_five` | |
| | Training environments | `ShellGamePush-VLA-v0`, `InterceptMedium-VLA-v0`, `RememberColor5-VLA-v0`, `TakeItBack-VLA-v0`, `RememberShapeAndColor3x3-VLA-v0` | |
| | GPUs | 8 x NVIDIA A100 80GB | |
| | Batch size | 4 per GPU | |
| | LoRA rank | 32 | |
| | Learning rate | 5e-4, cosine schedule, 2000 warmup steps, minimum ratio 0.1 | |
| | Image augmentation | on | |
| | Gradient checkpointing | on | |
|
|
| The episodic dataloader feeds `batch_size` independent streams, each replaying whole episodes in |
| order, and marks every step with `is_first` and `is_last` so that the memory state can be reset on |
| episode boundaries. Action normalisation statistics (`q01`/`q99`) are computed jointly over all five |
| environments and stored under the `mikasa_combined` key in `dataset_statistics.json`. |
|
|
| ## Evaluation |
|
|
| Protocol: each environment is evaluated independently, 100 episodes, starting seed `4242424242`, |
| metric `success_once`. Uncertainty is the standard error over 100 Bernoulli trials. |
|
|
| Inference uses receding horizon: instead of executing the whole open-loop chunk of 8 predicted |
| actions, the model is queried every step and only the first action is executed. This matters for |
| POMDP tasks where the visual cue is visible only briefly. The cost is 8 times more forward passes. |
|
|
| Only the first five rows below are training environments. Everything else is zero-shot transfer to |
| environments the model never saw during fine-tuning. |
|
|
| | Environment | mu-VLA K=8 | OpenVLA-OFT baseline | |
| |---|---|---| |
| | `ShellGamePush-VLA-v0` (train) | 0.93 ± 0.03 | 0.33 | |
| | `InterceptMedium-VLA-v0` (train) | 0.44 ± 0.05 | 0.53 | |
| | `RememberColor5-VLA-v0` (train) | 0.40 ± 0.05 | 0.23 | |
| | `TakeItBack-VLA-v0` (train) | 0.99 ± 0.01 | 0.98 | |
| | `RememberShapeAndColor3x3-VLA-v0` (train) | 0.09 ± 0.03 | 0.11 | |
| | `ShellGameTouch-VLA-v0` | 0.00 ± 0.00 | 0.00 | |
| | `ShellGamePick-VLA-v0` | 0.01 ± 0.01 | 0.01 | |
| | `InterceptSlow-VLA-v0` | 0.06 ± 0.02 | 0.06 | |
| | `InterceptFast-VLA-v0` | 0.19 ± 0.04 | 0.24 | |
| | `InterceptGrabSlow-VLA-v0` | 0.00 ± 0.00 | 0.00 | |
| | `InterceptGrabMedium-VLA-v0` | 0.00 ± 0.00 | 0.00 | |
| | `InterceptGrabFast-VLA-v0` | 0.00 ± 0.00 | 0.00 | |
| | `RotateLenientPos-VLA-v0` | 0.00 ± 0.00 | 0.08 | |
| | `RotateLenientPosNeg-VLA-v0` | 0.06 ± 0.02 | 0.07 | |
| | `RotateStrictPos-VLA-v0` | 0.04 ± 0.02 | 0.03 | |
| | `RotateStrictPosNeg-VLA-v0` | 0.06 ± 0.02 | 0.05 | |
| | `RememberColor3-VLA-v0` | 0.38 ± 0.05 | 0.25 | |
| | `RememberColor9-VLA-v0` | 0.09 ± 0.03 | 0.07 | |
| | `RememberShape3-VLA-v0` | 0.35 ± 0.05 | 0.17 | |
| | `RememberShape5-VLA-v0` | 0.20 ± 0.04 | 0.15 | |
| | `RememberShape9-VLA-v0` | 0.09 ± 0.03 | 0.11 | |
| | `RememberShapeAndColor3x2-VLA-v0` | 0.11 ± 0.03 | 0.12 | |
| | `RememberShapeAndColor5x3-VLA-v0` | 0.15 ± 0.04 | 0.08 | |
|
|
| Baseline column: OpenVLA-OFT without memory, trained on the same five environments with the same |
| episodic dataloader (experiment 2 in the matrix). It is not a perfectly matched control, since it |
| used the constant-then-decay learning rate schedule rather than cosine. |
|
|
| Note on the TBPTT window: the K=2 sibling checkpoint is substantially stronger on the memory-heavy |
| environments (for example 0.94 versus 0.40 on `RememberColor5-VLA-v0`). If you are looking for the |
| best MIKASA-Robo memory policy of the two, start there. This checkpoint is published as the K=8 |
| point of the ablation. |
|
|
| ## Files |
|
|
| Loading this checkpoint requires more than the base transformer weights. The extra heads are stored |
| as separate PyTorch state dicts, matching the layout the training and evaluation scripts expect. |
|
|
| | File | Purpose | |
| |---|---| |
| | `model-0000*-of-00004.safetensors`, `model.safetensors.index.json` | merged vision-language backbone | |
| | `lora_adapter/` | LoRA adapter as saved by PEFT, before merging | |
| | `action_head--150000_checkpoint.pt` | L1 regression action head | |
| | `proprio_projector--150000_checkpoint.pt` | proprioception projector | |
| | `memory_module--150000_checkpoint.pt` | memory module, including `initial_memory` | |
| | `memory_meta.json` | memory hyperparameters for evaluation auto-detection | |
| | `dataset_statistics.json` | action normalisation statistics, key `mikasa_combined` | |
| | `optimizer--150000_checkpoint.pt`, `scheduler--150000_checkpoint.pt` | optimizer and scheduler state, for resuming training | |
| | `configuration_prismatic.py`, `modeling_prismatic.py`, `processing_prismatic.py` | custom model code, memory token injection and the custom attention mask live here | |
|
|
| ## Usage |
|
|
| The checkpoint is not loadable with upstream `transformers`. It needs the mu-VLA code, which |
| depends on a forked `transformers` that supports the custom attention mask, and on |
| [MIKASA-Robo](https://github.com/CognitiveAISystems/MIKASA-Robo) for the environments. |
|
|
| ```bash |
| huggingface-cli download mu-vla/mu-vla-openvla-oft-mikasa-robo-5-tasks-m64-k8-tbptt \ |
| --local-dir ./mu-vla-mikasa-m64-k8 |
| ``` |
|
|
| Then point the evaluation script at the downloaded directory; memory hyperparameters are read from |
| `memory_meta.json`. See the code repository, `CognitiveAISystems/mu-vla`, for setup and the exact |
| command line. |
|
|
| ## Attribution |
|
|
| mu-VLA is a fork of OpenVLA-OFT by Moo Jin Kim, Chelsea Finn and Percy Liang |
| ([arXiv:2502.19645](https://arxiv.org/abs/2502.19645)), which in turn builds on OpenVLA. The |
| recurrent memory module, the episodic dataloaders and the MIKASA-Robo integration are the |
| contribution of this work. Released under the MIT license, following upstream. |
|
|