k1000dai/MINERVA

Python

19

4 commits

updated Aug 19, 2026

See the code

README

MINERVA — MINimal Efficient Robotic Vision-Action policy

日本語

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.

Main result

PolicyParametersSpatialObjectGoalLongAverage
MINERVA-0.5M (L1)0.54M96.899.697.489.295.75
MINERVA-0.5M (flow)0.54M94.499.696.489.895.05
MINERVA-1M (flow)0.99M97.099.897.492.896.75
MINERVA-5M (flow)4.89M99.099.298.092.497.15
MINERVA-10M (flow)9.66M98.499.098.494.097.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.

Pi0.5 reference uses a different protocol

PolicyParametersEpisodes per taskTotal rolloutsAverageSource
Pi0.5 (LeRobot reproduction)4.14B1040097.5LeRobot 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.

Inference cost

PolicyParametersGPU ms/chunkCPU ms/chunkPeak VRAM
MINERVA-0.5M (L1)0.54M2.25.10.03 GB
MINERVA-0.5M (flow)0.54M8.28.90.03 GB
MINERVA-1M (flow)0.99M8.510.00.03 GB
MINERVA-10M (flow)9.66M11.117.80.08 GB
SmolVLA450M1181,0100.97 GB
Pi0.54.14B19612,7819.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.

Quick start: evaluate the released 0.5M checkpoint

Requirements

  • Linux (the libero extra is Linux-only)
  • Python >=3.12,<3.14
  • uv
  • Approximately 15 GB of RAM for the full four-suite evaluation
  • A GPU is optional for MINERVA inference; headless GPU rendering uses EGL

Clone 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.

Model

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.

Train the released architecture

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.

Findings supported by repeated training seeds

At the 1M scale, three-seed studies found:

  • L1 regression and flow matching had no distinguishable success-rate difference in this protocol (95.97 ± 0.80 versus 95.63 ± 1.08), while L1 required fewer forward passes.
  • Changing the action-chunk length from 16 to 8 or 32 reduced the average score across all three tested seeds. Short chunks primarily hurt LIBERO-Goal; long chunks primarily hurt LIBERO-Long.
  • Smaller effects from conditioning style, distillation, and head type remain single-seed findings and should be treated as suggestive.

Detailed protocols, negative results, LIBERO-plus tests, LIBERO-90 tests, and aggregate tables are documented in EXPERIMENTS.md.

Renderer compatibility

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.

Limitations

  • The policy selects among a fixed set of learned task IDs; it does not generalize to unseen language instructions.
  • The 95.75 headline is one training seed and one evaluation seed in one simulator. The evaluation contains many rollouts, but those rollouts do not replace independent training seeds.
  • Several ablations are single-seed and do not support strong rankings between close alternatives.
  • The LIBERO-plus audit covers a stratified 404 of 10,030 variants. The LIBERO-90 result uses one seed, 10 episodes per task, and demonstrations recorded with an older simulator stack.
  • Performance drops substantially under visual and geometric perturbations. Nothing in this repository has been validated on a physical robot.
  • Timing results come from one laptop and exclude environment, camera, transport, and actuator latency.

Repository map

PathContents
src/lerobot/policies/tinyflow/MINERVA policy and processor
exp_small_libero/EXPERIMENTS.mdExperiment log, protocols, and caveats
exp_small_libero/results_*.tsvAggregate result tables
exp_small_libero/*.shTraining and evaluation recipes
ARTIFACTS.mdPinned inputs and checkpoints

References

MINERVA is built on the following projects:

License and acknowledgements

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.

k1000dai/MINERVA

Python

19

4 commits

updated Aug 19, 2026

See the code

README

MINERVA — MINimal Efficient Robotic Vision-Action policy

日本語

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.

Main result

PolicyParametersSpatialObjectGoalLongAverage
MINERVA-0.5M (L1)0.54M96.899.697.489.295.75
MINERVA-0.5M (flow)0.54M94.499.696.489.895.05
MINERVA-1M (flow)0.99M97.099.897.492.896.75
MINERVA-5M (flow)4.89M99.099.298.092.497.15
MINERVA-10M (flow)9.66M98.499.098.494.097.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.

Pi0.5 reference uses a different protocol

PolicyParametersEpisodes per taskTotal rolloutsAverageSource
Pi0.5 (LeRobot reproduction)4.14B1040097.5LeRobot 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.

Inference cost

PolicyParametersGPU ms/chunkCPU ms/chunkPeak VRAM
MINERVA-0.5M (L1)0.54M2.25.10.03 GB
MINERVA-0.5M (flow)0.54M8.28.90.03 GB
MINERVA-1M (flow)0.99M8.510.00.03 GB
MINERVA-10M (flow)9.66M11.117.80.08 GB
SmolVLA450M1181,0100.97 GB
Pi0.54.14B19612,7819.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.

Quick start: evaluate the released 0.5M checkpoint

Requirements

  • Linux (the libero extra is Linux-only)
  • Python >=3.12,<3.14
  • uv
  • Approximately 15 GB of RAM for the full four-suite evaluation
  • A GPU is optional for MINERVA inference; headless GPU rendering uses EGL

Clone 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.

Model

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.

Train the released architecture

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.

Findings supported by repeated training seeds

At the 1M scale, three-seed studies found:

  • L1 regression and flow matching had no distinguishable success-rate difference in this protocol (95.97 ± 0.80 versus 95.63 ± 1.08), while L1 required fewer forward passes.
  • Changing the action-chunk length from 16 to 8 or 32 reduced the average score across all three tested seeds. Short chunks primarily hurt LIBERO-Goal; long chunks primarily hurt LIBERO-Long.
  • Smaller effects from conditioning style, distillation, and head type remain single-seed findings and should be treated as suggestive.

Detailed protocols, negative results, LIBERO-plus tests, LIBERO-90 tests, and aggregate tables are documented in EXPERIMENTS.md.

Renderer compatibility

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.

Limitations

  • The policy selects among a fixed set of learned task IDs; it does not generalize to unseen language instructions.
  • The 95.75 headline is one training seed and one evaluation seed in one simulator. The evaluation contains many rollouts, but those rollouts do not replace independent training seeds.
  • Several ablations are single-seed and do not support strong rankings between close alternatives.
  • The LIBERO-plus audit covers a stratified 404 of 10,030 variants. The LIBERO-90 result uses one seed, 10 episodes per task, and demonstrations recorded with an older simulator stack.
  • Performance drops substantially under visual and geometric perturbations. Nothing in this repository has been validated on a physical robot.
  • Timing results come from one laptop and exclude environment, camera, transport, and actuator latency.

Repository map

PathContents
src/lerobot/policies/tinyflow/MINERVA policy and processor
exp_small_libero/EXPERIMENTS.mdExperiment log, protocols, and caveats
exp_small_libero/results_*.tsvAggregate result tables
exp_small_libero/*.shTraining and evaluation recipes
ARTIFACTS.mdPinned inputs and checkpoints

References

MINERVA is built on the following projects:

License and acknowledgements

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.