OpenVLA 深度技术解读

An Open-Source Vision-Language-Action Model
arXiv:2406.09246 · Moo Jin Kim, Karl Pertsch, Siddharth Karamcheti et al.
Stanford + UC Berkeley · 2024
Project · arXiv · GitHub
← 返回 VLA 技术站

0. 30 秒速览

OpenVLA 是一个 7B 参数的开源机器人操作模型。它接受一张 RGB 图像一句自然语言指令(如"把可乐罐拿起来"),输出一个7 维机器人动作向量(末端执行器的位移+旋转+夹爪开合)。核心思路是:把连续动作离散化成文本 token,让大语言模型用标准的 next-token prediction 来"说出"机器人该怎么动。

属性规格
参数量7B(Llama-2-7B backbone)
视觉编码器DINOv2 + SigLIP 双编码器融合(~600M)
训练数据970K 真机演示轨迹(Open X-Embodiment 子集)
训练成本64×A100,batch 2048,~15 小时
推理15GB 显存(bf16),~6Hz on RTX 4090
动作空间7-DoF:Δx, Δy, Δz, Δroll, Δpitch, Δyaw, gripper
核心精度256 bin per dimension 离散化

1. 背景知识:从 VLM 到 VLA

1.1 什么是 VLM?

Vision-Language Model(VLM)是能同时理解图像和文本的大模型。典型架构有三部分:

📷 图像
Vision Encoder
(ViT / CLIP / SigLIP)
↓ patch embeddings
Projector (MLP)
↓ visual tokens
LLM (Llama-2-7B)
↑ text tokens (语言指令)
📝 文本回复

输入一张图片 + "图片里有什么?",VLM 输出文字描述。VLM 的训练方式是:让模型看大量图文对,学会把图像 patch 转换成和文字 token 一样的东西,然后用标准的语言模型方式处理。

1.2 VLA = VLM + 动作输出

Vision-Language-Action Model(VLA)在 VLM 的基础上增加了一个输出维度:机器人动作。关键技术问题是:语言模型只能输出离散的 token(词表里的整数索引),但机器人需要连续的浮点数动作(如"向前移动 0.05 米")。怎么解决这个矛盾?

OpenVLA 的答案:把连续动作离散化为整数 token,然后假装它们是语言模型词表的一部分。这样,输出"拿起可乐罐"对应的动作序列,和输出"I love you"没有本质区别——都是 next-token prediction。

2. 架构三大组件

OpenVLA 由三个核心模块串联组成:

1
Vision Encoder(视觉编码器) 输入 224×224 RGB 图像 → DINOv2 + SigLIP 双编码器 → 拼接为 256 个视觉 token
2
Projector(投影层) 2 层 MLP,将 2048 维视觉特征映射到 Llama-2 的 4096 维嵌入空间
3
LLM Backbone(语言模型) Llama-2-7B,处理 visual tokens + 语言指令 tokens + 本体感知 token → 输出 7 个 action tokens

2.1 Vision Encoder:为什么用两个编码器?

这是 OpenVLA 相比 RT-2 的关键改进之一。OpenVLA 同时使用两个视觉编码器,各有所长:

编码器擅长在 OpenVLA 中的角色
DINOv2底层空间特征(纹理、边缘、深度感)帮助精确定位物体的空间位置——"可乐罐在桌子左前方 15cm 处"
SigLIP高层语义理解(物体类别、场景含义)帮助识别"这是一个可乐罐"而非"一个红色圆柱体"

具体做法:同一张 224×224 输入图像分别过 DINOv2 和 SigLIP,各自输出 256 个 patch embedding(每个 patch 是 14×14 像素区域),然后在通道维度拼接(channel-wise concatenation),得到 256 个 2048 维的融合 token。这比用单一编码器能同时捕获空间精度和语义理解。

为什么不用 CLIP?

CLIP 是最流行的视觉编码器,但它主要训练于图文匹配任务,侧重语义层面。DINOv2 使用自监督训练(不需要文本标注),学到的特征更偏向空间结构。对于机器人操作来说,知道物体精确在哪里和知道那是什么同样重要。实验证明,DINOv2+SigLIP 融合比单独使用任一个效果都好。

2.2 Projector:连接视觉和语言

Projector 是一个简单的2 层 MLP(多层感知机),输入维度 2048(拼接后的视觉特征维度),输出维度 4096(Llama-2 的隐藏维度)。它做的事很简单:把视觉编码器输出的特征"翻译"成语言模型能理解的格式。这和大多数现代 VLM(如 LLaVA、Prismatic)的做法一致。

2.3 LLM Backbone:Llama-2-7B

OpenVLA 选择了 Llama-2-7B 作为核心语言模型。完整输入序列是:

[visual_token_1] [visual_token_2] ... [visual_token_256]   ← 图像
"In This Task: pick up the coke can"                      ← 语言指令
[robot_state_token]                                         ← 本体感知(当前关节位置)
[action_token_1] [action_token_2] ... [action_token_7]    ← 输出的 7 个动作维度

其中 [robot_state_token] 是机器人当前状态(如夹爪开合度)被编码成一个 token。这使得模型不只"看一眼就动",还能感知自己的当前位置。

3. Action Tokenization:核心创新

这是理解 OpenVLA(以及整个"离散化 VLA"路线)的最关键部分。

3.1 问题:连续 → 离散

机器人动作是 7 个连续浮点数(以 Franka 机械臂为例):

action = [Δx, Δy, Δz, Δroll, Δpitch, Δyaw, gripper]
# 例如: [0.02, -0.01, 0.05, 0.0, 0.0, 0.0, 1]  ← 前进2cm,左移1cm,上移5cm,闭合夹爪

但 Llama-2 只能输出离散的 token(词表大小 32000)。怎么让 LLM 输出 7 个浮点数?

3.2 方案:每维 256 bin 离散化

OpenVLA 把每个动作维度独立离散化为 256 个 bin(即整数 0~255):

1
统计训练数据分布 对每个维度,计算所有训练数据的 1st percentile 和 99th percentile(不用 min/max 以避免 outlier)
2
均匀划分 256 个 bin bin 边界均匀分布在 [P1, P99] 区间。每个 bin 覆盖 (P99-P1)/256 的宽度
3
连续值 → 整数 token 给定连续值 v,找到其所在的 bin index → token ∈ {0, 1, ..., 255}

具体公式:

# 离散化(训练时)
bin_index = floor((v - P1) / (P99 - P1) * 256)
bin_index = clip(bin_index, 0, 255)

# 反离散化(推理时,把 token 转回连续值)
v = P1 + (bin_index + 0.5) / 256 * (P99 - P1)

关键设计决策:为什么用 1st/99th percentile 而非 min/max?

训练数据中可能有极端值(如某次操作意外大幅移动了 2 米)。如果用 min/max 划分 bin,绝大多数正常操作会被挤到少数几个 bin 里,精度大降。用 percentile 截断 outlier 后,256 个 bin 集中覆盖正常操作范围,有效精度更高。

3.3 7 个 token 怎么训练?

离散化后,一条动作变成 7 个整数 token:[152, 128, 200, 128, 128, 128, 255]。这些 token 被加到 LLM 的词表中(从 32000 扩展到约 33272,加上一些特殊 token)。

训练目标就是标准的next-token prediction + cross-entropy loss——但只在 action token 上计算 loss

loss = CrossEntropy(predicted_action_tokens, target_action_tokens)

# 只对序列最后的 7 个 action token 计算损失
# 前面的 visual tokens 和 instruction tokens 不产生 loss

这意味着模型学会的是:给定图像+指令+当前状态,"说出"正确的 7 个动作 token。推理时用 greedy decoding 逐个生成。

4. 训练数据

4.1 Open X-Embodiment 数据集

OpenVLA 从 Open X-Embodiment(OXE)数据集中筛选了 970K 条真机演示轨迹。OXE 是目前最大的开源机器人操作数据集,由全球 21 个研究机构共同贡献,包含多种机器人平台(Franka、WidowX、Google Robot、Kuka 等)。

4.2 数据筛选策略

不是所有 OXE 数据都用来训练。筛选规则:

  1. 必须有第三人称摄像头——只用第三人称视角的数据
  2. 必须是单臂末端执行器控制——排除关节空间控制的数据
  3. 使用 Octo 的数据混合权重——多样性高的数据集权重高,重复性高的降权
  4. 清洗零动作——移除轨迹末尾的"冻结"帧(无操作但机械臂仍开着)

5. 训练细节

参数
训练方式全参数微调(vision encoder + projector + LLM 全部更新)
Batch size2048
GPU64× NVIDIA A100 (80GB)
训练时长~15 小时
精度bfloat16
初始学习率2e-5
图像分辨率224×224(单张,无历史帧)

训练成本提示

64×A100 训练 15 小时的成本约为 $3000-5000(按 AWS p4d 按需价格估算)。对于个人研究者或小实验室来说门槛很高。但 OpenVLA 提供了LoRA 微调方案(见下节),可以在单张消费级 GPU 上适配新任务。

6. 微调与部署

6.1 LoRA 高效微调

当你想用 OpenVLA 控制一台新机器人(或新任务)时,不需要重新训练 7B 模型。用 LoRA(Low-Rank Adaptation)可以只训练极少参数:

# LoRA 原理:
# 原始权重矩阵 W ∈ R^{4096×4096}
# 冻结 W,新增两个小矩阵 A ∈ R^{4096×r}, B ∈ R^{r×4096}(r=8 或 16)
# 前向传播:y = (W + A·B) · x
# 只训练 A 和 B,参数量从 16M 降到 ~65K

实测:LoRA 微调 OpenVLA 在单张 RTX 4090 / A100 上即可完成,性能损失可忽略。

6.2 INT4 量化推理

INT4 量化(将模型权重从 16-bit 压缩到 4-bit),显存从 15GB 降到约 8GB,可以在更多消费级 GPU 上运行,且任务成功率不降

推理配置显存推理速度硬件
bf16(默认)15 GB~6 HzRTX 4090 (24GB)
INT4 量化~8 GB~6 HzRTX 3090/4070 (12-16GB)
bf16 + 远程推理0(机器人端)网络延迟任何机器

7. 实验结果

方法参数量29 任务平均成功率数据
RT-135M34.7%专有数据
RT-255B55.1%专有数据
OpenVLA7B71.6%970K (OXE)

OpenVLA 以 7×更少参数超越了 Google 的 RT-2-X(55B),在 29 个真实世界操作任务上成功率高出 16.5%

8. 工程权衡分析

✓ 优势

• 完全开源——权重、训练代码、数据 pipeline 全部公开

• 复用 LLM 生态——训练用标准 next-token prediction,可利用所有 LLM 训练工具

• LoRA + 量化——消费级 GPU 可微调和部署

• 双视觉编码器——空间精度+语义理解兼备

✗ 代价

• 单步预测——每步只输出 1 个 action(无 action chunking),高频控制困难

• 离散化精度损失——256 bin 对精细操作(如插钥匙)可能不够

• 6Hz 推理——对需要 50Hz+ 的灵巧任务(如折衣服)太慢

• 无历史观测——只看当前一帧,无法利用时序信息

9. 什么时候用 OpenVLA?

场景推荐度理由
机械臂抓取/放置★★★★★设计目标场景,性能最强
语言指令操作★★★★★LLM 骨干带来强语义理解
需要快速适配新任务★★★★☆LoRA 微调高效
灵巧操作(折衣服等)★★☆☆☆6Hz + 单步动作,频率不够
移动机器人导航★☆☆☆☆不是设计用途