HDF5数据格式不适合深度学习 - KDnuggets


在本文中,我们将讨论 HDF5 是最流行和最可靠的非表格数字数据格式之一。但是这种格式并未针对深度学习工作进行优化。本文建议应该采用什么样的 ML 原生数据格式才能真正满足现代数据科学家的需求。
HDF5是最流行和最可靠的非表格数字数据格式之一。我给你举个例子。NASA 的地球观测系统卫星每天以 HDF5 格式收集大约 16 TB 的数据。
命名数据集、分层组织的组、用户定义的元数据和属性、压缩过滤器、延迟加载2和跨不同轴的类数组切片等功能使其适用于许多数据处理任务。
尽管 HDF 是在 20 多年前创建的,但通过像h5py这样维护良好的开源库,HDF 在 PyData 社区中仍然很受欢迎。
 
HDF5 未针对深度学习进行优化
在 HDF5 中,大型数据集通常存储为“块”;即,数组的常规分区。虽然这一设计决策意味着 HDF 可以存储千万亿级的非结构化数值数据,如图像和视频,但它是在云对象存储或深度学习之前创建的。因此,DL 工作负载存在许多缺点:

  1. HDF 文件的布局使它们难以在云存储系统(如 Amazon 的 S3 )上进行有效查询,其中存储了越来越多的 ML 数据集。您不能直接从存储为 S3 对象的 HDF5 文件中读取 HDF5 库。在实践中,整个文件(通常大小为 GB)应该被复制到本地存储,然后只能读取第一个字节。
  2. 很难以并行方式对数据应用转换。转换,无论是计算机视觉的数据增强还是 NLP 的标记化,都是任何深度学习实验的核心。
  3. HDF5(Python 实现)基本上是单线程的。这意味着在给定时间只有一个核心可以读取或写入数据集。它不容易被并发读取访问,这限制了 HDF5 数据支持多个 worker 的能力。
  4. 它没有与 Keras 和 PyTorch 等现代框架集成,这意味着研究人员通常需要编写自定义 DataLoader。随着 DataLoader 承担更多职责,例如为并行训练分片数据集,它们变得更加难以定义。
  5. 由于 HDF 元数据散布在整个文件中,因此很难访问随机的数据块。事实上,它需要进行许多小的读取,以收集提取大量数据所需的元数据。

由于这些挑战,大多数用户在可以运行单个 epoch 之前将数据转换为另一种格式(例如 csv 或 TFRecords)。
 
ML 社区需要一种新的数据存储格式
  • 云原生。它应该在不牺牲 GPU 利用率的情况下与云对象存储系统(例如 S3 和 GCS)一起使用。
  • 可并行化。由于大多数 ML 数据集是一次写入、多次读取,因此它应该支持多个 worker 的并发读取。
  • 随机访问。由于研究人员很少需要预先获得整个数据集,因此应以随机方式访问以这种格式存储的数据。
  • 转型。它应该能够在运行时以最少的代码开销对数据应用任意转换。这是因为下载 TB 的数据通常是不切实际的:大多数用户无法访问大数据集群,以便在下载后根据需要对数据进行切片和切块。
  • 整合。它应该与流行的深度学习框架(如 Keras 和 PyTorch)以及其他 PyData 库(如 Numpy 和 Pandas)集成。理想情况下,研究人员应该能够使用他们为本地存储的较小数据集开发的相同脚本访问这些巨大的云数据集。