【问题标题】:Training on datasets too big to fit in RAM对太大而无法放入 RAM 的数据集进行训练
【发布时间】:2019-01-13 00:16:09
【问题描述】:

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

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

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

1) 的问题是从硬盘加载每个数据集分片需要很长时间,并且由于每个分片仅在每次迭代中进行训练,所以整个训练时间的很大一部分都花在了加载这些数据上。但是,2) 的问题在于,在同一分片上连续多次训练会使优化更容易收敛到局部最小值。

推荐的方法是什么?

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

    编辑:使用新链接回答更新。

    Dataset 类绝对是为数据太大而无法放入 RAM 的用例而设计的。 tf.data performance guide 值得一读。

    我会先看看在数据读取代码之后战略性地使用 prefetch + 在数据集管道结束时使用 prefetch to device 是否有助于隐藏 ETL 过程的“提取”阶段的延迟。

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

    其他有用的信息:

    1. 您是在单机还是集群上进行训练?
    2. 数据格式是什么?您目前如何加载它?

    【讨论】:

    • 第一个链接不再可用。
    • 已编辑指向新指南。现在 tf.data 中有自动调整功能,有关预取的详细信息可能不太相关
    猜你喜欢
    • 1970-01-01
    • 2022-01-19
    • 2022-01-21
    • 2020-11-24
    • 2019-11-28
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    相关资源
    最近更新 更多