Full-Weight VLA Fine-Tuning Without an fp32 Master Copy Silently Erases Most Updates
Abstract
When a vision-language-action (VLA) model is fine-tuned with its trainable weights in bfloat16 (bf16) and no fp32 master copy, AdamW writes each update straight into bf16, silently rounding away any update smaller than 1/512 of a weight. In 9 of 12 open VLA codebases a default or documented recipe trains this way, 4 on full weight matrices, including LeRobot's SmolVLA default and its / guides. In our LIBERO runs without the copy, a probe every 100 steps finds at least 79% of updates to bf16 weights erased. On the Hugging Face Hub, 99% of sampled full-weight SmolVLA fine-tunes store the action expert in bf16, and 84% of recent fine-tunes with a training configuration set the bf16 flag. On LIBERO-Object, with rules fixed in advance, an fp32 copy raises success over LeRobot's storage from 4.3% to 49.3% for SmolVLA and from 5.1% to 80.9% for at a ten-times lower learning rate, where both models are undertrained, and from 89.0% to 97.7% for at its default rate. For SmolVLA at its default rate it adds 10.2 points with open-loop 50-action chunks but only 4.2 when re-planning every 10 actions. In these five comparisons and two more against SmolVLA with every trainable weight in bf16, every run with the copy beats every run without it (p < 0.05); all gaps but the 8.7- and 4.2-point ones clear our 10-point threshold. The fix is to keep the trainable weights in fp32 during training, a one-line change for SmolVLA in LeRobot.
Figures & tables
| Codebase: recipe | Model (size) | Default | |
|---|---|---|---|
| LeRobot: default † | SmolVLA (0.45B) | 12% | |
| LeRobot: as documented † | (4.1B) | 83% | |
| openpi: PyTorch † | 78% | ||
| openpi: PyTorch † | 65% | ||
| RLinf: RL (PPO) | 94% | ||
| RLinf: RL | OpenVLA-OFT (7.5B) | 71% ∗ |