wikillm

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

Pseudocode
# 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).

Pseudocode
# 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).

Pseudocode
# 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

NameValueWhereNotes
BackbonePrismatic-7B: fused DINOv2+SigLIP, 2-layer MLP projector, Llama 2 7B§3.1Vision encoder about 600M parameters
Input resolution224 x 224 px§3.4384 px gave no gain and trained 3x slower
Action dimensions7fig. 2 §3.2Discretized per dimension
Action bins256, uniform over 1st to 99th percentile§3.2Code decodes to bin centres, see Paper vs code
Action-token idslast 256 vocabulary entries of Llama tokenizer§3.2Overwrites least-used tokens
Pretraining learning rate2e-5, constant, no warmup§3.4 vla.pySame as VLM pretraining
Pretraining global batch2048§3.5 vla.pyPer-device batch 32 in code
Pretraining epochs27§3.4Code base config sets epochs=1000 with max_steps unset
Pretraining hardware64 A100, 14 days, 21,500 A100-hours§3.5
Weight decay0.0 (base config)vla.pyFinal run value not stated in paper
Gradient clippingmax norm 1.0 (base config)vla.pyNot stated in paper
Fine-tuning optimizerAdamW, constant learning ratefinetune.pyPaper: not stated
Fine-tuning learning ratenot stated in paper; code default 5e-4finetune.pySee Paper vs code
Fine-tuning batch sizenot stated in paper; code default 16finetune.py
Fine-tuning max stepsnot stated in paper; code default 200,000finetune.py
LoRA rank32 (default); 64 gave the same success§5.3
LoRA alphanot stated in paper; code sets min(rank, 16)finetune.pyGives scale 0.5 at rank 32
LoRA target modulesall linear layers§5.3 finetune.py
LoRA dropoutnot stated in paper; code default 0.0finetune.py
Image augmentation (fine-tuning)not stated in paper; code default onfinetune.pyPretraining default off train.py
Decodingnot stated in paper; evaluation calls with do_sample=Falseopenvla_utils.pyGreedy decoding in the released eval code
Control frequency, Franka-Tabletop5 Hz non-blocking§5.2
Control frequency, Franka-DROID15 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 footnoteBaseline setting, not OpenVLA
LIBERO fine-tuningLoRA r=32, 500 trials per suite, 3 seedsapp. E.1 app. E.2
Inference precisionbfloat16 (default); int8; int4§5.4int4 keeps accuracy at 16.8 GB vs 7.0 GB
Inference speedabout 6 Hz on RTX 4090 in bfloat16§3.5Without 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.

SettingMetricBaselinesOpenVLASource
BridgeData V2 WidowX, 17 tasksmean successRT-2-X 50.6 ± 3.5; Octo 20.0 ± 2.6; RT-1-X 18.5 ± 2.770.6 ± 3.2app. B.1.3
Google robot, 12 tasksmean successRT-2-X 78.3 ± 5.4; RT-1-X 33.3 ± 6.1; Octo 26.7 ± 5.885.0 ± 4.6app. B.2.2
Franka-Tabletop, 6 tasks (fine-tuned)average successDiffusion Policy 48.5 ± 4.9; DP (matched) 43.4 ± 4.7; Octo 43.4 ± 4.4; OpenVLA from scratch 43.4 ± 4.667.2 ± 4.0app. B.3.2
Franka-DROID, Wipe Table (fine-tuned)average successDiffusion Policy 35.0 ± 8.0; DP (matched) 26.7 ± 7.5; Octo 38.3 ± 8.5; from scratch 21.7 ± 6.658.3 ± 7.2app. B.3.2
Headline across 29 taskspooled rollout successRT-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:

StrategySuccess rateTrainable params (M)VRAM (batch 16)
Full fine-tuning69.7 ± 7.2%7,188.1163.3 GB (sharded over 2 GPUs)
Last layer only30.3 ± 6.1%465.151.4 GB
Frozen vision47.0 ± 6.9%6,760.4156.2 GB (sharded over 2 GPUs)
Sandwich62.1 ± 7.9%914.264.0 GB
LoRA, rank 3268.2 ± 7.5%97.659.7 GB
LoRA, rank 6468.2 ± 7.8%195.260.5 GB

Quantized inference (eight BridgeData V2 tasks, 80 rollouts per precision) §5.4:

PrecisionSuccess rateGPU memoryInference rate (A5000)
bfloat1671.3 ± 4.8%16.8 GBnot stated in the text as a single figure
int858.1 ± 5.1%10.2 GB1.2 Hz
int471.9 ± 4.7%7.0 GB3 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:

MethodSpatialObjectGoalLongAverage SR (rank)
Diffusion Policy (scratch)78.3 ± 1.192.5 ± 0.768.3 ± 1.250.5 ± 1.372.4 ± 0.7 (2.5)
Octo (fine-tuned)78.9 ± 1.085.7 ± 0.984.6 ± 0.951.1 ± 1.375.1 ± 0.6 (2)
OpenVLA (fine-tuned)84.7 ± 0.988.4 ± 0.879.2 ± 1.053.7 ± 1.376.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_minus uses 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_idx from 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.