DINOv3 image tokens and a BERT-encoded instruction are fused by six bi-attention layers, and an ACT-style decoder predicts 16 actions, of which the NexArm runs 8 before looking again.
- 16 · actions per chunk
- 8 · actions run before re-planning
- 30 Hz · control rate
- 588 · vision tokens (3 cameras)
- DINOv3 ViT-B/16 · backbone
- 50k · training steps
Architecture
TurboVLA keeps ACT’s idea of decoding a chunk of actions from learned queries, but replaces the encoder side. Images are encoded by a large self-supervised vision transformer, the task arrives as text, and the two are fused before the action head reads them. The chunk is short (16 actions) and only half of it is run, so the policy re-plans about every quarter second.
| Part | Setting used for the NexArm |
|---|---|
| Vision | DINOv3 ViT-B/16, 224 × 224, views encoded separately, trainable |
| Vision projection | LN → MLP 768 → 1024 → 256 + linear skip, LN, + view embedding |
| Language | BERT-base uncased, frozen, Linear 768 → 256 |
| Interaction | 6 × (shared-logit bi-attention, 4 heads + text transformer) |
| State | LN → MLP 6 → 256 → 512 → 2 tokens + learned positions |
| Action decoder | 16 queries, 3 pre-norm layers, d 256, 8 heads, FFN 2048 |
| Output | MLP 256 → 512 → 512 → 6, tanh, min-max to joint units |
| Chunk / executed | 16 / 8 actions |
Training
The training script can mix two sources: scripted bowl-stacking demonstrations generated in the MuJoCo scene with domain randomization, and real teleoperated demonstrations. With --real-ratio 0.5 a sampler draws each training sample from the real set with probability one half, so the smaller real set is not drowned out by simulation.
| Setting | Default in train_turbovla.py |
|---|---|
| Data | sim + real, or either alone (--no-sim for real only) |
| Batch | 16 per device, no accumulation |
| Optimizer | AdamW, lr 5e-5 for the head, interaction and DINOv3 |
| Schedule | 1,000 warm-up steps, cosine to 5 %, 50,000 steps, save every 5,000 |
| Loss | L1 over non-padded chunk steps, optional --gripper-loss-weight |
| Stability | gradient clipping at 1.0, EMA of weights with decay 0.999 |
| Starting point | from scratch, or the released RoboTwin checkpoint |
The checkpoint carries its own contract. config.json stores the camera keys in order, the image size, the fps and the default task prompt, and stats_turbovla.json stores the min-max ranges. The rollout script reads both, so a checkpoint trained without the top camera is run without it.