Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python tf.keras模型.内存泄漏预测结果_Python_Tensorflow_Keras_Google Colaboratory - Fatal编程技术网

Python tf.keras模型.内存泄漏预测结果

Python tf.keras模型.内存泄漏预测结果,python,tensorflow,keras,google-colaboratory,Python,Tensorflow,Keras,Google Colaboratory,在google colab上工作。使用tf.keras和tensorflow 2.3.0版 我快发疯了,因为我不能使用我训练过的模型,用model.predict运行预测,因为它耗尽了CPU RAM。我已经能够用一个非常简单的例子重现这个问题 import numpy as np import tensorflow as tf from tensorflow.keras import backend as K from tensorflow.keras.layers import Input,C

在google colab上工作。使用
tf.keras
和tensorflow 2.3.0版 我快发疯了,因为我不能使用我训练过的模型,用
model.predict
运行预测,因为它耗尽了CPU RAM。我已经能够用一个非常简单的例子重现这个问题

import numpy as np
import tensorflow as tf
from tensorflow.keras import backend as K
from tensorflow.keras.layers import Input,Conv2D, Activation

matrixSide = 512 #define a big enough matrix to give memory issues

inputL = Input([matrixSide,matrixSide,12]) #create a toy model
l1 = Conv2D(32,3,activation='relu',padding='same') (inputL) #120
l1 = Conv2D(64,1,activation='relu',padding='same')(l1)
l1 = Conv2D(64,3,activation='relu',padding='same')(l1)
l1 = Conv2D(1,1,padding='same')(l1)
l1 = Activation('linear')(l1)
model = Model(inputs= inputL,outputs = l1)


#run predictions
inImm = np.zeros((64,matrixSide,matrixSide,12))
for i in range (60):
  print(i)
  outImm = model.predict(inImm)
# K.clear_session() #somebody suggested it...
基本上,在GPU上工作时,它在前4次迭代中使用3.0 GB的CPU RAM,然后上升到7,然后上升到10,然后崩溃,因为它耗尽了所有可用的RAM! 当在CPU上运行时,它会持续更多的迭代,有时甚至会将它使用的RAM数量从9GB减少到3GB,但在大约20次迭代后,最终它仍然崩溃

前一个示例()在使用
tf.data
时存在类似问题,但在使用numpy时则没有。有人就github问题建议tensorflow 1.14在每个循环中执行
K.clear\u会话
。。。但这没用


有没有办法解决这个问题?

我找到了一个解决内存泄漏的方法。虽然在我的情况下,
K.clear\u session()
没有任何作用,但在每次调用后使用
\uu=gc.collect()
添加垃圾收集实际上起到了作用!
现在使用的内存实际上是恒定的,我可以运行任意数量的预测。

这是我将此作为错误发布到Tensorflow后的理解

将代码更改为

in_imm = np.zeros((64,matrix_side,matrix_side,12))
for i in range (60):
  print(i)
  tensor = tf.convert_to_tensor(in_imm, dtype=tf.float32)
  out_imm = model.predict(tensor)

在带有numpy输入的for循环中使用tf.keras.Model.predict,每次迭代都会创建一个新的图,因为numpy数组是使用不同的签名创建的。将numpy数组转换为张量可以保持相同的签名并避免创建新的图形。

我使用
K.clear\u session()
解决了这个问题。 首先,您需要定义一个会话,然后才能清除它。 这一目的在这两个方面都有说明,并且

首先,在循环中使用
K.clear_session()
会在第一次预测后导致错误。在我看来,tf失去了与模型的联系。 因此,我在循环的每次运行中都创建一个新模型。这会对第一次多次运行的代码速度产生负面影响,但会阻止RAM存储的累积

以下代码包含建议的改进:

import numpy as np
import tensorflow as tf
from tensorflow.keras import backend as K
from tensorflow.keras.layers import Input,Conv2D, Activation

matrixSide = 512 #define a big enough matrix to give memory issues

config = tf.ConfigProto(log_device_placement=True)
config.gpu_options.allow_growth = True
session = tf.Session(config=config)
K.set_session(session)

def create_model(matrixSide_v):
    inputL = Input([matrixSide_v,matrixSide_v,12]) #create a toy model
    l1 = Conv2D(32,3,activation='relu',padding='same') (inputL) #120
    l1 = Conv2D(64,1,activation='relu',padding='same')(l1)
    l1 = Conv2D(64,3,activation='relu',padding='same')(l1)
    l1 = Conv2D(1,1,padding='same')(l1)
    l1 = Activation('linear')(l1)
    c_model = Model(inputs= inputL,outputs = l1)
    return c_model

#run predictions
inImm = np.zeros((64,matrixSide,matrixSide,12))
for i in range(64):
    print(i)
    model = create_model(matrixSide)
    outImm = model.predict(inImm)
    K.clear_session()

如果这是TF 1 .x-添加命令打开和关闭会话或使用<代码> 上下文:不,我正在使用TF2.XI刚刚打这个bug tooo谢谢,我会试试这个!顺便问一下,这些“图形”究竟是什么以及它们是如何表现的,有没有明确的解释?如果这是一个图形问题,为什么K.clear_sessions()不起作用(但gc.collect()起作用)?在我的用例中,我使用一个经过训练的模型来预测大量的样本。加载一个模型并为每个预测清除会话是没有意义的,因为它既慢,而且加载一个模型也有记录在案的内存泄漏问题。如何将您的解决方案应用到我的用例中,有什么建议吗?
import numpy as np
import tensorflow as tf
from tensorflow.keras import backend as K
from tensorflow.keras.layers import Input,Conv2D, Activation

matrixSide = 512 #define a big enough matrix to give memory issues

config = tf.ConfigProto(log_device_placement=True)
config.gpu_options.allow_growth = True
session = tf.Session(config=config)
K.set_session(session)

def create_model(matrixSide_v):
    inputL = Input([matrixSide_v,matrixSide_v,12]) #create a toy model
    l1 = Conv2D(32,3,activation='relu',padding='same') (inputL) #120
    l1 = Conv2D(64,1,activation='relu',padding='same')(l1)
    l1 = Conv2D(64,3,activation='relu',padding='same')(l1)
    l1 = Conv2D(1,1,padding='same')(l1)
    l1 = Activation('linear')(l1)
    c_model = Model(inputs= inputL,outputs = l1)
    return c_model

#run predictions
inImm = np.zeros((64,matrixSide,matrixSide,12))
for i in range(64):
    print(i)
    model = create_model(matrixSide)
    outImm = model.predict(inImm)
    K.clear_session()