把视觉分辨率提到 384 像素,机器人为什么一点没变准
视觉语言动作模型的精度不够,第一反应是把相机分辨率提上去。开源模型 OpenVLA 做过这组对照:224 像素和 384 像素在多项任务上的成功率没有差别,而后者训练时间要三倍。边长只乘 1.7,视觉 token 数乘 2.85,自注意力的计算量乘 8.1,多出来的算力全花在背景像素上。
边长乘一点七,像素乘二点九
224 和 384 这两个数字经常被当成“清晰度”来比较,实际差的是面积。224 的平方是 50176 个像素,384 的平方是 147456 个,比值 2.94。
视觉编码器不按像素算,按 patch 算。ViT 把图像切成 14 像素见方的块,每块压成一个 token。切块数是
N = (H / p)²
H 是输入边长,p 是 patch 边长。224 除以 14 得 16,16 的平方是 256 个 token。384 除以 14 得 27.4,向下取整 27,27 的平方是 729 个 token。
单路编码器从 256 涨到 729,比值 2.85。OpenVLA 用了两路编码器,DINOv2 取空间细节,SigLIP 取语义特征,两路拼起来送进语言模型。两路的 token 数一起涨,总数从 512 涨到 1458。
注意力按平方,编码器按线性
token 数只是线性涨,麻烦出在后面的注意力上。Transformer 的自注意力要算 Q 乘 K 的转置,再乘 V,两次矩阵乘法的计算量都正比于 token 数的平方:
注意力计算量 ≈ 4 × N² × d
d 是隐藏维度。token 从 512 涨到 1458,N² 这一项涨 8.1 倍。也就是说,输入边长只提了 71%,注意力这一层的计算量涨了八倍。
在 7B 参数的主干里,注意力的绝对占比不算最高,前馈层和词表投影也很重。但延时的增量主要从这一层来,因为它对序列长度最敏感,而前馈层对序列长度是线性的。
图 1 视觉 token 数与注意力计算量随输入边长的走向(依据原文第 3.1 节与第 3.5 节绘制)
同样的 token 增量,落在编码器和落在语言模型上,代价不一样。
ViT 编码器每层的计算量正比于 token 数乘隐藏维度的平方,对 token 数是一次的。token 从 256 涨到 729,编码器这一层的计算量就按 2.85 倍走。
语言模型那一段不是。自注意力里的 N² 项随序列长度平方涨,而这段序列本来就长,视觉 token 只是其中一部分,指令文本和动作 token 也在里面。序列从 512 涨到 1458,平方项涨 8.1 倍。
所以分辨率提上去之后,账不是均匀分摊的。编码器多花 2.85 倍,语言模型的主干要多花八倍。想把代价压下来,动的应该是后者,比如把视觉 token 在进语言模型之前先做一轮压缩,而不是把输入边长往回退。
论文的对照实验没跑出差别
这套推算如果只停在纸面上,还可以争一句“算力换精度值不值”。OpenVLA 的作者直接把两组模型都训了一遍。
结论写在论文的训练细节里:224 乘 224 和 384 乘 384 两种输入,在评测中没有表现出性能差异,而 384 那一组的训练时间是三倍。作者据此选定 224 作为默认输入。
这个结果比任何理论推导都硬。三倍训练时间意味着三倍的 A100 机时,这套模型在 64 张 A100 上训了 14 天,合计 21500 A100 小时,数据集是 97 万条真实机器人演示。把输入改到 384,这些数字全部乘三,换回来的是零。
顺带说一句,模型参数量 7B,用 bfloat16 加载要 15 GB 显存,在单张 RTX 4090 上的推理速度约 6 Hz。这个速度是后面所有讨论的前提。
分辨率买到的是什么
要理解为什么没差别,得看机器人任务里信息分布在哪。
抓取任务的关键信息在夹爪与物体的接触点上。这个区域在一帧 224 像素的画面里通常只占几十个像素见方,提到 384 之后变成一百多个像素见方。多出来的分辨率确实让接触点更清楚,但模型判断失败的原因往往不是看不清边缘,而是接触力、摩擦、物体材质这些视觉里根本没有的量。
背景像素反而被一起放大了。桌面纹理、光照变化、无关物体,这些内容在 384 下占用的 token 更多,对注意力的干扰也更重。有用信息增加的比例,低于无用信息增加的比例。
论文还有一个细节能侧面印证:模型的输出是 7 维动作,每一维离散成 256 个区间。动作精度的上限由这 256 个区间决定,与输入分辨率无关。视觉再清楚,动作也只能落到 256 分之一的位置上。
数据侧的成本同样按面积走。97 万条演示的原始视频要按目标分辨率解码再送进网络,分辨率翻一倍多,解码和传输的字节数也接近翻三倍。训练时的数据加载常常先成为瓶颈,GPU 在等数据,算力利用率上不去。这也解释了为什么 384 那一组实测下来慢三倍,而不是慢八倍,瓶颈被数据侧摊平了一部分。
6 Hz 的余量经不起这么花
6 Hz 意味着一次完整推理 167 毫秒。这个频率在抓取任务里勉强够用,在需要跟随外部扰动的任务里已经偏慢。
把分辨率提到 384,注意力涨 8.1 倍,整条链路的延时不会等比例涨,因为编码器部分、词表投影、采样都有固定开销。但哪怕只有一半的增量落到注意力上,167 毫秒也会变成三百毫秒以上,控制频率掉到 3 Hz 附近。
这里有一个容易被忽略的耦合。动作块的长度是按推理频率定的,推理慢一半,两次推理之间的盲区就长一倍。分辨率提上去换来的那点视觉细节,被更长的盲区吃掉了。
显存也不是没有代价。15 GB 里绝大部分是 7B 权重的 bf16 副本,视觉 token 的 KV 缓存只占很小一块。序列涨到 1458 之后,这一块跟着涨,加上中间激活,整机显存会往上抬一截。在 24 GB 的消费级卡上还装得下,装到边缘盒子里的那种 16 GB 方案就直接爆了。
图 2 一条 VLA 推理链上 token 在哪一段被放大(依据原文第 3.1 节与第 3.5 节绘制)
该省的从来不是分辨率
正确的做法是把 token 花在有用的地方,而不是把整幅图放大。
第一条路是裁感兴趣区域。既然接触点只占画面一小块,就把相机对准它,或者用上一帧的动作预测一个裁剪框,只把这一块送进编码器。同样的 token 预算,接触点的有效分辨率能提三四倍,而不是全图的 1.7 倍。
第二条路是做 token 合并。相邻的、特征接近的 patch 合成一个,背景区域大幅压缩,物体区域保留。这类方法不改模型结构,只在编码器和投影之间加一层。
第三条路是把视觉频率和动作频率分开。视觉编码器跑 6 Hz,动作头用插值或轻量策略跑到 50 Hz,中间靠动作块衔接。这也是目前主流 VLA 的架构选择。
三条路的共同点是,都不去动输入边长。分辨率是一个看起来很直观、实际上性价比最差的旋钮。
还有一条对照值得记住。这个 7B 模型的成功率比 55B 的 RT-2-X 高 16.5 个百分点,参数量只有对方的八分之一。拉开差距的是数据多样性和视觉特征的融合方式,不是输入像素数。把这条和前面的分辨率对照放在一起,结论很清楚:这条链路上真正值钱的是数据和对齐,不是像素。
一句话,视觉分辨率买到的是 token 的平方,买不到机器人的精度。
内容来源:arXiv 预印本(开放获取)
原文标题:OpenVLA: An Open-Source Vision-Language-Action Model
作者:Moo Jin Kim,Karl Pertsch,Siddharth Karamcheti 等
arXiv 编号:2406.09246
配图说明:两张图均为自行绘制,为原理示意,非原文原图复制。
改动声明:本文为对开放获取文献的技术编译与解读,标题、行文与配图为原创。
来源:21ic电子网





