Baselines
Nine state-of-the-art imitation-learning models, all consuming the same paired human–robot LeRobot dataset contract through shared loaders and task encoders.
Baseline overview
Each baseline is a self-contained directory under
examples/baselines/ with its own README describing the method, training and
rollout entry points, and the key hyperparameters used to reproduce the paper's experiments.
| Directory | Method | Training entry | Eval entry |
|---|---|---|---|
act/ | ACT (Action Chunking with Transformers) | train_act_imitator.py | eval_act_imitator.py / parallel_eval_act.py |
diffusion_policy/ | Diffusion Policy (1D UNet) | train_dp_imitator.py | eval_dp_imitator.py / parallel_eval_dp.py |
vqbet/ | VQ-BeT (VQ-VAE + behavior Transformer) | pretrain_vqvae_imitator.py → train_vqbet_imitator.py | eval_vqbet_imitator.py / parallel_eval_vqbet.py |
uniskill/ | UniSkill (IDM + conditional diffusion) | diffusion/train_uniskill.py → diffusion/train_cond_dp.py | diffusion/eval_uniskill.py |
xskill/ | XSkill (skill discovery + diffusion) | scripts/stage1_pretrain_encoder.py → scripts/stage2_skill_transfer.py | scripts/eval_xskill.py |
gr00t/ | NVIDIA GR00T N1.6 (flow-matching VLA) | gr00t.experiment.launch_finetune | gr00t.eval.parallel_eval_imitator / eval_imitator |
rdt/ | RDT-1B (diffusion transformer, LoRA finetune) | train_rdt_lora.py / train_rdt_scratch.py | eval_rdt_lora.py / parallel_eval_rdt.py |
pi/ | π0 / π0.5 (flow-matching VLA, JAX) | train_pi_lerobot_jax.py | eval_pi_lerobot_jax.py / parallel_eval_pi_lerobot_jax.py |
openvla_oft/ | OpenVLA (LoRA finetune, discrete/regression/diffusion head) | train_openvla.py | eval_openvla.py / eval_openvla_batch.py |
Shared infrastructure
| Directory | Purpose |
|---|---|
lerobot_dataset/ | LeRobot dataset loaders, human/sim/robot dataloaders, detection/learning-in/configs, evaluation processor, mask-gen tools |
encoders/ | Shared observation/state encoders and the frozen task-video backbone used by ACT / Diffusion Policy / VQ-BeT |
hand_estimation/ | HaMeR and WiLoR hand-tracking tools used to estimate MANO hand features for the human dataset |
exp_scripts/ | Experiment launchers that reproduce the paper's training and evaluation runs |
Data — human demonstrations and simulation/robot trajectories are
consumed through the LeRobot interface under lerobot_dataset/.
Environment — baselines share the repository Python environment
(uv sync --active). GR00T additionally provides a dedicated
uv environment in gr00t/pyproject.toml; Pi (JAX) additionally
depends on the openpi package pinned in pi/pyproject.toml.
Splits — configs named
<kind>_train_config_{15,30,45}.json are the 15/30/45-task training
splits; *_test_config_seen.json, *_test_config_unseen.json,
and the eval/exp_list/*.txt env lists are the seen/unseen evaluation
splits.
ACT
The policy receives a robot observation stream together with a task representation extracted from the human demonstration video, and predicts a chunk of dual-arm actions with a DETR-style transformer decoder. The reference training command uses the frozen task-video (video-only) configuration:
TAG=<15|30|45>
BACKBONE=<dinov2_vitl14|siglip2_so400m|videomae_large>
python -m examples.baselines.act.train_act_imitator \
--human-root demos/demo_data \
--sim-root demos/imitator_data \
--human-dataset-file examples/baselines/lerobot_dataset/config/exp_configs/human_train_config_${TAG}.json \
--sim-dataset-file examples/baselines/lerobot_dataset/config/exp_configs/sim_train_config_${TAG}.json \
--task-mapping-file examples/baselines/lerobot_dataset/task_mapping.json \
--input-mode video_only \
--task-encoder-type frozen_backbone \
--frozen-backbone-type ${BACKBONE} \
--frozen-backbone-num-frames 10 \
--frozen-backbone-adapter-layers 1 \
--frozen-backbone-seq-patches 32 \
--pred-horizon 24 \
--batch-size 128 \
--total-epochs 10 \
--warmup-epochs 1 \
--lr 1e-4 \
--control-mode pd_joint_pos \
--env-id TwoRobotPourCup-v1 \
--max-episode-steps 500 \
--no-include-depth
Additional model hyperparameters used in the reported ablation runs:
--hidden-dim 1024 --dim-feedforward 4096 --nheads 16 --enc-layers 12 --dec-layers 12.
Checkpoints are written to runs/<run_name>/checkpoints/, including
final_model.pt.
Diffusion Policy
The model conditions a 1D action diffusion model (UNet) on robot observations together with a task representation extracted from the human demonstration video:
python -m examples.baselines.diffusion_policy.train_dp_imitator \
--human-root demos/demo_data \
--sim-root demos/imitator_data \
--human-dataset-file examples/baselines/lerobot_dataset/config/exp_configs/human_train_config_${TAG}.json \
--sim-dataset-file examples/baselines/lerobot_dataset/config/exp_configs/sim_train_config_${TAG}.json \
--task-mapping-file examples/baselines/lerobot_dataset/task_mapping.json \
--input-mode video_only \
--task-encoder-type frozen_backbone \
--frozen-backbone-type ${BACKBONE} \
--frozen-backbone-num-frames 10 \
--control-mode pd_joint_pos \
--batch-size 256 \
--total-epochs 10 \
--lr 1e-4 \
--num-dataload-workers 24 \
--env-id TwoRobotPourCup-v1 \
--max-episode-steps 500 \
--unet-dims 352 704 1408 2816
Other baselines
Every baseline has its own README with training and evaluation commands. Highlights:
-
VQ-BeT — two-stage: pretrain the VQ-VAE
(
pretrain_vqvae_imitator.py), then train the behavior Transformer (train_vqbet_imitator.py). -
UniSkill — cross-embodiment skill learning: train the inverse-dynamics
module (
diffusion/train_uniskill.py), then the conditional diffusion policy (diffusion/train_cond_dp.py). -
XSkill — skill discovery + transfer: stage 1 pretrains the encoder
(
scripts/stage1_pretrain_encoder.py), stage 2 transfers the skill (scripts/stage2_skill_transfer.py). -
GR00T N1.6 — flow-matching VLA, LoRA fine-tuned on the shared bimanual
dataset with its dedicated
uvenvironment:
cd examples/baselines/gr00t
uv sync
source .venv/bin/activate
# then, from the repository root:
CUDA_VISIBLE_DEVICES=0 python -m gr00t.experiment.launch_finetune \
--embodiment-tag NEW_EMBODIMENT \
--human-config-path examples/baselines/lerobot_dataset/config/exp_configs/human_train_config_${TAG}.json \
--sim-config-path examples/baselines/lerobot_dataset/config/exp_configs/sim_train_config_${TAG}.json \
--lerobot-version v3 \
--language-source human_desc \
--batch-size 256 \
--num-epochs 10 \
--save-epochs 1 \
--use-backbone-lora --backbone-lora-rank 64 \
--use-llm-lora --llm-lora-rank 64 \
--tune-projector \
--base-model-path <GR00T-N1.6-3B cache path> \
--dataset-path demos/imitator_data
- RDT-1B — diffusion transformer fine-tuned with LoRA (
train_rdt_lora.py) or from scratch (train_rdt_scratch.py). - π0 / π0.5 — flow-matching VLA in JAX (
train_pi_lerobot_jax.py), depends on the pinnedopenpipackage. - OpenVLA — LoRA fine-tuning with a discrete / regression / diffusion action head (
train_openvla.py).
The paired dataset contract
The released baselines consume the shared contract in
examples/baselines/lerobot_dataset:
- ACT, Diffusion Policy, and VQ-BeT use
HumanSimPairedDatasetdirectly. - OpenVLA-OFT, π0.5, and RDT adapt the paired sample to their model-specific token, tensor, or JAX layouts.
- XSkill and UniSkill enable the skill-frame fields through wrappers around the paired interface.
- GR00T uses its own episode loader but reads the same LeRobot directories, experiment configs, task mapping, and descriptions.
The common training arguments are therefore the human and simulation data roots, their
experiment config files, task_mapping.json, the task-description files, camera
selection, observation/action horizons, and input_mode. Model-specific commands
and hyperparameters are documented in each policy's README. See the
data collection page for conversion and split setup.
Add your own model to the benchmark by following the baseline template, or contribute new tasks, models and robots through the community guide.