VerifiedarXiv:2406.0924628 min
Robotics · Multimodal

OpenVLA: An Open-Source Vision-Language-Action Model

A 7B vision-language model that outputs a robot arm's next move as seven tokens.

OpenVLA maps each of the seven numbers that command a robot arm to one of 256 tokens, then fine-tunes an open vision-language model (Llama 2 7B with two image encoders) to predict those tokens from a camera frame and an instruction. Trained on 970k robot episodes, it beats the closed 55B RT-2-X.

Explaining the paperOpenVLA: An Open-Source Vision-Language-Action ModelKim, Pertsch, Karamcheti, Xiao, Balakrishna, Nair, Rafailov, Foster, Lam, Sanketi, Vuong, Kollar, Burchfiel, Tedrake, Sadigh, Levine, Liang, Finn · Stanford / UC Berkeley / TRI / Google DeepMind / Physical Intelligence / MIT · CoRL 2024 · arXiv:2406.09246 ↗

The weights and training code are public, and the paper shows how to fine-tune the model for a new robot on one GPU and how to run it with 4-bit weights.

In 2023 Google DeepMind's RT-2 (project page here) showed that a vision-language model fine-tuned on robot demonstrations can control a robot arm. The arm's continuous commands are converted to integer tokens, and the model predicts them the way it predicts words. Its successor RT-2-X, a 55B-parameter model trained on the pooled Open X-Embodiment robot dataset, was the state of the art for generalist manipulation in early 2024. Neither model's weights were released, and RT-2-X could be queried only through an inference API that does not support fine-tuning.

OpenVLA, by Moo Jin Kim, Karl Pertsch, Siddharth Karamcheti and 15 co-authors, rebuilds the recipe from open parts. It starts from Prismatic-7B, an open vision-language model built on Llama 2 7B, and trains it on 970k robot episodes curated from Open X-Embodiment. With 7B parameters to RT-2-X's 55B, it scores 16.5 points higher in absolute task success, averaged over 29 tasks on two different robots. The paper then measures two ways to make the model cheaper. LoRA fine-tuning on one A100 in 10 to 15 hours matches full fine-tuning on a new robot, and 4-bit weights cut inference memory from 16.8 GB to 7.0 GB with no loss in rollout success. Both were measured on a smaller variant of the model, described in the LoRA section.

The page follows the paper's order: what a manipulation policy outputs; the three parts of the model and the token sequence it trains on; how seven action numbers become seven tokens and back; the training data and recipe; inference; the comparisons with RT-2-X, Octo, RT-1-X and Diffusion Policy; and the fine-tuning and quantization experiments, including why 8-bit inference lost rollouts that 4-bit won.

What a robot manipulation policy outputs

A manipulation policy is a function called in a loop. Each call takes the current camera image and an instruction such as "put the eggplant in the pot" and returns one command for the arm. In OpenVLA the command is seven numbers: the change in the gripper's position along x, y and z, the change in its orientation as roll, pitch and yaw, and the gripper opening, where 0 is closed and 1 is open in the data pipeline OpenVLA uses. The arm's controller turns each relative command into joint motion, and the loop repeats from the new camera frame.

On BridgeData V2, the WidowX dataset behind the paper's main evaluations, 98% of recorded x-axis steps lie between −0.0287 and +0.0283, under 3 cm per command. The demonstrations were recorded with a 5 Hz controller, a new command every 0.2 s, so a policy trained on them is expected to keep up with about that rate, which matters for the quantization result at the end of the page.

Before OpenVLA, learned policies came in two kinds. Imitation-learning policies such as Diffusion Policy are trained from scratch on tens to hundreds of demonstrations of one task in one scene; they can be precise, but everything they know about objects comes from those demonstrations. Generalist policies such as RT-1-X (35M parameters) and Octo (93M) are trained on data pooled from many robots, but they are still small transformers trained from scratch on robot data alone. A vision-language model has instead been pretrained on Internet-scale images and text, so it already associates a photo of a pot with the word "pot" and with "the metal one on the left". A vision-language-action model (VLA) is such a model fine-tuned to output robot commands, so that the policy can use what the model learned from the Internet.

How OpenVLA works: three parts and one token sequence

OpenVLA is the Prismatic-7B vision-language model with no new modules. Prismatic has three parts, drawn in the top half of Figure 1.

The vision encoder runs two pretrained vision transformers on the same 224×224 image. Each cuts the image into 14×14-pixel patches, a 16×16 grid of 256 patches, and outputs one vector per patch (the ViT explainer covers how a transformer reads patches). SigLIP SO400M was trained to match images with their captions, the CLIP objective with a sigmoid loss, and outputs 1152 numbers per patch. DINOv2 ViT-L was trained on images alone by self-distillation (the method of DINO, scaled up) and outputs 1024. For each patch the two vectors are concatenated into one vector of 2176 numbers, so the encoder's output for one image is a 256 × 2176 matrix. The paper sizes the two encoders together at 600M parameters and calls their outputs semantic and spatial features. A plausible reason for the split: a caption rarely changes when a cup moves 2 cm, so caption-matching training has little reason to keep exact positions, while DINOv2's image-only objective does. Prismatic's authors found that adding DINOv2 features improves spatial reasoning, which a controller needs.

The projector is a small MLP that maps each 2176-number patch vector to 4096 numbers, the width of a Llama 2 token embedding. This turns the image into 256 image tokens that the language model processes exactly as it processes embedded words; this construction is the one LLaVA popularized. The paper calls the projector a 2-layer MLP. The fused projector in the released code has three linear layers (2176 → 8704 → 4096 → 4096) with GELU activations between them.

The language model is Llama 2 7B, a 32-layer decoder-only transformer from the LLaMA family. It predicts the next token at every position. OpenVLA changes nothing in it except the meaning of 256 rows of its vocabulary, described in the next section.

The bottom half of Figure 1 shows one training example as Llama sees it: a start token, the 256 image tokens, the prompt "In: What action should the robot take to put the eggplant in the pot?\nOut:", seven action tokens and an end token, a little under 300 positions in total; hovering a segment shows whether it carries a loss.

Figure 1 · OpenVLA architecture and one training sequence
Top: a 224×224 frame goes through SigLIP and DINOv2 in parallel; their per-patch vectors are concatenated, projected to Llama's 4096-number embedding width, and read by Llama 2 7B with the prompt. Bottom: the training sequence. Only the 7 action tokens and the end token have a label; everything else is marked −100 and ignored by the loss. Hover or tap a block or segment for its shape and role.

Why Prismatic and not a better-known model? The authors fine-tuned three open vision-language models into policies on BridgeData V2. LLaVA and IDEFICS-1 were comparable on single-object tasks, and LLaVA was 35% better in absolute success rate on five language-grounding tasks, where the scene holds several objects and the instruction names one. Prismatic beat LLaVA by roughly 10% absolute on both kinds of task, which the authors attribute to the fused SigLIP + DINOv2 features. Input resolution stayed at 224×224: a 384×384 version showed no difference in their evaluations and took 3 times longer to train, because the number of image tokens grows with the square of the side length.

How a continuous action becomes seven tokens

Llama 2 outputs a probability distribution over the 32,000 entries of its vocabulary, so it cannot output the number 0.0100 directly. OpenVLA follows RT-2 and discretizes each action dimension separately into 256 bins, which the released code does in three steps.

First, each of the six motion dimensions is normalized with two statistics of the training data: its 1st percentile q01q_{01} and its 99th percentile q99q_{99}, computed separately for every dataset in the mix. The map sends q01q_{01} to −1 and q99q_{99} to +1 and clips everything outside:

u=clip⁡ ⁣(2 a−q01q99−q01−1,  −1,  1)u = \operatorname{clip}\!\left(2\,\frac{a - q_{01}}{q_{99} - q_{01}} - 1,\; -1,\; 1\right)
(1)

The gripper value is left as it is, 0 or 1, which already lies in [−1, 1]. Second, 256 evenly spaced edges cut [−1, 1] into 255 equal bins, and uu is replaced by the index of its bin (the end of this section explains why this still gives 256 token ids). Third, bin index dd, which the code numbers 1 to 256, becomes token id

token=32000−d  ∈  {31744,…,31999}\text{token} = 32000 - d \;\in\; \{31744, \dots, 31999\}
(2)

so the action vocabulary is the last 256 ids of Llama's 32,000, and a larger action value gives a smaller id. Decoding runs the steps backwards: id to index, index to the centre of its bin, centre back through (1).

A worked example with the real BridgeData V2 statistics from the released checkpoint: for the x-axis, q01=−0.02873q_{01} = -0.02873 and q99=+0.02831q_{99} = +0.02831. Take a command of a=+0.010a = +0.010, 1 cm along x:

u=2⋅0.010+0.028730.05704−1=0.358  ⇒  d=174  ⇒  token 31826u = 2\cdot\frac{0.010 + 0.02873}{0.05704} - 1 = 0.358 \;\Rightarrow\; d = 174 \;\Rightarrow\; \text{token } 31826u=2⋅0.010+0.028730.05704−1=0.358⇒d=174  ⇒  token 31826\begin{aligned} &u = 2\cdot\frac{0.010 + 0.02873}{0.05704} - 1 = 0.358 \\ \Rightarrow\quad & d = 174 \;\Rightarrow\; \text{token } 31826 \end{aligned}

Decoding token 31,826 gives back the centre of bin 174, which un-normalizes to 0.010081: an error of 0.08 mm. Each bin is 0.05704/2550.05704 / 255 = 0.224 mm wide, so any command between the two percentiles comes back within 0.11 mm. The full action for this step, with small moves on the other axes and the gripper open, is the seven ids shown in Figure 1's action cells.

Why the 1st and 99th percentiles and not the smallest and largest values ever recorded, the bounds RT-2 used? The recorded x-axis motion in BridgeData V2 runs from −0.401 to +0.417, more than 14 times the width of the percentile band. With min-max bounds each bin would be 3.2 mm wide, and the middle 98% of all recorded commands would share about 18 of the 255 bins, so the model would have about 18 distinct values for nearly every x-axis motion it ever makes. Yaw is worse: its recorded extremes are ±6.28 rad, a full turn, while 98% of yaw commands lie within ±0.21 rad, a band that min-max bounds would cover with 8 bins. With percentile bounds the band gets all 255 bins, and the cost is that the 2% of commands outside it are clipped to the end bins.

Figure 2 · from one action value to one token and back
0.0100 m
Real BridgeData V2 statistics. Top row: the full recorded range of the chosen dimension, with the 1st-99th percentile band. Middle row: a zoom on that band, with every bin edge drawn; the lit cell is the current bin and the dashed line is the value decoding returns. Bottom row: the 256 action-token ids. Drag the value, then switch to min-max bounds and watch the band shrink to a few bins. Try Δyaw for the extreme case and the gripper, which is binned without normalization.

At the slider's ends, past the percentile band, the readout marks the value clipped: every x-axis command above 0.0283 becomes the same token, and decoding returns 0.0283 or close to it. The gripper shows a side effect of skipping normalization: 0 and 1 land on tokens 31,872 and 31,744, and the lower half of its bins is never used.

Where do 256 free token ids come from? A tokenizer can normally be extended with new tokens, but the Llama tokenizer reserves only 100 special tokens for additions, fewer than 256. OpenVLA, again following RT-2, overwrites the 256 least-used tokens, which in Llama's vocabulary are the last 256. Their embedding rows and output-layer rows are retrained along with everything else, and the text pieces they used to encode can no longer be produced.

In the released code, np.linspace(-1, 1, 256) makes 256 bin edges, which bound 255 intervals. np.digitize returns 1 to 256, and index 256 is reached only by a value of exactly +1, which after clipping means any value at or above the 99th percentile. The model still uses 256 ids, with clipped-high values on their own id; decoding maps index 256 to the centre of the last interval.

Training: next-token prediction on 970k robot episodes

Training uses Llama's ordinary next-token cross-entropy, with every position except the action tokens masked out. For one example with image oo, instruction ℓ\ell and action tokens t1,…,t7t_1, \dots, t_7, the loss is

L(θ)=−∑i=17log⁡pθ ⁣(ti∣o, ℓ, t1,…,ti−1)\mathcal{L}(\theta) = -\sum_{i=1}^{7} \log p_\theta\!\left(t_i \mid o,\, \ell,\, t_1, \dots, t_{i-1}\right)
(3)

and the released code adds the same term for the end token, so the model also learns to stop after seven. The image tokens and the prompt get no loss: the model is never trained to predict the instruction, only to produce the right command after reading it. The gradient reaches every weight, including both vision encoders. One training example in code:

# one OpenVLA training example (shapes for one image; batch omitted)
img, instr, a = sample()              # img 224x224x3, a: 7 floats
p_sig  = siglip(img)                  # [256, 1152]  16x16 patches of 14 px
p_dino = dinov2(img)                  # [256, 1024]  same patches
patch  = concat([p_sig, p_dino], -1)  # [256, 2176]
vis    = projector(patch)             # [256, 4096]  Llama embedding width

u   = clip(2 * (a[:6] - q01) / (q99 - q01) - 1, -1, 1)   # gripper a[6] kept as is
u   = concat([u, a[6:]])                                  # 7 values in [-1, 1]
d   = digitize(u, linspace(-1, 1, 256))                   # 7 ints in 1..256
act = 32000 - d                                           # 7 ids in 31744..31999

ids = tok("<s>In: What action should the robot take to " + instr + "?\nOut: ")
seq = [embed(ids[:1]), vis, embed(ids[1:]), embed(act), embed("</s>")]
logits = llama2_7b(seq)                    # next-token logits at every position
loss = cross_entropy(logits, labels)       # labels = -100 except act and </s>
loss.backward(); adamw.step()              # every weight gets a gradient

The data starts from Open X-Embodiment, which at the time held more than 70 robot datasets and more than 2M trajectories from 22 robots. The authors kept only manipulation datasets with at least one third-person camera and single-arm end-effector control, so that every example has the same kind of image and the same seven-number action, and weighted the remaining datasets with Octo's mixture, which down-weights less diverse datasets. They also added DROID, a newer large dataset, at a 10% weight, saw its action-token accuracy stay low, and removed it for the final third of training. They removed the first step of every BridgeData V2 episode, whose recorded action is all zeros; a model trained with those steps learned to output all-zero commands and froze during evaluation. After these steps 970k episodes remain.

Three choices in the recipe differ from standard vision-language training, and the authors made each from smaller BridgeData V2 experiments before the full run.

The final run used 64 A100 GPUs for 14 days, 21,500 A100-hours, with a batch size of 2048. That cost is paid once; the fine-tuning recipes below start from the released checkpoint.

Running the policy: seven forward passes per command

At test time the prompt is built the same way, the image goes through the encoders once, and Llama generates seven tokens, one forward pass each, reusing the cached keys and values of earlier positions. The seven ids are decoded with the 1st and 99th percentiles of a dataset chosen by name, for example BridgeData V2 for a WidowX in a similar scene:

# inference: one command from one camera frame
ids  = llama2_7b.generate(prompt_with_image, max_new_tokens=7)  # greedy
d    = 32000 - ids                        # 1..256
c    = clip(d - 1, 0, 254)                # index of a bin interval
u    = bin_centers[c]                     # 255 centres in (-1, 1)
a    = where(mask, (u + 1) / 2 * (q99 - q01) + q01, u)  # mask False for gripper
robot.send(a)                             # q01/q99 of the chosen dataset

Because the statistics are per dataset, the command scale belongs to one robot and controller in the training mix; a new robot needs fine-tuning (and its own statistics). In bfloat16, 2 bytes per parameter, the model needs 15 GB of GPU memory and runs at about 6 Hz on one RTX 4090, without compilation, speculative decoding or other speed-ups. The authors also release a server that runs the model on a remote GPU and streams commands to the robot.

How OpenVLA compares with RT-2-X, Octo and RT-1-X

The out-of-the-box evaluation used two robots that earlier generalist policies had been tested on, with every policy run from the same initial robot and object states. The first is the WidowX from BridgeData V2: 17 tasks with 10 trials each, 170 rollouts per policy. The tasks are grouped by what they change relative to the training data: visual (unseen backgrounds, distractor objects, new object appearances), motion (unseen object positions and orientations), physical (unseen object sizes and shapes), semantic (unseen target objects, instructions and concepts from the Internet) and language grounding (several objects, one of them named in the instruction). The second is the Google mobile manipulator from the RT-1 and RT-2 papers: 12 tasks with 5 trials each, 60 rollouts.

On BridgeData V2, OpenVLA averages 70.6% ± 3.2% success against RT-2-X's 50.6% ± 3.5% (the ± is the standard error over 170 rollouts). Octo reaches 20.0% and RT-1-X 18.5%; the paper reports both failing to manipulate the right object when distractors are present and sometimes waving the arm around aimlessly. OpenVLA leads RT-2-X in every category except semantic generalization, where RT-2-X scores 38.8% against 36.3%. On the Google robot the two are comparable, 85.0% ± 4.6% against 78.3% ± 5.4% with overlapping error bars: OpenVLA leads in-distribution (88.0% against 72.0%) and they tie at 82.9% out of distribution. RT-1-X and Octo score 33.3% and 26.7%. Over all 29 tasks on both robots OpenVLA leads RT-2-X by 16.5 points, the abstract's headline, with a seventh of the parameters.

Figure 3 · rollout success by category and by task
average
OpenVLA (teal) against the baselines (amber) on the paper's three real-robot suites. Pick a suite, then step the slider through its categories or tasks; the line under the bars gives the gap to the strongest baseline. On Bridge only semantic goes to RT-2-X. The fine-tune suite is discussed in the next section.

The paper credits the gap to three factors. OpenVLA's curated dataset is larger, 970k episodes against about 350k for RT-2-X. It was cleaned more carefully: RT-2-X was trained with the all-zero first steps of BridgeData V2 left in, and the authors report that it often freezes on Bridge tasks unless the way it is queried is changed. And OpenVLA's encoder adds DINOv2's spatial features to SigLIP's semantic ones. The semantic category goes the other way for a different reason. RT-2-X was co-fine-tuned on robot data and Internet image-text data together, which keeps more of its pretraining knowledge about unseen objects and concepts; OpenVLA was fine-tuned on robot data only.

Fine-tuning OpenVLA to a new robot

A lab whose robot or scene is not in the training mix usually cannot use the out-of-the-box model as is, so the second question is how well OpenVLA adapts. The test uses Franka Emika Panda arms in two setups: Franka-Tabletop, a table-mounted arm with a 5 Hz controller, and Franka-DROID, the setup of the DROID dataset with a 15 Hz controller. Seven tasks have 10 to 150 demonstrations each, and every policy is evaluated on 129 rollouts. OpenVLA is fully fine-tuned on each task's demonstrations, which takes 8 A100s for 5 to 15 hours per task.

The comparisons: Diffusion Policy trained from scratch on the same demonstrations, a version of it restricted to OpenVLA's inputs and outputs, Octo fine-tuned on the same data (RT-2-X's API does not allow fine-tuning), and an ablation called OpenVLA (scratch), which fine-tunes the Prismatic model directly with no robot pretraining. Select the fine-tune suite in Figure 3 and step through the tasks.

No policy wins every task. Diffusion Policy wins the two narrow single-instruction tasks, "put carrot in bowl" (66.7% against OpenVLA's 60.0%) and "pour corn into pot" (93.3% against 53.3%). The pretrained generalists win the tasks with several objects in the scene and an instruction naming one of them: on "move <object> onto plate" OpenVLA scores 69.4% and Diffusion Policy 19.4%. OpenVLA has the best average on both setups, 67.2% against Diffusion Policy's 48.5% on Franka-Tabletop and 58.3% against 35.0% on Franka-DROID, and it is the only policy with at least 50% on every task. The abstract summarizes the comparison as a 20.4% margin over Diffusion Policy. OpenVLA (scratch) averages 43.4% on Franka-Tabletop, 23.8 points below the pretrained model, which measures what the 970k episodes of robot pretraining contribute.

On the tasks Diffusion Policy wins, the paper describes its trajectories as smoother and more precise. Diffusion Policy predicts a chunk of future actions at once (8 actions at 5 Hz, executing the first 3 before predicting again) from two frames of history plus the robot's proprioceptive state, and smooths across chunks; OpenVLA predicts one action at a time from one frame. The authors name action chunking and temporal smoothing as likely ways to give OpenVLA the same dexterity.

In simulation the margins are smaller. On the four LIBERO task suites (Appendix E), fine-tuned OpenVLA averages 76.5% against 75.1% for fine-tuned Octo and 72.4% for Diffusion Policy. The authors attribute the narrower gap to OpenVLA's pretraining on real-robot data only, with no simulation data.

LoRA and other cheaper ways to fine-tune OpenVLA

Full fine-tuning a 7B model needs more memory than one GPU has. The paper compares six fine-tuning strategies on Franka-Tabletop tasks (33 rollouts each), recording GPU memory at batch size 16. These experiments, and the quantization experiments in the next section, used a smaller OpenVLA variant: a SigLIP-only encoder, pretrained on Octo's Open X-Embodiment mixture instead of the 970k-episode one.

LoRA freezes every pretrained weight matrix WW and trains a low-rank correction beside it:

W′=W+BA,B∈Rdout×r,  A∈Rr×dinW' = W + BA, \qquad B \in \mathbb{R}^{d_{\text{out}} \times r},\; A \in \mathbb{R}^{r \times d_{\text{in}}}
(4)

For one of Llama's 4096 × 4096 attention projections at rank r=32r = 32, BB and AA hold 2 × 4096 × 32 = 262,144 trainable numbers against 16,777,216 frozen ones, 1.6%. OpenVLA applies LoRA to every linear layer of the model, including the vision encoder's; in total 97.6M of the 7,188.1M parameters train, 1.4%. The frozen weights need no gradients and no optimizer state, which saves most of the memory.

The six strategies from the paper's Table 1:

Figure 4 plots the same rows as success against memory. LoRA at rank 32 is within error of full fine-tuning at 37% of its memory (59.7 GB against 163.3 GB), on one GPU instead of two, and the paper recommends it as the default. The two strategies that leave the vision encoder untouched, last layer only and frozen vision, perform poorly; last layer only, at 30.3%, scores below fine-tuning the Prismatic model with no robot pretraining at all (43.4% on the same Franka-Tabletop tasks in the previous section). Sandwich does better because it trains the encoder, at almost ten times LoRA's trainable parameters. A LoRA fine-tune takes 10 to 15 hours on one A100, which the paper counts as an 8× reduction in compute against full fine-tuning.

Figure 4 · success against GPU memory, fine-tuning and inference
fine-tune plots Table 1: LoRA r=32 sits at the top left, 68.2% at 59.7 GB, next to Full FT's 69.7% at 163.3 GB. inference plots Table 2: int4 matches bfloat16 at less than half the memory while int8 drops. Hover or tap a point for its numbers.

Quantization: why int8 lost rollouts and int4 did not

To run on smaller GPUs, the weights can be stored at lower precision. The paper serves the model with the 8-bit method of LLM.int8() and the 4-bit method used by QLoRA, and runs 8 BridgeData V2 tasks with 80 rollouts per precision (Table 2, the inference view of Figure 4):

4-bit matches bfloat16 in less than half the memory. 8-bit, which keeps more precision than 4-bit, loses 13 points because its extra quantization operations slow inference on most GPUs the paper measured; 4-bit pays the same kind of overhead but moves a quarter of bfloat16's bytes from memory per token, which compensates for it. On the A5000 used for these rollouts, 8-bit ran at 1.2 Hz and 4-bit at 3 Hz. The BridgeData V2 demonstrations were recorded with a 5 Hz non-blocking controller, one that keeps the arm moving while the next command is computed.

Figure 5 draws the timing. The top lane is the training data, a command every 0.2 s. The middle lane is the model: each bar is one inference, from the frame it reads (amber dot) to the command it emits (bright tick). The bottom lane is the arm. At 1.2 Hz a command arrives every 0.83 s, 4.2 times the interval in the training data, and the arm has kept moving for 0.83 s since the frame behind that command was taken. In the paper's words, 1.2 Hz "significantly changes the system dynamics compared to the training dataset"; at 3 Hz, 4-bit is closer to the dynamics seen during data collection.

Figure 5 · inference rate against a 5 Hz control loop
1.2 Hz
Pick a precision and GPU from the paper, or drag the inference rate from 0.5 to 10 Hz. In non-blocking mode the arm keeps moving while the model computes; in blocking mode it waits, so each frame matches the state the command is applied to, at any rate. The readout quotes the paper's success rate for the A5000 presets under each mode.

The paper tests this explanation two ways. Offline, on training data, 8-bit and 4-bit predict action tokens with accuracy comparable to bfloat16, so the 8-bit weights are not producing worse tokens. And with blocking control, where each command is fully executed before the next frame is taken, speed stops mattering: 8-bit scores 74.4% ± 4.9%, bfloat16 70.0% ± 5.1% and 4-bit 68.8% ± 5.2% (Appendix D.4, Table 11). Switch Figure 5 to blocking to see the arm wait.

Limitations the paper names

One camera frame in, nothing else. OpenVLA reads a single image. It takes no history of earlier frames, no proprioception (the robot's own joint and gripper state) and no second camera, all of which many robot setups provide. The authors suggest that vision-language models pretrained on interleaved image and text data could make multi-image input a fine-tuning change.

Throughput. About 6 Hz on an RTX 4090 suits 5 Hz tabletop control. An ALOHA bimanual setup runs at 50 Hz. The paper names action chunking, which emits several future commands per inference as Diffusion Policy does, and speculative decoding, where a small model drafts tokens and the large one checks them, as possible remedies.

Reliability. On the tested tasks OpenVLA typically succeeds less than 90% of the time; its averages in this paper are 70.6% on BridgeData V2 and 85.0% on the Google robot.

Open design questions. The authors list the size of the base vision-language model, whether co-training on robot and Internet data together (as RT-2-X did) helps, and which visual features are best, as questions their compute budget left unanswered.

Provenance Verified against primary literatureHow we verify
RT-2 (Brohan et al., 2023)Introduced the vision-language-action framing: fine-tune a vision-language model so that robot actions, discretized into 256 bins per dimension, are output as text tokens, overwriting the least-used tokens of the vocabulary. Used min-max bin bounds. OpenVLA keeps the recipe, switches to 1st-99th percentile bounds, and replaces the closed PaLI-X / PaLM-E backbones with open Prismatic-7B.
RT-1 (Brohan et al., 2022)Robotics Transformer trained from scratch. Already mapped each action dimension to 256 bins uniformly spread over that variable's bounds; RT-2 and OpenVLA carry the 256-bin scheme forward.
Open X-Embodiment (Padalkar et al., 2023)Pooled robot data: more than 70 datasets and more than 2M trajectories when OpenVLA was written, from 22 robots. OpenVLA filters it to single-arm, end-effector-controlled manipulation data with a third-person camera, weights it with Octo's mixture, and trains on 970k episodes. RT-2-X and RT-1-X are this paper's models.
Prismatic VLMs (Karamcheti et al., 2024)The base model: SigLIP + DINOv2 features concatenated per patch, an MLP projector, Llama 2 7B, fine-tuned on the LLaVA 1.5 data mixture. OpenVLA chose it over IDEFICS-1 and LLaVA in BridgeData V2 experiments and adds no new modules.
Llama 2 (Touvron et al., 2023)The 7B language model. Its tokenizer has 32,000 entries (the Llama 2 paper: a 32k vocabulary) and reserves only 100 special tokens for additions, which is why OpenVLA overwrites the last 256 entries instead of adding new ones.
LoRA (Hu et al., 2021)Low-rank adapters on every linear layer. At rank 32, 97.6M of 7,188.1M parameters train (1.4%) and Franka-Tabletop success matches full fine-tuning, 68.2% against 69.7%.
QLoRA and LLM.int8() (Dettmers et al., 2023 and 2022)The 4-bit and 8-bit weight-quantization methods the paper cites for its inference experiment.
Octo (Octo Model Team, 2024)Open 93M-parameter generalist policy trained from scratch on Open X-Embodiment. Baseline on BridgeData V2 and the Google robot, and the only fine-tunable generalist baseline in the Franka experiments.
Diffusion Policy (Chi et al., 2023)From-scratch imitation learning with action chunks generated by denoising. Beats OpenVLA on the narrow single-instruction Franka tasks; trails it by 20.4% overall in the paper's fine-tuning comparison.
openvla/openvla code and openvla-7b checkpointGround truth for details the paper leaves open: prismatic/vla/action_tokenizer.py (256 edges, token = 32000 - digitize index), prismatic/vla/datasets/datasets.py (prompt "What action should the robot take to ...?", labels on action tokens and </s> only), prismatic/util/nn_utils.py (FusedMLPProjector), and config.json norm_stats (the BridgeData V2 q01/q99 used on this page).
correctionAttribution first. OpenVLA did not invent the vision-language-action recipe, the 256-bin action discretization or the trick of overwriting the least-used tokens: all three follow RT-2, and the 256 uniform bins go back to RT-1. The fused SigLIP + DINOv2 encoder, the projector and the channel-wise concatenation are Prismatic's design. OpenVLA's own contributions are the open weights and code, the 970k-episode curation of Open X-Embodiment, the fine-tuning results (LoRA at rank 32 matching full fine-tuning), and the finding that 4-bit inference keeps rollout success while 8-bit loses it through speed. The Llama tokenizer has 32,000 entries; the "100 special tokens" are the slots it reserves for additions. The 16.5-point headline over RT-2-X is an average over 29 tasks on two robots (about 20 points on BridgeData V2, a near tie on the Google robot), and RT-2-X still leads on semantic generalization. Three places where the paper and the released code differ: the paper's quantile bounds replace min-max bounds it attributes to RT-2, not RT-1; the paper describes a 2-layer MLP projector, while the fused projector in the code has three linear layers (2176 to 8704 to 4096 to 4096); and the paper says each dimension is binned into integers 0 to 255, while the code builds 256 bin edges, so 255 intervals, assigns indices 1 to 256 (index 256 only to values clipped at the 99th percentile) and token 32000 minus the index. Finally, the LoRA and quantization tables (Tables 1 and 2) were measured on a smaller variant, SigLIP-only and pretrained on Octo's data mixture, not on the released model.

Questions you might still have

?

Why discretize actions instead of adding a regression head?
Because the language model already outputs a categorical distribution over tokens and is trained with cross-entropy. Binning lets OpenVLA reuse the output layer, the loss and the decoding code unchanged, with no new module to initialize. Binning limits resolution to 255 intervals per dimension. On BridgeData V2 statistics that is 0.22 mm per bin along the x-axis, and decoding returns the bin centre, so the round-trip error is at most half a bin for values inside the 1st-99th percentile range.

?

Why overwrite 256 existing Llama tokens instead of adding new ones?
The Llama tokenizer reserves only 100 special tokens for additions, fewer than 256. Following RT-2, OpenVLA takes the last 256 entries of the 32,000-entry vocabulary, which are the least used, and lets fine-tuning retrain their embedding and output rows. The text pieces those ids encoded can no longer be produced, which costs nothing for a policy that only answers with actions.

?

Did OpenVLA invent the vision-language-action model?
No. RT-2 introduced the framing and the action-as-token recipe in 2023, and RT-2-X applied it to Open X-Embodiment data. OpenVLA is an open model of that kind, with weights, training code and fine-tuning and quantization recipes released. The RT-2 explainer covers the original recipe.

?

How does a 7B model beat the 55B RT-2-X?
The paper credits three things: a larger curated training set (970k episodes against 350k), more careful data cleaning (for example removing the all-zero first action of every BridgeData V2 episode, which made RT-2-X freeze in place), and the fused SigLIP + DINOv2 encoder. RT-2-X keeps the lead on semantic generalization, where its co-fine-tuning with Internet data helps.

?

Why did 8-bit quantization score lower than 4-bit?
Speed. On the A5000 used for the rollouts, 8-bit inference ran at 1.2 Hz and 4-bit at 3 Hz, while the BridgeData V2 data was recorded with a 5 Hz non-blocking controller. Offline, all three precisions predict training-set tokens with comparable accuracy, and with blocking control, where the arm waits for each command, 8-bit scores 74.4% against 70.0% for bfloat16 and 68.8% for 4-bit.

?

Why is the vision encoder trained when vision-language models usually freeze it?
Freezing worked better for Prismatic's image-and-text tasks, and the OpenVLA authors tried it. In an earlier-stage BridgeData V2 experiment, fine-tuning the encoder gave 80.0% average success against 46.7% frozen. Their hypothesis is that the pretrained features lack the fine spatial detail precise control needs.

?

Can I run OpenVLA on my own robot without fine-tuning?
Only if your setup resembles one in the training mix. The output is un-normalized with one dataset's 1st and 99th percentiles, chosen by name at inference, so the command scale is tied to that dataset's robot and controller. For a new robot the paper's recipe is to collect 10 to 150 demonstrations and fine-tune, with LoRA if you have one GPU.

?

How fast does it run, and is that enough?
About 6 Hz on one RTX 4090 in bfloat16 with 15 GB of memory, with no compilation or speculative decoding. That matches 5 Hz tabletop setups and is far from the 50 Hz an ALOHA bimanual setup runs at; the paper names action chunking and speculative decoding as possible fixes.

Footnotes & further reading

  1. The paper: Kim, Pertsch, Karamcheti et al., OpenVLA: An Open-Source Vision-Language-Action Model (CoRL 2024, PMLR 270). Project page, weights and notebooks.
  2. Code: github.com/openvla/openvla (action tokenizer, prompt and loss masking, projector) and the openvla-7b checkpoint, whose config.json holds the per-dataset action statistics used in Figure 2.
  3. The VLA recipe and action tokens: Brohan et al., RT-2: Vision-Language-Action Models Transfer Web Knowledge to Robotic Control (2023; our RT-2 explainer), building on RT-1 (2022).
  4. The robot data: Open X-Embodiment Collaboration, Open X-Embodiment: Robotic Learning Datasets and RT-X Models (2023); Walke et al., BridgeData V2 (2023); Khazatsky et al., DROID (2024).
  5. The base model: Karamcheti et al., Prismatic VLMs: Investigating the Design Space of Visually-Conditioned Language Models (2024); Touvron et al., Llama 2 (2023).
  6. The vision encoders: Zhai et al., SigLIP (2023), and Oquab et al., DINOv2 (2023).
  7. Efficiency methods: Hu et al., LoRA (2021; our LoRA explainer); Dettmers et al., QLoRA (2023) and LLM.int8() (2022).
  8. The baselines: Octo Model Team, Octo (2024), and Chi et al., Diffusion Policy (2023; our Diffusion Policy explainer). The simulation benchmark: Liu et al., LIBERO (2023).