Inside a VLAa hands-on lab

Where the milliseconds go when a robot policy reads three cameras and writes fifty actions

Open up a vision-language-action model as if it were an office building: a mailroom that cuts photos into cards, a tower whose floors read them, a filing cabinet, and a drafting room that writes the work order ten times over. SmolVLA is the worked example and π0 the comparison; every card and every FLOP is counted by the page, from the published shapes. About 45 minutes of play.

0 · The mailroom: frames, words and joints become cards

Demos to Deployment timed the drafting desk from outside: a big policy thinks for d ticks, then hands over a chunk of 50 actions. This lab opens the desk up. Picture the model as an office building. Photos from the robot's three cameras, a written request ("put the cube in the box") and a slip with the arm's joint readings arrive at the mailroom. Nothing upstairs reads photos or slips: everything travels on cards, all the same size. The cards go up a tower of floors, the tower files its notes in a cabinet, and a smaller drafting room next door writes the work order. Every term with a wavy red underline is tappable.

A card = a token
photo, word or joint card, all one width
The photo desk = the vision encoder
reads every 16-pixel tile (step 1)
The bundler = pixel shuffle
4 × 4 tiles onto one card (step 0)
The tower = the language-model backbone
one floor per layer (steps 1–2)
The floor staff = the weights
every card visits every desk
The floor meeting = attention
every card compared with every card
The filing cabinet = the KV cache
the tower's notes, filed once (step 3)
The drafting room = the action expert
writes 50 lines, ten drafts (step 3)
The stopwatch = latency
against the robot's tick (step 4)

Covers SmolVLA §3.1: "a pixel shuffle operation, limiting the visual tokens to 64 per frame"; states "projected into a single token"; images resized to 512×512 (§4.3) · SmolVLM §2.2: pixel shuffle cuts tokens by r², r = 4 for small models · PaliGemma §3.2: 224 px gives 256 image tokens · π0 §IV: 2 or 3 images per robot

Make the cards

the model's mailroom
cameras3
bundle size r (tiles per side)
photo cardsword cardsjoint card
–
tiles per frame
–
cards per frame
–
photo cards, all cameras
–
cards in the prefix

SmolVLA's photo desk is SigLIP-B/16 at 512 px (16-pixel tiles); π0's is SigLIP-So400m/14 at 224 px (14-pixel tiles), with no bundling. Both pad the request to 48 word cards: LeRobot's π0 always does, and the released smolvla_base config does too. π0 sends its joint card to the drafting room instead of the tower, so its tower prefix has no joint card.

Guess first!
SmolVLA's frame is 512 × 512 pixels, cut into 16 × 16-pixel tiles, and the bundler staples 4 × 4 tiles onto each card. How many cards per frame?
(512 ÷ 16)² = 1,024 tiles, ÷ 4² = 64 cards: the "64 tokens per frame" in the SmolVLA paper. With three cameras, 48 word cards and one joint card, the prefix is 241 cards.
Guess first!
π0 takes three 224 × 224 frames with 14-pixel tiles and no bundling. How many photo cards go up its tower?
(224 ÷ 14)² = 256 per frame, PaliGemma's 256 image tokens, × 3 = 768. Add 48 word cards and π0's tower reads 816, more than three times SmolVLA's 241, from smaller pictures. The difference is the bundler.
Say it out loud
A VLA reads tokens, not pictures: each frame becomes (size ÷ patch)² patches, ÷ r² after pixel shuffle, plus the instruction's word tokens and one state token. SmolVLA: 3 × 64 + 48 + 1 = 241. π0: 3 × 256 + 48 = 816.

1 · The tower: what one forward pass costs

On every floor, two things happen to the cards. Each card visits every desk on the floor: every weight is one multiply and one add per card, so the staff work is 2 × (weights on the floor) × (cards). Then the floor meeting: each card is compared with every other card and takes notes from the relevant ones, which costs 4 × (meeting width) × cards², because the number of pairs grows with the square. Count it in FLOPs. The photo desk downstairs works the same way, on the tiles of each frame, before they are bundled.

Covers SmolVLA §3.1: visual-token reduction "to obtain a faster inference time" · SmolVLM §2.2: smaller VLMs benefit from r = 4 "as the reduced token count eases attention overhead" · shapes from the released SmolVLM2-500M and SigLIP-So400m configs and π0 appendix A-B

The prefix bill

model
bundle size r
cameras3
photo desk (all tiles)bundler's projectortower stafftower meetings
–
cards up the tower
–
photo desk
–
tower (staff + meetings)
–
of the tower is meetings
The tower's bill for any pile of cards (this model's floors, 2 per weight per card plus 4 × width × cards² per floor). The dot is the pile above. The staff line is straight; the meeting curve bends up, and only matters once the pile is long.
Guess first!
SmolVLA, three cameras, 241 cards. What share of the tower's work is the meetings (attention)?
4.5%. At 241 cards the meetings are small next to the staff work: 3.6 of 79.4 GFLOP. Attention's square only takes over for long piles; π0's 816 cards are still only 2.9% meetings, because its floors are wide.
Guess first!
Turn SmolVLA's bundler off (r = 1): 3,121 cards instead of 241, 13 times as many. The tower's bill grows by…
19.9×: from 79 to 1,580 GFLOP. The staff work grows 13×, and the meetings, which were 4.5% of the bill, grow 168× and become 38% of it. That is what the 64-card bundle buys in the tower.
Guess first!
With the bundler on, where does most of SmolVLA's prefix compute go?
The photo desk: 646 of 725 GFLOP, 89%. Bundling cuts what the tower reads, not what the photo desk reads: it still studies all 1,024 tiles of each 512-pixel frame with 86M weights. π0's photo desk reads 256 bigger tiles a frame with 412M weights and costs about the same, 661 GFLOP; there it is only 17% of the prefix, because π0's tower is 2,048 wide.
Say it out loud
A forward pass costs about 2 × weights × tokens, plus attention at 4 × width × tokens² per layer. Fewer visual tokens shrink the backbone's bill; after SmolVLA's pixel shuffle, the vision encoder reading every patch is most of what's left.

2 · Halfway up: skipping the top floors

SmolVLM2's tower has 32 floors. SmolVLA closes the top 16: the cards stop at floor 16, and the drafting room reads its notes from there. That is layer skipping, N = L/2. The drafting room is built with one floor for each floor of the tower it reads (LeRobot's default), so closing tower floors also shortens the drafting room. The paper says it "effectively halv[es] the LLM and action expert's computational cost". How much of the whole chunk is that?

Covers SmolVLA §3.1: "setting N to half the total layers (N = L/2) offers a good tradeoff between speed and performance" · §4.3: "We use only the first 16 layers" · Table 8: LIBERO success by N · LeRobot num_vlm_layers = 16, num_expert_layers = -1 (same as the VLM)

Close floors

floors kept, N (of 32)16
photo desktowerdrafting room, 10 draftsLIBERO success, SmolVLA Table 8
–
tower
–
drafting room, 10 drafts
–
whole chunk
–
saved against all 32 floors
The other two rows of Table 8: keeping every second floor ("Skip %2", half the depth, like N = 16) scored 75.5, and swapping in the whole smaller SmolVLM2-256M scored 75.8, both below the first 16 floors' 78.5. In the paper's words, "skipping layers from a large VLM (here 500M parameters) yields better results than downsizing the VLM".
Guess first!
Keep 16 of the 32 floors, which halves the tower and the drafting room. The whole chunk (photo desk, tower, ten drafts) costs how much less than with all 32?
19%: 1,029 GFLOP down to 838. The tower and drafting room do halve, from 383 to 192 GFLOP, but the photo desk's 646 GFLOP doesn't move. On LIBERO the paper's success went from 80.3 (32 floors) to 78.5 (16).
Guess first!
In Table 8, which scores higher: the first 16 floors of the 500M VLM, or every floor of the smaller 256M VLM?
78.5 against 75.8 average success on LIBERO. Cutting depth kept more of what the bigger model learned than shrinking the whole model did.
Say it out loud
SmolVLA keeps the first half of the backbone's layers and reads features from layer 16, which halves the backbone and the action expert at a small cost in success. It doesn't touch the vision encoder, so the whole chunk gets about a fifth cheaper, not half.

3 · The drafting room: ten drafts from one filing

The work order is written next door by the action expert: 50 blank lines, one card each, sent through a narrower building (SmolVLA's is 0.75× the tower's width, ~100M weights). It doesn't write the order once. It starts from scribble and redrafts the whole order ten times, each draft a full pass through the drafting room; the tenth goes to the robot. Why drafts, and why scribble, is Fork in the Road's subject (its step 7 is flow matching); here only the cost matters. The trick is that the photos and the request don't change between drafts, so the tower reads them once and files its notes in the filing cabinet (KV caching in general, for serving language models, is Inference Kitchen's subject). SmolVLA's drafting floors alternate: on one kind the drafters read only the cabinet (cross-attention); on the other they read the cabinet and the lines already written above theirs, never below (self-attention with a causal mask, as LeRobot's code runs it). π0's drafters read the cabinet and the whole order, above and below, on every floor.

Covers SmolVLA §3.1: interleaved cross- and causal self-attention, expert width 0.75 × d · §4.3: n = 50, 10 flow-matching steps, ~100M of 450M parameters in the expert · Tables 6–7 · π0 §IV: "caching the attention keys and values for the prefix and only recomputing the suffix … for each integration step" · π0 appendix A-B: expert width 1024, ~300M · LeRobot sample_actions: prefix once with use_cache, then denoise_step × num_steps

Who reads what, and what it costs

model
drafts (flow-matching steps)10
lines in the order, n50
photo desktowerone draft in the drafting room
–
drafting-room weights
–
one draft
–
one draft ÷ the tower's pass
–
whole chunk
What the paper measured on these choices (LIBERO average success, trained from scratch): cross-attention on every floor (CA) 79.0, causal self-attention on every floor (SA) 74.5, the two alternating (CA+SA) 85.5 (Table 6); inside the order, causal 74.5 against bidirectional 67.5 (Table 7). Chunk size n: 1 → 50.0, 10 → 84.0, 50 → 80.3, 100 → 74.5 (Table 12).
Guess first!
SmolVLA. One draft runs 50 cards through ~100M weights; the tower's pass runs 241 cards through 157M. One draft costs about what share of the tower's pass?
14.1%: 11.2 GFLOP against 79.4. Fewer cards and narrower floors (the cross floors' k and v projections still run over all 241 filed cards on every draft, as LeRobot does: 0.8 of the 11.2). Ten drafts together are 112 GFLOP, more than the tower's pass, but the drafts are small passes, and step 4 shows that small passes are slow in their own way.
Guess first!
Throw away the filing cabinet, so π0's tower must reread the 816 cards for every one of its 10 drafts. The whole chunk costs…
7.9×: 4.4 TFLOP becomes 34.4. π0's tower is 76% of its chunk, so redoing it ten times nearly multiplies the bill by ten (the photo desk still runs once). SmolVLA's tower is small, so without the cabinet SmolVLA pays 1.9×. The bigger the tower, the more the cabinet is worth.
Say it out loud
The prefix is the same for every denoising step, so it is encoded once and its keys and values are cached; the action expert then runs once per step over the 50 action tokens, reading that cache. Latency ≈ prefix + steps × expert pass.

4 · The stopwatch: from FLOPs to milliseconds

FLOPs aren't time. Each stage of the office takes as long as the slower of two things: doing the arithmetic, at the computer's rate F, or walking every weight in from memory once, at bandwidth B. Big piles keep the staff busy (compute-bound); a draft of 50 cards barely uses each weight before the next is needed, so it waits on memory (memory-bound). This lab's computers are made up, round numbers on purpose (toy computers); the shape of the answer is what transfers. Then compare the total with the robot's tick: the number of ticks that pass while the office works is the inference delay d that Demos to Deployment hides with asynchronous inference and Real-Time Chunking.

Covers SmolVLA §3.3: "a real-world frame-rate of 30 frames per second, Δt = 33ms"; the queue never runs dry when g ≥ (E[ℓ_S]/Δt)/n · π0: 50 Hz robots, "inference every 0.5 seconds (after executing 25 actions)", timed on an RTX 4090 with 3 cameras · RTC §2: π0 "spends 46ms on the KV cache prefill alone", d := ⌊δ/Δt⌋

Time one chunk

model
toy computer
robot's control rate
drafts10
lines in the order, n50
cameras3
photo desktowerdrafts| a robot tick▨ waiting on memory
–
to the chunk
–
inference delay d
–
the order lasts
–
async needs g ≥ (latency ÷ Δt) ÷ n
Guess first!
SmolVLA on the toy desktop GPU takes 11.1 ms. Cut the drafts from 10 to 5. The chunk now takes…
10.1 ms. Each draft is memory-bound at 0.2 ms (reading about 200 MB of weights and cache at 1 TB/s takes longer than 11 GFLOP at 80 TFLOP/s), and the photo desk is 8.1 ms of the 11.1. The same goes for the order's length: 10 lines or 50 take the same 0.2 ms a draft here.
Guess first!
SmolVLA on the toy laptop CPU, robot at 30 fps. How many ticks pass before the order arrives (d)?
838 ms ÷ 33.3 ms = 25.1, so d = 25 ticks. Synchronously the robot would stand still for 25 of every 75 ticks; asynchronously it must ask for the next order with g ≥ 25.1/50 = 0.50 of the order still left (with n = 10 that would be 2.3: no threshold works, the order is shorter than the wait). On the toy desktop GPU the same model lands inside one tick (d = 0).
Say it out loud
Latency ≈ vision encoder + backbone prefill + steps × expert pass, each the slower of its arithmetic and its weight reads. The prefill is compute-bound; a 50-token expert pass is usually memory-bound, so it costs about the same for 10 actions as for 50. d = ⌊latency ÷ Δt⌋ is what execution has to hide.

5 · Side by side: SmolVLA and π0, then build your own

The two offices, in the papers' words and in this lab's count. Paper figures are marked with their source; the FLOPs and toy milliseconds are this page's arithmetic on the published shapes. The papers report task success, not speed side by side: SmolVLA reports no inference time in milliseconds, and the one π0 timing this lab could check is the 46 ms prefill.

Covers SmolVLA §4.3–4.5, Tables 2–3: 450M vs 3.3B, LIBERO and SO100 results, "around 40% faster to train and consumes 6× less memory" · π0 §IV, appendix A-B · RTC §2: the 46 ms prefill

Guess first!
π0 has about 7× SmolVLA's parameters (3.3B against 450M). By this lab's count, how many times the FLOPs does it spend per chunk?
5.2×: 4.37 TFLOP against 0.84. π0's tower is 42× SmolVLA's (816 cards through 18 floors 2,048 wide, against 241 through 16 floors 960 wide), but the photo desks cost about the same, and SmolVLA's is 77% of its chunk. Parameters on the label aren't the bill: what matters is how many tokens pass through which weights, how many times.

Build your own office

start from
tower
floors kept16
photo desk
bundle size r
cameras3
drafting room width (× tower)
drafting floors read the cabinet
drafts10
lines in the order, n50
toy computer
robot's control rate
–
cards up the tower
–
weights a chunk runs through
–
per chunk
–
to the chunk · d

Three work orders

Each is solved when the builder above meets it. There's more than one way to meet each; the note says which levers you pulled.

Say it out loud
SmolVLA buys speed with fewer visual tokens (64 a frame), half the backbone's layers, and a narrower expert; π0 spends about five times the compute, mostly in a 2B backbone reading 816 tokens. In both, latency = encoder + prefill + steps × expert pass, and the biggest remaining line is the one to cut next.

✓ Field test

Eight questions. Answer each by operating the widget in the step named, not from memory. Seven or more earns the check.

What's exact here, and what's a teaching model

  • Exact, from the papers, configs and code: the token counts (SmolVLA: 64 per 512-pixel frame after pixel shuffle with r = 4, one state token; π0: 256 per 224-pixel frame; 48 instruction tokens, which LeRobot's π0 always pads to and the released smolvla_base config pads to as well); the shapes (SmolVLM2-500M's SigLIP-B/16 and 32-layer, 960-wide decoder, of which SmolVLA keeps 16; an expert 0.75× as wide with interleaved cross- and causal self-attention; PaliGemma's SigLIP-So400m/14 and Gemma-2B; π0's 1024-wide expert); n = 50 and 10 flow-matching steps for both; the order of work (encode, prefill once and cache, then one expert pass per step). The weight counts follow from the shapes: 98M for SmolVLA's expert and 311M for π0's, against the papers' "~100M" and "~300M"; SigLIP-B/16 is 93M in the SmolVLM paper and 86M here, because the count has only the matrix weights, not the pooling head, biases and norms.
  • Teaching models, labelled on the page: FLOPs are 2 per weight per token plus 4 × (query width) × (queries) × (keys) per attention layer. A cross-attention floor's k and v projections are counted over the 241 cached prefix tokens on every draft, as LeRobot runs them (a tuned stack could do that once per chunk). π0's state token is counted once and cached, as the paper says it can be; LeRobot's code re-embeds it with the actions on every step, one token in 51. Norms, biases, softmax, the small state, action and time projections, and the embedding lookup are left out, and the tower's prefix is counted with full attention. Milliseconds come from made-up computers (toy desktop GPU: 80 TFLOP/s and 1 TB/s; toy edge board: 10 TFLOP/s and 100 GB/s; toy laptop CPU: 1 TFLOP/s and 50 GB/s), each stage taking max(FLOPs ÷ F, weight bytes ÷ B) with bf16 weights. On π0 the toy GPU gives a 49.9 ms prefill against the 46 ms measured on an RTX 4090, close for a big compute-bound pass; for small passes real stacks add kernel-launch and Python overheads this model leaves out, so treat its milliseconds as a floor.
  • The office is an analogy. Weights aren't people and attention isn't a meeting; the counts are the real counts. Nothing here measures a real robot.

Sources (exact quotes and sections in SOURCES.md): Shukor et al., SmolVLA (2025) · Black et al., π0 (2024) · Marafioti et al., SmolVLM (2025) · Beyer et al., PaliGemma (2024) · Black, Galliker & Levine, Real-Time Execution of Action Chunking Flow Policies (2025) · the LeRobot SmolVLA and π0 code and the released model configs.

Part of a series of hands-on labs: Inference Kitchen (serving) · Finishing School (post-training) · Arm Playground (kinematics and control) · Policy Pond (reinforcement learning) · Reward Arcade (environments and evals) · Fork in the Road (diffusion policies) · Duck's-Eye View (robot vision) · Demos to Deployment (imitation learning and real-time execution) · Eye Exam (camera calibration) · Dual Controls (real-world RL with a human in the loop) · Inside a VLA (VLA anatomy and compute)