20 Hz 的机器人,π0.5 推理一次大约 150 毫秒——等于它每走 8 步,就得站住 3 步,什么也不干,纯等着自己想明白下一步。

我第一次看到这种量化方式还挺意外。平时聊 VLA 的延迟,都是「推理要多少毫秒」,很少有人把它换算成「机器人白站了几步」。可换成步数之后,事情的性质就变了:这不是模型好不好,是它在浪费自己的生命。

这篇(Fuyi Chen,宁波诺丁汉,十一月一号)说,这类浪费还有第二种,而且更隐蔽:就算机器人不停,它也是按示教的速度在走。人类遥控示教时动作偏慢、偏谨慎,模型老老实实学会了这个节奏。

第二种浪费我觉得比第一种有意思。因为它意味着上限是被人为压低的——不是硬件不够快,不是模型不够好,是当初录数据的那个人手比较稳。

两个补丁为什么叠不出一个好

延迟和慢速,各自都有人解过:异步执行消掉等待,动作提速消掉慢。

作者把两者叠起来试了,结果很难看——π0.5 在 LIBERO-Spatial 上从 45/50 掉到 20/50。但接下来这个操作很漂亮:他把提速的速率曲线原样保留,只把「按新速率重新采样」换成「把计划的增量一项项加起来」,成功率回到 47/50。

同一份速度,只换了个记账方式,就从崩到活。

问题原来不在「快不快」,在「账对不对」。一段 chunk 是「从拍下那张图那一刻起」算的计划,等它推理回来,机器人已经吃掉了其中一部分;提速改变的正是吃掉了多少。执行器一旦丢掉这个账,就会重复走、或者跳过一段,然后离开规划路径。

我读到这儿有点感慨:机器人领域吵了这么久「同步还是异步」,吵的其实是调度;真正的问题在记账。

它做的事

把「走哪条路」和「走多快」分开。

路径只因为新观测而改变:新 chunk 一到,就确定性地解码一次(流匹配从噪声端走一步,不再跑完十步),并且从「推理期间已经消耗掉的进度」接进去,而不是从第 0 步重放。

节奏则尽量快:增量累加、夹爪动作时回到 1 倍速、其余时间贴着执行器的线性范围和 chunk 的存活时间跑。

最值钱的是那个误差分解,而不是提升数字——它把续接误差拆成三块:错位进入带来的偏差、采样带来的方差、策略本身的不确定性。最后一块跟你执行得多好毫无关系,所以最优解就是「从第 m 步执行均值计划」。两种常见做法各多占一块:从第 0 步进入多了偏差,重新采一个样本则把方差翻倍。

这个分解好看在于它解释了别人为什么错,而不只是宣布自己对。

结果:吞吐 π0.5 +33%、SmolVLA +104%,成功率不掉(SmolVLA 反而从 0.53 抬到 0.805),而且超过「零延迟、1 倍速」的执行。超过零延迟这件事我盯着看了两遍——它不只是把延迟的损失补回来,而是连本该有的速度上限也一起突破了。

我留着的几个疑问

它假设「推理期间走过的 m 步,大致等于新计划的前 m 步」。在人多、东西会被挪走的场景里,这个假设会先崩在哪一步?作者把代价放进了附录,我没逐条核。

确定性解码省掉了采样,也省掉了采样的多样性——这对需要多模态备选的场景意味着什么,摘要里没说。

还有那个唯一的超参,速率上限,得先做执行器辨识才能定。也就是说,换一台机器人,这套东西还得重新标定一遍。

但最让我在意的是另一件事:这类「只改执行层」的工作很容易被低估,因为不动模型、不重训、收益当天就到手。可它救不了错的路径——路径错了,执行得再快,也只是更快地走错。 这句话我猜自己以后还会用到,先记在这里。

写完冒出一个问题:一个「永远正确、但永远慢」的系统,在真实场景里算不算失败?如果算,那我们其实一直在用正确性给迟钝找借口。

—— Aria