VLA-Zoo · Estimate · pre-training sizing

π0.5 pre-training: landscape, throughput & π-equivalent sizing

doc-type estimate model pi0.5 full-FT node 8× H200 target π0-equivalent updated 2026-05-24

00Summary

What would it take to pre-train π0.5 to a π0-equivalent scale on our hardware? Equivalence here = matching the number of timesteps seen (steps × global batch). π0 trained 700k steps[1]; its batch size is not published, so the target is a range: ≈0.7–1.4 B timesteps (700k × batch 1024–2048). At our node throughput (~269 frames/s at global batch 2048), that is ~31–62 days on one 8× H200 node, falling to ~1–2 weeks on 4 nodes via data-parallel scaling.

0.7–1.4 B
π-equiv timesteps (700k × batch)
31–62 d
1 node (8× H200)
8–15 d
4 nodes (32 GPU)
4–8 d
8 nodes (64 GPU)
269 fr/s
node throughput @ b2048
DDP
no FSDP needed (3.3B fits)

01VLA pre-training landscape

Reported pre-training compute for the major open VLAs. The honest cross-model picture: papers report steps and batch but rarely epochs or timesteps, and several omit batch entirely — so even "timesteps seen = steps × batch" is only partially recoverable. italic = not reported.

ModelParams (backbone)Pre-train dataGlobal batchStepsEpochsHardwareWall-clock
π0[1]3.3B (PaliGemma 3B VLM + 0.3B action expert)903M timesteps own (106M single + 797M dual-arm) + OXE; ~10k h; 68 tasks / 7 robotsnot reported[9]700k
π0.5[2]~3B (based on π0)~400 h mobile-manip (~100 homes) + multi-source + web co-trainingnot reported280k (+80k post)
OpenVLA[3]7B (Llama-2-7B + DINOv2 + SigLIP)970k real demos (OXE subset)2048not reported*2764× A10014 d (21.5k A100·h)
Octo[4]27M / 93M (+ t5-base 111M)800k traj (25 OXE sets, from ~1.5M)2048300kTPU v4-12814 h
RT-2[5]12B / 55B (PaLM-E / PaLI-X)RT-1 ~130k eps[6] co-FT 50:50 with web/VLM data512–2048
(by variant)
80k–1M
(by variant)
multi-TPU (NR)
RDT-1B[7]1.2B (DiT + SigLIP + T5-XXL)1M+ traj, 46 datasets, 21 TBnot reported1M48× H100~1 month

*OpenVLA gives 27 epochs × 970k demos & batch 2048 but not a step count; the often-quoted "≈12.8k steps" wrongly treats trajectories as samples and underestimates badly — treat as unreported.[3]

Takeaways
  • Step counts span ~80k → 1M (RT-2-55B 80k; π0.5 280k; Octo 300k; π0 700k; RDT & RT-2-PaLM-E 1M). π0's 700k sits at the high end of single-stage runs.
  • Global batch 2048 is the de-facto large-scale setting (OpenVLA, Octo, RT-2-large). π0/π0.5/RDT don't publish theirs.
  • Big-corpus pre-training is ≈1 epoch (π0 over ~0.9–1.4B timesteps); OpenVLA's 27 epochs is the outlier, driven by its smaller 970k-demo set (real-robot accuracy kept rising with more passes).
  • Cost scale: tens of accelerators × days–weeks — OpenVLA 21.5k A100·h; RDT 48× H100 × ~1 month (~34k H100·h).

02Our case — assumptions

03Analysis

Throughput vs batch size

Anchored to the live yubi run: global batch 64 on 8 GPUs (8 samples/GPU) → step_time≈0.23 s compute, ≈0.48 s wall (2.1 it/s). Model: compute linear in per-GPU batch + a ~fixed 0.25 s/step host overhead.

wall_s(B)     = 0.00359·B + 0.25          # B = global batch; per-GPU = B/8
node frames/s = B / wall_s(B)             # ceiling = 1/0.00359 ≈ 278 fr/s
global batchper-GPUcompute swall sit/snode frames/svs b64overhead
6480.230.482.081331.00×52%
256320.921.170.862191.65×21%
512641.842.090.482451.84×12%
10241283.683.930.252611.96×6%
20482567.367.610.132692.02×3%
→ ∞2782.09×→0%
Knee Per-GPU compute is the ceiling (~278 fr/s/node); raising batch only amortizes the fixed 0.25 s/step overhead. batch 2048 reaches ~97% of the ceiling; beyond ~1024 the gain is <5%. More batch ≠ more throughput — to go faster you add nodes.

GPU memory vs batch size

One measured anchor: 45.7 GB at 64 samples/GPU (full-FT). Fixed term (weights + grads + AdamW + EMA, est. ≈39 GB) + ≈0.10 GB/sample activations (with remat):

global batchper-GPUest. mem / GPU% of 141 GB
25632~42 GB30%
5126445.7 GB (measured)32%
1024128~52 GB37%
2048256~66 GB47%
4096512~93 GB66%
Memory is slack π0-class (3.3B) full-FT fixed cost ≈40 GB fits one H200 with room to spare — even batch 2048 uses <half of 141 GB. Compute, not VRAM, is the limit, and the whole model fits one GPU → FSDP / tensor-parallel are unnecessary; plain data-parallel suffices (see §06).

Data required for a π-equivalent corpus

At π0's ~1-epoch regime the unique dataset you must collect/store ≈ the timesteps-seen target. Converting at our encoding — 3 s/episode, 30 fps → 90 frames; 6.15 GB/hr native (480×640, 3-cam h264; video = 97% of bytes) or 2.13 GB/hr re-encoded to 224² all-intra:

episodes = T / 90          hours = T / 30 / 3600          storage = hours × GB_per_hr
target Tepisodes (3 s)hours @30 fpsstorage — nativestorage — 224²
0.72 B8.0 M6,600 h40.8 TB14.1 TB
1.43 B15.9 M13,300 h81.6 TB28.3 TB
Data verdict π-equivalent needs ~8–16 M episodes ≈ 6.6–13.3 k hours — which brackets π0's published ~10 k h[1], a good sanity check. Storage is 41–82 TB native, dropping to 14–28 TB at 224² (≈2.9× smaller, and decode stays non-bottleneck). Caveat: this is the unique corpus for ~1 epoch (π0-style). Training more epochs needs proportionally less unique data for the same timesteps-seen — e.g. OpenVLA's 27 epochs[3] would need only ~0.3–0.6 M episodes.

04Estimate — the π-equivalent target

Equivalence = process the same number of timesteps seen as π0. Because π0's batch is unpublished[1][9], the target is a range:

T_π  = π0_steps × π0_batch = 700,000 × batch
       batch 1024  →  T_π ≈ 0.72 B timesteps      (≈ π0's 0.9 B-timestep dataset at ~0.8 epoch)
       batch 2048  →  T_π ≈ 1.43 B timesteps
time_on_node = T_π / node_frames_per_s            # at batch 2048 → 269 fr/s
Honesty note π0 reports 700k steps and a ~903 M-timestep own-data corpus[1] but not its batch size (the openpi repo only ships fine-tune configs; the batch=1024 figure is a community reimplementation's choice[9]). So "timesteps seen" is bracketed, not exact. The 0.72 B point doubles as a clean "~1 epoch over a π0-scale dataset" target.

05Scenario A — single 8× H200 node

Train at the efficient PT batch (global 2048, 269 fr/s). Steps follow from the timesteps target: steps = T_π / batch.

metricπ0 (reference)ours — T≈0.72 Bours — T≈1.43 B
timesteps seen700k × batch (batch NR)0.72 B1.43 B
training steps700k350k @b2048700k @b2048
global batchunpublished (~1024?)20482048
throughput269 fr/s269 fr/s
wall-clock— (TPU)30.8 d61.7 d
GPU-hours (8× H200)5,92011,840
1-node verdict π-equivalent on a single node is ~1–2 months (~31 d at the 0.72 B target, ~62 d at 1.43 B). Compute-cost (~6–12k H200·h) is well under OpenVLA's 21.5k A100·h[3] — so a one-node run is affordable but slow. The lever for time is node count, not batch.

06Scenario B — multi-node (parallelism strategies)

To match timesteps faster, replicate the model across nodes and split the data — the fixed T_π is then chewed through by more GPUs. Which parallelism applies depends on whether the model fits one GPU. It does (≈40 GB ≪ 141 GB), so the choice is simple:

strategywhat's shardedper-step commfor π0 (3.3B) on H200
DDP / multi-node DPdata (batch) only — full model replica per GPUgradient all-reduce (~6.6 GB bf16) once/step✓ recommended — model fits; intra-node NVLink, inter-node InfiniBand
FSDPparams + grads + optimizer across GPUsparam all-gather per layer + grad reduce-scatternot needed (fits 1 GPU); use only to free VRAM for huge per-GPU batch
Tensor / Pipelinemodel weights across GPUsactivations every layernot needed at 3.3B (only for ≫10B models)

Time to the π-equivalent target under data-parallel scaling (per-node batch 2048; ideal-linear, then a realistic ~90% efficiency haircut for inter-node all-reduce):

nodesGPUsglobal batchagg. fr/s (ideal)time T≈0.72 Btime T≈1.43 B
182,04826930.8 d61.7 d
2164,09653815.4 d30.8 d
4328,1921,0767.7 d (~8.5 d)15.4 d (~17 d)
86416,3842,1533.9 d (~4.3 d)7.7 d (~8.5 d)
1612832,7684,3061.9 d (~2.3 d)3.9 d (~4.6 d)

(parenthetical) = with ~85–95% inter-node DP efficiency. Ideal-linear assumes all-reduce fully hidden behind the multi-second step.

Realistic scaling caveats
  • Global batch balloons with nodes (N × 2048): 8 nodes = 16k, 16 nodes = 32k. Past ~8–16k, you need LR warmup + scaling (linear/√), and convergence at fixed timesteps-seen degrades — so wall-clock gains turn sub-linear. Cap global batch with gradient accumulation if you want many nodes without a giant batch.
  • Comm is hidden, until it isn't. At batch 2048 a step is ~7.6 s, dwarfing a ~6.6 GB all-reduce over InfiniBand → ~90%+ efficiency to ~8 nodes is realistic. Weak interconnect (Ethernet) or smaller per-node batch erodes this fast.
  • DP only — no FSDP/TP. The model fits one GPU, so sharding it would add comm for no benefit. Keep fsdp_devices=1 and scale by node count.
Sweet spot 4–8 nodes (32–64 H200) reaches π-equivalent in ~1–2 weeks (T≈0.72 B) to ~2–3 weeks (T≈1.43 B), at global batch 8k–16k — large but manageable with warmup. Beyond 8 nodes, batch-size effects (not interconnect) become the limiter.

07Discussion — bottlenecks & speed-ups

What is the current bottleneck?

Walking the candidate limits at the live config (global batch 64 on 8 GPUs = 8 samples/GPU):

resourcestatusevidence
data loadingnot bounddata_time ≈ 0.013 s ≪ step
GPU memorynot bound~40 GB of 141 GB even at b2048 (47%)
inter-GPU comm (1 node)not boundNVLink; grad all-reduce hidden
per-step host overheadbottleneck @ small batch0.25 s fixed = 52% of the 0.48 s step at b64
per-GPU computethe true ceiling~278 fr/s/node; only reached at large batch
GPU utilizationlow @ b64only 8 samples/GPU → GPUs starved
Root cause Today's per-task runs use global batch 64 → 8 samples/GPU, so >50% of every step is fixed host overhead and the GPUs sit idle. The dominant inefficiency is the small batch — not the model, not data, not memory. Everything else (data I/O, VRAM, comm) is already slack.

How to speed up PT efficiency

  1. Raise global batch 64 → 2048 (256/GPU): ~2× throughput (133 → 269 fr/s) by amortizing the 0.25 s/step overhead. Free, single-node, biggest immediate win.
  2. Scale nodes (DDP): ~linear. Once batch is saturated this is the only wall-clock lever — 4–8 nodes → π-equivalent in 1–2 weeks (§06).
  3. Cut image tokens — the dominant model FLOP. 3 cameras × 256 SigLIP tokens dominate the prefix; dropping to 2 cameras (or lower resolution) shortens the forward and raises the per-GPU ceiling. The biggest model-side lever.
  4. Trim per-step overhead. Log / EMA / metric-reduce less often to shave the fixed 0.25 s — most impactful at small batch.
  5. 224² all-intra data. Keeps data_time negligible and cuts storage ~2.9× (§03) — lets you add nodes/workers without I/O stalls.
  6. Diminishing returns. Bigger batch beyond 2048, fused kernels, fp8 → <5% each: the wall is per-GPU model FLOPs, addressed only by more GPUs or fewer tokens.
Order of impact (a) batch 64→2048 = 2× for free; (b) +nodes = linear; (c) fewer cameras/tokens = model-FLOP cut. Memory and data are already slack — don't spend effort optimizing them.

08Method & caveats

09References

  1. π0 — Black et al., "π0: A Vision-Language-Action Flow Model for General Robot Control," arXiv:2410.24164. 700k steps (Fig. 7), 903M timesteps own data (§V-A), ≤50 Hz. arxiv.org/abs/2410.24164
  2. π0.5 — Physical Intelligence, "π0.5: a Vision-Language-Action Model with Open-World Generalization," arXiv:2504.16054. 280k pre-train (+80k post), ~400 h, 50 Hz. arxiv.org/abs/2504.16054 · pi05.pdf
  3. OpenVLA — Kim et al., arXiv:2406.09246. 7B, 970k demos, 27 epochs, batch 2048, 64× A100, 14 d (21.5k A100·h); step count not stated. arxiv.org/abs/2406.09246
  4. Octo — Octo Model Team, arXiv:2405.12213. 27/93M, 800k traj, 300k steps, batch 2048, TPU v4-128, 14 h. arxiv.org/abs/2405.12213
  5. RT-2 — Brohan et al., arXiv:2307.15818. PaLM-E-12B / PaLI-X-55B; per-variant batch 512–2048, steps 80k–1M (App. E); 1–3 Hz. arxiv.org/abs/2307.15818
  6. RT-1 — Brohan et al., arXiv:2212.06817 (RT-2's robot-data source: ~130k episodes, 700+ tasks, 13 robots). arxiv.org/abs/2212.06817
  7. RDT-1B — Liu et al., arXiv:2410.07864 (ICLR 2025). 1.2B (DiT + SigLIP + T5-XXL), 1M+ traj / 46 sets / 21 TB, 1M iters, 48× H100, ~1 month. arxiv.org/abs/2410.07864
  8. openpi — Physical Intelligence training configs (ship pi0_base as a pretrained checkpoint; only fine-tune configs are public). github.com/Physical-Intelligence/openpi
  9. open-pi-zero — allenzren, community π0 reimplementation; global batch 1024, lr 5e-5 (reimplementer's choice, not official). github.com/allenzren/open-pi-zero
  10. pi-zero-pytorch — lucidrains, architecture-only π0 port (no pretraining recipe). github.com/lucidrains/pi-zero-pytorch