References
Gathered 2026-09-09. Each entry says what the source actually claims, because a citation without its claim is a citation nobody checks.
Marked [summarised] where the figure reached this document through a
summary rather than from the page itself. Those are the ones to verify before
quoting in anything that ships.
Benchmark suites
MLPerf Storage — MLCommons
- Repository: https://github.com/mlcommons/storage
- v3.0 results, 2026-09-01: https://mlcommons.org/2026/09/mlperf-storage-v3-0-results/ — 19 organisations, 143 results, 11 first-time submitters
- v2.0 results, 2025-08-04: https://mlcommons.org/2025/08/mlperf-storage-v2-0-results/ — 26 submitters
What it measures: how many emulated accelerators a storage system keeps above a utilisation threshold — 90 % for UNet3D and ResNet50, 70 % for CosmoFlow — plus checkpoint read/write bandwidth for Llama-3 at 8B/70B/405B/1T, a vector-database test, and a KV-cache test. It uses no GPUs: accelerator compute is emulated with sleeps while real data is read through PyTorch or TensorFlow.
It does not benchmark file formats. It generates synthetic files whose size distribution matches a real dataset. Access layers are POSIX and S3.
Divisions: CLOSED forbids code changes, for comparability. OPEN permits documented DLIO and configuration changes — where a custom format would go.
DLIO Benchmark — Argonne
- Repository: https://github.com/argonne-lcf/dlio_benchmark, Apache-2.0
- Paper: Devarajan et al., DLIO: A Data-Centric Benchmark for Scientific Deep Learning Applications, CCGrid 2021 (best paper) — https://ieeexplore.ieee.org/document/9499416/
- Configuration: https://dlio-benchmark.readthedocs.io/en/latest/config.html
- Custom loaders: https://dlio-benchmark.readthedocs.io/en/latest/custom_data_loader.html
MLPerf Storage is built on it. Formats: tfrecord, hdf5, npz, csv, jpeg, png.
Loaders: tf.data, PyTorch DataLoader, synthetic.
file_shuffle and sample_shuffle both default to off.
The plugin path, which is the actionable route to an independent number:
implement BaseDataLoader, place it in the plugins directory, then set
data_loader_classname: dlio_benchmark.plugins.experimental.src.data_loader.pytorch_custom_data_loader.CustomTorchDataLoader
data_loader_sampler: index # or: iterative
index is map-style random access; iterative is sequential streaming. That
one setting is the distinction access-patterns.md is about.
The workload shapes, read from the configs themselves:
| Workload | Format | Files | Samples/file | Record size | Shuffle |
|---|---|---|---|---|---|
unet3d_h100.yaml | npz | 168 | 1 | ~146 MB (σ 68 MB) | file_shuffle: seed, sample_shuffle: seed |
cosmoflow_h100.yaml | tfrecord | 524,288 | 1 | ~2.8 MB | shuffle_size: 2 |
resnet50_h100.yaml | tfrecord | 1,024 | 1,251 | ~115 KB | no shuffle keys set |
The one audited industry benchmark models random access at whole-file granularity with multi-megabyte records, or sequential streaming inside shards. Not fine-grained shuffled row access inside a large file.
NVIDIA DALI
dali/test/python/test_RN50_data_pipeline.py — an input-pipeline-only
benchmark, not end to end. Covers file reader, TFRecord, RecordIO, LMDB, Caffe2
LMDB and WebDataset, with --read_shuffle and --random_shuffle. Useful as a
harness shape; NVIDIA publishes no authoritative cross-loader results table.
FFCV benchmark suite
https://docs.ffcv.io/benchmarks.html — ImageNet on AWS p3dn.24xlarge:
31,278 img/s (RAM, 512px JPEG q90), 172,801 img/s (RAM, 256px raw), 16,631
img/s (EBS, 512px JPEG q90), 1,956 img/s (EBS, 512px raw).
Only FFCV's own numbers appear in that table, and its paper concedes the limit: "we compare FFCV to the standard PyTorch dataloader rather than specialized solutions like NVIDIA DALI." That disclosure is what keeps it credible, and is the precedent for how to handle a self-designed comparison.
Nothing benchmarks formats independently
MLPerf Storage benchmarks storage systems; DLIO benchmarks I/O behaviour; every format comparison in the literature is author-designed. That cuts both ways — it is why our benchmark has no referee, and why nobody else's does either.
Is data loading the bottleneck?
Mohan, Phanishayee, Raniwala, Chidambaram — Analyzing and Mitigating Data Stalls in DNN Training
PVLDB 14(5):771–784, 2021 — https://vldb.org/pvldb/vol14/p771-mohan.pdf.
Nine models, three tasks, four datasets, Microsoft production servers.
Artifact: msr-fiddle/DS-Analyzer.
- "DNNs spend 10–70 % of their epoch time on blocking I/O, despite pipelining and prefetching, simply because the compute rate is higher than fetch rate" — 35 % of dataset cached, SSD + V100
- "we show that it accounts for up to 65 % of the training time"
- HDD + 1080Ti, two-server distributed: ResNet50 "stalled on I/O for 75 % of its epoch time"
- Fully cached, 8-GPU ResNet18: native TF and MXNet spend "65 % and 50 % of the epoch time on prep stall"; DALI still leaves "upto 50 % prep stalls"
- Against sequential formats: "TFRecord format results in 40 % higher cache misses than the ideal because, the sequential access nature of TFRecords (and RecordIO) is at odds with LRU cache replacement policy"
They separate fetch stalls from prep stalls deliberately, and prep frequently dominates. If a format's samples need little decode and the working set fits in page cache, a bytes-fetched win may not convert into wall clock at all.
Murray, Šimša, Klimovic, Indyk — tf.data: A Machine Learning Data Processing Framework
VLDB 2021, https://arxiv.org/abs/2101.12127. Fleet analysis over millions of Google jobs.
- "20 % of jobs spend more than a third of their compute time ingesting data"
- "we find that 30 % of the total compute time is spent ingesting data"
- "13 % of jobs read at least 1 TB of input data"; "over 96 % of total compute resources across jobs are spent in jobs that read over 1 TB"
AIStore — Aizman, Maltby, Breuel, High Performance I/O For Large Scale Deep Learning
IEEE BigData 2019, https://arxiv.org/abs/2001.01858.
- The canonical model, stated plainly: "(1) randomly shuffle the dataset; (2) sequentially iterate through the shuffled dataset"
- "4KB random read throughput for SSDs ranges anywhere between 200MB/s and 900MB/s, thus at the low end matching sequential read performance of a stock enterprise HDD … performance at scale requires optimized random reading at sizes orders of magnitude greater than 4KB"
- Bandwidth actually required: "PyTorch/ResNet-50 initially demands ~60-70MB/s per GPU, the demand drops to more like 40-50MB/s per GPU beyond a total of 8 GPUs" — one HDD feeds about 2.5–3 GPUs
- Their stated aim: "to measure the end-to-end performance of the whole (compute + storage) system and to avoid common DL-benchmarking pitfalls"
Rinas — Zhong et al.
https://arxiv.org/abs/2312.02368. "data loading I/O for shuffling can consume up to 85 % of the total training time for models such as ResNet-152 on the ImageNet dataset (~140 GB)"; 30–50 % throughput degradation for language-model training; 59 % and 89 % improvements from intra-batch unordered fetching.
SPDL — Meta
https://arxiv.org/abs/2504.20067, submitted 2025-04-23, revised 2026-03-10. 74 % faster ImageNet iteration than PyTorch DataLoader, 38 % less CPU, 50 GB less memory, +33 % on free-threaded Python 3.13t.
Methodology
Raasveldt, Holanda, Gubner, Mühleisen — Fair Benchmarking Considered Difficult
DBTest'18, June 2018 — https://ir.cwi.nl/pub/27862/27862.pdf. The pitfall
taxonomy methodology.md is organised around:
§3.1 Non-Reproducibility · §3.2 Failure To Optimize · §3.3 Apples vs Oranges · §3.4 Over-specific Tuning · §3.5 Cold/Warm/Hot Runs · §3.6 Ignoring Preprocessing Time · §3.7 Incorrect Code
Lance — VLDB 2025
https://arxiv.org/abs/2504.15247. [summarised] — verify before quoting.
- Parquet random access moves ~64× on configuration: ~5,500 rows/sec at defaults against ~350,000 with 8 KiB pages
- Uses 256 random indices per take, against one billion rows for small types
- "benefits of coalesced access are easily overstated in benchmarking and less frequent in real-world use cases"
Zeng et al. — columnar format evaluation
Artifact: XinyuZeng/EvaluationOfColumnarFormats. Found ORC issues "≈4× S3
GET than Parquet", and that request count rather than bytes reverses the SSD
ranking on object storage.
MCAP evaluation
John Hurliman, Foxglove, 2021-10-06 — https://mcap.dev/files/evaluation.pdf. "A recording format should be optimized for write throughput first and foremost." Published benchmarks (https://mcap.dev/guides/benchmarks/rosbag2-storage-plugins) measure write throughput on ramdisk and contain no random-access measurement.
Shuffling: cost and consequence
Full argument in access-patterns.md; the sources:
| Source | Where | What it establishes |
|---|---|---|
| WebDataset | https://github.com/webdataset/webdataset | "purely sequential I/O … 3x-10x for local drives compared to random access". Shuffling is a buffer plus shard permutation; "tar files do not support random access" |
| MosaicML Streaming | docs, blog 2023-02-09 | Five algorithms, default py1e; shuffle_block_size defaults to max(4_000_000 // num_canonical_nodes, 1<<18). Global naive shuffle is "the least download-efficient … Training throughput is often much lower" |
| Megatron-Energon | https://nvidia.github.io/Megatron-Energon/ | Requires explicit shuffle_buffer_size and max_samples_per_sequence "because the library is designed to work on (sequential) webdatasets"; ~100 recommended for both as "balanced shuffling randomness vs seeking performance impact" [summarised] |
| FFCV | Leclerc et al., CVPR 2023, https://arxiv.org/abs/2306.12517 | "each file system has a block size after which random reads become sequential reads. In almost all system, this lies below 2MB." Uses quasi-random sampling over permuted 8 MB pages |
| Nguyen et al. | IPDPS 2022, https://bgerofi.github.io/papers/tnguyen-IPDPS22.pdf | Local vs global shuffling at up to 4,096 workers. See below |
| CorgiPile | SIGMOD 2022, https://arxiv.org/abs/2206.05830 | Block-then-tuple shuffle; "the gap between Shuffle Once and CorgiPile is below 1 %"; 1.5× faster than full-shuffle PyTorch on ImageNet |
| scDataset | ICML 2026 (PMLR 306), https://arxiv.org/abs/2506.01883 | Scientific recording data. See below — the closest analogue to CA3's situation |
| BatchWeave | https://arxiv.org/abs/2605.09994 v2, 2026-05-15 | "a static, pre-processed dataset is shuffled offline, partitioned into fixed-size batches, and streamed to the training process at a predictable rate" |
| GetBatch | Aizman, Gaikwad, Żelasko, https://arxiv.org/abs/2602.22434, 2026-02-27 | Still targets randomised fetch as the workload |
A "20–40 % of training time" figure was attributed to BatchWeave by a summarising tool. The PDF was searched and it is not there. Do not use it.
Nguyen et al., IPDPS 2022 — the accuracy cost of local shuffling
Up to 2,048 GPUs on ABCI, 4,096 nodes on Fugaku.
- "To much of our surprise, in the overwhelming majority of our experiments local shuffling performs almost identical to global shuffling in terms of validation accuracy"
- ImageNet-1K/ResNet-50 at 1,024 workers: local matches global "when each worker only processes a very small fraction of the dataset (e.g. 1/1024)"
- Where it breaks: 9 % gap at 2,048 GPUs on ImageNet-1K; up to 30 % on ImageNet-50 at 128 GPUs (10 % even at 32); 3 % on ImageNet-21K upstream
- The repair: partial exchange at rate 0.3 restores global-shuffle accuracy at 4,096 workers while each worker stores 0.03 % of the dataset
- The cost avoided: "global shuffling on 128 workers is almost 5x slower than local shuffling"; DenseNet I/O 19.6 s vs 8 s per epoch at 512 workers
scDataset, ICML 2026 — where shuffle buffers fail
Single-cell omics in HDF5/AnnData; Tahoe-100M, 100M cells, 314 GB. Code: https://github.com/scDataset/scDataset.
- True random sampling from on-disk AnnData: ~20 samples/sec — over 58 days for one epoch
- Block sampling (block
b) with batched fetching (fetch factorf): 204× over AnnLoader at b=1024, f=1024; 47× over HuggingFace Datasets; 25× over BioNeMo-SCDL; 15× from fetch-factor batching alone on pure sequential streaming (345 → 5,263 samples/sec) - The accuracy result, four tasks × two architectures × three seeds: "Streaming and streaming with a shuffle buffer achieve similarly poor performance, confirming that a buffer of 16,384 cells does not mitigate bias when plate-scale heterogeneity spans tens of millions of cells." Drug and mechanism-of-action classification collapse to near chance under both. Block shuffling at b=16, f=256 matches true random sampling on all four, with minibatch plate-label entropy ~3.61 against ~3.62 for true random
- Streaming also shows periodic loss spikes at plate boundaries; block shuffling does not
- Their generalisation names CA3's case: "time-series sensor data from IoT deployments", and anything with "natural clustering (spatial, temporal, or organizational)"
Tooling notes
torchdata DataPipes are gone. Deprecated in 0.8.0 (July 2024), deleted in
0.10.0. The repository is now "an iterative enhancement of
torch.utils.data.DataLoader"; the surviving artifact is
StatefulDataLoader for mid-epoch checkpointing. Pin torchdata==0.9.0 if the
old API is needed. https://github.com/meta-pytorch/data/releases
shuffle=True has no effect on an IterableDataset —
https://docs.pytorch.org/docs/2.14/data.html.
Reference datasets. Vision converged on ImageNet-1K (~140–146 GB), which is why FFCV, DALI, WebDataset, AIStore and CorgiPile numbers can be argued about at all. For scientific data, Tahoe-100M through scDataset's public code is the newest reusable reference, with AnnLoader, HuggingFace Datasets and BioNeMo-SCDL baselines already established.
Could not be verified
- Any published cross-loader throughput table putting FFCV, DALI, WebDataset
and PyTorch DataLoader on the same axes.
docs.ffcv.ioshows FFCV only, and the FFCV paper says it did not compare against DALI - Any MCAP random-read benchmark — none exists
- The "20–40 % of training time" figure attributed to BatchWeave — searched and absent