【问题标题】:Tensorflow loading data randomly slows down during trainingTensorflow 加载数据在训练期间随机减慢
【发布时间】:2017-03-03 12:41:46
【问题描述】:

我已经加载了内存中的所有训练数据,只消耗了总内存的 7%。并使用以下框架来训练模型:

# build graph
......
# data producer
class DataProducer(object):
  # a single feature has multiple labels and is needed to be trained separately for each label
  # in order to not copy the features multiple times, I use the self.ft_idxs to index the relationships between features and labels
  def yield_trn_batch(self, batch_size):
    for i in xrange(0, self.num_data, batch_size):
      fts = self.fts[self.ft_idxs[self.shuffled_idxs[i: i+batch_size]]
      labels = self.labels[self.shuffled_idxs[i: i+batch_size]]
      yield fts, labels

# training
for feature, label in data.yield_trn_batch(batch_size):
  sess.run(model.train_op, feed_dict={model.feature: feature, model.label: label})

但是,当特征的维度很高时,训练过程会随机变慢。 诊断如下:

  1. 图表是预定义的,tensorflow slow performance 不是这种情况。
  2. sess.run()的实际运行时间是稳定的,下面是一个训练batch的时间线,看​​起来很正常。
  3. 缓慢的部分发生在 data.yield_trn_batch() 中。一开始,加载一个 minibatch 需要 0.01 秒,但经过几个 epoch 后,它变得不稳定,有时需要 1s 才能加载一个 minibatch。但是,当我评论 sess.run() 并纯粹运行 data.yield_trn_batch() 时,它像往常一样快。我不使用队列,所以可能不是dequeue many operation very slow 中的情况。

我猜图形运行过程影响了数据加载,但不知道为什么以及如何解决这个问题(可能使用另一个线程加载数据?)。谁能解决这个问题?

【问题讨论】:

  • 我想我们需要更多细节来解决这个问题。你的 Python 进程是否消耗大量内存?可以分享data.yield_trn_batch(batch_size)的代码吗?如果你一遍又一遍地喂同一批次,它仍然会变慢吗?
  • 我更新了代码和内存使用情况。当我喂同一批次时,几个时期后速度似乎没有增长。数据产出代码有问题吗?
  • 我的猜测是,您产生的数组切片对于 Python 使用的内存分配器来说是一个尴尬的大小,并且每个批次都在增加堆的大小(本身不是内存泄漏,但释放的内存不会像您希望的那样被重用)。您可以尝试使用tcmalloc 中描述的this doc 吗?
  • 谢谢!它解决了问题。

标签: tensorflow


【解决方案1】:

根据我们在 cmets 中的对话,速度变慢似乎是由于分配大量 NumPy 数组造成的内存压力。虽然 NumPy 数组在不再使用时会正确地进行垃圾回收,但默认的 malloc() 实现不会重用它们,并通过调用 @987654322 逐渐增加堆的大小(以及进程的虚拟大小) @系统调用。

一种解决方法是切换分配器库,它可以修复地址空间泄漏:为您的 TensorFlow 进程使用 tcmalloc 分配器而不是默认的 malloc()tcmalloc 中的分配策略更适合重复分配和回收相同大小的缓冲区,并且不需要随着时间的推移增加头部的大小,这应该会带来更好的性能。

【讨论】:

    猜你喜欢
    • 2020-07-13
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多