The AY-Robots policy comparison table showing GR00T N1.7, GR00T N1.5, Pi0.5, SmolVLA and ACT with parameters, GPU tier, latency and minimum episodes
Open sourceLeRobotIsaac-GR00TopenpiOpen X-EmbodimentVLA

The Open Source Robot Learning Ecosystem: Who Ships What

AY-Robots ResearchAugust 23, 202622 min read

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.

ProjectPublisherWhat it actually isCode licenceWeights or data licence
LeRobotHugging FaceRobot drivers, teleop, the dataset format, ~20 policy implementations, train and eval CLIsApache 2.0Per model; pi05_base carries Gemma terms
Isaac-GR00TNVIDIAReference implementation of the GR00T N-series plus ONNX, TensorRT and Jetson deploymentApache 2.0Per checkpoint: N1.7 under the NVIDIA Open Model License Agreement, N1.5 under the OneWay Noncommercial License
openpiPhysical IntelligenceJAX-first training and serving for pi0, pi0-FAST and Pi0.5, with a PyTorch pathApache 2.0Gemma Terms of Use
Open X-Embodiment21-institution collaboration, via Google DeepMindPooled dataset in RLDS form, plus the RT-1-X and RT-2-X resultsApache 2.0CC-BY 4.0, per-dataset terms beneath
ALOHA / ACTStanfordThe original Action Chunking with Transformers reference designApache 2.0, inside LeRobotNone, 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.

bash
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 hardware
Install and CLI verbs, from the repository README (verified 24 August 2026).

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

Third-party hardware is discovered by package name

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

FlagDefaultComment
--seed1000Set, so a lerobot run is reproducible
--batch_size8Too small for a 3 B VLA on 80 GB, too large for one on 24 GB
--steps100000Most SO-100 fine-tunes converge long before this
--save_freq20000Checkpoint interval
--log_freq200Console and W&B logging
--eval_steps0No 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.1LeRobotDataset v3.0
File layoutOne Parquet and one MP4 per episodeMany episodes packed into shared shards
Episode boundariesImplied by filenamesResolved through meta/episodes/ metadata
StreamingNoStreamingLeRobotDataset, or --dataset.streaming=true
Shipped inlerobot up to 0.3.xlerobot 0.4.0 and later
Read by Isaac-GR00TYes, plus meta/modality.jsonNo, must be converted down first
The trap that eats a day: a v3.0 dataset handed to the GR00T loader

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.

bash
# 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>
Both directions. The GR00T-side converter runs in its own virtualenv because its dependencies conflict with the main GR00T install.
The AY-Robots public dataset directory listing LeRobot-format datasets with their episode counts
The /directory page. Datasets here are in LeRobot format, which is what makes them usable by lerobot-train directly, by openpi after a config change, and by Isaac-GR00T after a version conversion.

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 tagPublishedWhere the code lives now
n1-release11 June 2025n1-release branch
n1.5-release15 December 2025n1d5 branch
n1.6-release15 April 2026n1d6 branch
n1.7-release18 April 2026main

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.

bash
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 4
The single-GPU fine-tune from the Isaac-GR00T README.

The 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 fieldUpstream defaultWhy it matters
global_batch_size64Across all GPUs, not per device
learning_rate1e-4Same order as the platform default for N1.7
max_steps10000Short next to lerobot's 100000
save_steps1000Checkpoint interval
save_total_limit5Older checkpoints are deleted, silently
tune_llm / tune_visualfalse / falseBackbone frozen by default
(no seed field)n/aThe tyro config has no seed at all
Two GR00T details that will cost you an evening

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.

ModeMemory stated by openpiExample GPU
Inference> 8 GBRTX 4090
Fine-tuning (LoRA)> 22.5 GBRTX 4090
Fine-tuning (full)> 70 GBA100 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.

  1. 1
    Compute normalisation statistics

    openpi refuses to train without them, and the error is not obvious the first time. Once per config.

    bash
    uv run scripts/compute_norm_stats.py --config-name pi05_libero
  2. 2
    Train

    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.

    bash
    XLA_PYTHON_CLIENT_MEM_FRACTION=0.9 uv run scripts/train.py pi05_libero \
      --exp-name=my_experiment --overwrite
  3. 3
    Serve 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.

    bash
    uv run scripts/serve_policy.py policy:checkpoint \
      --policy.config=pi05_libero \
      --policy.dir=checkpoints/pi05_libero/my_experiment/20000
  4. 4
    Or 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.

    bash
    uv run examples/convert_jax_model_to_pytorch.py \
      --checkpoint_dir /path/to/jax/checkpoint \
      --output_path /path/to/converted/pytorch/checkpoint
The licence on the weights is not the licence on the repo

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.
bash
# 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/
Open X-Embodiment access, from the google-deepmind/open_x_embodiment README.

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 haveYou wantThe path
An SO-100 and no dataA working policylerobot-record, fine-tune SmolVLA or ACT, lerobot-rollout
A LeRobot v3.0 datasetGR00T N1.7 fine-tuneconvert_v3_to_v2.py, add meta/modality.json, launch_finetune.py
A LeRobot v2.1 datasetSmolVLA or Pi0.5 fine-tuneconvert_dataset_v21_to_v30, then lerobot-train
Data in RLDS or a custom formatAny of the aboveA converter modelled on openpi's convert_libero_data_to_lerobot.py
A trained openpi checkpointPyTorch deploymentconvert_jax_model_to_pytorch.py, then serve_policy.py
An N1.5 checkpoint from 2025To keep using it in LeRobotPin 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.

ArtefactLicencePractical consequence
lerobot, Isaac-GR00T, openpi and open_x_embodiment sourceApache 2.0Vendor it, modify it, ship it
GR00T N1.7 weightsNVIDIA Open Model License AgreementRead it before productising; it is not Apache
GR00T N1.5 weightsNVIDIA OneWay Noncommercial LicenseNoncommercial terms, not the same licence as N1.7; check before you ship
pi0 and Pi0.5 weightsGemma Terms of UseUse and distribution terms attach to derivatives
Open X-Embodiment dataCC-BY 4.0, per-dataset terms beneathAttribution required; check the individual row
ACTNo pretrained weights existNothing to license, you train from scratch
A fine-tune inherits the base model's terms

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.

  1. 1
    Record the dataset

    Install lerobot, calibrate leader and follower, record 50 episodes. You get LeRobotDataset v3.0.

    bash
    pip 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"
  2. 2
    Convert 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.

    bash
    cd 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
  3. 3
    Build 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.

    bash
    git 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=...
  4. 4
    Rent 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.

    bash
    CUDA_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
What this buys you

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.

Running the open stack yourself: the honest ledger

Assembling LeRobot, Isaac-GR00T and openpi by hand
Advantages
  • 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.
Trade-offs
  • 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.

7.4 V, not 12 V

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.

The AY-Robots teleoperator page showing an SO-100 arm and an invitation to become a remote robot operator
The /teleoperator page. Data collection is still human work: someone drives the arm through the task enough times for the dataset to mean anything.

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.

The AY-Robots pricing page showing what a training run costs
The /pricing page. Run cost is dominated by GPU tier: about 4 to 12 USD on the 80 GB tier, 1 to 3 USD on the 24 GB tier.

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 Arena

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

  1. 1
    Drive 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.

  2. 2
    Record 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.

    bash
    lerobot-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"
  3. 3
    Train 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.

    bash
    lerobot-train \
      --policy.type=act \
      --dataset.repo_id=${HF_USER}/cube-pick \
      --batch_size=8 \
      --steps=100000
  4. 4
    Then 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.

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started