
LeRobot, Isaac-GR00T, openpi and Open X-Embodiment: who publishes what, which licence really covers the weights, and how the four projects connect on a real robot arm.
What you need to know
- •Four projects carry the open robot learning stack: LeRobot (Hugging Face), Isaac-GR00T (NVIDIA), openpi (Physical Intelligence) and Open X-Embodiment (a 21-institution collaboration published through Google DeepMind).
- •All four ship code under Apache 2.0. The weights diverge, and not even within one vendor: GR00T N1.7 is under the NVIDIA Open Model License Agreement, GR00T N1.5 under NVIDIA's older OneWay Noncommercial License, the pi0 family carries the Gemma Terms of Use, Open X-Embodiment data is CC-BY 4.0.
- •The LeRobot dataset format is the de facto interchange layer: openpi converts foreign data into it before training, Isaac-GR00T reads a variant of it.
- •That format has a version split: GR00T wants v2.x plus a meta/modality.json, lerobot 0.4.0 and later default to v3.0. Converting both ways is routine.
- •Upstream breaks things quietly. GR00T N1.5 support has been removed from LeRobot; the docs name 0.5.1 (7 April 2026) as the last release that supports it, so keeping an N1.5 checkpoint means pinning lerobot==0.5.1.
- •Everything below was read out of the repositories on 24 August 2026.
Robot learning is not one open source project. It is four or five projects with different owners, release cadences and licences, plus one shared data format that nobody formally standardised. If you have an SO-100 arm on your desk and want to train a policy on it, you will touch at least three of them, and the seams between them are where the day goes.
This is a map of who publishes what. Every command, flag, default and licence below came out of the actual repository, model card or paper.
The four layers, and who owns each
These are layers, not competing frameworks. Open X-Embodiment is data. LeRobot is the runtime and the format. Isaac-GR00T and openpi are model publishers who also ship training code. Only LeRobot tries to be all of it at once.
| Project | Publisher | What it actually is | Code licence | Weights or data licence |
|---|---|---|---|---|
| LeRobot | Hugging Face | Robot drivers, teleop, the dataset format, ~20 policy implementations, train and eval CLIs | Apache 2.0 | Per model; pi05_base carries Gemma terms |
| Isaac-GR00T | NVIDIA | Reference implementation of the GR00T N-series plus ONNX, TensorRT and Jetson deployment | Apache 2.0 | Per checkpoint: N1.7 under the NVIDIA Open Model License Agreement, N1.5 under the OneWay Noncommercial License |
| openpi | Physical Intelligence | JAX-first training and serving for pi0, pi0-FAST and Pi0.5, with a PyTorch path | Apache 2.0 | Gemma Terms of Use |
| Open X-Embodiment | 21-institution collaboration, via Google DeepMind | Pooled dataset in RLDS form, plus the RT-1-X and RT-2-X results | Apache 2.0 | CC-BY 4.0, per-dataset terms beneath |
| ALOHA / ACT | Stanford | The original Action Chunking with Transformers reference design | Apache 2.0, inside LeRobot | None, ACT has no base model |
The five policies you can actually train here come from three of those publishers: GR00T N1.7 and GR00T N1.5 from NVIDIA, Pi0.5 from Physical Intelligence, SmolVLA from Hugging Face, and ACT out of the ALOHA line at Stanford. Those are the groups shipping usable open weights for tabletop manipulation.
LeRobot is the substrate everything plugs into
LeRobot started in January 2024 and now has the widest surface: robot drivers, teleoperation devices, the dataset format, policy implementations in pure PyTorch, and the CLI verbs that do the work. Version 0.6.1 landed 3 August 2026 and needs Python 3.12 or newer.
pip install lerobot
lerobot-info
# the four verbs that matter
lerobot-record # drive the arm, write a LeRobotDataset
lerobot-train # fine-tune a policy on that dataset
lerobot-eval # score a checkpoint in a sim benchmark
lerobot-rollout # run the checkpoint on real hardwareWhat is easy to miss is how much LeRobot has absorbed. Its policy table now lists ACT, Diffusion Policy, VQ-BeT and a multitask DiT for imitation learning; HIL-SERL and TDMPC for reinforcement learning; and for vision-language-action models it lists Pi0, Pi0Fast, Pi0.5, GR00T N1.7, SmolVLA, XVLA, EO-1, MolmoAct2, WALL-OSS and EVO1. Several are reimplementations of models whose authors publish their own repo. You can fine-tune GR00T through NVIDIA's code or LeRobot's, and the two do not take the same flags.
LeRobot imports any installed package prefixed lerobot_robot_, lerobot_teleoperator_ or lerobot_camera_, and the type it registers becomes usable straight from the CLI. That is how xArm, UR5e, Franka, AgileX Piper, Trossen WidowX and ROS 2 bridges get in without a PR against core.
The defaults lerobot-train really uses
| Flag | Default | Comment |
|---|---|---|
| --seed | 1000 | Set, so a lerobot run is reproducible |
| --batch_size | 8 | Too small for a 3 B VLA on 80 GB, too large for one on 24 GB |
| --steps | 100000 | Most SO-100 fine-tunes converge long before this |
| --save_freq | 20000 | Checkpoint interval |
| --log_freq | 200 | Console and W&B logging |
| --eval_steps | 0 | No held-out eval loss unless you also set dataset.eval_split |
Read that last row twice: out of the box you get no validation loss at all. A training step count and a falling training loss tell you the optimiser works, not that the policy will move the arm. The loss falls but the policy does nothing failure mode is common enough to have its own page.
The dataset format is the real interoperability layer
Nobody standardised the LeRobot dataset format. It won by being the thing every tool already reads. openpi's documented path for your own data is to convert it into a LeRobot dataset first, using their convert_libero_data_to_lerobot.py as a template. Isaac-GR00T reads what its README calls a flavour of the LeRobot v2 format. The Hub carries tens of thousands of datasets tagged LeRobot.
| LeRobotDataset v2.1 | LeRobotDataset v3.0 | |
|---|---|---|
| File layout | One Parquet and one MP4 per episode | Many episodes packed into shared shards |
| Episode boundaries | Implied by filenames | Resolved through meta/episodes/ metadata |
| Streaming | No | StreamingLeRobotDataset, or --dataset.streaming=true |
| Shipped in | lerobot up to 0.3.x | lerobot 0.4.0 and later |
| Read by Isaac-GR00T | Yes, plus meta/modality.json | No, must be converted down first |
Record with a current lerobot and you get v3.0. Hand that to Isaac-GR00T and the loader fails, because GR00T expects the v2 layout plus meta/modality.json. The converter lives in its own environment under scripts/lerobot_conversion and is easy to miss, since it is not part of the main install. The symptom looks like a corrupt dataset rather than a version mismatch, which is why people re-record episodes that were fine. See dataset rejected as v3.
# v2.1 -> v3.0, inside a lerobot environment
python -m lerobot.scripts.convert_dataset_v21_to_v30 \
--repo-id=<HF_USER>/<DATASET_ID>
# v3.0 -> v2, inside the Isaac-GR00T repo, in its own venv
cd scripts/lerobot_conversion
uv venv && source .venv/bin/activate
uv pip install -e . --verbose
python convert_v3_to_v2.py --repo-id <DATASET_REPO_ID>
One more v3.0 detail: it writes Parquet incrementally, so a script that builds a dataset with LeRobotDataset.create() must call dataset.finalize() before pushing, or the footers never flush and the files will not load. Recording through lerobot-record handles this. The dataset docs cover the field names, and record your first dataset walks through producing one from a real arm.
Isaac-GR00T: NVIDIA's model with two front doors
Isaac-GR00T is the reference implementation of NVIDIA's GR00T N-series. The code is Apache 2.0; the weights are not, and they are not all under the same terms. The base nvidia/GR00T-N1.7-3B model card names the NVIDIA Open Model License Agreement. The older nvidia/GR00T-N1.5-3B card points at NVIDIA's OneWay Noncommercial License instead, which is a materially different document if you intend to sell anything. The release tags are public, so the timeline is checkable:
| Release tag | Published | Where the code lives now |
|---|---|---|
| n1-release | 11 June 2025 | n1-release branch |
| n1.5-release | 15 December 2025 | n1d5 branch |
| n1.6-release | 15 April 2026 | n1d6 branch |
| n1.7-release | 18 April 2026 | main |
What actually changed in N1.7
- The VLM backbone moved from a vendored Eagle model (nvidia/Eagle-Block2A-2B-v2) to nvidia/Cosmos-Reason2-2B, built on Qwen3-VL.
- State and action dimensions expanded from 29 to 132, and the action horizon from 16 to 40.
- The action head stays a flow-matching DiT but drops from 32 to 16 diffusion layers.
- The rollout flag was renamed from --action-horizon to --execution-horizon, a silent break in anyone's shell scripts.
- Full-pipeline ONNX and TensorRT export landed. The model card reports 27.9 ms end to end and 35.9 Hz on an H100 80 GB, a 3.08x speedup over PyTorch eager.
The fine-tuning entry point is a tyro CLI, and the repo ships an SO100 modality config plus a five-episode SO100 demo dataset, which makes it the most directly relevant of the four projects if you own a low-cost arm.
CUDA_VISIBLE_DEVICES=0 uv run python \
gr00t/experiment/launch_finetune.py \
--base-model-path nvidia/GR00T-N1.7-3B \
--dataset-path demo_data/cube_to_bowl_5 \
--embodiment-tag NEW_EMBODIMENT \
--modality-config-path examples/SO100/so100_config.py \
--num-gpus 1 \
--output-dir /tmp/test_finetune \
--max-steps 2000 \
--global-batch-size 32 \
--dataloader-num-workers 4The defaults inside FinetuneConfig explain how GR00T behaves during fine-tuning. It trains only the projector and the diffusion head by default: tune_llm and tune_visual are false, tune_projector and tune_diffusion_model are true. That is why a 3 B model fine-tunes on a single card at all.
| FinetuneConfig field | Upstream default | Why it matters |
|---|---|---|
| global_batch_size | 64 | Across all GPUs, not per device |
| learning_rate | 1e-4 | Same order as the platform default for N1.7 |
| max_steps | 10000 | Short next to lerobot's 100000 |
| save_steps | 1000 | Checkpoint interval |
| save_total_limit | 5 | Older checkpoints are deleted, silently |
| tune_llm / tune_visual | false / false | Backbone frozen by default |
| (no seed field) | n/a | The tyro config has no seed at all |
The N1.7 backbone is gated. Every GR00T N1.7 checkpoint loads nvidia/Cosmos-Reason2-2B on first use (N1.5 and N1.6 load the older Eagle backbone instead), which needs an approved access request plus huggingface-cli login or HF_TOKEN. Without it, loading dies with a GatedRepoError or a bare 401, which reads like a network fault rather than a permissions one. Separately, save_total_limit defaults to 5, so a long run quietly deletes earlier checkpoints.
The second front door is LeRobot, where GR00T N1.7 is available as --policy.type=groot. That path does expose a seed. It also carries a breaking change: GR00T N1.5 support was removed from LeRobot, and current releases reject N1.5 checkpoints with a migration note. The documented workaround is to pin lerobot==0.5.1, released 7 April 2026. The two generations are compared on the N1.7 versus N1.5 page.
openpi: Physical Intelligence's JAX stack
openpi is the odd one out. It is JAX-first where everything else is PyTorch, it has no tagged releases (the repo is a rolling main branch), and its base checkpoints live in a Google Cloud Storage bucket rather than on the Hub. It publishes pi0, a flow matching VLA; pi0-FAST, an autoregressive variant using the FAST action tokenizer; and Pi0.5, the open-world upgrade trained with knowledge insulation. The base checkpoints were pretrained on what the README calls 10k+ hours of robot data.
| Mode | Memory stated by openpi | Example GPU |
|---|---|---|
| Inference | > 8 GB | RTX 4090 |
| Fine-tuning (LoRA) | > 22.5 GB | RTX 4090 |
| Fine-tuning (full) | > 70 GB | A100 80 GB or H100 |
That table is the honest reason Pi0.5 sits in the 80 GB tier: a LoRA fine-tune fits on a 4090, a full one does not.
- 1Compute normalisation statistics
openpi refuses to train without them, and the error is not obvious the first time. Once per config.
bashuv run scripts/compute_norm_stats.py --config-name pi05_libero - 2Train
XLA_PYTHON_CLIENT_MEM_FRACTION lets JAX use 90 percent of the card instead of the 75 percent default. On a rented 80 GB GPU that difference is real.
bashXLA_PYTHON_CLIENT_MEM_FRACTION=0.9 uv run scripts/train.py pi05_libero \ --exp-name=my_experiment --overwrite - 3Serve the checkpoint
Serving is a separate process speaking websocket on port 8000. A thin openpi-client goes on the robot side, so the robot environment never imports JAX.
bashuv run scripts/serve_policy.py policy:checkpoint \ --policy.config=pi05_libero \ --policy.dir=checkpoints/pi05_libero/my_experiment/20000 - 4Or convert to PyTorch
If you would rather not run JAX in production, openpi ships a converter and a PyTorch trainer that take the same config names.
bashuv run examples/convert_jax_model_to_pytorch.py \ --checkpoint_dir /path/to/jax/checkpoint \ --output_path /path/to/converted/pytorch/checkpoint
openpi's code is Apache 2.0, but the repository also ships LICENSE_GEMMA.txt, the Gemma Terms of Use dated 21 February 2024, because the pi0 family builds on a Gemma-derived backbone. The LeRobot conversion, lerobot/pi05_base, is listed under the Gemma licence too. If you plan to redistribute a fine-tuned checkpoint, that is the governing document, not the Apache header on the training script.
One detail from openpi's remote inference guide is worth copying whichever model you run: resize camera frames to 224 by 224 on the client, before they go over the wire. The pretrained pi0 models expect 224 anyway, and pushing full-resolution frames across a network link is the fastest way to make a working policy laggy.
Open X-Embodiment: the data pool underneath all of it
Open X-Embodiment predates the current wave. The paper went up on arXiv on 13 October 2023 and answers one question: what happens if you pool everyone's robot data instead of each lab training on its own.
- 60 existing robot datasets from 34 research labs, 21 institutions on the paper.
- 22 robot embodiments, from single arms to bimanual setups to quadrupeds.
- More than one million real robot trajectories, 527 skills across 160,266 tasks.
- Distributed in RLDS episode format via TensorFlow Datasets and a public GCS bucket.
- Code Apache 2.0, materials CC-BY 4.0, per-dataset licences in a separate spreadsheet to check before commercial use.
- RT-1-X beat per-dataset baselines by 50 percent in the small-data regime; RT-2-X tripled RT-2 on emergent skill evaluations.
# via TensorFlow Datasets
python -c "import tensorflow_datasets as tfds; tfds.load('bridge')"
# or pull the raw RLDS shards
gsutil -m cp -r gs://gdm-robotics-open-x-embodiment/{dataset_name} \
~/tensorflow_datasets/The catch for anyone with a hobby arm: RLDS is not LeRobot format, and almost none of the 22 embodiments is an SO-100. It is what the foundation models were pretrained on, not something you fine-tune against. We covered its structure and limits in the Open X-Embodiment deep dive, and the wider model lineage in the VLA overview.
How the pieces actually fit together
As a chain: Open X-Embodiment and its descendants feed the pretraining of GR00T, pi0 and Pi0.5. You record your own episodes in LeRobot format, fine-tune one of those checkpoints, and serve the resulting checkpoint back to the arm. LeRobot sits at three of those four steps, which is why it feels central despite publishing only one of the models.
| You have | You want | The path |
|---|---|---|
| An SO-100 and no data | A working policy | lerobot-record, fine-tune SmolVLA or ACT, lerobot-rollout |
| A LeRobot v3.0 dataset | GR00T N1.7 fine-tune | convert_v3_to_v2.py, add meta/modality.json, launch_finetune.py |
| A LeRobot v2.1 dataset | SmolVLA or Pi0.5 fine-tune | convert_dataset_v21_to_v30, then lerobot-train |
| Data in RLDS or a custom format | Any of the above | A converter modelled on openpi's convert_libero_data_to_lerobot.py |
| A trained openpi checkpoint | PyTorch deployment | convert_jax_model_to_pytorch.py, then serve_policy.py |
| An N1.5 checkpoint from 2025 | To keep using it in LeRobot | Pin lerobot==0.5.1, or migrate to N1.7 |
For the model decision itself, GR00T N1.7 against Pi0.5 and ACT against SmolVLA lay out the trade-offs with numbers, and the Arena carries 85 VLA models with 332 benchmark results, each value linked back to its source.
Licences: what you can actually ship
This is the part people skip and then regret. All four projects use Apache 2.0 for source. The weights are a different question, and each publisher answers it differently.
| Artefact | Licence | Practical consequence |
|---|---|---|
| lerobot, Isaac-GR00T, openpi and open_x_embodiment source | Apache 2.0 | Vendor it, modify it, ship it |
| GR00T N1.7 weights | NVIDIA Open Model License Agreement | Read it before productising; it is not Apache |
| GR00T N1.5 weights | NVIDIA OneWay Noncommercial License | Noncommercial terms, not the same licence as N1.7; check before you ship |
| pi0 and Pi0.5 weights | Gemma Terms of Use | Use and distribution terms attach to derivatives |
| Open X-Embodiment data | CC-BY 4.0, per-dataset terms beneath | Attribution required; check the individual row |
| ACT | No pretrained weights exist | Nothing to license, you train from scratch |
Fine-tuning a GR00T or Pi0.5 checkpoint on your own data does not reset the licence. The derivative carries the base model's terms. If you intend to sell access to the policy or bundle it into a product, read the actual agreement rather than assuming the Apache header covers you. Not legal advice, but the gap between an Apache repo and a custom model licence is where teams get surprised.
Two paths to the same fine-tune
One goal: fine-tune GR00T N1.7 on 50 episodes recorded with an SO-100, then run it back on the arm. Assembled by hand, and on this platform.
- 1Record the dataset
Install lerobot, calibrate leader and follower, record 50 episodes. You get LeRobotDataset v3.0.
bashpip install lerobot lerobot-record \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 \ --robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}" \ --teleop.type=so100_leader \ --teleop.port=/dev/ttyACM1 \ --dataset.repo_id=${HF_USER}/my-dataset \ --dataset.num_episodes=50 \ --dataset.single_task="Grab the black cube" - 2Convert down to v2 and write modality.json
GR00T will not read v3.0. Run the converter in its own virtualenv, then map the concatenated state and action arrays onto named joints.
bashcd scripts/lerobot_conversion uv venv && source .venv/bin/activate uv pip install -e . --verbose python convert_v3_to_v2.py --repo-id ${HF_USER}/my-dataset - 3Build the GR00T environment
Python 3.12, CUDA 12.8, uv, and ffmpeg below 8 because torchcodec 0.8.0 supports only FFmpeg 4 to 7. Then request access to the gated backbone and log in.
bashgit clone --recurse-submodules https://github.com/NVIDIA/Isaac-GR00T curl -LsSf https://astral.sh/uv/install.sh | sh uv sync --python 3.12 uv run huggingface-cli login # or export HF_TOKEN=... - 4Rent a GPU and run
You need 40 GB or more of VRAM. Copy the dataset on, run the fine-tune, copy the checkpoints off before the instance dies.
bashCUDA_VISIBLE_DEVICES=0 uv run python \ gr00t/experiment/launch_finetune.py \ --base-model-path nvidia/GR00T-N1.7-3B \ --dataset-path /data/my-dataset \ --embodiment-tag NEW_EMBODIMENT \ --modality-config-path examples/SO100/so100_config.py \ --num-gpus 1 --output-dir /out --max-steps 20000
Complete control, no dependency on anyone's uptime, a setup you can run offline. The cost is that you own the version matrix: CUDA, ffmpeg, torchcodec, transformers, the dataset version and the gated-repo token all have to agree at once.
- 1Record from a teleop session
The desktop client records LeRobot-format datasets straight out of a teleop session: episodes, camera streams and joint states, no separate export step.
- 2Pick model, dataset and hyperparameters in one form
The form takes the policy, the dataset (public directory, a Hugging Face repo id, or your own machine) and the hyperparameters. GR00T N1.7 defaults here: batch size 32, learning rate 1e-4, 20000 max steps, gradient accumulation 1.
- 3The backend rents the GPU
The job is matched to a spot-market GPU by required VRAM, the trainer runs, checkpoints go to object storage. GR00T N1.7 needs the A100 80 GB or H100 tier.
- 4Version conversion is handled
A LeRobot v3.0 dataset crashes the GR00T loader, so it is converted down to v2.1 before the run rather than failing at step one.
- 5Inference pod, then back to the arm
The inference endpoint auto-provisions a cloud GPU pod serving the policy, and the local robot client talks to it. Pods carry an idle watchdog and destroy themselves, so nothing bills quietly.
| Policy | GPU tier | Typical run | Typical cost |
|---|---|---|---|
| GR00T N1.7, GR00T N1.5, Pi0.5 | A100 80 GB or H100 80 GB | 3 to 6 h at 1.20 to 2.00 USD/h | about 4 to 12 USD |
| SmolVLA, ACT | RTX 4090 or any 24 GB card | 2 to 5 h at 0.30 to 0.60 USD/h | about 1 to 3 USD |
None of this is browser-only. The CLI and the MCP server expose the same operations, so you can script a run or hand it to an agent. The guide for this combination is GR00T N1.7 on SO-100.
Running the open stack yourself: the honest ledger
- Everything is Apache 2.0 at the source level. You can read, patch and vendor any of it.
- You are never blocked on someone else's roadmap. If a flag exists upstream, you can use it today.
- Reference implementations are what the papers were written against, so reproducing a published result is possible.
- Offline operation once the weights are on disk, apart from the gated backbone download.
- The GR00T repo ships an SO100 modality config and a five-episode SO100 demo dataset, so the low-cost-arm path is supported rather than a hack.
- The version matrix is the real work: Python 3.12, CUDA 12.8, ffmpeg below 8, matching torchcodec and transformers pins, and the right dataset version, all at once.
- Two of the three model publishers use uv with locked dependencies, which is reproducible but fights an existing conda or pip environment.
- Silent breaking changes. A renamed flag and a removed policy both landed without a loud deprecation cycle.
- Gated weights: Cosmos-Reason2-2B needs an approved access request before any GR00T checkpoint loads.
- You still source the GPU, move tens of gigabytes onto it, and move checkpoints off before the instance disappears.
- None of these projects will tell you whether your dataset is any good. Loss curves look identical for clean data and for swapped camera streams.
Where this ecosystem, and this platform, do not help you
Three limits, stated plainly, because the marketing around robot foundation models skips them.
First, latency. Inference latency here runs from 20 ms per action step for ACT to 485 ms for Pi0.5, with GR00T N1.7 at 152 ms and SmolVLA at 245 ms. Those are compute numbers. Add a public-internet round trip and a policy that worked on a local GPU becomes hesitant. Remote inference is viable for slow pick-and-place, not for fast reactive motion, and no amount of action chunking fully hides it. For tight control the inference has to sit next to the servos.
Unrelated to software, but it ends more projects than any dependency conflict: the Feetech STS3215 bus servos in an SO-100 or SO-101 run at 7.4 V. Feeding them 12 V destroys them. A LeKiwi has a 7.4 V arm and a 12 V base in one machine, which is where the wrong barrel jack meets the wrong socket.
Second, data. None of these projects collects it for you. You cannot fine-tune on someone else's Franka data and expect transfer to your SO-100 gripper. You need your own episodes, and the platform minimum is 30 for SmolVLA and 50 for the others, which is a floor rather than a target. Recording those is manual work, and nobody automates it away.

Third, a platform cannot fix a bad dataset. If camera streams are swapped between episodes, if the wrist camera drifted, if one joint sat at its mechanical limit for half the recording, training converges happily and the policy does something confident and wrong. The failure-mode pages exist because these all look the same from the loss curve. Reading the data collection guide before recording 50 episodes is cheaper than recording them twice.

85 VLA models, 332 benchmark results, every number sourced
Before you pick a model out of any of these repositories, look at what it actually scores. The Arena compares 85 vision-language-action models with 332 benchmark results, and every value links back to the paper or model card it came from.
Open the ArenaWhere to start if all of this is new
The shortest useful path does not begin with a foundation model. It begins with the smallest thing that closes the loop, because the loop is where you learn whether your data is any good.
- 1Drive an arm before you buy one
You can teleoperate a physical SO-100 from the browser with no signup at /live, queue-based. It costs nothing and tells you what the latency feels like.
- 2Record 30 to 50 episodes of one task
Same object, same lighting, same starting region. Vary the object position, not the scene. This is the highest-leverage decision in the whole pipeline.
bashlerobot-record \ --robot.type=so100_follower \ --teleop.type=so100_leader \ --dataset.repo_id=${HF_USER}/cube-pick \ --dataset.num_episodes=50 \ --dataset.single_task="Pick up the red cube and place it in the bowl" - 3Train ACT first, not GR00T
ACT is roughly 80 M parameters, trains from scratch on a 24 GB card, and runs at 20 ms per action step. It has no base model, so nothing depends on a gated download or a model licence. If ACT cannot learn your task, a 3 B VLA probably will not rescue it.
bashlerobot-train \ --policy.type=act \ --dataset.repo_id=${HF_USER}/cube-pick \ --batch_size=8 \ --steps=100000 - 4Then move up to a VLA
Once ACT works, SmolVLA at roughly 450 M parameters is the next step on the same 24 GB card. GR00T N1.7 and Pi0.5 need the 80 GB tier. The training matrix has a guide for every model and arm combination, and run your first policy closes the loop on hardware.
Starting from the hardware end instead? The SO-100 complete guide covers build, calibration and first teleop, the SO-100 and LeRobot page covers the software side, the desktop client records datasets locally, and the training docs describe what the backend does with them.
Is LeRobot a replacement for Isaac-GR00T and openpi, or do I need all three?▾
It depends on the model. LeRobot reimplements GR00T N1.7, Pi0, Pi0-FAST and Pi0.5 in PyTorch, so lerobot-train alone often suffices. You want the vendor repo when you need something LeRobot does not expose: NVIDIA's ONNX and TensorRT export and Jetson deployment, or openpi's JAX training and its DROID and ALOHA expert checkpoints. The two paths take different flags, so pick one per project.
Which LeRobot dataset version should I record in?▾
Record whatever your current lerobot produces, which for 0.4.0 and later is v3.0, and convert when a consumer needs something else. v3.0 packs many episodes into shared Parquet and MP4 shards and supports streaming from the Hub, which matters once a dataset gets large. Isaac-GR00T still wants v2 plus meta/modality.json. Converting is fast; re-recording is not.
Are the model weights really open source?▾
The code is. The weights mostly are not, in the strict sense. All four projects use Apache 2.0 for source, but GR00T checkpoints are covered by the NVIDIA Open Model License Agreement and the pi0 family carries the Gemma Terms of Use. Both allow a lot, neither is Apache 2.0, and a fine-tune inherits the base model's terms.
Can I fine-tune GR00T N1.7 on a 24 GB card?▾
Isaac-GR00T's README recommends 40 GB or more of VRAM for fine-tuning and 16 GB or more for inference, and suggests H100 or L40 nodes for throughput. On this platform GR00T N1.7 and N1.5 are cloud-only for that reason, on the A100 80 GB or H100 80 GB tier. With a 24 GB card, SmolVLA and ACT run locally, and both are worth trying before you rent anything.
Why is my GR00T run not reproducible with identical settings?▾
Isaac-GR00T's fine-tuning entry point is a tyro CLI over a FinetuneConfig dataclass with no seed field at all, so two runs with identical flags will not be bit-for-bit identical. LeRobot's train config does set a seed, defaulting to 1000, so the --policy.type=groot path gives you a seed the vendor path does not. If you plan to publish a comparison, that decides which front door to use.
Where does Open X-Embodiment fit if I have an SO-100?▾
Indirectly. It is part of what the foundation models were pretrained on, so you benefit every time you fine-tune GR00T or Pi0.5. You will not train on it directly: it is RLDS rather than LeRobot format, and almost none of its 22 embodiments resembles a 7.4 V hobby arm with a parallel gripper. Treat it as context for why pretrained VLAs generalise, not a substitute for your own episodes.
Sources
- huggingface/lerobot: the LeRobot library, CLI verbs, policy list and plugin discovery
- LeRobotDataset v3.0: directory layout, streaming, and the v2.1 to v3.0 converter
- lerobot on PyPI: version 0.6.1 (3 August 2026) and the release history
- LeRobot GR00T policy docs: the --policy.type=groot path and the N1.5 removal notice
- NVIDIA/Isaac-GR00T: install requirements, N1.7 changes, data format and launch_finetune.py
- nvidia/GR00T-N1.7-3B model card: licence, backbone and TensorRT latency figures
- NVIDIA Open Model License Agreement
- GR00T N1: An Open Foundation Model for Generalist Humanoid Robots (18 March 2025)
- Physical-Intelligence/openpi: checkpoints, hardware table, training and serving commands
- pi-0.5: a Vision-Language-Action Model with Open-World Generalization (22 April 2025)
- nvidia/GR00T-N1.5-3B model card: the OneWay Noncommercial licence on the N1.5 weights
- Open X-Embodiment project page: 60 datasets, 34 labs, 22 embodiments, RT-1-X and RT-2-X
- Open X-Embodiment: Robotic Learning Datasets and RT-X Models (13 October 2023)
- google-deepmind/open_x_embodiment: RLDS access, GCS bucket, Apache 2.0 and CC-BY 4.0 terms
- Learning Fine-Grained Bimanual Manipulation with Low-Cost Hardware (ACT / ALOHA, 23 April 2023)
Sources
- huggingface/lerobot: the LeRobot library, CLI verbs, policy list and plugin discovery
- LeRobotDataset v3.0: directory layout, streaming, and the v2.1 to v3.0 converter
- lerobot on PyPI: version 0.6.1 (3 August 2026) and the release history
- LeRobot GR00T policy docs: the --policy.type=groot path and the N1.5 removal notice
- NVIDIA/Isaac-GR00T: install requirements, N1.7 changes, data format and launch_finetune.py
- nvidia/GR00T-N1.7-3B model card: licence, backbone and TensorRT latency figures
- NVIDIA Open Model License Agreement
- GR00T N1: An Open Foundation Model for Generalist Humanoid Robots (18 March 2025)
- Physical-Intelligence/openpi: checkpoints, hardware table, training and serving commands
- pi-0.5: a Vision-Language-Action Model with Open-World Generalization (22 April 2025)
- nvidia/GR00T-N1.5-3B model card: the OneWay Noncommercial licence on the N1.5 weights
- Open X-Embodiment project page: 60 datasets, 34 labs, 22 embodiments, RT-1-X and RT-2-X
- Open X-Embodiment: Robotic Learning Datasets and RT-X Models (13 October 2023)
- google-deepmind/open_x_embodiment: RLDS access, GCS bucket, Apache 2.0 and CC-BY 4.0 terms
- Learning Fine-Grained Bimanual Manipulation with Low-Cost Hardware (ACT / ALOHA, 23 April 2023)
Ready for high-quality robotics data?
AY-Robots connects your robots to skilled operators worldwide.
Get Started