
Your trainer prints a falling loss and saves ten checkpoints. None of that says which one to deploy. What open-loop error, held-out episodes and rollout counts really tell you.
What you need to know
- •A falling training loss means the network memorised your demonstrations, not that the arm finishes the task more often.
- •In the robomimic study the lowest-validation-loss checkpoint scored 7.3 percent on Square (PH, low-dim), where the run's best checkpoint scored 84.0 and the last one 74.0.
- •lerobot only grew a held-out evaluation loss in 0.6.0 (PyPI, 6 July 2026). Isaac-GR00T's fine-tuning entry point has no validation split, and no seed either.
- •Open-loop error against recorded actions is a filter, not a decision: discard broken checkpoints with it, then spend rollouts on the survivors.
- •Ten rollouts at 70 percent observed success give a 95 percent Clopper-Pearson interval of 34.8 to 93.3 percent. That cannot rank two checkpoints.
- •The GPU is the cheap part at 4 to 12 USD per run on the A100 or H100 tier. Budget the arm time instead.
The number your trainer prints is not the number you care about
You fine-tuned a GR00T N1.7 policy on 60 recorded episodes of your SO-100 picking up a cube. Twenty thousand training steps later the loss has fallen from 1.2 to 0.04 and the output directory holds five checkpoints. Which one goes on the robot?
The trainer did not tell you, and in most robot learning stacks it structurally cannot. Supervised learning solves model selection by holding out data and taking the lowest validation loss. Imitation learning breaks that, because what you minimise (per-timestep agreement with a demonstrator) and what you want (task success in a closed loop) come apart.
| Trainer | Version checked (24 Aug 2026) | In-training metric | Held-out loss? | Success rate? |
|---|---|---|---|---|
Isaac-GR00T launch_finetune.py | main | training loss, checkpoints every save_steps | No. FinetuneConfig has no eval field | No |
lerobot-train 0.5.1 | PyPI, 7 Apr 2026 | training loss; eval_freq drives gym rollouts only | No | Only with a simulator |
lerobot-train 0.6.0+ | PyPI, 6 Jul 2026 | training loss plus eval_loss | Yes, via dataset.eval_split and eval_steps | Only with a simulator |
The lerobot row changed recently. On the Pi0.5 path the platform runs lerobot 0.5.1, where eval_freq means "run the policy in a gym environment every N steps". A real SO-100 dataset has no gym environment, so the flag does nothing. Version 0.6.0 added an offline train/eval split (pull request 3824), the first upstream held-out loss for a real robot dataset.
The evidence: lowest validation loss is close to the worst rule available
The reference measurement is Mandlekar et al., What Matters in Learning from Offline Human Demonstrations for Robot Manipulation (2021). They evaluated every checkpoint in simulation, so they had ground truth for what each selection rule would have picked. Table 29 is the result.
| Task and observation type | Lowest validation loss | Final checkpoint | Best checkpoint in the run |
|---|---|---|---|
| Square (PH), low-dim | 7.3 +/- 5.0 | 74.0 +/- 7.5 | 84.0 +/- 0.0 |
| Transport (PH), low-dim | 4.0 +/- 5.7 | 59.3 +/- 5.0 | 71.3 +/- 6.6 |
| Square (PH), images | 35.3 +/- 10.0 | 64.7 +/- 9.0 | 82.0 +/- 0.0 |
| Transport (PH), images | 0.0 +/- 0.0 | 58.7 +/- 5.7 | 72.0 +/- 4.3 |
Success rates in percent for BC-RNN, three seeds each. Read the first row again: the validation-loss rule picked a 7.3 percent policy out of a run containing an 84 percent one, and blindly taking the last checkpoint was ten times better. The project page states the general result: the best validation policy is "50 to 100% worse than the best performing policy".
The obvious objection is that the validation set was too small. The authors tested that. With 30 percent of the data held out, across 3 seeds, the best policy on Square (PH) achieves 80.7 +/- 0.9, while the policy achieving the lowest validation loss achieves 2.7 +/- 1.9. They also report that best validation loss lands early, around epoch 100 to 300, while best success lands much later. More held-out data buys a tighter estimate of the wrong quantity.
Diffusion Policy (Chi et al., 2023) reacted by refusing to report a single number. Every benchmark entry is written as (max performance) / (average of last 10 checkpoints), each averaged over 3 seeds and 50 environment initial conditions. The distance between the two columns is the size of the checkpoint-selection problem.
| Method | Task (Table 1, state obs) | Max over checkpoints | Average of last 10 checkpoints |
|---|---|---|---|
| LSTM-GMM (BC-RNN) | Transport (mh) | 0.62 | 0.20 |
| BET | Transport (mh) | 0.21 | 0.06 |
| DiffusionPolicy-C | Transport (mh) | 0.68 | 0.46 |
| DiffusionPolicy-C | ToolHang (ph) | 0.50 | 0.30 |
| DiffusionPolicy-T | Square (mh) | 0.95 | 0.81 |
A 42 point spread between the best checkpoint a run produced and a typical late one is larger than most published architecture differences. The same paper notes that Implicit BC was so unstable its authors evaluated every checkpoint and reported the best, which in the real world "necessitates the evaluation of many policies on hardware".
The three signals you actually have
A policy fine-tuned on your own SO-100 data leaves exactly three sources of information, in increasing order of cost and usefulness.
- Training loss. Free, and almost useless for ranking. It says the run did not diverge and the loader is feeding real data. A loss that falls to near zero while the arm does nothing has its own page: loss falls, policy does nothing.
- Open-loop error on held-out episodes. Runs on the GPU pod that just finished training, no robot needed. Feed the policy observations it never saw and compare its actions to the human's, as MSE and MAE in joint units.
- Closed-loop rollouts on the real arm. Slow, noisy, and the only thing that answers the question. Everything above it is triage.
- Catches gross breakage: constant actions, a normalisation mismatch, a camera key on the wrong stream.
- Costs GPU seconds, not robot hours: score ten checkpoints before the pod shuts down.
- Reproducible, so it fits in a script and can gate a pipeline.
- Per-joint plots make failure legible: a gripper channel stuck at its resting value shows at once.
- It scores agreement with one demonstration; many valid trajectories exist and the policy is punished for choosing another.
- It never leaves the expert's state distribution, which is where closed-loop failure comes from.
- It is blind to inference latency: the right action 200 ms late scores well and fails on the arm.
- Ranking inside the top few checkpoints is noise. It is a gate, not a leaderboard.
DAgger (Ross, Gordon and Bagnell, 2011) showed that a policy trained only on expert states accumulates error once its own mistakes push it off that distribution. Simchowitz et al. (2025) sharpened it for continuous actions: any smooth deterministic imitator "necessarily suffers error on execution that is exponentially larger, as a function of problem horizon, than the error under the distribution of expert training data". Your held-out MSE measures the small quantity; the robot experiences the large one.
Step 1: hold out episodes before you press train
None of this works if every episode went into training. You need a slice of your LeRobot dataset the model never saw, held out at episode granularity. Frames within one episode are near-duplicates at 30 Hz, so a random frame split leaks the answer.
In lerobot 0.6.x the split is deterministic. The splitter in src/lerobot/datasets/factory.py states the rule: The last ceil(n_episodes * eval_split) episodes per task are held out for evaluation. If you recorded 60 episodes in one sitting, the last nine at eval_split=0.15 are the ones where the operator was tired, the light had shifted and the tape mark had been bumped, so your held-out loss measures a shift you did not intend to test. Shuffle episode order on disk first, or read the number as a floor. The data collection guide covers why recording order is rarely neutral.
- 1lerobot 0.6.0 and later: use the built-in split
dataset.eval_splitholds out a fraction of episodes per task;eval_stepssets how often the held-out loss is computed. Settingeval_stepswithouteval_splitaborts the run with a config error;eval_spliton its own is legal and just holds the episodes back.bashpip install 'lerobot==0.6.1' lerobot-train \ --dataset.repo_id=your-name/so100_cube_pick \ --policy.type=act \ --output_dir=outputs/act_cube \ --steps=100000 \ --save_freq=5000 \ --dataset.eval_split=0.15 \ --eval_steps=2000 \ --max_eval_samples=2000 \ --seed=1000 - 2lerobot 0.5.1: split by hand
0.5.1 has no
eval_split, butdataset.episodeslets you name the training episodes explicitly and leaves the rest of the dataset untouched.dataset.exclude_episodesis the inverse of the same knob, but it is not in 0.5.1, 0.6.0 or 0.6.1 - it only exists onmain, so do not reach for it on a released version.bashTRAIN_EPS=$(python -c "print(list(range(51)))" | tr -d ' ') lerobot-train \ --dataset.repo_id=your-name/so100_cube_pick \ --dataset.episodes="$TRAIN_EPS" \ --policy.type=smolvla \ --output_dir=outputs/smolvla_cube \ --steps=20000 \ --save_freq=2000 \ --seed=1000 - 3Isaac-GR00T: split the dataset on disk
launch_finetune.pyexposes no episode filter and no eval split, so the split must exist in the filesystem. GR00T needs LeRobot v2.0 or v2.1; a v3.0 dataset crashes its loader and must be converted down before the split.bashcp -r ~/.cache/huggingface/lerobot/so100_cube_pick /data/cube_train cp -r ~/.cache/huggingface/lerobot/so100_cube_pick /data/cube_heldout # then edit meta/episodes.jsonl in each copy so that # cube_train holds episodes 0-50 and cube_heldout holds 51-59, # dropping the matching parquet and video files on each side. - 4Record enough that a split is affordable
Holding out 15 percent of 30 episodes rounds up to 5 held out and leaves 25 for training, under the minimum for most policies. The stated minimums are 50 episodes for GR00T N1.7, GR00T N1.5, Pi0.5 and ACT, and 30 for SmolVLA. Plan the slice on top.
bashpython -c " from lerobot.datasets.lerobot_dataset import LeRobotDataset ds = LeRobotDataset('your-name/so100_cube_pick') print('episodes:', ds.num_episodes, 'frames:', ds.num_frames, 'fps:', ds.fps) "

Step 2: score every surviving checkpoint open-loop
Isaac-GR00T ships the tool. gr00t/eval/open_loop_eval.py loads a checkpoint, replays recorded trajectories and prints unnormalized MSE and MAE against ground-truth actions, plus per-joint plots. On main as of 24 August 2026 its defaults are steps=200, traj_ids=[0], execution_horizon=16 and denoising_steps=4.
uv run python gr00t/eval/open_loop_eval.py \
--dataset-path /data/cube_heldout \
--embodiment-tag NEW_EMBODIMENT \
--model-path /tmp/so100_finetune/checkpoint-10000 \
--traj-ids 0 \
--execution-horizon 16 \
--steps 400One trajectory is not a measurement. Pass every held-out episode index to --traj-ids and loop over every checkpoint; the script averages across trajectories, so a small shell loop turns a directory of checkpoints into a ranked list.
#!/usr/bin/env bash
set -euo pipefail
RUN=/tmp/so100_finetune
HELDOUT=/data/cube_heldout
TRAJS="0 1 2 3 4 5 6 7 8"
mkdir -p /tmp/oleval
for ckpt in "$RUN"/checkpoint-*; do
step=$(basename "$ckpt" | cut -d- -f2)
echo "=== step $step ==="
uv run python gr00t/eval/open_loop_eval.py \
--dataset-path "$HELDOUT" \
--embodiment-tag NEW_EMBODIMENT \
--model-path "$ckpt" \
--traj-ids $TRAJS \
--execution-horizon 16 \
--steps 400 2>&1 \
| tee "/tmp/oleval/$step.log" | grep -Ei 'average m(s|a)e'
done
# rank the checkpoints by mean MSE over the held-out episodes
for f in /tmp/oleval/*.log; do
mse=$(grep -o 'Average MSE across all trajs: [0-9.e+-]*' "$f" | awk '{print $NF}')
printf '%s %s\n' "$mse" "$(basename "$f" .log)"
done | sort -gIsaac-GR00T's FinetuneConfig defaults are save_steps=1000, max_steps=10000 and save_total_limit=5. That writes ten checkpoints and keeps five: steps 6000 through 10000. If the best policy in your run was at step 3000 it no longer exists when the job finishes, and no evaluation recovers it. Set --save-total-limit high enough to keep the whole run, check free disk first, and prune only after scoring. On AY-Robots the training form exposes saveSteps for both GR00T variants and writes checkpoints to object storage.
For ACT and SmolVLA there is no equivalent upstream script, because lerobot's lerobot-eval expects a gym environment. On 0.6.x the held-out eval_loss printed every eval_steps is the closest thing. Same signal, same caveat: reject with it, do not rank with it.
launch_finetune.py is a tyro CLI and its FinetuneConfig has no seed field at all (verified on main, 24 Aug 2026). Two identical GR00T runs produce different checkpoints, so "step 12000 was good last time" does not transfer. lerobot does have a seed, defaulted to 1000, so ACT and SmolVLA runs stay comparable.
Step 3: spend rollouts where they change the decision
Open-loop scoring gets you from ten candidates to two or three. The rest is arithmetic about binomial proportions, and this is where hobby projects and a fair share of papers go wrong: a rollout either succeeds or it does not, so you are estimating a proportion, and the uncertainty is wider than intuition suggests.
| Rollouts (n) | Successes | Observed rate | 95% Clopper-Pearson interval | Width |
|---|---|---|---|---|
| 10 | 7 | 70% | 34.8% to 93.3% | 59 pp |
| 20 | 14 | 70% | 45.7% to 88.1% | 42 pp |
| 30 | 21 | 70% | 50.6% to 85.3% | 35 pp |
| 50 | 35 | 70% | 55.4% to 82.1% | 27 pp |
| 100 | 70 | 70% | 60.0% to 78.8% | 19 pp |
| 200 | 140 | 70% | 63.1% to 76.3% | 13 pp |
Ten rollouts at 70 percent is compatible with a true rate anywhere from a third to nearly always. The Toyota Research Institute large behavior model project page puts it in one sentence: "With 50 rollouts, for example 10 rollouts each on 5 behaviors, the resulting CI width is generally 20% to 30% absolute success rate, making all but the largest-sized effects impossible to reliably measure." They add that "many robotics papers may be measuring statistical noise due to insufficient statistical power".
from scipy.stats import beta, fisher_exact
def clopper_pearson(k, n, alpha=0.05):
lo = 0.0 if k == 0 else beta.ppf(alpha / 2, k, n - k + 1)
hi = 1.0 if k == n else beta.ppf(1 - alpha / 2, k + 1, n - k)
return lo, hi
for n in (10, 20, 30, 50, 100, 200):
k = round(0.7 * n)
lo, hi = clopper_pearson(k, n)
print(f"n={n:3d} {k/n:.0%} [{lo:.3f}, {hi:.3f}] width={100*(hi-lo):.0f} pp")
# smallest gap reaching p < 0.05 against a 50% baseline
for n in (10, 20, 30, 50, 100, 200):
kb = round(0.5 * n)
for ka in range(kb, n + 1):
if fisher_exact([[ka, n - ka], [kb, n - kb]])[1] < 0.05:
print(f"n={n:3d}: challenger must hit {ka}/{n} = {ka/n:.0%}")
break| Rollouts per checkpoint | Baseline | Rate the challenger must reach for p < 0.05 | Minimum detectable gap |
|---|---|---|---|
| 10 | 50% | 100% | 50 pp |
| 20 | 50% | 85% | 35 pp |
| 30 | 50% | 80% | 30 pp |
| 50 | 50% | 72% | 22 pp |
| 100 | 50% | 65% | 15 pp |
| 200 | 50% | 60% | 10 pp |
With ten rollouts each you cannot distinguish a 50 percent checkpoint from an 80 percent one. The consequence is liberating: if you can afford 20 rollouts per candidate, do not test five checkpoints with four each. Test two with 20 each, and filter hard enough open-loop that only two survive.
Robot evaluation drifts. Servos warm up, the tape mark shifts, and you unconsciously place the cube more helpfully for the checkpoint you want to win. Run all 20 rollouts of A and then all 20 of B, and the difference is confounded with time. Interleave in a randomised order and write the object pose down before each trial. TRI ran "blind A/B-style testing in the real world with statistical significance computed via a sequential hypothesis testing framework"; a shuffled paper list approximates it.

A protocol that fits an SO-100 and an afternoon
One arm, one task, and a run that produced five to twenty checkpoints. This finishes before dinner and is honest about its limits.
- 1Reject on open-loop error, keep the top three
Score every checkpoint on all held-out episodes. Discard anything whose MSE is more than roughly double the best, and anything whose per-joint plot shows a channel flatlining, usually the gripper. Do not rank inside the top three.
bashfor f in /tmp/oleval/*.log; do mse=$(grep -o 'Average MSE across all trajs: [0-9.e+-]*' "$f" | awk '{print $NF}') printf '%s %s\n' "$mse" "$(basename "$f" .log)" done | sort -g | head -3 - 2Add the last checkpoint as a free fourth candidate
The robomimic numbers make it a strong default: 74.0 percent against 84.0 for the best and 7.3 for the validation-loss rule. It costs nothing and protects you when the open-loop filter misleads.
- 3Fix the scene, then interleave
Mark 10 named object start positions with tape and shuffle a schedule of (position, checkpoint) pairs before touching the arm. Serve every candidate from the same endpoint so inference latency is identical.
pythonimport random positions = [f"P{i}" for i in range(10)] checkpoints = ["ckpt-8000", "ckpt-16000", "ckpt-20000", "last"] schedule = [(p, c) for c in checkpoints for p in positions] random.seed(0) random.shuffle(schedule) for i, (p, c) in enumerate(schedule, 1): print(f"{i:3d} place at {p} run {c}") - 4Log binary outcomes plus a failure tag
Success or failure only; a partial success is a failure. Add one word for how it failed. The distribution of failure modes is often more informative than the rate.
bashecho "$(date -Iseconds),P3,ckpt-16000,0,stalled" >> rollouts.csv - 5Compute the interval before announcing a winner
Feed the counts into the function above. If your top two intervals overlap heavily you did not find a winner, you found two checkpoints you cannot separate on this budget: ship the faster one and say so. Reuse the same slice and the same 10 positions next run; the training docs and the CLI let you pin the dataset revision.
Two ways to run this
You rent the GPU, install the stack and own every path. The right choice if you want the trainer source in front of you, or your task needs a flag nobody exposes.
git clone --recurse-submodules https://github.com/NVIDIA/Isaac-GR00T
cd Isaac-GR00T
uv sync --python 3.12
CUDA_VISIBLE_DEVICES=0 uv run python \
gr00t/experiment/launch_finetune.py \
--base-model-path nvidia/GR00T-N1.7-3B \
--dataset-path /data/cube_train \
--embodiment-tag NEW_EMBODIMENT \
--modality-config-path examples/SO100/so100_config.py \
--num-gpus 1 \
--output-dir /tmp/so100_finetune \
--max-steps 20000 \
--save-steps 2000 \
--save-total-limit 20 \
--global-batch-size 32 \
--dataloader-num-workers 4
bash score_checkpoints.sh- GR00T's VLM backbone
nvidia/Cosmos-Reason2-2Bis gated, and every checkpoint includingnvidia/GR00T-N1.7-3Bloads it. Request access and log in first, or the run dies on a GatedRepoError before it has read a single episode. - You control
save_total_limit, so no checkpoint disappears behind your back. - You can patch the trainer to log a custom held-out loss for GR00T.
- You own the LeRobot v2.1 conversion, the CUDA versions and the reclaimed spot instance.
- Still no seed for GR00T, so a rerun is a different run.
The training form picks model, dataset and hyperparameters, the backend rents a GPU on a spot market by required VRAM, runs the trainer and writes checkpoints to object storage. The evaluation is still yours: the platform trains and serves, it does not decide which checkpoint is best.
| Policy | Trainer key | GPU tier | Min episodes | Inference per step | Run cost |
|---|---|---|---|---|---|
| GR00T N1.7 | groot1.7 | A100 80 GB or H100 80 GB | 50 | 152 ms | 4 to 12 USD |
| GR00T N1.5 | groot1.5 | A100 80 GB or H100 80 GB | 50 | 165 ms | 4 to 12 USD |
| Pi0.5 | pi0 | A100 80 GB or H100 80 GB | 50 | 485 ms | 4 to 12 USD |
| SmolVLA | smolvla | RTX 4090 or any 24 GB card | 30 | 245 ms | 1 to 3 USD |
| ACT | act | RTX 4090 or any 24 GB card | 50 | 20 ms | 1 to 3 USD |
- Checkpoints land in object storage, so a pod shutting down does not delete your candidates.
/api/inference/podauto-provisions a GPU pod that serves the policy, and the local client talks to that endpoint. Pods carry an idle watchdog and destroy themselves after an idle period.- Serving three candidates in one session is therefore cheap: point the client at each in turn, arm and scene fixed.
- Base checkpoints for a zero-shot baseline are the vendors' own:
nvidia/GR00T-N1.7-3B,nvidia/GR00T-N1.5-3B,lerobot/pi05_base. ACT has no base model at all. Cost stays in the 1 to 12 USD range per run (pricing).
Where this platform does not help
AY-Robots does not solve checkpoint selection, and no current product does. Ranking checkpoints by task success requires running the robot.
- No automatic held-out metric across all five policies. GR00T's open-loop MSE comes from the upstream script; lerobot's
eval_lossarrived in 0.6.0. Neither is a success rate. - No success classifier. Deciding whether a rollout succeeded is manual. Systems like AutoEval automate it with learned classifiers and reset policies, but on two fixed WidowX stations with four fixed tasks.
- No simulator for your scene. SIMPLER makes simulated evaluation predictive of real performance, but only after someone builds a simulated environment matched to the real one. The paper's sim-to-real correlation rests on around 1500 evaluation episodes across two standard embodiments, Google Robot and WidowX. That is a project, not a checkbox.
- Remote inference changes what you measure. The control loop is 20 to 485 ms per action step depending on the model, and public-internet round trips turn a working policy into a hesitant one. Keep the inference location constant across candidates, or you are ranking network paths.

Failure modes that look like a bad checkpoint but are not
Before concluding that every checkpoint in a run is bad, rule out the causes that make all of them look bad at once. A systematic problem in the data or the serving path produces a flat, uniformly poor evaluation.
- Loss near zero and the arm barely moves: loss falls, policy does nothing. Usually a normalisation or action-space mismatch, identical across every checkpoint.
- Works on your desk and nowhere else: policy only works in one setup. Your held-out episodes came from that same setup, so open-loop error will not catch it.
- The arm stops halfway: policy freezes mid-motion, often an action chunking horizon issue rather than checkpoint quality.
- GR00T refuses a v3.0 dataset: dataset rejected as v3. The full index is at the fix pages, and run your first policy covers the serving side.
One free sanity check: run the fine-tuned checkpoint and a base checkpoint through the same open-loop script on the same episodes. If fine-tuning did anything the gap is obvious; if not, the problem is upstream of checkpoint selection. For how these models compare on published benchmarks, the arena lists 85 VLA models with 332 benchmark results, each value linked to its source.
Can I just take the last checkpoint and move on?▾
It is a defensible default and far better than the lowest validation loss. In robomimic Table 29 the final checkpoint scored 74.0 percent on Square (PH, low-dim) against 84.0 for the best in the run and 7.3 for the validation-loss pick. You leave about ten points on the table, which may be fine for a hobby project. For anything you report, spend the rollouts.
How many rollouts do I actually need?▾
It depends on the gap you need to detect. Against a 50 percent baseline, a two-sided Fisher exact test at p < 0.05 needs 20 rollouts per side for a 35 point gap, 50 per side for 22 points, and 100 per side for 15 points. With 10 per candidate, use the result to confirm the checkpoint works at all, not to rank two similar ones.
Does a lower open-loop MSE mean a better policy?▾
Only coarsely. It separates a broken checkpoint from a functional one reliably. Within the functional group it is weak, because it measures single-step agreement with one demonstration on states the policy never has to recover from. Execution error grows much faster with horizon than training-distribution error.
lerobot 0.6.0 added a held-out eval loss. Does that solve it?▾
No, but it helps. It is a better signal than training loss and worth logging. It is still a surrogate: the robomimic study measured this exact quantity and found it a poor selector. Use it to catch overfitting and to see when a run stops improving, then run rollouts on the finalists anyway.
Train the policy, then evaluate it properly
Pick a model and an arm and the guide walks the run end to end: dataset format, the defaults the trainer really sends, GPU tier and what it costs. Checkpoints land in object storage so no candidate disappears.
Open the training guidesThe short version
The loss curve is a liveness check. Open-loop error on episodes the model never saw filters out broken checkpoints. Rollouts on the real arm are the only measurement, and how many you can afford sets how confidently you may speak. Earlier in the pipeline, the SO-100 setup guide covers the hardware and the VLA overview covers the models. The dataset directory has datasets to practise on; the SO-100 page has the arm.
Sources
- Mandlekar et al., What Matters in Learning from Offline Human Demonstrations for Robot Manipulation (2021)
- robomimic study page: policy selection and validation loss
- Chi et al., Diffusion Policy: Visuomotor Policy Learning via Action Diffusion (2023, rev. 2024)
- TRI LBM Team, A Careful Examination of Large Behavior Models for Multitask Dexterous Manipulation (2025)
- Large Behavior Models project page: rollout counts and Clopper-Pearson intervals
- Simchowitz et al., The Pitfalls of Imitation Learning when Actions are Continuous (2025)
- Ross, Gordon, Bagnell, A Reduction of Imitation Learning and Structured Prediction to No-Regret Online Learning (2011)
- Zhou et al., AutoEval: Autonomous Evaluation of Generalist Robot Manipulation Policies in the Real World (2025)
- Li et al., Evaluating Real-World Robot Manipulation Policies in Simulation (SIMPLER, 2024)
- Isaac-GR00T open_loop_eval.py: defaults, MSE and MAE reporting
- Isaac-GR00T FinetuneConfig: save_steps, save_total_limit, max_steps, no seed
- Isaac-GR00T SO-100 example: fine-tuning and open-loop evaluation commands
- lerobot TrainPipelineConfig: eval_steps, env_eval_freq, max_eval_samples, seed
- lerobot DatasetConfig: eval_split and episode selection
- lerobot on PyPI: release history for 0.5.1 (7 Apr 2026), 0.6.0 (6 Jul 2026) and 0.6.1
Sources
- Mandlekar et al., What Matters in Learning from Offline Human Demonstrations for Robot Manipulation (2021)
- robomimic study page: policy selection and validation loss
- Chi et al., Diffusion Policy: Visuomotor Policy Learning via Action Diffusion (2023, rev. 2024)
- TRI LBM Team, A Careful Examination of Large Behavior Models for Multitask Dexterous Manipulation (2025)
- Large Behavior Models project page: rollout counts and Clopper-Pearson intervals
- Simchowitz et al., The Pitfalls of Imitation Learning when Actions are Continuous (2025)
- Ross, Gordon, Bagnell, A Reduction of Imitation Learning and Structured Prediction to No-Regret Online Learning (2011)
- Zhou et al., AutoEval: Autonomous Evaluation of Generalist Robot Manipulation Policies in the Real World (2025)
- Li et al., Evaluating Real-World Robot Manipulation Policies in Simulation (SIMPLER, 2024)
- Isaac-GR00T open_loop_eval.py: defaults, MSE and MAE reporting
- Isaac-GR00T FinetuneConfig: save_steps, save_total_limit, max_steps, no seed
- Isaac-GR00T SO-100 example: fine-tuning and open-loop evaluation commands
- lerobot TrainPipelineConfig: eval_steps, env_eval_freq, max_eval_samples, seed
- lerobot DatasetConfig: eval_split and episode selection
- lerobot on PyPI: release history for 0.5.1 (7 Apr 2026), 0.6.0 (6 Jul 2026) and 0.6.1
Ready for high-quality robotics data?
AY-Robots connects your robots to skilled operators worldwide.
Get Started