Keras(TensorFlow,CPU):训练循环中的顺序模型吃内存

时间:2017-03-19 11:29:23

标签: python-3.x tensorflow keras

我正在尝试在循环中训练1000x的Sequential模型。在每个循环中,我的程序都会泄漏内存,直到我用完并获得OOM异常。

我之前已经问过类似的问题了 (Training multiple Sequential models in a row slows down

并且已经看到其他类似问题(Keras: Out of memory when doing hyper parameter grid search

,解决方案是在使用完模型后始终将100%添加到代码中。所以我在之前的问题中做到了这一点,我仍在泄漏记忆

以下是重现此问题的代码。

K.clear_session()

这是我从第一个内存调试打印输出的输出

/tensorflow/python/framework/ops.py:121:size = 3485 KiB(+3485 KiB),count = 42343(+42343) /tensorflow/python/framework/ops.py:1400:size = 998 KiB(+998 KiB),count = 8413(+8413) /tensorflow/python/framework/ops.py:116:size = 888 KiB(+888 KiB),count = 32468(+32468) /tensorflow/python/framework/ops.py:1185:size = 795 KiB(+ 795 KiB),count = 3179(+3179) /tensorflow/python/framework/ops.py:2354:size = 599 KiB(+599 KiB),count = 5886(+5886)

系统信息:

  • python 3.5
  • keras(1.2.2)
  • tensorflow(1.0.0)

2 个答案:

答案 0 :(得分:9)

内存泄漏源于Keras和TensorFlow,它使用单个“默认图形”来存储网络结构,随着内部for循环的每次迭代,其大小会增加。

调用K.clear_session()释放迭代之间与默认图关联的一些(后端)状态,但需要额外调用tf.reset_default_graph()来清除Python状态。

请注意,可能有一个更有效的解决方案:由于nn不依赖于任何一个循环变量,您可以在循环外定义它,并在循环内重用相同的实例。如果这样做,则无需清除会话或重置默认图表,并且性能会提高,因为您可以从迭代之间的缓存中受益。

答案 1 :(得分:0)

由于模型参数没有更改,因此您只需编译一次模型即可。然后,您可以构建一个循环来拟合它:

nn = Sequential()
nn.add(Dense(num_hidden_nodes, input_dim=num_input_nodes, activation='relu'))
nn.add(Dense(num_output_nodes))
nn.compile(loss='mean_squared_error', optimizer='adam')

for i in range(100):
        snapshot = tracemalloc.take_snapshot()
        for j in range(10):
            start_time = time.time()
            nn.fit(train_x, train_y, nb_epoch=300, batch_size=2, verbose=0)
            K.clear_session()
            print("Iteration {iter}. Current time {t}. Took {elapsed} seconds".
                  format(iter=i*10 + j + 1, t=time.strftime('%H:%M:%S'), elapsed=int(time.time() - start_time)))

        top_stats = tracemalloc.take_snapshot().compare_to(snapshot, 'lineno')

        print("[ Top 5 differences ]")
        for stat in top_stats[:5]:
            print(stat)

这就是为什么您的内存消耗持续增长的原因。