Summary
For 1-sample-per-file formats such as JPEG (RetinaNet), the high-concurrency prefetch path (TorchIterableDatasetSimple, effective depth 64 × num_workers) is enabled only for object-storage backends, while POSIX / local filesystems fall back to the map-style path (1 × num_workers). Under the same CLOSED rules this gives object storage up to 64× higher I/O concurrency than POSIX, even when the underlying storage is equally capable — so the dataloader path, not the storage, can dominate the result.
Where in the code
dlio_benchmark/data_loader/torch_data_loader.py (verified on HEAD f16fe43, 2026-06-29):
- TorchIterableDatasetSimple (~L432-461): S3 → s3dlio.get_many(64 in-flight per worker); POSIX → ThreadPoolExecutor(64 workers); comment states "Effective pipeline depth: 64 × num_workers (vs 1 × num_workers before)."
- Selection gate (~L629-632):
python use_simple_iterable_dataset = (
self.format_type in _simple_iterable_formats
and not use_rg_iterable_dataset
and self._args.storage_type in _s3_types # S3 / AISTORE / DIRECT_FS only
)
where _s3_types = (StorageType.S3, StorageType.AISTORE, StorageType.DIRECT_FS). Plain POSIX is excluded and falls through to the map-style TorchDataset (1 in-flight per worker).
- A nearby comment notes the restriction exists for fork-safety of the prefetch thread — suggesting this is a technical limitation rather than a deliberate benchmarking choice.
Impact
RetinaNet reads many small (~315 KB) JPEGs, so it is highly sensitive to read concurrency. A POSIX/distributed-FS (e.g., CephFS) submission is capped at 1 in-flight per worker, while an object-storage submission gets up to 64, making CLOSED comparisons unfair.
Question / request
Is this asymmetry intended? If it is a fork-safety limitation, could the POSIX path also be given a high-concurrency prefetch option (e.g., the ThreadPoolExecutor(64) path) so POSIX and object-storage submissions compete on equal footing under CLOSED?
Summary
For 1-sample-per-file formats such as JPEG (RetinaNet), the high-concurrency prefetch path (TorchIterableDatasetSimple, effective depth 64 × num_workers) is enabled only for object-storage backends, while POSIX / local filesystems fall back to the map-style path (1 × num_workers). Under the same CLOSED rules this gives object storage up to 64× higher I/O concurrency than POSIX, even when the underlying storage is equally capable — so the dataloader path, not the storage, can dominate the result.
Where in the code
dlio_benchmark/data_loader/torch_data_loader.py (verified on HEAD f16fe43, 2026-06-29):
where _s3_types = (StorageType.S3, StorageType.AISTORE, StorageType.DIRECT_FS). Plain POSIX is excluded and falls through to the map-style TorchDataset (1 in-flight per worker).
Impact
RetinaNet reads many small (~315 KB) JPEGs, so it is highly sensitive to read concurrency. A POSIX/distributed-FS (e.g., CephFS) submission is capped at 1 in-flight per worker, while an object-storage submission gets up to 64, making CLOSED comparisons unfair.
Question / request
Is this asymmetry intended? If it is a fork-safety limitation, could the POSIX path also be given a high-concurrency prefetch option (e.g., the ThreadPoolExecutor(64) path) so POSIX and object-storage submissions compete on equal footing under CLOSED?