MINERVA is a compact, task-ID-conditioned manipulation policy for the standard LIBERO benchmark. The released 0.54M-parameter model uses a scratch CNN and an L1 action-chunk head: no language encoder, pretrained vision backbone, VLM, or iterative generative sampler is used at inference.
[!IMPORTANT] MINERVA studies how little capacity the closed-set, 40-task LIBERO benchmark requires. It is not a general-purpose vision-language-action model and cannot execute unseen instructions.
| Policy | Parameters | Spatial | Object | Goal | Long | Average |
|---|---|---|---|---|---|---|
| MINERVA-0.5M (L1) | 0.54M | 96.8 | 99.6 | 97.4 | 89.2 | 95.75 |
| MINERVA-0.5M (flow) | 0.54M | 94.4 | 99.6 | 96.4 | 89.8 | 95.05 |
| MINERVA-1M (flow) | 0.99M | 97.0 | 99.8 | 97.4 | 92.8 | 96.75 |
| MINERVA-5M (flow) | 4.89M | 99.0 | 99.2 | 98.0 | 92.4 | 97.15 |
| MINERVA-10M (flow) | 9.66M | 98.4 | 99.0 | 98.4 | 94.0 | 97.45 |
MINERVA rows use the same evaluation protocol: four suites, 10 tasks per suite, 50 episodes per
task (2,000 rollouts per checkpoint), hard resets, evaluation seed 1000, temporal ensembling,
and mujoco==3.3.2. The headline 95.75 result is from one training seed. Training-seed studies in
exp_small_libero/EXPERIMENTS.md show that otherwise identical
runs can move the four-suite average by about one percentage point.
| Policy | Parameters | Episodes per task | Total rollouts | Average | Source |
|---|---|---|---|---|---|
| Pi0.5 (LeRobot reproduction) | 4.14B | 10 | 400 | 97.5 | LeRobot LIBERO documentation |
Pi0.5 is included only as context. Its result was produced with fewer evaluation episodes and is not a protocol-matched statistical comparison with the MINERVA rows above.
| Policy | Parameters | GPU ms/chunk | CPU ms/chunk | Peak VRAM |
|---|---|---|---|---|
| MINERVA-0.5M (L1) | 0.54M | 2.2 | 5.1 | 0.03 GB |
| MINERVA-0.5M (flow) | 0.54M | 8.2 | 8.9 | 0.03 GB |
| MINERVA-1M (flow) | 0.99M | 8.5 | 10.0 | 0.03 GB |
| MINERVA-10M (flow) | 9.66M | 11.1 | 17.8 | 0.08 GB |
| SmolVLA | 450M | 118 | 1,010 | 0.97 GB |
| Pi0.5 | 4.14B | 196 | 12,781 | 9.36 GB |
These are batch-1 measurements on one RTX 5080 Laptop system with eight CPU threads. They measure
one full action-chunk generation, not end-to-end simulator or robot latency. The L1 checkpoint needs
one policy forward pass per chunk; the flow checkpoints use 10 Euler steps. See
benchmark_speed.py and the stored
GPU and CPU
results.
libero extra is Linux-only)>=3.12,<3.14uvClone the public repository over HTTPS and install the locked LIBERO environment:
git clone --depth 1 https://github.com/k1000dai/MINERVA.git
cd MINERVA
uv python install 3.13
uv sync -p 3.13 --locked --extra libero
# if CMake 4.x
#CMAKE_POLICY_VERSION_MINIMUM=3.5 uv sync -p 3.13 --locked --extra libero
# The lock file constrains the renderer used for the published result.
uv run python -c \
'import mujoco; assert mujoco.__version__ == "3.3.2", mujoco.__version__'
export MUJOCO_GL=egl
Download the public checkpoint from
k1000dai/MINERVA. Authentication is not required for
public artifacts.
uv run hf download k1000dai/MINERVA \
--revision 1b4fb1743f00a7d8eb87c7059c446447907d12bf \
--include "t05_l1_0.54M/*" --local-dir ckpt
Run a short smoke test on two LIBERO-Long tasks:
uv run lerobot-eval \
--policy.path=ckpt/t05_l1_0.54M \
--env.type=libero --env.task=libero_10 --env.task_ids='[0,1]' \
--policy.temporal_ensemble_coeff=0.01 --policy.n_action_steps=1 \
--eval.batch_size=5 --eval.n_episodes=5 --env.max_parallel_tasks=1 \
--output_dir=eval_smoke
Run the published 2,000-rollout evaluation:
uv run lerobot-eval \
--policy.path=ckpt/t05_l1_0.54M \
--env.type=libero \
--env.task=libero_spatial,libero_object,libero_goal,libero_10 \
--policy.temporal_ensemble_coeff=0.01 --policy.n_action_steps=1 \
--eval.batch_size=5 --eval.n_episodes=50 --env.max_parallel_tasks=1 \
--seed=1000 --output_dir=eval_full
uv run python exp_small_libero/summarize_eval.py \
eval_full/eval_info.json
One full evaluation takes roughly 55 minutes on the machine used for this study and should not be
run concurrently on a 32 GB host. For flow-head checkpoints, additionally pass
--policy.noise_temperature=0.85.
two RGB views ─┐
├─ shared depthwise-separable scratch CNN + SpatialSoftmax ─┐
task ID ───────┘ │
proprioception ── MLP ───────────────────────────────────────────────────────┤
▼
16-step AdaLN-Zero MLP-Mixer action head
The task instruction is mapped to one of 40 learned task embeddings. The headline model directly regresses the action chunk with an L1 objective. Flow variants use the same compact action head as a velocity field and integrate it for 10 Euler steps. Both use ACT-style temporal ensembling during the reported evaluation.
Install both the simulation and training extras, then download the released 2.75M teacher used by the headline model:
uv sync --python 3.13 --locked --extra libero --extra training
uv run hf download k1000dai/MINERVA \
--revision 1b4fb1743f00a7d8eb87c7059c446447907d12bf \
--include "t3C_2.75M/*" --local-dir ckpt
The exact 0.54M L1 recipe includes velocity distillation from that teacher:
uv run lerobot-train \
--policy.type=tinyflow --policy.push_to_hub=false \
--dataset.repo_id=lerobot/libero \
--dataset.revision=a1aaacb7f6cd6ee5fb43120f673cebb0cfea7dd4 \
--dataset.video_backend=torchcodec \
--output_dir=outputs/minerva_05m --job_name=minerva_05m \
--policy.n_obs_steps=2 --policy.share_adaln=true --policy.mlp_ratio=2 \
--policy.head_type=mixer --policy.cnn_depthwise=true \
--policy.cnn_blocks_per_stage=2 \
--policy.hidden_dim=96 --policy.cond_dim=96 \
--policy.num_heads=4 --policy.num_layers=4 \
--policy.cnn_widths='[32,64,112,160]' --policy.num_keypoints=48 \
--policy.vision_feature_dim=96 --policy.task_embed_dim=32 \
--policy.state_feature_dim=32 --policy.timestep_embed_dim=48 \
--policy.distill_teacher_path=ckpt/t3C_2.75M \
--policy.distill_weight=1.0 \
--policy.upweight_task_indices='[0,1,2,3,4,5,6,7,8,9]' \
--policy.upweight_factor=3.0 --policy.progress_aux_weight=0.05 \
--policy.objective=l1 --seed=1000 \
--steps=100000 --batch_size=128 --num_workers=16 \
--log_freq=2000 --save_freq=25000 --wandb.enable=false
The command pins the public dataset revision used for archival reproduction. Omitting distillation
trains a valid ablation, but it is not the published headline recipe. The executable experiment script is
train_t05_l1.sh; other model recipes are in
ablation_queue.sh.
At the 1M scale, three-seed studies found:
95.97 ± 0.80 versus 95.63 ± 1.08), while L1 required fewer forward passes.Detailed protocols, negative results, LIBERO-plus tests, LIBERO-90 tests, and aggregate tables
are documented in EXPERIMENTS.md.
The lerobot/libero videos and the current simulator do not render every scene identically across
MuJoCo releases. For the standard four-suite result above, use MuJoCo 3.3.2. In this study, the
scratch-CNN policy's LIBERO-Object score changed from 96%+ on 3.3.2 to 0% on 3.3.5 and newer because
of a lighting change. This sensitivity may not transfer to policies with pretrained visual
backbones.
LIBERO-90 is a separate case: its older demonstrations require MuJoCo 3.2.7 for the evaluation
reported in EXPERIMENTS.md. Do not use the LIBERO-90 setting for the standard four-suite commands
above.
| Path | Contents |
|---|---|
src/lerobot/policies/tinyflow/ | MINERVA policy and processor |
exp_small_libero/EXPERIMENTS.md | Experiment log, protocols, and caveats |
exp_small_libero/results_*.tsv | Aggregate result tables |
exp_small_libero/*.sh | Training and evaluation recipes |
ARTIFACTS.md | Pinned inputs and checkpoints |
MINERVA is built on the following projects:
The source code is released under the Apache License 2.0. See NOTICE and
THIRD_PARTY_NOTICES.md for attribution. Checkpoint terms are stated on
the Hugging Face model card; datasets retain their own
licenses and terms. This repository is a research fork of
Hugging Face LeRobot, not an official LeRobot release.
Upstream copyright and license notices are retained.
MINERVA builds on ideas from MobileNet-style depthwise-separable convolutions, SpatialSoftmax, MLP-Mixer, AdaLN-Zero, ACT temporal ensembling, and flow-matching robot policies.
MINERVA is a compact, task-ID-conditioned manipulation policy for the standard LIBERO benchmark. The released 0.54M-parameter model uses a scratch CNN and an L1 action-chunk head: no language encoder, pretrained vision backbone, VLM, or iterative generative sampler is used at inference.
[!IMPORTANT] MINERVA studies how little capacity the closed-set, 40-task LIBERO benchmark requires. It is not a general-purpose vision-language-action model and cannot execute unseen instructions.
| Policy | Parameters | Spatial | Object | Goal | Long | Average |
|---|---|---|---|---|---|---|
| MINERVA-0.5M (L1) | 0.54M | 96.8 | 99.6 | 97.4 | 89.2 | 95.75 |
| MINERVA-0.5M (flow) | 0.54M | 94.4 | 99.6 | 96.4 | 89.8 | 95.05 |
| MINERVA-1M (flow) | 0.99M | 97.0 | 99.8 | 97.4 | 92.8 | 96.75 |
| MINERVA-5M (flow) | 4.89M | 99.0 | 99.2 | 98.0 | 92.4 | 97.15 |
| MINERVA-10M (flow) | 9.66M | 98.4 | 99.0 | 98.4 | 94.0 | 97.45 |
MINERVA rows use the same evaluation protocol: four suites, 10 tasks per suite, 50 episodes per
task (2,000 rollouts per checkpoint), hard resets, evaluation seed 1000, temporal ensembling,
and mujoco==3.3.2. The headline 95.75 result is from one training seed. Training-seed studies in
exp_small_libero/EXPERIMENTS.md show that otherwise identical
runs can move the four-suite average by about one percentage point.
| Policy | Parameters | Episodes per task | Total rollouts | Average | Source |
|---|---|---|---|---|---|
| Pi0.5 (LeRobot reproduction) | 4.14B | 10 | 400 | 97.5 | LeRobot LIBERO documentation |
Pi0.5 is included only as context. Its result was produced with fewer evaluation episodes and is not a protocol-matched statistical comparison with the MINERVA rows above.
| Policy | Parameters | GPU ms/chunk | CPU ms/chunk | Peak VRAM |
|---|---|---|---|---|
| MINERVA-0.5M (L1) | 0.54M | 2.2 | 5.1 | 0.03 GB |
| MINERVA-0.5M (flow) | 0.54M | 8.2 | 8.9 | 0.03 GB |
| MINERVA-1M (flow) | 0.99M | 8.5 | 10.0 | 0.03 GB |
| MINERVA-10M (flow) | 9.66M | 11.1 | 17.8 | 0.08 GB |
| SmolVLA | 450M | 118 | 1,010 | 0.97 GB |
| Pi0.5 | 4.14B | 196 | 12,781 | 9.36 GB |
These are batch-1 measurements on one RTX 5080 Laptop system with eight CPU threads. They measure
one full action-chunk generation, not end-to-end simulator or robot latency. The L1 checkpoint needs
one policy forward pass per chunk; the flow checkpoints use 10 Euler steps. See
benchmark_speed.py and the stored
GPU and CPU
results.
libero extra is Linux-only)>=3.12,<3.14uvClone the public repository over HTTPS and install the locked LIBERO environment:
git clone --depth 1 https://github.com/k1000dai/MINERVA.git
cd MINERVA
uv python install 3.13
uv sync -p 3.13 --locked --extra libero
# if CMake 4.x
#CMAKE_POLICY_VERSION_MINIMUM=3.5 uv sync -p 3.13 --locked --extra libero
# The lock file constrains the renderer used for the published result.
uv run python -c \
'import mujoco; assert mujoco.__version__ == "3.3.2", mujoco.__version__'
export MUJOCO_GL=egl
Download the public checkpoint from
k1000dai/MINERVA. Authentication is not required for
public artifacts.
uv run hf download k1000dai/MINERVA \
--revision 1b4fb1743f00a7d8eb87c7059c446447907d12bf \
--include "t05_l1_0.54M/*" --local-dir ckpt
Run a short smoke test on two LIBERO-Long tasks:
uv run lerobot-eval \
--policy.path=ckpt/t05_l1_0.54M \
--env.type=libero --env.task=libero_10 --env.task_ids='[0,1]' \
--policy.temporal_ensemble_coeff=0.01 --policy.n_action_steps=1 \
--eval.batch_size=5 --eval.n_episodes=5 --env.max_parallel_tasks=1 \
--output_dir=eval_smoke
Run the published 2,000-rollout evaluation:
uv run lerobot-eval \
--policy.path=ckpt/t05_l1_0.54M \
--env.type=libero \
--env.task=libero_spatial,libero_object,libero_goal,libero_10 \
--policy.temporal_ensemble_coeff=0.01 --policy.n_action_steps=1 \
--eval.batch_size=5 --eval.n_episodes=50 --env.max_parallel_tasks=1 \
--seed=1000 --output_dir=eval_full
uv run python exp_small_libero/summarize_eval.py \
eval_full/eval_info.json
One full evaluation takes roughly 55 minutes on the machine used for this study and should not be
run concurrently on a 32 GB host. For flow-head checkpoints, additionally pass
--policy.noise_temperature=0.85.
two RGB views ─┐
├─ shared depthwise-separable scratch CNN + SpatialSoftmax ─┐
task ID ───────┘ │
proprioception ── MLP ───────────────────────────────────────────────────────┤
▼
16-step AdaLN-Zero MLP-Mixer action head
The task instruction is mapped to one of 40 learned task embeddings. The headline model directly regresses the action chunk with an L1 objective. Flow variants use the same compact action head as a velocity field and integrate it for 10 Euler steps. Both use ACT-style temporal ensembling during the reported evaluation.
Install both the simulation and training extras, then download the released 2.75M teacher used by the headline model:
uv sync --python 3.13 --locked --extra libero --extra training
uv run hf download k1000dai/MINERVA \
--revision 1b4fb1743f00a7d8eb87c7059c446447907d12bf \
--include "t3C_2.75M/*" --local-dir ckpt
The exact 0.54M L1 recipe includes velocity distillation from that teacher:
uv run lerobot-train \
--policy.type=tinyflow --policy.push_to_hub=false \
--dataset.repo_id=lerobot/libero \
--dataset.revision=a1aaacb7f6cd6ee5fb43120f673cebb0cfea7dd4 \
--dataset.video_backend=torchcodec \
--output_dir=outputs/minerva_05m --job_name=minerva_05m \
--policy.n_obs_steps=2 --policy.share_adaln=true --policy.mlp_ratio=2 \
--policy.head_type=mixer --policy.cnn_depthwise=true \
--policy.cnn_blocks_per_stage=2 \
--policy.hidden_dim=96 --policy.cond_dim=96 \
--policy.num_heads=4 --policy.num_layers=4 \
--policy.cnn_widths='[32,64,112,160]' --policy.num_keypoints=48 \
--policy.vision_feature_dim=96 --policy.task_embed_dim=32 \
--policy.state_feature_dim=32 --policy.timestep_embed_dim=48 \
--policy.distill_teacher_path=ckpt/t3C_2.75M \
--policy.distill_weight=1.0 \
--policy.upweight_task_indices='[0,1,2,3,4,5,6,7,8,9]' \
--policy.upweight_factor=3.0 --policy.progress_aux_weight=0.05 \
--policy.objective=l1 --seed=1000 \
--steps=100000 --batch_size=128 --num_workers=16 \
--log_freq=2000 --save_freq=25000 --wandb.enable=false
The command pins the public dataset revision used for archival reproduction. Omitting distillation
trains a valid ablation, but it is not the published headline recipe. The executable experiment script is
train_t05_l1.sh; other model recipes are in
ablation_queue.sh.
At the 1M scale, three-seed studies found:
95.97 ± 0.80 versus 95.63 ± 1.08), while L1 required fewer forward passes.Detailed protocols, negative results, LIBERO-plus tests, LIBERO-90 tests, and aggregate tables
are documented in EXPERIMENTS.md.
The lerobot/libero videos and the current simulator do not render every scene identically across
MuJoCo releases. For the standard four-suite result above, use MuJoCo 3.3.2. In this study, the
scratch-CNN policy's LIBERO-Object score changed from 96%+ on 3.3.2 to 0% on 3.3.5 and newer because
of a lighting change. This sensitivity may not transfer to policies with pretrained visual
backbones.
LIBERO-90 is a separate case: its older demonstrations require MuJoCo 3.2.7 for the evaluation
reported in EXPERIMENTS.md. Do not use the LIBERO-90 setting for the standard four-suite commands
above.
| Path | Contents |
|---|---|
src/lerobot/policies/tinyflow/ | MINERVA policy and processor |
exp_small_libero/EXPERIMENTS.md | Experiment log, protocols, and caveats |
exp_small_libero/results_*.tsv | Aggregate result tables |
exp_small_libero/*.sh | Training and evaluation recipes |
ARTIFACTS.md | Pinned inputs and checkpoints |
MINERVA is built on the following projects:
The source code is released under the Apache License 2.0. See NOTICE and
THIRD_PARTY_NOTICES.md for attribution. Checkpoint terms are stated on
the Hugging Face model card; datasets retain their own
licenses and terms. This repository is a research fork of
Hugging Face LeRobot, not an official LeRobot release.
Upstream copyright and license notices are retained.
MINERVA builds on ideas from MobileNet-style depthwise-separable convolutions, SpatialSoftmax, MLP-Mixer, AdaLN-Zero, ACT temporal ensembling, and flow-matching robot policies.