Why the format matters more than it sounds
Every research group used to invent its own recording layout, which meant every dataset needed a bespoke loader. LeRobot, maintained by Hugging Face, ended most of that. Recording into it means you can hand your data to a policy trainer you did not write, and it will load.
What the layout looks like
A LeRobot dataset is a directory of Parquet files for the numeric streams, encoded video for the camera streams, and JSON metadata describing what the columns mean. The client writes this directly, so there is no conversion step.
my_so100_pick/
├── meta/
│ ├── info.json # fps, robot type, feature schema
│ ├── episodes.jsonl # one line per episode, with its task string
│ └── stats.json # per-feature mean/std, used for normalisation
├── data/
│ └── chunk-000/
│ └── episode_000000.parquet # joint states + actions per frame
└── videos/
└── chunk-000/
├── observation.images.wrist/episode_000000.mp4
└── observation.images.scene/episode_000000.mp4Version 2.1 versus 3.0
LeRobot v3.0 reorganised how episodes are chunked and how metadata is stored, mainly to handle datasets far larger than a single workstation records. It is the better format going forward. The catch is that the training ecosystem moved more slowly than the format did.
| v2.1 | v3.0 | |
|---|---|---|
| Episode files | One Parquet file per episode | Episodes batched into larger chunks |
| Metadata | episodes.jsonl | Restructured, with additional index files |
| Large datasets | Slows down past a few thousand episodes | Designed for it |
| Trainer support | Accepted nearly everywhere | Still patchy in third-party trainers |
NVIDIA GR00T will not load a v3.0 dataset. If you plan to fine-tune GR00T, record or export as v2.1. This is the single most common reason a training job fails immediately after upload, and the error message is not obvious about the cause.
The platform reads both versions for dataset preview and archiving, so you can inspect either. The constraint is on the training side, not on ingest.
Exporting and moving datasets
The client writes LeRobot directly during recording. If you already have recordings elsewhere, the CLI can package a local directory and upload it as an archive.
# Inspect what you have locally
ay-robots datasets list --local
# Upload an existing LeRobot directory
ay-robots datasets upload ./my_so100_pick --name "SO-100 pick v1"
# Pull one back down
ay-robots datasets download <dataset-id> --out ./restoredFrequently asked questions
Which version should I record in?▾
v2.1 unless you have a specific reason not to. It is accepted by more trainers, including GR00T, and the scaling advantages of v3.0 only start to matter well past the dataset size a single SO-100 produces.
Can I convert v3.0 back to v2.1?▾
Yes, the LeRobot tooling ships conversion scripts in both directions. Expect it to take a few minutes for a mid-sized dataset since the video files get re-chunked.
Does my dataset have to be public on the Hugging Face Hub?▾
No. The format and the hub are separate things. Datasets recorded with the client stay in your account unless you publish them yourself.