Real-Time Chunking for VLAs: RTC, Training-Time RTC, and VLASH

21 minute read

Published:

Large vision-language-action models have a timing problem. The robot controller wants a new command every 20-30 ms, while a large VLA may need tens or hundreds of milliseconds to produce the next action chunk. If the robot waits, it stalls. If it keeps moving and naively swaps to the next chunk, the new action can be inconsistent with the trajectory already being executed.

These three papers are best read as a sequence of increasingly precise answers to that mismatch:

  1. RTC makes chunked policies real-time by running inference asynchronously and inpainting the next chunk so it remains compatible with the previous chunk.
  2. Training-Time RTC keeps the same runtime interface but moves the prefix-conditioning problem into training, removing the expensive inference-time guidance step.
  3. VLASH reframes the asynchronous failure mode as prediction-execution state mismatch and conditions the VLA on the robot state that will hold when the new chunk actually starts executing.

My main takeaway: real-time action chunking is not one trick. It has at least three layers. The system layer hides latency with asynchronous execution. The action layer preserves continuity across chunk boundaries. The state layer aligns the model input with the future state at execution time.

Paper Info

The first paper is “Real-Time Execution of Action Chunking Flow Policies” by Kevin Black, Manuel Y. Galliker, and Sergey Levine. It introduces real-time chunking (RTC) and is available as arXiv:2506.07339, with the Physical Intelligence project page Real-Time Action Chunking with Large Models and code at Physical-Intelligence/real-time-chunking-kinetix.

The second paper is “Training-Time Action Conditioning for Efficient Real-Time Chunking” by Kevin Black, Allen Z. Ren, Michael Equi, and Sergey Levine, available as arXiv:2512.05964. It is a direct follow-up to RTC.

The third paper is “VLASH: Real-Time VLAs via Future-State-Aware Asynchronous Inference” by Jiaming Tang, Yufei Sun, Yilong Zhao, Shang Yang, Yujun Lin, Zhuoyang Zhang, James Hou, Yao Lu, Zhijian Liu, and Song Han, available as arXiv:2512.01031, with project/code at mit-han-lab/vlash.

The Shared Problem

An action-chunking policy predicts a sequence

\[ A_t = [a_t, a_{t+1}, \ldots, a_{t+H-1}], \]

where \(H\) is the prediction horizon. During rollout, the system usually executes only the first \(s \le H\) actions before asking the model for another chunk. This \(s\) is the execution horizon.

If the controller period is \(\Delta t\) and model inference takes \(\delta\), the delay in controller steps is roughly

\[ d = \left\lfloor \frac{\delta}{\Delta t} \right\rfloor. \]

For modern VLAs, \(d\) is often larger than zero. A synchronous system waits for the model after each chunk, producing visible pauses. A naive asynchronous system starts the next inference while the old chunk is still executing, but the new chunk arrives after \(d\) steps. At that moment the robot may jump from an action planned by the old chunk to an action planned by the new chunk under a different observation and a different sampled mode.

The technical question is therefore:

How can the robot keep executing at controller frequency while letting a slow model think in the background, without creating out-of-distribution jumps at chunk boundaries?

Original RTC: Inference-Time Inpainting

RTC answers this by turning asynchronous action generation into an inpainting problem.

Suppose the robot is executing an old chunk and starts inference for the next chunk. While the model is running, the next \(d\) actions are already committed: the robot will execute them from the old chunk before the new chunk is ready. RTC uses these known actions as a prefix constraint for the new chunk. The new chunk should agree with the already-committed prefix and then smoothly continue into newly generated actions.

For flow-matching policies, a chunk is generated by integrating a learned velocity field from noise:

\[ A_t^{\tau + 1/n} = A_t^\tau + \frac{1}{n} v_\pi(A_t^\tau, o_t, \tau). \]

RTC modifies the velocity field during sampling. At each denoising step, it forms an estimate of the final denoised chunk:

\[ \hat{A}t^1 = A_t^\tau + (1-\tau)v\pi(A_t^\tau, o_t, \tau). \]

Then it compares this estimate to the previous chunk on overlapping timesteps. The error is weighted by a mask \(W\). The first \(d\) actions get weight 1 because they are guaranteed to execute. The final \(s\) actions have no overlap with the previous chunk and get weight 0. The intermediate overlap receives exponentially decaying weights, giving nearby future actions stronger continuity pressure than far-future actions.

The correction is computed with a vector-Jacobian product through the denoiser. In implementation terms, the official Kinetix code does:

x_1, vjp_fun, v_t = jax.vjp(denoiser, x_t, has_aux=True)
weights = get_prefix_weights(inference_delay, prefix_attention_horizon, ...)
error = (prev_action_chunk - x_1) * weights[:, None]
pinv_correction = vjp_fun(error)[0]
v_t = v_t + guidance_weight * pinv_correction

That is the core of RTC: the base flow policy proposes the action chunk, while pseudoinverse-style guidance bends the denoising trajectory toward compatibility with the old chunk.

The system part matters just as much as the math. RTC uses a background inference loop. The controller calls GetAction every control step and consumes the current chunk. Meanwhile, the background thread waits until enough actions have been executed, snapshots the newest observation, estimates the next delay from recent latency measurements, runs guided inference, then swaps in the new chunk as soon as it is ready. The execution horizon can adapt as \(s=\max(d, s_{\min})\), so the system remains conservative under changing latency.

In simulation, RTC is evaluated on 12 dynamic Kinetix tasks with force-based control, where holding position is not a meaningful fallback. It outperforms naive asynchronous execution, temporal ensembling, hard masking, and bidirectional decoding under increasing delay. On real bimanual manipulation with \(\pi_{0.5}\), it improves throughput and remains robust even with injected latency, while temporal ensembling can trigger high oscillations.

The limitation is also clear. RTC adds a VJP/backpropagation correction at every denoising step, so the method increases inference cost exactly inside a real-time system. It also applies most naturally to diffusion- or flow-based policies. Conceptually, RTC fixes action compatibility, while the observation and robot state used by the model are still captured at inference start.

Training-Time RTC: Learn the Prefix Constraint

Training-Time RTC keeps the asynchronous RTC interface but changes where the continuity constraint is learned.

The key observation is simple: during training, we already have ground-truth action chunks. We can simulate inference delay by taking the first \(d\) actions of a chunk as a known prefix, then asking the model to denoise only the postfix:

\[ p(A_{t+d:H} \mid o_t, A_{t:t+d}). \]

This turns RTC from an inference-time optimization procedure into a conditional generation problem learned during flow-matching training.

Implementation requires three small changes:

  1. Allow the flow-matching time \(\tau\) to differ across action tokens.
  2. Feed the prefix actions as clean, non-noisy tokens by setting their \(\tau\) to 1.
  3. Mask the loss so the model is trained only on the postfix tokens.

The training loss starts from the usual flow-matching interpolation:

\[ A_t^\tau = \tau A_t + (1-\tau)\epsilon,\quad \epsilon \sim \mathcal{N}(0,I). \]

For the prefix tokens, Training-Time RTC sets \(\tau=1\), making them equal to the clean ground-truth actions. For the postfix tokens, it uses normal noisy flow-matching inputs. The model sees both prefix and postfix, but the loss is computed only on the postfix. At sampling time, the same trick is used: clamp the known prefix, set its time to 1, and denoise the rest without any VJP guidance.

This is why the paper calls the method a drop-in replacement for inference-time RTC. The robot runtime can still pass in an action prefix and delay \(d\), but the action generator now handles the prefix natively. In the official Kinetix code, this appears as simulated_delay: during loss computation, a random delay is sampled, prefix tokens are assigned time 1, and the loss mask ignores those prefix positions.

The trade-off is flexibility. Original RTC can softly condition on all overlapping actions with a real-valued mask. Training-Time RTC uses a hard prefix corresponding to the sampled delay. It also requires choosing a training delay distribution that matches the expected deployment latency. The paper samples delays during training, including uniformly over delays 0 to 10 for the real-world \(\pi_{0.6}\) experiments.

The empirical message is useful. On Kinetix, Training-Time RTC outperforms inference-time RTC when the delay is 2 or higher, with the gap widening at larger delays. The authors interpret this as a failure mode of the inference-time linearization: when the prefix is long, the VJP-based correction has to work harder to produce a consistent postfix. On real tasks such as box building and espresso making, Training-Time RTC keeps similar task performance and speed to inference-time RTC while removing the extra runtime cost.

My read: Training-Time RTC is the version I would prefer when fine-tuning is available. Original RTC is attractive because it can wrap a pre-trained diffusion/flow policy immediately. Training-Time RTC is more deployment-friendly once you can afford a small fine-tuning stage.

VLASH: Align the State, Not Just the Chunk

VLASH points to a different failure mode. In asynchronous inference, the model predicts a chunk at time \(t\), but that chunk is executed starting at time \(t+\Delta\). The prediction interval is

\[ I_t^{\mathrm{pred}} = [t, t+K), \]

while the execution interval is

\[ I_t^{\mathrm{exec}} = [t+\Delta, t+\Delta+K). \]

RTC makes the new chunk compatible with the old chunk, but the model may still be conditioning on the robot state at inference start. By the time the new chunk begins executing, the robot has already moved. VLASH calls this prediction-execution misalignment.

The core idea is future-state awareness. During the inference delay, the robot will execute known actions from the previous chunk. Therefore, the robot state at the beginning of the next execution interval can be estimated by rolling the current state forward through those known actions:

\[ \hat{s}{t+\Delta} = \mathrm{rollforward}(s_t, a_t, a{t+1}, \ldots, a_{t+\Delta-1}). \]

VLASH then conditions the VLA on the current visual observation \(o_t\) and the rolled-forward robot state \(\hat{s}_{t+\Delta}\). For delta-action robots, this can be as simple as accumulating the known delta actions into the proprioceptive state. The visual observation is still the latest available image at inference start, but the robot-state input is shifted to the state where the new actions will actually take effect.

The paper adds an important training detail: existing VLAs may under-use robot state, sometimes performing better with visual-only fine-tuning. Feeding a future state at test time will not help if the model learned to ignore state. VLASH therefore uses temporal-offset augmentation during fine-tuning. For a trajectory \((o_t, s_t, a_t)\), it samples an offset \(\delta\), keeps the visual observation fixed as \(o_t\), and trains the model with state \(s_{t+\delta}\) and target action chunk \(a_{t+\delta:t+\delta+H-1}\).

This creates multiple training examples with the same image but different robot states and different action targets. The model is forced to use the state input to disambiguate what action chunk is appropriate. To make this efficient, VLASH packs one shared observation token sequence with multiple offset branches and uses a block-sparse attention pattern: each offset branch can attend to the shared observation and itself, while branches do not attend to each other. This reuses expensive image/language encoding across offsets.

VLASH also includes action quantization as a practical speed knob. It groups \(q\) fine-grained delta actions into one macro-action:

\[ \hat{a}i = a{iq} + a_{iq+1} + \cdots + a_{(i+1)q-1}. \]

This reduces the number of execution steps and gives a speed-accuracy trade-off. It is separate from future-state awareness, but it matters once asynchronous inference hides most model latency and physical execution becomes the bottleneck.

In Kinetix, VLASH remains close to the synchronous upper bound and is much more robust than naive asynchronous execution under delay. At delay 4, the paper reports 81.7% success for VLASH compared with 51.2% for naive async. In LIBERO, VLASH maintains comparable accuracy to synchronous inference while improving completion time. In real-world experiments, \(\pi_{0.5}\) with VLASH reaches comparable or better score percentages than synchronous inference on manipulation tasks, and action quantization with \(q=2\) gives up to 2.03x speedup while preserving accuracy in the reported setting. The paper also emphasizes reaction latency: asynchronous inference can reduce maximum reaction latency by up to 17.4x compared with synchronous execution because the robot no longer waits for the current chunk to finish before starting model inference.

VLASH’s limitation is that it rolls forward robot state, not the full future world. If the scene changes externally during inference, the visual input is still from the inference-start observation. The method also relies on a VLA interface where proprioceptive state is available and meaningful, and it benefits from fine-tuning with temporal offsets. Still, it gives a clean answer to a problem RTC leaves partly open: what state should the VLA condition on when asynchronous execution shifts the action interval into the future?

How the Three Methods Fit Together

These methods are compatible at the conceptual level because they target different pieces of the real-time stack.

MethodMain object being correctedWhen the correction happensWhat it needs
Original RTCAction chunk continuityInference timeDiffusion/flow sampler plus VJP guidance
Training-Time RTCPrefix-conditioned action generationTraining and samplingFine-tuning with simulated delay
VLASHPrediction-execution state alignmentFine-tuning and deployment input constructionRobot-state rollforward and offset augmentation

Original RTC is the most plug-and-play for a pre-trained flow or diffusion VLA. It can be added at inference time and immediately improves asynchronous execution, though it pays extra compute for guidance.

Training-Time RTC is the clean deployment version of the same idea. It teaches the model the prefix-conditioning interface directly, so deployment avoids the costly guidance loop.

VLASH shifts attention from chunk boundary smoothness to the input side of the policy. It says that a chunk generated from stale robot state is misaligned even if the action sequence is smooth. Its fix is to feed the state where the robot will be when the chunk begins.

Practical Takeaways

If I were implementing a real-time VLA stack, I would separate the design into three layers.

First, use asynchronous inference by default. The controller should keep consuming actions while model inference runs in another thread or process. The runtime needs a shared action queue, a measured inference delay, and conservative handling of latency spikes.

Second, ensure action continuity. If using a pre-trained diffusion/flow policy with no fine-tuning budget, original RTC is the natural first implementation. If fine-tuning is possible, Training-Time RTC is likely the better long-term choice because it removes the VJP overhead from deployment.

Third, align the state. If the model conditions on proprioception, the state should correspond to the execution-time state used by the next chunk. VLASH’s rollforward idea is especially relevant for long-latency systems, remote inference, and fast dynamic tasks.

The three-paper progression also clarifies where future work can go. A strong real-time VLA should probably combine training-time prefix conditioning with future-state-aware inputs. The former keeps chunks continuous; the latter makes the new chunk start from the right robot state. For dynamic scenes, the remaining hard problem is future environment estimation: the robot can roll forward its own state with known actions, but it cannot know exactly how objects, humans, or contacts will evolve during inference.

大型 vision-language-action model 有一个很现实的时序问题。机器人控制器可能每 20-30 ms 就需要一个新命令,而一个大 VLA 生成下一个 action chunk 可能要几十到几百毫秒。机器人等待模型会停顿;机器人继续动并直接切换新 chunk,又可能在 chunk 边界产生和当前轨迹不一致的动作。

这三篇论文适合按一条线读:

  1. RTC 通过异步推理和 action inpainting,让 chunked policy 可以实时执行,并且新 chunk 和旧 chunk 保持连续。
  2. Training-Time RTC 保留同样的运行时接口,但把 prefix conditioning 放到训练阶段,去掉推理时昂贵的 guidance。
  3. VLASH 把异步失败重新解释为 prediction-execution state mismatch,让 VLA 条件化在新 chunk 真正开始执行时的 robot state 上。

我的核心理解是:real-time action chunking 不是一个单点技巧。它至少有三层。系统层通过异步执行隐藏延迟;动作层保证 chunk 边界连续;状态层让模型输入对齐到未来执行时刻。

论文信息

第一篇是 “Real-Time Execution of Action Chunking Flow Policies”,作者是 Kevin Black, Manuel Y. Galliker, and Sergey Levine。它提出 real-time chunking (RTC),论文链接为 arXiv:2506.07339,Physical Intelligence 项目页为 Real-Time Action Chunking with Large Models,代码为 Physical-Intelligence/real-time-chunking-kinetix

第二篇是 “Training-Time Action Conditioning for Efficient Real-Time Chunking”,作者是 Kevin Black, Allen Z. Ren, Michael Equi, and Sergey Levine,论文链接为 arXiv:2512.05964。它是 RTC 的直接后续。

第三篇是 “VLASH: Real-Time VLAs via Future-State-Aware Asynchronous Inference”,作者是 Jiaming Tang, Yufei Sun, Yilong Zhao, Shang Yang, Yujun Lin, Zhuoyang Zhang, James Hou, Yao Lu, Zhijian Liu, and Song Han,论文链接为 arXiv:2512.01031,项目和代码为 mit-han-lab/vlash

共同问题

Action-chunking policy 会预测一段动作序列:

\[ A_t = [a_t, a_{t+1}, \ldots, a_{t+H-1}], \]

其中 \(H\) 是 prediction horizon。实际 rollout 时,系统通常只执行前 \(s \le H\) 个动作,然后请求模型生成下一个 chunk。这里的 \(s\) 是 execution horizon。

如果控制周期是 \(\Delta t\),模型推理耗时是 \(\delta\),那么用控制步数表示的延迟大约是

\[ d = \left\lfloor \frac{\delta}{\Delta t} \right\rfloor. \]

对现代 VLA 来说,\(d\) 往往大于 0。同步系统会在每个 chunk 后等待模型,产生明显停顿。朴素异步系统会在旧 chunk 还在执行时启动下一次推理,但新 chunk 要 \(d\) 步之后才到。到达时,机器人可能从旧 chunk 规划出的动作跳到新 chunk 在另一个 observation 和另一个采样 mode 下规划出的动作。

技术问题因此变成:

机器人怎样一边以控制频率持续执行,一边让慢模型在后台思考,同时避免在 chunk 边界产生分布外跳变?

原始 RTC:推理时 Inpainting

RTC 的回答是把异步 action generation 写成 inpainting 问题。

假设机器人正在执行旧 chunk,并启动下一次推理。模型推理期间,接下来的 \(d\) 个动作已经确定:机器人会在新 chunk ready 之前从旧 chunk 里执行这些动作。RTC 把这些已知动作作为新 chunk 的 prefix constraint。新 chunk 需要和这个已经承诺执行的 prefix 对齐,然后平滑延续到新生成的动作。

对于 flow-matching policy,生成一个 chunk 的过程是从噪声开始积分 learned velocity field:

\[ A_t^{\tau + 1/n} = A_t^\tau + \frac{1}{n} v_\pi(A_t^\tau, o_t, \tau). \]

RTC 在 sampling 时修改这个 velocity field。每个 denoising step 中,它先估计最终 denoised chunk:

\[ \hat{A}t^1 = A_t^\tau + (1-\tau)v\pi(A_t^\tau, o_t, \tau). \]

然后它在重叠时间步上比较这个估计和旧 chunk。误差由 mask \(W\) 加权。前 \(d\) 个动作权重为 1,因为它们确定会执行。最后 \(s\) 个动作和旧 chunk 没有重叠,权重为 0。中间重叠区域使用指数衰减权重,让近未来动作受到更强连续性约束,让远未来动作保留更多自由度。

修正项通过 denoiser 的 vector-Jacobian product 计算。官方 Kinetix 代码里的核心就是:

x_1, vjp_fun, v_t = jax.vjp(denoiser, x_t, has_aux=True)
weights = get_prefix_weights(inference_delay, prefix_attention_horizon, ...)
error = (prev_action_chunk - x_1) * weights[:, None]
pinv_correction = vjp_fun(error)[0]
v_t = v_t + guidance_weight * pinv_correction

这就是 RTC 的中心机制:base flow policy 负责提出 action chunk,pseudoinverse-style guidance 把 denoising 轨迹拉向和旧 chunk 兼容的结果。

系统部分同样重要。RTC 使用后台 inference loop。控制器每个控制步调用 GetAction 并消费当前 chunk;后台线程等待已经执行足够多的动作后,记录最新 observation,根据近期 latency 保守估计下一次 delay,运行 guided inference,然后在新 chunk ready 后立即交换到共享状态里。execution horizon 可以按 \(s=\max(d, s_{\min})\) 自适应,因此系统在 latency 变化时更保守。

仿真实验使用 12 个动态 Kinetix 任务,控制方式是 force-based control,所以“保持位置”等待模型不是合适退路。RTC 在 delay 增大时优于 naive async、temporal ensembling、hard masking 和 bidirectional decoding。真实双臂 manipulation 中,基于 \(\pi_{0.5}\) 的 RTC 提升了 throughput,并且在注入额外延迟后仍然鲁棒;temporal ensembling 在高延迟下会产生强振荡,甚至触发机器人保护停止。

局限也很清楚。RTC 在每个 denoising step 里增加 VJP/backpropagation correction,因此它在实时系统里引入了额外推理成本。它也主要适用于 diffusion 或 flow-based policy。从概念上看,RTC 修的是 action compatibility;模型使用的 observation 和 robot state 仍然是推理开始时刻采到的。

Training-Time RTC:把 Prefix Constraint 学进去

Training-Time RTC 保留异步 RTC 的接口,但改变连续性约束的学习位置。

关键观察很简单:训练时本来就有 ground-truth action chunk。我们可以在训练时模拟 inference delay,把一个 chunk 的前 \(d\) 个动作当作已知 prefix,然后让模型只 denoise 后面的 postfix:

\[ p(A_{t+d:H} \mid o_t, A_{t:t+d}). \]

这样,RTC 从推理时优化过程变成训练时学到的 conditional generation 问题。

实现只需要三个小改动:

  1. 允许 action token 之间的 flow-matching time \(\tau\) 不同。
  2. 对 prefix actions 设置 \(\tau=1\),把它们作为干净的非噪声 token 输入。
  3. mask loss,只在 postfix tokens 上计算训练损失。

训练损失从普通 flow-matching interpolation 开始:

\[ A_t^\tau = \tau A_t + (1-\tau)\epsilon,\quad \epsilon \sim \mathcal{N}(0,I). \]

对 prefix token,Training-Time RTC 令 \(\tau=1\),因此它们等于干净的 ground-truth actions。对 postfix token,则保持普通 noisy flow-matching 输入。模型同时看到 prefix 和 postfix,但 loss 只在 postfix 上计算。采样时用同样方式:固定已知 prefix,把它的 time 设为 1,然后无 VJP guidance 地 denoise 剩余部分。

这也是论文称它为 inference-time RTC drop-in replacement 的原因。机器人 runtime 仍然可以传入 action prefix 和 delay \(d\),但 action generator 已经原生支持 prefix conditioning。官方 Kinetix 代码中,这对应 simulated_delay:loss computation 时随机采样 delay,把 prefix token 的 time 设为 1,并用 loss mask 忽略这些 prefix 位置。

代价是灵活性下降。原始 RTC 可以用 real-valued mask 对所有重叠动作做 soft conditioning;Training-Time RTC 使用和 sampled delay 对应的 hard prefix。它也需要选择训练时的 delay distribution,使其匹配预期部署 latency。论文在训练中随机采样 delay,在真实 \(\pi_{0.6}\) 实验中使用 0 到 10 的 delay 范围。

实验结论很实用。在 Kinetix 上,当 delay 大于等于 2 时,Training-Time RTC 超过 inference-time RTC,而且 delay 越大差距越明显。作者认为这是 inference-time linearization 的失效模式:prefix 越长,基于 VJP 的修正越难生成一致的 postfix。真实 box building 和 espresso making 任务中,Training-Time RTC 在去掉额外运行时开销的同时,保持了和 inference-time RTC 接近的任务表现和速度。

我的理解:如果只拿到一个已经训练好的 diffusion/flow VLA,原始 RTC 很有吸引力,因为它能直接包在推理阶段。如果可以 fine-tune,Training-Time RTC 更适合长期部署,因为它把 VJP 开销从运行时移走了。

VLASH:对齐 State,而不只是对齐 Chunk

VLASH 指出了另一个失败模式。异步推理中,模型在时间 \(t\) 预测 chunk,但这个 chunk 到 \(t+\Delta\) 才开始执行。prediction interval 是

\[ I_t^{\mathrm{pred}} = [t, t+K), \]

execution interval 是

\[ I_t^{\mathrm{exec}} = [t+\Delta, t+\Delta+K). \]

RTC 让新 chunk 和旧 chunk 兼容,但模型仍然可能条件化在推理开始时刻的 robot state 上。新 chunk 真正开始执行时,机器人已经运动到另一个状态。VLASH 把这个问题称为 prediction-execution misalignment

核心想法是 future-state awareness。推理延迟期间,机器人会执行旧 chunk 中已知的动作。因此,下一个 execution interval 开始时的 robot state 可以通过这些已知动作从当前状态 roll forward 得到:

\[ \hat{s}{t+\Delta} = \mathrm{rollforward}(s_t, a_t, a{t+1}, \ldots, a_{t+\Delta-1}). \]

VLASH 然后把当前视觉 observation \(o_t\) 和 roll-forward 后的 robot state \(\hat{s}_{t+\Delta}\) 一起输入 VLA。对 delta-action 机器人来说,这可以简单实现为把已知 delta actions 累加到 proprioceptive state 上。视觉 observation 仍然是推理开始时的最新图像,但 robot-state input 被移动到新动作真正生效的状态。

论文还有一个重要训练细节:现有 VLA 可能没有充分利用 robot state,有时 visual-only fine-tuning 反而表现更好。如果模型训练时已经学会忽略 state,测试时喂 future state 也不会有明显帮助。因此 VLASH 在 fine-tuning 时使用 temporal-offset augmentation。给定轨迹 \((o_t, s_t, a_t)\),它采样 offset \(\delta\),保持视觉 observation 为 \(o_t\),并用 state \(s_{t+\delta}\) 和目标 action chunk \(a_{t+\delta:t+\delta+H-1}\) 训练模型。

这样,同一张图像会对应不同 robot state 和不同 action target。模型必须利用 state input 来判断当前应该输出哪段动作。为了提高效率,VLASH 把一个共享 observation token sequence 和多个 offset branch 打包到一起,并使用 block-sparse attention:每个 offset branch 可以 attend 到共享 observation 和自身,但不同 branch 之间互不 attend。这样昂贵的图像/语言编码可以在多个 offset 上复用。

VLASH 还加入了 action quantization 作为实用的速度旋钮。它把 \(q\) 个细粒度 delta action 合成一个 macro-action:

\[ \hat{a}i = a{iq} + a_{iq+1} + \cdots + a_{(i+1)q-1}. \]

这会减少执行步数,提供 speed-accuracy trade-off。它和 future-state awareness 是两个不同模块,但当异步推理隐藏大部分模型延迟后,物理执行速度就会成为新的瓶颈,因此这个模块很实用。

在 Kinetix 上,VLASH 接近同步上界,并且在 delay 下比 naive async 鲁棒得多。论文报告 delay 为 4 时,VLASH success rate 为 81.7%,naive async 为 51.2%。在 LIBERO 上,VLASH 保持接近同步推理的准确率,同时缩短完成时间。真实机器人实验中,带 VLASH 的 \(\pi_{0.5}\) 在 manipulation 任务上的 score percentage 接近或优于同步推理;使用 \(q=2\) 的 action quantization 时,论文报告在保持准确率的情况下最高达到 2.03x speedup。论文还强调 reaction latency:异步推理可以让最大反应延迟相对同步执行降低最高 17.4x,因为机器人不再等当前 chunk 全部执行完才启动模型推理。

VLASH 的局限是它 roll forward 的是 robot state,不是完整未来世界。如果推理期间外部场景变化,视觉输入仍然来自推理开始时刻。它也依赖 VLA 接口中存在可用且有意义的 proprioceptive state,并且受益于 temporal-offset fine-tuning。即便如此,它对 RTC 尚未完全处理的问题给出了很干净的回答:异步执行把 action interval 推向未来时,VLA 应该条件化在哪个 state 上?

三种方法怎么拼起来

这三种方法在概念上可以兼容,因为它们修的是实时系统中的不同位置。

Method被修正的对象修正发生的阶段需要什么
Original RTCAction chunk continuity推理时Diffusion/flow sampler 加 VJP guidance
Training-Time RTCPrefix-conditioned action generation训练和采样时使用 simulated delay 做 fine-tuning
VLASHPrediction-execution state alignmentFine-tuning 和部署输入构造Robot-state rollforward 和 offset augmentation

原始 RTC 对已经训练好的 flow 或 diffusion VLA 最 plug-and-play。它可以直接加在推理阶段,立刻改善异步执行,但需要为 guidance 付额外计算。

Training-Time RTC 是同一思想的更干净部署版本。它直接教会模型 prefix-conditioning 接口,因此部署时不需要昂贵的 guidance loop。

VLASH 把注意力从 chunk 边界平滑转到 policy 输入侧。它指出,从过期 robot state 生成的 chunk 即使动作序列本身平滑,也可能和真正执行时的状态错位。它的修法是喂入 chunk 开始执行时机器人将处在的状态。

实践启发

如果要实现一个 real-time VLA stack,我会把设计拆成三层。

第一层默认使用 asynchronous inference。控制器持续消费动作,模型推理在另一个线程或进程里运行。runtime 需要共享 action queue、实时测量 inference delay,并保守处理 latency spike。

第二层保证 action continuity。如果只有一个预训练 diffusion/flow policy,且没有 fine-tuning 预算,原始 RTC 是自然起点。如果可以 fine-tune,Training-Time RTC 更适合长期部署,因为它去掉了部署时的 VJP 开销。

第三层对齐 state。如果模型条件化在 proprioception 上,输入 state 应该对应 execution-time state,而不是只使用 inference-start state。VLASH 的 rollforward 思路特别适合长延迟系统、远程推理和快速动态任务。

三篇论文的递进也说明了后续工作方向。一个强实时 VLA 很可能需要同时结合 training-time prefix conditioning 和 future-state-aware inputs。前者保证 chunk 连续;后者让新 chunk 从正确的机器人状态开始。对动态场景来说,剩下的难点是 future environment estimation:机器人可以用已知动作 roll forward 自己的状态,但无法精确知道推理期间物体、人和接触会如何演化。