OpenVLA:开源视觉-语言-动作通用机器人策略的技术原理与落地实践
论文信息
标题:OpenVLA: An Open-Source Vision-Language-Action Model
会议:arXiv:2406.09246v3 [cs.RO]
单位:斯坦福大学、加州大学伯克利分校、丰田研究院、Google DeepMind、麻省理工学院、Physical Intelligence
代码:https://openvla.github.io
论文:https://arxiv.org/pdf/2406.09246.pdf
一、引言:机器人“通用大脑”的破局之路
给机器人教新技能,过去的模式是“一个任务训一个模型”,就像给每个工种单独招一个工人,换个活就得重新招人。随着大模型时代到来,大家开始琢磨:能不能给机器人做一个“通用大脑”,看一眼图像、听一句指令,就能上手各种操作任务?
这个方向就是视觉-语言-动作模型(VLA)——把视觉理解、语言理解和机器人动作控制塞到一个端到端模型里,靠大规模预训练获得泛化能力。Google的RT-2系列已经证明这条路走得通,但有两个致命问题卡着行业脖子:
- 闭源黑箱:顶尖的VLA模型基本都不开放权重和训练细节,学术界和小公司根本碰不到;
- 落地困难:没人摸得透怎么把通用VLA快速适配到自己的机器人、自己的任务上,更别说用消费级显卡跑起来。
本文推出的OpenVLA,就是冲着解决这两个问题来的。它是一个70亿参数的完全开源VLA模型,在97万条真实机器人演示数据上训练而成。最夸张的是:它用比闭源标杆RT-2-X少7倍的参数量,在29个任务、多种机器人平台上,把绝对成功率拉高了16.5个百分点。同时它还支持消费级显卡微调、量化推理,把通用机器人策略的门槛直接打了下来。
下图是OpenVLA的整体定位与核心特性:
图1:OpenVLA核心定位示意。基于开源VLM主干,在大规模机器人数据集上微调,输出通用机器人控制策略,支持多机器人开箱即用与高效微调,全链路完全开源。
出处:原文Figure 1
通俗解释:
之前的顶尖VLA就像某大厂的闭源商业软件,贵还不让改;OpenVLA就像开源的Linux系统,免费给你用,还能自己改配置、装插件,普通电脑也能跑起来。性能还比商业软件强,属于典型的“开源打赢闭源”。
二、模型架构与核心数学原理
2.1 整体架构
OpenVLA的思路非常朴素:把机器人动作预测当成一个“图文生成任务”来做,直接复用成熟的视觉-语言模型(VLM)主干,只需要把动作塞进输出词汇表里就行。
整体架构分为三大模块,如下图所示:
图2:OpenVLA模型架构。输入为图像观测与语言指令,输出7维机器人控制动作;由双路视觉编码器、MLP投影层、Llama 2 7B大语言模型主干三部分组成。
出处:原文Figure 2
三个模块的分工如下:
- 双路视觉编码器:由DINOv2和SigLIP两个预训练视觉模型组成。同一张图片分别过两个编码器,得到的特征在通道维度拼接,兼顾细粒度空间信息(DINOv2擅长)和高层语义信息(SigLIP擅长)。
- MLP投影层:一个2层的多层感知机,把视觉特征映射到和语言嵌入相同的维度,让大语言模型能“看懂”图片。
- LLM主干:采用Llama 2 7B作为基座,负责融合视觉、语言信息,输出离散的动作token序列,最终反解为连续的机器人动作。
通俗解释:
视觉编码器相当于“眼睛”,DINOv2负责“看清楚物体在哪、长啥样”,SigLIP负责“认出这是什么东西”;投影层相当于“翻译官”,把视觉信号翻译成大脑能懂的语言;LLM主干就是“大脑”,看着图、听着指令,琢磨出下一步该怎么动。
2.2 动作离散化:让大模型能输出动作
大语言模型天生只能输出离散的token,可机器人动作是连续值(比如位移、角度)。所以第一步要把连续动作“拆成”离散的档位,也就是动作离散化。
本文对动作的每个维度独立做均匀分箱,每个维度拆成256个档位:
aibin=⌊ai−q0.01q0.99−q0.01×255⌋ a_i^\text{bin} = \left\lfloor \frac{a_i - q_{0.01}}{q_{0.99} - q_{0.01}} \times 255 \right\rflooraibin=⌊q0.99−q0.01ai−q0.01×255⌋
符号逐一解释:
- aia_iai:第iii维的原始连续动作值(比如末端执行器的x方向位移)
- aibina_i^\text{bin}aibin:离散化后的档位编号,取值范围是0到255的整数
- q0.01q_{0.01}q0.01:训练数据中该维度动作的1%分位数,即去掉最低1%的异常值后的下界
- q0.99q_{0.99}q0.99:训练数据中该维度动作的99%分位数,即去掉最高1%的异常值后的上界
- ⌊⋅⌋\lfloor \cdot \rfloor⌊⋅⌋:向下取整运算
- 255:分箱总数减1,最终得到0~255共256个档位
和直接用最大最小值分箱相比,用分位数可以过滤掉极端异常动作,避免大部分动作挤在少数几个档位里,有效提升控制精度。
离散化之后,7维动作就变成了7个0~255的整数,刚好对应词表里的7个token。由于Llama的tokenizer只预留了100个特殊token位置,本文直接复用了词表里最不常用的256个token,把它们重定义为动作token,零成本扩展输出空间。
通俗解释:
这就像把音量旋钮从无级调节改成256格的按键调节。用分位数定范围,就是把偶尔拧到底的极端情况去掉,让中间常用的区间分得更细,调起来更精准。
2.3 训练损失函数
训练目标就是标准的下一个token预测,只对动作token部分计算交叉熵损失:
L=−1Ta∑t=1Talogpθ(at∗∣o,I,a<t) \mathcal{L} = -\frac{1}{T_a} \sum_{t=1}^{T_a} \log p_\theta(a_t^* | o, \mathcal{I}, a_{<t})L=−Ta1t=1∑Talogpθ(at∗∣o,I,a<t)
符号逐一解释:
- L\mathcal{L}L:最终训练损失值,越小模型预测越准
- TaT_aTa:动作token的总数量,本文中单步动作对应7个token
- ∑t=1Ta\sum_{t=1}^{T_a}∑t=1Ta:对每个动作token的损失求和再取平均
- log\loglog:自然对数,用于把概率转为对数概率,优化更稳定
- pθ(at∗∣o,I,a<t)p_\theta(a_t^* | o, \mathcal{I}, a_{<t})pθ(at∗∣o,I,a<t):给定条件下,模型预测出正确动作tokenat∗a_t^*at∗的概率
- θ\thetaθ:模型的全部可训练参数
- ooo:输入的图像观测
- I\mathcal{I}I:输入的语言指令
- a<ta_{<t}a<t:当前位置之前的所有动作token,利用自回归特性保证动作序列的连贯性
简单说,就是给模型看图片、读指令,让它挨个预测7个动作档位,预测错了就用交叉熵罚它,直到预测越来越准。
通俗解释:
这就像做英语完形填空,给你上下文(图片+指令+前面的动作),让你填每个空的正确单词(动作档位),填错越多扣分越多。练得多了,填得就越来越准。
三、关键设计决策与训练细节
做VLA不是把VLM拿来直接训动作就行,很多细节决定了最终效果。作者做了大量消融实验,踩了一堆坑,总结出了下面这些最佳实践。
3.1 VLM主干怎么选?
作者对比了IDEFICS-1、LLaVA、Prismatic三个开源VLM主干,结论很明确:
- IDEFICS-1最弱,多物体场景下经常抓错东西;
- LLaVA比IDEFICS-1强35%,语言理解能力更好;
- Prismatic比LLaVA再强10%,核心原因是它用了DINOv2+SigLIP双路视觉编码器,空间推理能力更强,刚好适配机器人对位置精度的要求。
最终OpenVLA选择了Prismatic-7B作为基座,这也是性能和工程可用性的最优解。
3.2 视觉编码器要不要微调?
这是一个反常识的结论:普通VLM任务里,冻结视觉编码器效果更好,能保住互联网预训练学到的通用特征;但机器人VLA任务里,必须微调视觉编码器,否则效果很差。
原因很简单:通用视觉预训练只需要认出“这是个杯子”,但机器人控制需要精准知道“杯子在桌子上哪个坐标、离机械臂多远”。这些细粒度空间信息必须在机器人数据上微调才能提取出来。
3.3 图像分辨率越高越好吗?
不是。作者对比了224×224和384×384两种分辨率:
- 精度上两者几乎没区别;
- 训练速度上384分辨率要慢3倍。
最终选用224×224分辨率,性价比最高。当然这是当前数据规模下的结论,未来数据更多了,高分辨率可能会体现出优势。
3.4 训练超参的反常识结论
和普通大语言模型预训练相比,VLA训练有两个明显不同:
- 训练轮次要多很多:LLM预训练一般1-2轮数据就够了,但VLA要训27轮,直到动作token准确率超过95%,真机效果才会饱和。毕竟机器人数据量比文本小得多,需要多迭代几次才能吃透。
- 不需要学习率预热:固定2e-5的学习率效果最好,预热反而会掉点。
3.5 训练数据怎么凑?
OpenVLA的训练数据来自Open X-Embodiment(OpenX)数据集,这是全球几十个机构凑出来的机器人演示大合集,原始有200多万条轨迹。作者做了两轮筛选:
- 只保留单机械臂、有第三人称摄像头的操作任务,保证输入输出格式统一;
- 沿用Octo的数据混合权重,给多样性高的数据集更高权重,给单一任务的数据集降权,避免模型偏科。
最终训练集包含97万条机器人演示轨迹,覆盖多种机器人、多种场景、多种任务。
有趣案例:
这就像练武功,只练一套拳法容易走火入魔,得百家拳都练一点,基础才扎实。数据混合权重就是给厉害的拳法多安排点课时,给花架子少安排点课时,最后练出来的底子最均衡。
四、开箱即用:通用机器人性能评测
第一部分实验测试“零样本直接用”的能力:不做任何额外微调,直接把模型放到新机器人上跑,看泛化能力有多强。测试了两个主流平台:WidowX机械臂(BridgeData V2基准)和Google移动操作机器人。
4.1 WidowX平台:五维度泛化大比拼
BridgeData V2的测试覆盖了5类泛化能力,每类都对应真实场景里的常见挑战:
- 视觉泛化:背景变了、多了干扰物、物体颜色变了
- 运动泛化:物体放的位置、朝向没见过
- 物理泛化:物体大小形状变了
- 语义泛化:完全没见过的新物体、新指令
- 语言对齐:多个物体摆在一块,能不能准确抓起指令说的那个
结果如下图所示:
图3:BridgeData V2 WidowX机器人评测结果。从左到右依次为平均成功率、视觉泛化、运动泛化、物理泛化、语义泛化、语言对齐能力。
出处:原文Figure 3
详细数据汇总如下表:
| 方法 | 参数量 | 平均成功率 | 视觉泛化 | 运动泛化 | 物理泛化 | 语义泛化 | 语言对齐 |
|---|---|---|---|---|---|---|---|
| RT-1-X | 35M | 18.5% | 8.0% | 25.0% | 25.0% | 26.7% | 26.3% |
| Octo | 93M | 20.0% | 29.0% | 7.5% | 26.3% | 38.8% | 36.3% |
| RT-2-X | 55B | 50.6% | 52.0% | 55.0% | 60.0% | 76.7% | 38.8% |
| OpenVLA | 7B | 70.6% | 87.0% | 60.0% | 70.7% | 70.7% | 90.0% |
表1:BridgeData V2各维度泛化成功率对比
出处:根据原文Figure 3与Table 4整理
结果分析:
- 全面碾压闭源大模型:OpenVLA参数量只有RT-2-X的1/7,平均成功率高出20个百分点,在视觉泛化、物理泛化、语言对齐三个维度上优势尤其巨大。
- 唯一短板是语义泛化:只有在完全没见过的新概念、新物体上,RT-2-X略占优,毕竟它用了更大规模的互联网预训练数据。但这个差距很小,完全在可接受范围内。
- 小模型完全不够打:RT-1-X和Octo这种几千万参数的模型,在强泛化任务上成功率普遍只有百分之二三十,基本没法实用。
通俗解释:
这就像考试,RT-2-X是个550斤的大胖子学霸,OpenVLA是个80斤的普通体型学霸,结果门门科目OpenVLA分更高,只有最偏的冷门题胖子稍微多对两道。性价比差了不是一点半点。
4.2 Google机器人平台:分布内与分布外双测
Google机器人平台测试了12个任务,分为两类:
- 分布内:训练数据里见过类似的物体和任务
- 分布外:完全没见过的物体、场景、指令
结果如下图所示:
图4:Google移动操作机器人评测结果。左为平均成功率,中为分布内任务,右为分布外泛化任务。
出处:原文Figure 4
数据汇总:
- 平均成功率:OpenVLA 85.0% vs RT-2-X 78.3% vs Octo 26.7% vs RT-1-X 33.3%
- 分布内任务:OpenVLA 88.0% vs RT-2-X 72.0%
- 分布外任务:OpenVLA 82.9% vs RT-2-X 34.3%
最夸张的是分布外泛化:OpenVLA只掉了不到5个点,而RT-2-X直接腰斩,从72%掉到34%。这说明OpenVLA的泛化鲁棒性比闭源模型强得多。
五、下游适配:微调与轻量化落地
通用模型再强,也得能适配自己的机器人、自己的任务才算能用。这部分实验回答两个核心问题:微调效果怎么样?消费级显卡能不能跑?
5.1 全量微调对比:吊打从零训练
测试在Franka机械臂的7个任务上做微调,对比三类方法:
- Diffusion Policy:从零开始训的当前最优模仿学习方法
- Octo:开源通用策略微调
- OpenVLA:本文模型微调
结果如下:
| 方法 | 单指令任务平均 | 多指令任务平均 | 整体平均 |
|---|---|---|---|
| Diffusion Policy | 61.0% | 32.7% | 45.4% |
| Octo(微调) | 52.4% | 40.1% | 46.2% |
| OpenVLA(微调) | 63.8% | 53.7% | 58.3% |
表2:Franka平台微调任务成功率对比
出处:根据原文Table 7整理
结果分析:
- 简单任务各有千秋:单一物体、单一指令的简单任务,Diffusion Policy和OpenVLA差不多,毕竟扩散模型在单任务精度上确实有优势。
- 复杂任务拉开差距:多物体、多指令、需要语言理解的复杂任务,OpenVLA比Diffusion Policy高出21个百分点。这就是预训练的威力——大模型见过的场景多,理解语言指令更准。
- 整体提升20.4%:平均下来,微调后的OpenVLA比从零训练的Diffusion Policy成功率高20.4%,是目前数据高效模仿学习的新标杆。
5.2 参数高效微调:消费级显卡也能训
全量微调7B模型需要大显存服务器,普通人玩不起。作者测试了LoRA(低秩适配)这类参数高效微调方法,结论非常乐观:
- LoRA只训练不到1%的参数,就能达到全量微调95%以上的性能;
- 其他PEFT方法(比如前缀微调、适配器)效果都比LoRA差不少。
这意味着什么?一张24G显存的消费级显卡(比如RTX 4090),就能给OpenVLA做微调,适配自己的机器人任务。这在以前是想都不敢想的事。
通俗解释:
全量微调就像让学霸重新从小学学起,费钱费时间;LoRA就像给学霸补一门专业课,只学新知识,旧知识不动,花很少的时间就能考高分。
5.3 量化推理:显存砍半,性能不掉
推理侧也做了轻量化验证:4位量化、8位量化对成功率几乎没有影响,但能大幅降低显存占用、提升推理速度。
不同显卡上的推理速度如下图所示:
图6:不同型号GPU上的推理速度对比,单位为每秒输出动作数。蓝色为bfloat16精度,深蓝色为8位量化,绿色为4位量化。
出处:原文Figure 6
关键数据:
- RTX 4090上,bfloat16精度就能跑到6Hz,完全满足机器人闭环控制的要求;
- 4位量化后,显存占用从15GB降到不到8GB,普通游戏本都能跑;
- 服务器级H100上能跑到每秒5个以上动作,延迟完全可控。
六、核心代码实现
下面给出基于HuggingFace的OpenVLA核心推理代码与LoRA微调代码,可直接用于实际部署。
6.1 开箱即用推理代码
importtorchfromtransformersimportAutoModelForVision2Seq,AutoProcessorfromPILimportImage# 加载模型和处理器model_name="openvla/openvla-7b"processor=AutoProcessor.from_pretrained(model_name,trust_remote_code=True)model=AutoModelForVision2Seq.from_pretrained(model_name,trust_remote_code=True,torch_dtype=torch.bfloat16,load_in_4bit=True# 开启4bit量化,显存不够就打开).to("cuda")# 准备输入image=Image.open("robot_observation.jpg")# 机器人摄像头图像instruction="把红色的瓶子放进锅里"# 构造提示词prompt=f"What action should the robot take to{instruction}? A:"# 预处理输入inputs=processor(prompt,image).to("cuda",dtype=torch.bfloat16)# 预测动作withtorch.no_grad():action_tokens=model.predict_action(**inputs)# 反解为连续动作action=processor.decode_action(action_tokens)print(f"预测7维动作:{action}")# 输出格式: [delta_x, delta_y, delta_z, delta_roll, delta_pitch, delta_yaw, gripper]6.2 LoRA微调核心代码
importtorchfromtransformersimportAutoModelForVision2Seq,AutoProcessorfrompeftimportLoraConfig,get_peft_modelfromdatasetsimportload_dataset# 加载基础模型model_name="openvla/openvla-7b"processor=AutoProcessor.from_pretrained(model_name,trust_remote_code=True)model=AutoModelForVision2Seq.from_pretrained(model_name,trust_remote_code=True,torch_dtype=torch.bfloat16,load_in_4bit=True).to("cuda")# 配置LoRAlora_config=LoraConfig(r=16,lora_alpha=32,target_modules=["q_proj","v_proj"],# 只微调注意力的Q/V矩阵lora_dropout=0.05,bias="none",task_type="CAUSAL_LM")model=get_peft_model(model,lora_config)model.print_trainable_parameters()# 输出: trainable params: ~0.1% of all parameters# 加载自定义数据集dataset=load_dataset("your_custom_robot_dataset")# 训练配置training_args=TrainingArguments(output_dir="./openvla-lora-finetuned",per_device_train_batch_size=4,learning_rate=2e-5,num_train_epochs=10,fp16=True,logging_steps=10,save_strategy="epoch")# 开始训练trainer=Trainer(model=model,args=training_args,train_dataset=dataset["train"],data_collator=lambdabatch:processor([f"What action should the robot take to{x['instruction']}? A:"forxinbatch],[x["image"]forxinbatch],actions=[x["action"]forxinbatch],return_tensors="pt"))trainer.train()# 保存LoRA权重model.save_pretrained("./openvla-lora-finetuned")代码说明:
- 推理代码支持4位量化,单张消费级显卡即可运行;
- LoRA微调仅训练极少量参数,24G显存显卡即可完成7B模型的微调;
- 完整的训练、数据处理、部署代码可参考官方开源仓库。
七、总结与展望
核心结论
- 开源VLA首次超越闭源标杆:OpenVLA用1/7的参数量,在29个任务上全面超越55B的RT-2-X,把通用机器人策略的性能和可及性都推到了新高度。
- 微调落地路径跑通:从全量微调到LoRA高效微调,再到量化推理,整条落地链路都验证过了,消费级硬件就能用,不再是实验室专属玩具。
- 设计经验可复用:双路视觉编码器、微调视觉主干、分位数动作离散化、多轮训练这些最佳实践,给后续做VLA的研究者踩平了很多坑。
未来方向
- 更大规模数据与模型:现在还只有不到一百万条机器人数据,未来数据量上去后,更大的模型应该还能继续涨点;
- 多模态输入扩展:现在只用了单目RGB,未来可以加入深度图、力觉、语音等更多传感器输入;
- 强化学习对齐:现在还是纯行为克隆,未来结合RLHF或者在线强化学习,有望进一步提升任务成功率和鲁棒性。
总的来说,OpenVLA不是终点,而是开源通用机器人策略的一个坚实起点。它把高高在上的VLA技术拉到了普通人能碰得到的位置,接下来整个领域的迭代速度肯定会越来越快。