Embodied VLAs: RT-2, OpenVLA, π0, GR00T
RT-2 (Google DeepMind, July 2023) was the first model to carry web knowledge into a robot arm. It discretized actions into text tokens, co-fine-tuned a VLM on web data plus robot-action data, and showed that web-scale vision-language knowledge transfers to control. OpenVLA (June 2024) shipped the open 7B reference. Physical Intelligence's π0 series (2024-2025) added flow-matching action experts. NVIDIA's GR00T N1 (March 2025) brought dual-system control to humanoids. The VLA primitive, a single model that sees, reads, and acts, is the bridge between this phase's understanding models and the autonomous systems in Phase 15.
Learning Objectives
- Describe action tokenization: discrete bin encoding (RT-2), FAST efficient action tokens, continuous flow-matching actions (π0).
- Explain why co-fine-tuning on web + robot data preserves general-knowledge transfer to novel tasks.
- Compare OpenVLA (open 7B Llama+VLM), π0 (flow-matching), and GR00T N1 (dual-system) on the same robot task.
- Name the Open X-Embodiment dataset and its role as the RT-X training corpus.
The Problem
Robots that do chores from natural-language instructions have been a research target since the 1970s. The 2020s answer is the vision-language-action (VLA) model: the same VLM architecture you use for VQA, except the output is actions (joint torques, end-effector poses, discrete commands) instead of text.
VLAs run into four problems that text models don't:
- Action spaces are continuous and high-dimensional. A 7-DOF arm plus a 3-DOF gripper is 10 dims, emitted at 30 Hz.
- Robot training data is scarce. Open X-Embodiment has ~1M trajectories, while web image-text data runs past 5B.
- Control frequency sets a hard budget. A 30 Hz loop leaves 33 ms per action.
- Safety. A wrong action can damage hardware, people, or property.
The Concept
Action tokenization (RT-2)
RT-2 represents each joint target as a quantized text token. Discretize the normalized [-1, 1] range into 256 bins and map each bin to a vocabulary ID, so a 10-DOF action becomes 10 tokens per control step.
RT-2 co-fine-tunes a PaLM-X VLM on a mixture of two sources:
- Web image-text pairs (captioning, VQA).
- Robot demonstrations, with actions written as tokens.
The model sees "pick up the red cube" (language), then an image (vision), and emits a 10-token action sequence (discretized joint targets). Web pretraining is what keeps general knowledge available: RT-2 can follow "move towards the fast-moving object" even though "fast-moving" isn't in training data.
Inference runs at 3-5 Hz in the RT-2 paper, limited by autoregressive VLM decode.
OpenVLA, the open 7B reference
OpenVLA (Kim et al., June 2024) is the open-weights counterpart to RT-2. It has a 7B Llama backbone, a DINOv2 + SigLIP dual vision encoder, and action tokenization over 256 bins.
It trains on Open X-Embodiment (970k trajectories across 22 robots) and ships with LoRA fine-tuning support for adapting to a new robot.
Inference reaches 4-5 Hz on an A100 with quantization. That is fast enough for slow manipulation and too slow for high-frequency control.
FAST tokenizer: faster action decode
Pertsch et al. (2024) argued that discrete-bin tokenization is inefficient because most actions cluster in a small region of bin-space. FAST (Frequency-domain Action Sequence Tokenizer) compresses action sequences with a DCT and quantizes the coefficients.
A 30-step action trajectory becomes ~10 FAST tokens instead of 300 discrete-bin tokens, and inference speeds up 3-5x without quality loss.
π0 and flow-matching actions
Physical Intelligence's π0 (Black et al., October 2024) replaces discrete action tokens with a flow-matching action expert:
- A small action transformer reads the VLM's hidden states and outputs a continuous 50-step action sequence via rectified flow.
- The action head trains with a flow-matching loss while the VLM pretraining stays unchanged.
- The full action sequence comes out in ~5 denoising steps, which works out to roughly 50 Hz control.
π0 reports beating OpenVLA and Octo on a wide suite of manipulation tasks. A continuous formulation keeps the smoothness that discretization throws away.
π0.5 and π0-FAST are incremental upgrades. π0-FAST combines FAST tokenization with flow matching.
GR00T N1: dual-system control for humanoids
NVIDIA's GR00T N1 (March 2025) targets humanoid robots (>30 DOF, full body) and splits the work in two:
- System 2 is a large VLM that reads the scene and instruction and produces high-level subgoals at ~1 Hz.
- System 1 is a small action-head transformer that produces low-level 50-100 Hz joint commands conditioned on those subgoals.
The split maps to Kahneman's fast-and-slow thinking: System 2 plans, System 1 acts. Slow VLM-sized planning does not block fast control, and System 1 stays small to keep latency down.
GR00T N1.7 (late 2025) improves data scaling. GR00T fine-tunes with sim-to-real data from Omniverse.
Open X-Embodiment
This is the training data. RT-X (October 2023) assembled 22 datasets covering 1M trajectories across 22 robots, and Open X-Embodiment is the corpus most of these models train on:
- ALOHA, Bridge V2, Droid, RT-2 Kitchen, Language Table.
- Each sample is (robot state, camera views, instruction, action sequence).
- Training hygiene means unifying the action space, normalizing joint ranges, and resizing cameras.
OpenVLA and π0 train on Open X-Embodiment. The domain gap to a specific robot is closed by LoRA fine-tuning on 100-1000 task-specific demos.
Co-fine-tuning vs robot-only
Co-fine-tuning mixes web VQA data with robot trajectories, and the ratio matters. Too much VQA and the model forgets actions. Too much robot data and it loses general knowledge.
RT-2 uses roughly 1:1. OpenVLA uses ~0.5:1 web-to-robot, and π0 is similar. Treat the exact ratio as a hyperparameter to tune per dataset size.
Robot-only training gives task-specific models that fail on out-of-distribution instructions. Co-fine-tuning is the difference between "pick up the red cube" (as in the demo) and "pick up the third largest object from the left" (novel phrasing).
Safety and action limits
Every production VLA ships with:
- Hard joint limits, so the arm can't torque past spec.
- Velocity limits (soft clipping).
- Workspace bounds, so the end-effector stays over the table.
- Human-in-the-loop approval for novel tasks.
These sit outside the VLA as control-layer checks. The VLA's output is a suggestion, not a command.
Use It
code/main.py is stdlib Python and does four things:
- Implements 256-bin action tokenization and de-tokenization, with a round-trip check on a 10-DOF action.
- Sketches a FAST-style tokenizer: a per-dimension DCT, the first few coefficients kept, then quantized.
- Compares token counts for a 30-step, 10-DOF trajectory across discrete-bin, FAST, and continuous flow.
- Prints a lineage table of RT-2, OpenVLA, Octo, π0, π0-FAST, and GR00T.
Ship It
This lesson produces outputs/skill-vla-action-format-picker.md. Give it a robot task (manipulation, navigation, or humanoid whole-body control) and it picks between discrete-bin + RT-2, FAST + OpenVLA, flow-matching + π0, or dual-system + GR00T.
I'd run main.py first and look at the token counts before reading anything else. For a 30-step, 10-DOF trajectory, the discrete 256-bin format prints 300 tokens, and the FAST-style compressor prints 40. That is about 7.5x, because the toy keeps 4 DCT coefficients per dimension. Treat the ratio as a feel for the idea, not a benchmark. The ~10 token figure in the body is a general claim about FAST made in the body, not something this script measures.
The flow-matching row prints a count of 1. That is a placeholder for a single head output, not a measurement. The code has no action expert and no denoising loop, so it says nothing about π0's speed or quality. The same goes for the lineage table and the co-fine-tuning ratios: they are printed constants, not results from training anything.
The round-trip demo is the part I'd poke at. The max error comes out at 0.0069 against a bin width of about 0.0078, and it never exceeds one bin because discretize truncates with int(). Try swapping that for rounding and see how much the error shrinks. Then ask whether an error of that size per joint matters on a real arm.
Exercises
-
A 10-DOF arm at 30 Hz control rate. Discrete-bin tokenization at 256 bins emits how many tokens per second? Can a 7B VLM keep up?
-
FAST tokenization compresses 30-step trajectories to ~10 tokens. What does the user lose if the trajectory has high-frequency motion (e.g., drumming)?
-
π0's flow-matching head denoises in ~5 steps. Compare throughput to OpenVLA's autoregressive decode at 4-5 Hz.
-
GR00T's System 1 / System 2 split maps to Kahneman. Propose a different split (System 3?) that might help bipedal walking.
-
Read Open X-Embodiment Section 4 on dataset curation. Name the three curation rules that prevent domain leakage.
Key Terms
| Term | What people say | What it actually means |
|---|---|---|
| VLA | "Vision-language-action" | Model that takes image + instruction and outputs action commands |
| Action tokenization | "Discrete bins" | Quantize continuous joint targets into 256 bins per dim, each a vocab ID |
| FAST tokenizer | "Frequency action tokens" | DCT + quantize to compress 30-step trajectories to ~10 tokens |
| Co-fine-tune | "Mix web + robot" | Train on web VQA data alongside robot demos to preserve general knowledge |
| Flow-matching action head | "π0 continuous output" | Small transformer that outputs a 50-step action sequence via rectified flow |
| System 1 / System 2 | "Dual-system control" | Large VLM plans slowly, small action head acts quickly; GR00T pattern |
| Open X-Embodiment | "RT-X dataset" | 1M-trajectory cross-robot dataset; the training corpus |
Code
- main.py (python, 131 lines)