How SmolVLA makes the robot's brain think while its hands move — achieving 30% faster task completion
Vision-Language-Action models (VLAs) are slow. The VLM backbone needs ~200ms to process an image. The flow matching action expert needs another ~100ms for 10 denoising steps. During all that time, the robot just sits there waiting.
SmolVLA solves this with a simple but powerful idea: let the robot keep moving while the brain computes the next plan. This is asynchronous inference.
When you pour coffee, your hand is pouring while your eyes are already looking at where to set the mug down. You don't freeze your hand, look, plan, then resume. Your brain and hands work in parallel.
SmolVLA does exactly this — the robot executes the current batch of actions while the server is already computing the next batch from a fresh observation.
Why running a VLA the naive way creates jerky, slow robot motion.
Watch one cycle of synchronous inference. Notice the red idle block — the robot is frozen while the VLM processes the next observation.
Every cycle, the robot freezes for 300+ milliseconds. At 30 Hz control, that's ~9 missing frames of motion. The result: jerky, stop-and-go behavior that limits task success.
The key insight: predicting many actions at once creates a buffer for parallel execution.
Toggle between architectures to see why only chunked models can go async.
SmolVLA predicts 50 actions at once. While the robot executes actions from the buffer, the server is already computing the next 50. The action chunk is the bridge that decouples perception from execution.
Predicts 1 action per inference.
No buffer — must wait for each action. Fundamentally synchronous. ~3 Hz effective control.
Predicts 50 actions per inference.
Has a buffer, but the paper uses synchronous inference. Async is possible in theory but not implemented.
Predicts 50 actions + async execution.
Executes ~15 actions, queues the rest as buffer. VLM runs in parallel. 30% faster.
SmolVLA splits inference across a Robot Client and a GPU Policy Server, connected by gRPC.
Thread 1 (Control Loop) captures a camera image + robot joint state. This becomes a TimedObservation with a timestamp.
A FIFO buffer of future actions — the heartbeat of async inference.
Watch the queue fill and drain in real time. When it drops below 50%, a new observation is sent to the server.
Simulation log:
Ready. Press "Start Simulation".
Queue level over time
As long as inference finishes before the queue empties, the robot never stops. If the queue ever does empty, a must_go flag forces immediate inference on the next observation.
When a new chunk arrives, it overlaps with remaining old actions. How do we blend them?
Adjust the weighting to see how old and new chunks blend in the overlap region.
The default weighted_average (0.3/0.7) works best: it trusts the newer prediction (computed from a more recent observation) while maintaining some continuity from the old trajectory, preventing jerky transitions.
Watch two robots race to complete the same task. One runs synchronously, the other asynchronously.
Both robots must pick up and place 5 cubes. The sync robot freezes during inference. The async robot never stops.
Cubes placed: 0/5
State: Waiting
Idle time: 0ms
Cubes placed: 0/5
State: Waiting
Queue level: 50/50
Detailed breakdown of what each robot is doing at every moment.
Real-world experiments on SO-100 pick-and-place prove the async advantage.
Synchronous
Average completion time
Asynchronous
Average completion time
Faster
Same success rate
In a fixed time budget, the async robot completed 19 cubes vs 9 cubes for synchronous — a 2.1x throughput improvement.
Asynchronous inference is not a model improvement — it's an execution strategy. It works because action chunking provides the temporal buffer needed to decouple perception from execution. Any VLA that predicts action chunks can benefit from this approach.