最近在做优化的时候涉及到了这块内容,觉得值得写下来,方便以后翻阅。
模型快了,机器人就能动吗?从 OpenVLA-OFT 到启元 Q1 的 8 步动作块适配实验
- 引言:VLA 的瓶颈不只在“看懂”
- 一、OpenVLA-OFT 改了什么
- 1. 从“逐个动作 token”变为并行输出
- 2. 一次不只预测一个动作,而是预测一个动作块
- 3. 不再把连续控制量硬塞进离散 token
这里解读论文《Fine-Tuning Vision-Language-Action Models: Optimizing Speed and Success》,并围绕启元 Q1 达成一个 8 步、22 维的动作块适配器。实验使用 Q1 官方 URDF,不下载 OpenVLA 权重、不训练模型,也不向真机发送指令;目标是把论文中的“连续动作块”落实为一段可以检查、记录和复现的本体接口代码。
引言:VLA 的瓶颈不只在“看懂”
视觉—语言—动作模型(VLA)听起来很像“给机器人装一个能看、能听的大模型”:输入图像和文字指令,模型输出动作。但真正接入机器人后,一个很容易被忽略的麻烦会立刻出现——模型生成动作的速度,可能远远跟不上控制循环。
原始 OpenVLA 采用自回归方法,把机器人动作离散成 token,再像语言模型生成文字一样逐个生成动作维度。对于低频单臂任务,这种方法尚能工作;面对高频双臂或人形机器人,逐维生成会产生明显延迟。OpenVLA-OFT 论文报告,原始方案在单臂场景约为 3~5 Hz,而实际双臂控制常需要 25~50 Hz 甚至更高的更新频率。[论文原文]把麻烦概括为:VLA 不仅要“预测正确”,还要在机器人来得及执行的时间内预测出来。
这正是这里选择该论文的原因。相比泛泛讨论基础模型,OpenVLA-OFT 关注的是一个非常工程化的麻烦:怎样改变微调与动作解码方法,使一个 70 亿级 VLA 同时获得更高吞吐量和更好的任务成功率。对于拥有 22 个可动关节的启元 Q1,这比单纯比较模型参数量更值得讨论。
一、OpenVLA-OFT 改了什么
OpenVLA-OFT 并不是重新预训练一个全新的 VLA。它以 OpenVLA 为基础,系统比较了动作解码、动作表示和训练目标,最终组合成 Optimized Fine-Tuning(OFT)方案。核心由三部分构成:
1. 并行解码与动作分块;
2. 连续动作表示;
3. L1 回归目标。
在双臂 ALOHA 实验中,作者又增加 FiLM,通过语言条件调制视觉特征,形成 OpenVLA-OFT+。论文代码、模型和演示入口汇总在 [OpenVLA-OFT 官方项目页]。
图 1:这里根据论文方法重新绘制的 OpenVLA-OFT 结构图。OFT 将视觉语言主干与并行连续动作头连接;腕部相机、本体状态和 FiLM 属于进一步增强项。该图不是论文原图。
1. 从“逐个动作 token”变为并行输出
自回归 OpenVLA 生成一个 7 维动作,需要依次生成 7 个动作 token。后一个 token 依赖前一个 token,因而无法一次做好。OFT 改用双向注意力和并行解码,让动作维度在一次前向过程中共同产生。
论文在 NVIDIA A100 上测试 LIBERO:原始 OpenVLA 的动作吞吐量是 4.2 Hz,单次延迟为 0.2396 秒;只加入并行解码后,吞吐量提升到 15.9 Hz,延迟降至 0.0629 秒。这里的收益主要来自把多次串行解码合并为一次。
2. 一次不只预测一个动作,而是预测一个动作块
OFT 接着在并行解码基础上加入 action chunking。LIBERO 实验的块长度为 K=8,即每次同时生成未来 8 个时间步的动作。在相同测试条件下,并行解码加 8 步动作块达到 108.8 Hz 的动作吞吐量,生成一块的延迟为 0.0735 秒。
这组数据容易被误读。108.8 Hz 指一秒生成的动作点数量,而不是模型每秒重新观察环境 108.8 次。论文在 LIBERO 中会完整执行 8 步动作块,再重新查询模型。于是,动作分块提高了吞吐量,却也让块内若干步成为开环执行。环境一旦在块内发生意外变化,模型不能立刻根据新图像修正。这是效率与反应性的交换,而不是免费的加速。
3. 不再把连续控制量硬塞进离散 token
原始 OpenVLA 把动作离散化后用下一 token 预测训练。OFT 改为连续动作头,并比较扩散目标与 L1 回归。论文结果显示,连续动作优于离散动作,而简单的 L1 回归与扩散方案在 LIBERO 上表现接近,但训练收敛和推理更快。
采用并行解码、8 步动作块、连续动作和 L1 回归后,吞吐量为 109.7 Hz,延迟为 0.0729 秒。扩散版本若使用 50 次去噪,LIBERO-Long 成功率略高,但延迟达到 1.907 秒;减少到 1 次去噪虽然吞吐量接近 L1,LIBERO-Long 成功率却降到 0。这个消融实验说明:比较模型速度时,不能只看“每秒输出多少动作”,还要同时查看任务质量。
图 2:根据论文 Table II 重新绘制的 LIBERO 推理效率对比。测试条件为 NVIDIA A100、7 维动作和 K=8;PD 表示并行解码,AC 表示动作分块。吞吐量显著提高,但每块延迟不能直接解释为视觉闭环频率。
二、实验结果:97.1% 不能脱离输入条件
OpenVLA-OFT 最常被引用的结果,是 LIBERO 四个任务套件平均成功率从原始 OpenVLA 的 76.5% 提升到 97.1%,动作生成吞吐量提高 26 倍。不过,论文表格中存在两组不同输入条件,阅读时应分开。
输入与训练条件方法LIBERO 平均成功率第三人称图像、语言;过滤失败示范原始 OpenVLA76.5%同上并行解码 + 8 步动作块90.2%同上连续动作 + 扩散95.4%同上OpenVLA-OFT(连续动作 + L1)95.3%再加入腕部相机和本体状态;过滤失败示范OpenVLA-OFT97.1%
于是,和原始 OpenVLA 输入条件更接近的 OFT 成绩是 95.3%,而 97.1% 还使用了腕部图像和机器人本体状态。97.1% 当然仍是论文的重要结果,但不能把全部增益都归因于 L1 回归或动作分块。[论文的 LIBERO 表格与效率测试]给出了完整分组。
图 3:根据论文 Table I 重新绘制的平均成功率。橙色斜线柱使用了额外的腕部图像和本体状态,于是用虚线与前四项分隔,避免把不同输入条件混为同一消融实验。
在真实 ALOHA 双臂机器人上,实验使用三个 224×224 图像视角、14 维关节状态和语言指令,控制频率为 25 Hz,动作是目标绝对关节角。动作块长度扩大到 K=25。OpenVLA-OFT+ 的吞吐量为 77.9 Hz、单块延迟为 0.321 秒,相比原始 OpenVLA 的 1.8 Hz 和 0.543 秒有显著改善。不过,论文同时报告 ACT、Diffusion Policy 和 π0 的吞吐量更高,说明 OFT 的价值不是“绝对速度最快”,而是让大型 VLA 达到可用的高频控制区间,同时保留视觉语言模型的语义能力。
三、为什么这篇论文和启元 Q1 有关系
论文中的 LIBERO 动作是 7 维末端位姿增量,ALOHA 使用 14 维绝对关节角;启元 Q1 官方 q1_v3.urdf 则包含 22 个可动旋转关节。三者的动作语义完全不同。
这意味着,即使拿到了 OpenVLA-OFT 的连续动作头,也不能把其输出原样交给 Q1。至少需要解决四个接口问题:
- 输出维度从目标数据集定义为 Q1 的 22 维;
- 固定关节名称与顺序,避免左右侧或关节轴错位;
- 将归一化值恢复为 Q1 的物理关节角;
- 对整个动作块逐步执行限位、速率和异常值检查。
图 4:本文设计的 Q1 动作块适配链。实线部分对应本次达成的数值检查、URDF 映射、时序限制和日志记录;虚线框中的真机控制门禁没有在本文验证。
四、实操设计:构造一个 8×22 的动作块
1. 实验范围
本文使用以下环境:
项目实际版本操作系统Windows 11,build 10.0.26200Python3.12.14NumPy2.5.4Matplotlib3.11.2Q1 模型启元 Q1 官方 URDF 仓库仓库提交9657817ba375f41b0e5d2b62d8d6b72b757cdf4f
脚本从 URDF 读取 22 个非固定关节,随后构造一个形状为 [8, 22] 的确定性模拟输出。这里的 8 对应论文 LIBERO 实验的块长度,22 对应 Q1 可动关节数量。
需要格外强调:模拟输出不是 OpenVLA-OFT 推理结果。它刻意加入两个超出 [-1,1] 的值,用于验证适配器是否能拦截越界;本文没有下载 7B 权重,也没有将动作发送到机器人。
2. 运行方法
git clone https://github.com/PrimebotTech/primebot-q1-urdf.git
cd D:\codex\q1-paper-practice
py -3.12 -m venv .venv312
.\.venv312\Scripts\python.exe -m pip install -r requirements.txt
.\.venv312\Scripts\python.exe .\simulate_q1_action_chunk.py `
..\primebot-q1-urdf\urdf\q1_v3.urdf `
--output .\output
.\.venv312\Scripts\python.exe .\generate_openvla_oft_figures.py `
--output .\output
脚本会生成:
output/q1_action_chunk_trace.csv:8×22 个动作值的完整处理轨迹;output/q1_action_chunk_summary.json:裁剪计数与安全检查结果;output/figure_q1_action_chunk_adapter.png:部分关节的输入与输出曲线。
3. 关键适配代码
下面是完整脚本中的核心步骤。raw_chunk 可以替换为将来真实 VLA 动作头的输出。
# lower/upper 来自 Q1 URDF,形状均为 [22]
width = upper - lower
# 在机械上下限内各保留 5% 行程,不把机械极限当工作边界
safe_lower = lower + 0.05 * width
safe_upper = upper - 0.05 * width
# raw_chunk.shape == [8, 22]
normalized = np.clip(raw_chunk, -1.0, 1.0)
# [-1, 1] 映射到各关节的安全角度范围
target = safe_lower + (normalized + 1.0) * 0.5 * (
safe_upper - safe_lower
)
# 示例速率限制:每个离散步最多变化 0.08 rad
executed = np.empty_like(target)
previous = (safe_lower + safe_upper) * 0.5
for step in range(target.shape[0]):
delta = target[step] - previous
executed[step] = previous + np.clip(delta, -0.08, 0.08)
previous = executed[step]
这里的 5% 安全余量和 0.08 rad/step 是本文为了演示处理链设置的实验参数,不是启元官方控制参数。真机应用务必根据 SDK 控制周期、关节速度、负载和安全规范重新确定,不能直接复制。
五、实测结果:越界值被拦截,但“安全”还远没有收尾
脚本实际读取到 22 个可动关节,动作块形状为 [8, 22],共包含 176 个关节目标。确定性模拟数据中有 2 个归一化值越过 [-1,1],二者均在映射前被裁剪。以中位姿为初始状态、每步最大变化量设为 0.08 rad 后,共有 167 个关节步触发了速率限制;处理后的 176 个命令全部位于预留 5% 余量的安全角度区间内。
图 5:上图为选定 Q1 关节的模拟归一化输出,红色虚线表示 [-1,1] 边界;下图为经过 URDF 映射、5% 行程余量和 0.08 rad/step 速率限制后的关节命令。数据由本文脚本实际生成。
167 次速率限制看起来挺多,但这恰好暴露了动作块接口中值得检查的问题:如果策略连续输出大跨度关节目标,简单逐步截断会让实际轨迹严重偏离模型原始意图。工程上不能只记录“没有超过机械限位”,还应记录裁剪比例、实际轨迹与目标轨迹的误差,并据此调整训练数据归一化或动作表示。
这个实验也说明,动作分块的输出检查该是二维的:
- 空间维度:同一时间步的 22 个关节是否满足范围、左右对称关系与碰撞约束;
- 时间维度:同一关节在 8 个时间步之间是否满足速度、加速度和控制周期要求。
六、动作分块在 Q1 上还需要补哪几层
1. 明确动作到底表示什么
论文中 LIBERO 使用末端增量动作,ALOHA 使用绝对关节角。Q1 后续采集数据时务必先确定训练目标:是 22 维绝对关节角、关节增量、关节速度,还是更高层的末端位姿。不同表示会改变归一化方式、控制器结构和容错策略。
2. 不要把吞吐量当作闭环频率
模型一次给出 8 步动作,不等于视觉闭环运行了 8 次。若执行完整块后才重新观测,块内反应性会下降。对于需要平衡或可能接触人的人形机器人,可以考虑缩短实际执行长度:预测 8 步,但只执行前几步就重新观测;代价是模型查询更频繁。
3. 给每个动作块附加“可审计信息”
建议至少记录观测时间戳、模型版本、关节顺序、原始输出、反归一化目标、裁剪原因和最终下发值。本文输出的 CSV 就采用这种思路。出现异常时,应能区分问题来自模型、适配器还是底层控制器。
4. 真机前必须经过更严格的验证链
可行的推进顺序是:离线动作统计 → URDF/MuJoCo 运动学检查 → 自碰撞与稳定性检查 → 控制器硬件在环 → 真机单关节低速验证 → 多关节空载动作 → 视觉闭环任务。本文做好的是前两步中的接口原型,不应跨级解释为部署完成。
七、论文局限与个人判断
OpenVLA-OFT 的优势来自清晰而有效的工程组合,但它也有边界。
首先,L1 回归倾向于预测条件分布的中位模式。如果同一场景存在绕左和绕右两条都合理的轨迹,L1 可能把两种策略平均成一条并不理想的轨迹。论文明确把多模态示范列为限制,而扩散模型在表达多种可行动作方面通常更有优势。
其次,论文主要研究下游微调,并未证明 OFT 同样适合大规模预训练。OpenVLA 的预训练动作表示与 OFT 的连续动作头不同,因此迁移仍然依赖目标机器人数据。
最终,论文的 26 倍吞吐量来自指定 GPU、输入尺寸和动作维度。Q1 是 22 维全身关节空间,并且可能需要更多视觉输入;真实吞吐量必须在目标硬件和完整软件链上重新测量。
我的理解是,OFT 最重要的启示并不是“L1 一定优于扩散”,而是 VLA 的动作头和微调配方该围绕目标机器人重新设计。预训练模型提供视觉语言表征,真正决定机器人能否稳定工作的,往往是动作定义、数据质量、推理节奏与安全适配这些看似不够“基础模型”的细节。
八、结语
OpenVLA-OFT 把一个大型自回归 VLA 改造成能够并行输出连续动作块的策略,在 LIBERO 和 ALOHA 上证明了微调配方本身可以显著影响速度与成功率。论文没有消除机器人本体差异,反而提醒开发者:模型输出越快,动作接口越需要清晰。
本文针对启元 Q1 构造的 8×22 动作块实验,将论文的 action chunking 概念落到了关节名称、URDF 限位、归一化映射、速率限制和运行日志上。没有真机也可以先把这些接口验证好;但只有完成动力学、安全链路和真机测试后,才能讨论真正的 VLA 部署效果。
参考资料
1. Moo Jin Kim, Chelsea Finn, Percy Liang, [Fine-Tuning Vision-Language-Action Models: Optimizing Speed and Success], 2025.
2. [OpenVLA-OFT 官方项目页],包含代码、模型与实验视频。
3. Moo Jin Kim et al., [OpenVLA: An Open-Source Vision-Language-Action Model], 2024.
4. [OpenVLA 官方代码仓库]。
5. [启元 Q1 官方 URDF/MuJoCo 模型仓库]。
更多机器人开发资料可访问启元机器人开发者社区:https://dev.primebot.com/
本次分享就到这里。技术这东西越研究越有意思,后续有新的收获我也会继续更新。
评论 (0)
暂无评论