【问题标题】:Why sometimes tensorflow runs slower and slower with the process of training?为什么有时候 tensorflow 在训练过程中运行的越来越慢?
【发布时间】:2017-01-27 12:20:19
【问题描述】:

我训练了一个 RNN 网络,第一个 epoch 用了 7.5 小时。但是随着训练过程的运行,tensorflow运行的越来越慢,第二个epoch用了55个小时。我检查了代码,大多数随着时间变慢的 API 是这些:

  1. session.run([var1, var1, ...], feed_dict=feed),
  2. tensor.eval(feed_dict=feed)

比如一行代码是session.run[var1, var2, ...], feed_dict=feed),程序开始的时候,用了0.1秒,但是随着进程的运行,这行代码所用的时间越来越大,10个小时后,给这一行计时花费 10 秒。

我已经遇到过好几次了。哪个触发了这个?我该怎么做才能避免这种情况?

如果这行代码:self.shapes = [numpy.zeros(g[1].get_shape(), numy.float32) for g in self.compute_gradients] 将节点添加到 tensorflow 的图中?我怀疑这可能是原因。这行代码会周期性调用多次,self不是tf.train.optimizer的对象。

【问题讨论】:

  • 听起来你可能有内存泄漏。尝试按照说明here 查找原因。如果selftf.train.Optimizer 对象,[numpy.zeros(...) for g in self.compute_gradients] 线可能会向图中添加节点。

标签: tensorflow


【解决方案1】:

在创建图表后尝试完成图表 (graph.finalize())。这将阻止将操作添加到图表中。我还认为 self.compute_gradients 正在向图中添加操作。尝试在循环外定义操作并在循环内运行它

【讨论】:

  • 非常感谢。我试过graph.finalize(),应该完全没有内存泄漏。而且我还删除了numpy.ndarray等频繁分配大内存的代码。我将运行几个 epoch 来检查它。
【解决方案2】:

我遇到了类似的问题。我的解决方案是把

tf.reset_default_graph()

在每个时期或样本之后。这会重置图表并释放所有使用的资源,而关闭会话则不会。

【讨论】:

  • 我收到了这个错误:AssertionError: Do not use tf.reset_default_graph() to clear nested graphs. If you need a cleared graph, exit the nesting and create a new graph.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-31
  • 2018-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多