代码之家  ›  专栏  ›  技术社区  ›  Karnivaurus

数据集太大而无法放入RAM的培训

  •  2
  • Karnivaurus  · 技术社区  · 6 年前

    我使用TensorFlow在一个非常大的数据集上进行训练,这个数据集太大,无法放入RAM。因此,我已将数据集拆分为硬盘上的多个碎片,并使用 tf.data.Dataset 类将碎片数据加载到 tf.placeholder 在GPU内存中。为了在这些碎片上训练,我考虑了两种方法,但我不知道哪种方法是最佳实践。他们是:

    1) 对于每个epoch,依次加载每个数据集shard,并在每个shard上训练一次迭代。

    2) 对于每个epoch,依次加载每个数据集shard,然后在每个shard上进行多次训练。

    1)的问题是,从硬盘加载每个数据集碎片需要很长时间,而且由于每个碎片只在每次迭代中进行训练,因此加载此数据所花费的总训练时间占很大一部分。然而,2)的问题是,连续多次在同一个碎片上进行训练将使优化更可能收敛到局部最小值。

    建议采用哪种方法?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Ed Bordin    6 年前

    Dataset类绝对是为数据的用例而设计的,这些数据太大,无法放入RAM中。如果您还没有看过性能指南,那么它是值得一读的: https://www.tensorflow.org/performance/datasets_performance

    我想先看看 prefetch 数据读取代码后+ prefetch to device 在数据集管道的末尾,可以帮助隐藏ETL过程的“提取”阶段的延迟。

    我还建议重新排列文件加载的顺序,并使用Dataset shuffle ops来避免您描述的局部最小值-理想情况下,示例也应该以随机顺序开始。如果您当前正在使用python代码加载数据,则可能需要考虑将数据预处理为TFRecord格式,以便您可以从TFRecordDataset的本机性能中获益。

    其他有用的信息:

    1. 你是在单机上训练还是在集群上训练?
    2. 数据格式是什么?当前如何加载?