【发布时间】: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})
但是,当特征的维度很高时,训练过程会随机变慢。 诊断如下:
- 图表是预定义的,tensorflow slow performance 不是这种情况。
- sess.run()的实际运行时间是稳定的,下面是一个训练batch的时间线,看起来很正常。
- 缓慢的部分发生在 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