Python tf.keras模型.内存泄漏预测结果
在google colab上工作。使用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
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()