【问题标题】:Is there a max size of samples that tensorflow Datasets can hold?张量流数据集可以容纳的样本的最大大小?
【发布时间】:2021-02-28 17:15:56
【问题描述】:

我有几个关于tensorflow Datasets的问题。

我在 jupyter notebook 中创建了一个 tensorflow 数据集对象,一个包含 370 万个样本的训练数据集和一个包含近 100 万个样本的测试集。 每个样本都是一个包含 1000 个值的时间序列。

对于我所做的训练集和测试集

dataset = dataset.cache()
dataset = dataset.shuffle(len(dataset))
dataset = dataset.batch(batch_size)
dataset = dataset.prefetch(tf.data.experimental.AUTOTUNE)

笔记本的这些单元格的创建非常出色。 但是在下一个单元格中,当我想枚举测试数据集时,我的 jupyter 内核连接中断(也描述了here。调试输出揭示了这个问题:

tensorflow/core/framework/cpu_allocator_impl.cc:80] Allocation of 18936000000 exceeds 10% of free system memory.

这个问题也是described here。 我已经将 batch_size 降到了 1,我启用了

physical_devices = tf.config.list_physical_devices('GPU')
tf.config.experimental.set_memory_growth(physical_devices[0], True)

但我仍然有这个问题。我的机器有 64GB 的 RAM 和 6GB 的 GPU 内存。

我的问题是:

  1. tensorflow 数据集可以容纳的样本数量是否有限制?
  2. 我可以进一步减少时间序列长度,但如果有这样的限制,这是否会有帮助?
  3. 是否有任何聪明的想法/方法(或其他更有效的数据结构)不会遇到此内存错误?
  4. 这是超出的 GPU 内存还是 RAM 内存?

抱歉问了这么多问题,我正在学习,感谢任何事情。

【问题讨论】:

  • 我在使用基于时间序列的大型数据集时遇到了完全相同的问题。事实上,我的调试器根本没有输出任何错误信息,它只是表明 jupyter 内核崩溃了。我将代码导出到一个常规的 py 文件并执行了脚本,但是 python 只是退出而没有任何警告或错误消息。我将批量大小减少到 1,但这也无济于事。 Gpu 工作负载“Cuda”暂时达到峰值,然后代码退出,没有任何错误消息。

标签: python tensorflow jupyter-notebook tensorflow-datasets


【解决方案1】:

内存超载的原因是当您cache() 并将shuffle() 缓冲区设置为整个数据集时,您将所有内存都放入内存中。如果您删除前者并大幅减少 shuffle 缓冲区,它应该会有所帮助。

tensorflow/core/framework/cpu_allocator_impl.cc:80] 18936000000 的分配超过了可用系统内存的 10%。

CPU

【讨论】:

  • 感谢@Nicolas Gervais 的回答!我删除了cache() 并将随机缓冲区从len(dataset) 大幅减少到10,但我仍然有问题Allocation of 18936000000 exceeds 10% of free system memory. 还有其他想法吗?请多多包涵
  • BTW,有没有办法让TF使用超过10%的内存?
  • 嗯,你得到的是一个警告,而不是一个错误,所以尽管有这个警告,它应该可以工作
  • 不完全是:“但是在下一个单元格中,当我想枚举测试数据集时,我的 jupyter 内核连接中断(也描述了这里。”所以每次我想枚举数据集时,内核中断,笔记本冻结。当我查看调试输出时,我看到了前面提到的分配问题。这可能是因为我的枚举 - enumerate(dataset) 是否导致此内存溢出?
猜你喜欢
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 2010-12-17
  • 2020-11-11
  • 1970-01-01
  • 2016-10-08
  • 1970-01-01
  • 2020-08-16
相关资源
最近更新 更多