Paper · 2024-06-13 · cs.RO, cs.LG
OpenVLA: An Open-Source Vision-Language-Action Model
OpenVLA is a 7B-parameter vision-language-action model: a Prismatic VLM with fused DINOv2+SigLIP vision and a Llama 2 7B backbone, fine-tuned to output 7 robot-action dimensions as 256-bin tokens on 970k Open X-Embodiment episodes. Authors report 70.6% (BridgeData V2) and 85.0% (Google robot) mean success, above RT-2-X (55B), and LoRA fine-tuning that matches full fine-tuning.
Vision-language-action modelImitation learningLow-rank adaptation (LoRA and variants)Weight quantizationroboticsvision-language-actionimitation-learningfine-tuningquantization
arXivPDFCodeMarkdown11 min read
AI-compiled by claude-haiku-5-5 on 2026-10-18, not yet reviewed by a human. Every claim cites its source; check it when a detail matters.
In plain words
A robot arm can be taught a task by copying examples, but each new task or robot usually needs its own model. OpenVLA is one large model meant to be a starting point for many robots. You give it a camera image and a sentence such as "put the carrot in the bowl", and it outputs the motor commands for the next moment.
It is built by taking a model that already understands pictures and text and training it further on about 970k recorded robot demonstrations from many different robots. The robot commands are written as word-like tokens, so the model predicts them the same way it predicts words. The authors release the weights and the training code, and they show that the model can be adapted to a new robot with a small, cheap fine-tuning step that runs on a single GPU.
TL;DR
OpenVLA is a 7B-parameter open vision-language-action model trained on 970k Open X-Embodiment episodes §1 §3.3. The authors report that it beats the closed 55B RT-2-X on two robot platforms §5.1 and that LoRA fine-tuning on a new robot matches full fine-tuning §5.3. Use the card when you need to implement the model, its action tokenizer, or its fine-tuning recipe. Check the Paper vs code section before copying any number: the released mixture weights differ from the paper's table.
Problem
Robot policies trained on task-specific data generalise poorly to new distractor objects and to new instructions §1. Large vision-language models carry broad knowledge, but the authors note that VLAs (such as RT-2) were closed, and that no best-practice guidance existed for adapting them to new robots or tasks, especially on consumer hardware §1.
Method
Architecture. The model has three parts: a vision encoder, a projector and an LLM backbone §3.1 fig. 2. The vision encoder concatenates DINOv2 and SigLIP features channel-wise, so each image patch gets both feature sets. The encoder is about 600M parameters, the projector is a two-layer MLP, and the backbone is Llama 2 7B. The model starts from the Prismatic-7B VLM §3.1.
Action tokens. Each of the 7 action dimensions is discretized separately into one of 256 bins. The bin width divides the interval between the 1st and 99th percentile of that dimension in the training data, which ignores outliers §3.2. The 256 action tokens overwrite the 256 least-used tokens of the Llama tokenizer, which are the last 256 vocabulary entries §3.2.
Training objective. The model is trained with next-token prediction, and the cross-entropy loss is computed only on the action tokens §3.2. The authors fine-tune all weights, including the vision encoder, because freezing it hurt VLA performance in their runs §3.4.
Data. The authors keep only manipulation datasets with at least one third-person camera and single-arm end-effector control, then reuse the Octo mixture weights §3.3. DROID is added at a 10% weight, but it is removed for the final third of training because its action-token accuracy stayed low §3.3 app. A. The full list of datasets and weights is in app. A.
Training recipe. Pretraining uses a fixed learning rate of 2e-5 without warmup, a global batch of 2048, and 27 epochs over the mixture §3.4 §3.5. Training ran on 64 A100 GPUs for 14 days, or 21,500 A100-hours §3.5.
Inference. The model produces 7 action tokens, decodes them to continuous actions, and un-normalises them. Single-image input only; no proprioception and no observation history §6. Inference in bfloat16 needs about 15 GB of GPU memory and runs at about 6 Hz on one RTX 4090 without compilation or speculative decoding §3.5. A remote inference server is provided §3.5.
Fine-tuning. Full fine-tuning on 10 to 150 demonstrations per task §5.2. LoRA with rank 32 on all linear layers matches full fine-tuning on the Franka-Tabletop tasks while training 1.4% of the parameters §5.3. With LoRA, a new task takes 10 to 15 hours on a single A100 §5.3.
Pseudocode: action tokenization (paper §3.2; code action_tokenizer.py).
# Normalise one action dimension to [-1, 1] with its 1st and 99th percentiles
# [§3.2] [code: prismatic/vla/datasets/rlds/utils/data_utils.py#L76-L88]
def normalise(action, low, high):
scaled = 2 * (action - low) / (high - low + 1e-8) - 1
return clip(scaled, -1, 1) # (7,)
# Digitize into 256 uniform edges over [-1, 1]; ids run from 1 to 256
# [§3.2] [code: prismatic/vla/action_tokenizer.py#L31-L41]
def action_to_token_ids(normalised, edges, vocab_size):
bin_index = digitize(normalised, edges) # (7,), values in 1..256
# Use the last 256 vocabulary ids, which the tokenizer overwrites [§3.2]
return vocab_size - bin_index # (7,)Pseudocode: decoding at inference (code action_tokenizer.py and openvla.py).
# Map predicted token ids back to bin centres (one per dimension)
# [code: prismatic/vla/action_tokenizer.py#L32, #L66]
def token_ids_to_normalised(token_ids, vocab_size, centres):
index = clip(vocab_size - token_ids - 1, 0, len(centres) - 1)
return centres[index] # (7,)
# Un-normalise with the dataset statistics for the chosen embodiment
# [code: prismatic/models/vlas/openvla.py#L94-L101]
def decode_action(normalised, low, high):
return 0.5 * (normalised + 1) * (high - low) + low # (7,)Pseudocode: training loss (paper §3.2; code datasets.py).
# Next-token cross-entropy over the sequence; non-action positions are masked
# [§3.2] [code: prismatic/vla/datasets/datasets.py#L63]
def training_loss(model, images, prompt_ids, action_token_ids):
logits = model(images, prompt_ids, action_token_ids) # (B, T, vocab)
# Only action-token positions contribute to the loss [§3.2]
return cross_entropy(logits, targets=action_token_ids, mask=is_action)Hyperparameters
| Name | Value | Where | Notes |
|---|---|---|---|
| Backbone | Prismatic-7B: fused DINOv2+SigLIP, 2-layer MLP projector, Llama 2 7B | §3.1 | Vision encoder about 600M parameters |
| Input resolution | 224 x 224 px | §3.4 | 384 px gave no gain and trained 3x slower |
| Action dimensions | 7 | fig. 2 §3.2 | Discretized per dimension |
| Action bins | 256, uniform over 1st to 99th percentile | §3.2 | Code decodes to bin centres, see Paper vs code |
| Action-token ids | last 256 vocabulary entries of Llama tokenizer | §3.2 | Overwrites least-used tokens |
| Pretraining learning rate | 2e-5, constant, no warmup | §3.4 vla.py | Same as VLM pretraining |
| Pretraining global batch | 2048 | §3.5 vla.py | Per-device batch 32 in code |
| Pretraining epochs | 27 | §3.4 | Code base config sets epochs=1000 with max_steps unset |
| Pretraining hardware | 64 A100, 14 days, 21,500 A100-hours | §3.5 | |
| Weight decay | 0.0 (base config) | vla.py | Final run value not stated in paper |
| Gradient clipping | max norm 1.0 (base config) | vla.py | Not stated in paper |
| Fine-tuning optimizer | AdamW, constant learning rate | finetune.py | Paper: not stated |
| Fine-tuning learning rate | not stated in paper; code default 5e-4 | finetune.py | See Paper vs code |
| Fine-tuning batch size | not stated in paper; code default 16 | finetune.py | |
| Fine-tuning max steps | not stated in paper; code default 200,000 | finetune.py | |
| LoRA rank | 32 (default); 64 gave the same success | §5.3 | |
| LoRA alpha | not stated in paper; code sets min(rank, 16) | finetune.py | Gives scale 0.5 at rank 32 |
| LoRA target modules | all linear layers | §5.3 finetune.py | |
| LoRA dropout | not stated in paper; code default 0.0 | finetune.py | |
| Image augmentation (fine-tuning) | not stated in paper; code default on | finetune.py | Pretraining default off train.py |
| Decoding | not stated in paper; evaluation calls with do_sample=False | openvla_utils.py | Greedy decoding in the released eval code |
| Control frequency, Franka-Tabletop | 5 Hz non-blocking | §5.2 | |
| Control frequency, Franka-DROID | 15 Hz non-blocking | §5.2 | |
| Diffusion Policy chunking (baseline) | T=16, X=8 at 15 Hz; T=8, X=3 at 5 Hz | §5.2 footnote | Baseline setting, not OpenVLA |
| LIBERO fine-tuning | LoRA r=32, 500 trials per suite, 3 seeds | app. E.1 app. E.2 | |
| Inference precision | bfloat16 (default); int8; int4 | §5.4 | int4 keeps accuracy at 16.8 GB vs 7.0 GB |
| Inference speed | about 6 Hz on RTX 4090 in bfloat16 | §3.5 | Without compilation or speculative decoding |
Results
Author-reported. Setups: BridgeData V2 WidowX, 17 tasks with 10 rollouts each (170 rollouts) §5.1 app. B.1; Google robot, 12 tasks with 5 rollouts each (60 rollouts) §5.1 app. B.2. Values are mean success rate ± standard error.
| Setting | Metric | Baselines | OpenVLA | Source |
|---|---|---|---|---|
| BridgeData V2 WidowX, 17 tasks | mean success | RT-2-X 50.6 ± 3.5; Octo 20.0 ± 2.6; RT-1-X 18.5 ± 2.7 | 70.6 ± 3.2 | app. B.1.3 |
| Google robot, 12 tasks | mean success | RT-2-X 78.3 ± 5.4; RT-1-X 33.3 ± 6.1; Octo 26.7 ± 5.8 | 85.0 ± 4.6 | app. B.2.2 |
| Franka-Tabletop, 6 tasks (fine-tuned) | average success | Diffusion Policy 48.5 ± 4.9; DP (matched) 43.4 ± 4.7; Octo 43.4 ± 4.4; OpenVLA from scratch 43.4 ± 4.6 | 67.2 ± 4.0 | app. B.3.2 |
| Franka-DROID, Wipe Table (fine-tuned) | average success | Diffusion Policy 35.0 ± 8.0; DP (matched) 26.7 ± 7.5; Octo 38.3 ± 8.5; from scratch 21.7 ± 6.6 | 58.3 ± 7.2 | app. B.3.2 |
| Headline across 29 tasks | pooled rollout success | RT-2-X 57.8% (133 of 230, derived) | 74.3% (171 of 230, derived) | §1 app. B.1.3 app. B.2.2 |
The paper's headline gain is 16.5 points over RT-2-X on 29 tasks §1. Our derivation from the appendix tables reproduces that figure only when rollouts are pooled. See Pitfalls.
Parameter-efficient fine-tuning (two Franka-Tabletop tasks, 33 rollouts per approach in the summary table) §5.3 app. B.3.2:
| Strategy | Success rate | Trainable params (M) | VRAM (batch 16) |
|---|---|---|---|
| Full fine-tuning | 69.7 ± 7.2% | 7,188.1 | 163.3 GB (sharded over 2 GPUs) |
| Last layer only | 30.3 ± 6.1% | 465.1 | 51.4 GB |
| Frozen vision | 47.0 ± 6.9% | 6,760.4 | 156.2 GB (sharded over 2 GPUs) |
| Sandwich | 62.1 ± 7.9% | 914.2 | 64.0 GB |
| LoRA, rank 32 | 68.2 ± 7.5% | 97.6 | 59.7 GB |
| LoRA, rank 64 | 68.2 ± 7.8% | 195.2 | 60.5 GB |
Quantized inference (eight BridgeData V2 tasks, 80 rollouts per precision) §5.4:
| Precision | Success rate | GPU memory | Inference rate (A5000) |
|---|---|---|---|
| bfloat16 | 71.3 ± 4.8% | 16.8 GB | not stated in the text as a single figure |
| int8 | 58.1 ± 5.1% | 10.2 GB | 1.2 Hz |
| int4 | 71.9 ± 4.7% | 7.0 GB | 3 Hz |
With blocking control, the same precisions score 70.0%, 74.4% and 68.8% (bfloat16, int8, int4), which the authors read as showing that the int8 drop came from speed, not from precision app. D.4.
LIBERO simulation (fine-tuned via LoRA r=32; SR and rank across four suites, three seeds, 500 trials each) app. E.2:
| Method | Spatial | Object | Goal | Long | Average SR (rank) |
|---|---|---|---|---|---|
| Diffusion Policy (scratch) | 78.3 ± 1.1 | 92.5 ± 0.7 | 68.3 ± 1.2 | 50.5 ± 1.3 | 72.4 ± 0.7 (2.5) |
| Octo (fine-tuned) | 78.9 ± 1.0 | 85.7 ± 0.9 | 84.6 ± 0.9 | 51.1 ± 1.3 | 75.1 ± 0.6 (2) |
| OpenVLA (fine-tuned) | 84.7 ± 0.9 | 88.4 ± 0.8 | 79.2 ± 1.0 | 53.7 ± 1.3 | 76.5 ± 0.6 (1.5) |
Ablations on the 8-task BridgeData V2 subset app. D.1 app. D.2: OpenVLA 76.3%; OpenVLA trained only on BridgeData V2 45.6%; the same without the DINOv2 encoder 40.6%. The authors report that OpenX pretraining matters more than the fused encoder.
Frozen vs fine-tuned vision encoder (two Prismatic backbones, small task set, different evaluation configuration) app. D.3: fine-tuning gave 95% vs 85% (SigLIP backbone) and 90% vs 25% (LLaVA backbone) on the two first tasks. The authors report 80.0% vs 46.7% averaged over the evaluations where both were run.
Paper vs code
The official repository is github.com/openvla/openvla at the commit above. The
project page linked from the title page points to it LICENSE. The
repository carries an MIT license with copyright held by three of the authors.
- Data mixture. The paper's table gives percentage shares app. A. The
released final mixture
oxe_magic_soup_plus_minususes unnormalised sampling weights that differ from those shares, for example BC-Z 7.5% in the paper and weight 0.2 in code, NYU Franka 0.8% vs 3.0, UCSD Kitchen under 0.1% vs 2.0, and Furniture Bench 2.4% vs 0.1 mixtures.py. Language Table and DROID are commented out of this mixture mixtures.py mixtures.py. The config comment describes two stages: a mix that includes DROID for the first 70% of training, followed by resampling vla.py. - Bin decoding. The paper describes 256 bins §3.2. The tokenizer builds 256 edges, which give 255 bin centres, and decodes to those centres action_tokenizer.py action_tokenizer.py. The paper does not say whether decoding uses centres or edges.
- Normalisation. The paper uses 1st and 99th quantiles §3.2. The OpenVLA RLDS path uses the BOUNDS_Q99 scheme datasets.py, which clips to [-1, 1] data_utils.py. Clipping is code-only; the paper does not state it.
- Fine-tuning learning rate. The paper states 2e-5 for OpenVLA pretraining §3.4 and gives no fine-tuning learning rate. The fine-tuning script defaults to 5e-4 finetune.py.
- LoRA alpha. Not stated in the paper. The code sets alpha to min(rank, 16) finetune.py.
- Epoch count. The paper says 27 epochs §3.4. The base config sets epochs=1000 with max_steps unset vla.py. The final run's step count is not stated. The TeX source defines a "150k" iteration macro that the text does not use.
- Quantized training. The paper evaluates quantized inference only. The code has a 4-bit NF4 fine-tuning option, marked "CAUTION: Reduces memory but hurts performance" finetune.py finetune.py.
- Image augmentation. The paper does not mention it. The fine-tuning default is on finetune.py and pretraining default is off train.py.
- Action-token range. The tokenizer assumes the action tokens are the last
256 vocabulary entries, and computes
action_token_begin_idxfrom that assumption action_tokenizer.py. It must be checked for any other tokenizer.
Pitfalls
- Headline arithmetic. The 16.5-point gain is reproduced only with pooled rollouts (74.3% vs 57.8% over 230 rollouts). Averaging the per-task success rates from the same tables gives 76.6% vs 62.1%, a 14.5-point gap (our derivation). Report which one you use.
- Diffusion Policy gap. The 20.4-point figure in the abstract §1 could not be reproduced by simple averages of the appendix values: 18.7 points on Franka-Tabletop and 23.3 on Franka-DROID app. B.3.2. The paper does not say how it was computed.
- Small trial counts. BridgeData tasks have 10 rollouts, Google tasks 5, and Franka tasks 5 to 12 §5.1 app. B.3.1. Most per-task differences are one to three successes. Standard errors are given, but many comparisons overlap.
- RT-2-X is a special case. RT-2-X is closed and was queried with its second-most-likely action to avoid a freezing problem, so the comparison depends on that workaround app. C. Dynamic re-querying performed worse in the authors' tests app. C.
- Zero actions. Many BridgeData demonstrations start with an all-zero action, and a policy trained on them can freeze. The authors drop the first transition of each demonstration app. C. For LIBERO they drop no-op actions, and they rotate third-person images 180 degrees for their hardware app. E.1.
- Blocking control matters for quantization. int8 inference is 1.2 Hz on the A5000, which changes the controller dynamics, so int8 looks worse in non-blocking runs §5.4 app. D.4. Measure control frequency before judging a precision.
- Different checkpoint for PEFT and quantization. The PEFT and quantization experiments use a SigLIP-only checkpoint trained on the Octo mixture [§5.3 footnote]. Their numbers are not directly comparable to the main results.
- Single image, no proprioception. The model takes one image and outputs one action per step, with no history and no action chunking §6. The authors report under 90% success on their tasks §6. They say faster inference is needed before ALOHA-rate (50 Hz) control and more dexterous bimanual tasks can be tested §6.
- Licences beyond this card. The card is CC BY 4.0, which covers the paper. The code is MIT. The authors state that the training data and code of the three base components are not open, while the weights are §1 footnote. Check the dataset and Llama 2 terms before commercial use.
- Figure and table numbers. Figure numbers here follow source order and were not checked against the compiled PDF. Where a number disagrees, use the section.
Lineage
- Builds on: the Prismatic-7B VLM and its fused DINOv2+SigLIP encoder §3.1; RT-2's approach of predicting actions as tokens §3.2; the Open X-Embodiment dataset §3.3; the Octo mixture weights §3.3; LoRA for fine-tuning §5.3.
- Compared against: RT-1-X, RT-2-X and Octo on BridgeData V2 and Google robot tasks §5.1; Diffusion Policy, with and without matched inputs, and Octo for fine-tuning §5.2; LIBERO baselines app. E.2.
- Superseded by: not stated on this card.
Source and license
Adapted from “OpenVLA: An Open-Source Vision-Language-Action Model” by Moo Jin Kim, Karl Pertsch, Siddharth Karamcheti, Ted Xiao, Ashwin Balakrishna, Suraj Nair, Rafael Rafailov, Ethan Foster, Grace Lam, Pannag Sanketi, Quan Vuong, Thomas Kollar, Benjamin Burchfiel, Russ Tedrake, Dorsa Sadigh, Sergey Levine, Percy Liang, Chelsea Finn (arXiv:2406.09246), used under CC BY 4.0. Changes: condensed and restructured for implementation, with tables, equations and algorithms taken from the paper and its code, each cited to its source. Not affiliated with or endorsed by the authors. Code citations refer to https://github.com/openvla/openvla at commit c8f03f48af69 (MIT). Any quoted code is shown under that license.