High-Performance ML Data Loading - Real-Time Performance Analytics
Drop in your own JPEG/PNG images and
TurboLoader will decode → resize → normalize them and report real
throughput (vs PyTorch). Requires the backend:
python benchmark_server.py then open http://localhost:8000.
Only PyTorch uses per-worker processes, so only it scales with this knob. TurboLoader's fast path runs a single process-wide C++ thread pool sized to every core — it's already saturated at 1 worker (flat line). tf.data uses AUTOTUNE (manages its own parallelism), shown as a horizontal reference. PyTorch needs ~8 workers to approach what TurboLoader does with one internal pool.
Static reference numbers measured on dedicated hardware — they don't re-run in this
dashboard. Methodology, correctness checks, and the corrections history live in
experiments/cuda/RESULTS.md, benchmarks/E2E_TRAINING_RESULTS.md
and benchmarks/METAL_RESIDENT_RESULTS.md.
| Regime | TurboLoader | Best alternative | Hardware |
|---|---|---|---|
| On-the-fly (decode JPEGs every epoch) | 28,527 img/s | NVIDIA DALI 25,479 (+12%) | RTX 3090 |
| Pre-processed, fits in VRAM | ~280k img/s | FFCV-raw ~80k (3.5×) | RTX 3090 |
| Pre-processed, streaming > VRAM | ~140k img/s | FFCV-raw ~85k (1.6×) | RTX 3090 |
| Pre-processed, resident (unified memory) | 757k produced / 433k consumed img/s | numpy resident ~3.7k | Apple M4 Max |
| Video: 1080p H.264 → 224px training batches (hardware decode) | 2,556 frames/s (3.9×) | OpenCV 657; PyAV 535; torchcodec 173 | Apple M4 Max |
| Video on NVIDIA: GPU-resident batches (cpu-decode backend) | 371 frames/s | OpenCV 312; PyAV 131; decord 604 leads on this weak-CPU host | RTX 3090 (WSL2) |
| End-to-end ResNet-18 training (median epoch) | 4.37s (1.17×) | PyTorch recipe 5.11s; pure-GPU floor 3.81s | RTX 3090 |
| End-to-end ResNet-18 on MPS (honest null result) | 8.06s — a tie (1.00×) | PyTorch 8.08s; MPS floor 7.61s (GPU-bound) | Apple M4 Max |