【问题标题】:The Tensorflow model can't completely delet and still occupy the CPU memoryTensorflow模型无法完全删除,依然占用CPU内存
【发布时间】:2020-07-25 20:42:24
【问题描述】:

我正在优化神经网络架构和超参数。出于这个原因,我构建了一个 for 循环以发送超参数,并通过每次迭代构建/训练/评估新模型。这样的例子:

for k in range(10):
    #full_model() function is used to build the new model with 
    #hyperparameters l1,l2,l3
    md=full_model(l1,l2,l3)
    md.compile(optimizer='SGD',loss='categorical_crossentropy',metrics=['accuracy'])
    md.fit(trads,validation_data=vds,epochs=3)
    teloss,teacc=md.evaluate(teds)


我尝试通过在循环中添加以下代码来完全删除创建的模型并在循环中评估后释放占用的 CPU 内存:

del md
gc.collect()
tf.keras.backend.clear_session()
tf.compat.v1.reset_default_graph()

但我观察到在循环中添加上述代码后,CPU 内存不会释放,并且在迭代过程中内存的使用量不断增加。最后,由于内存泄漏,该进程将被系统杀死。

顺便说一句,我使用了一些自定义层,它们将子层和张量保存在列表中。在构建整个模型期间,这种自定义层也包含在列表中。我不确定这是否是导致此问题的原因之一。示例 persudo 代码如下:

class custom_layer(tf.keras.layers.Layer):

   def __init__(self):
      self.layer_li=[layers.conv(),layers.Maxpool2d()....]
      ...

   def call(self,inputs):
    self.out1,self.out2=self.layer_li[0](inputs),self.layer_li[1(inputs)
    return [self.out1,self.out2]


class build_model(tf.keras.Model):

    def __init__(self):
        sub_layers_list=[sublayer_1(),sublayer2...]

   def call(self,inputs):
        self.x=self.sub_layers_list[0](inputs)
        for k in range(1,len(sub_layers_list)):
           self.out=sub_layers_list[k](self.out)

        return self.out







谁能帮助我以这种方式工作而不会泄漏内存? 提前感谢您的帮助!

已编辑 我的代码使用 ubuntu 16.04 在 tensorflow2.1 中运行

【问题讨论】:

  • 我也在调查可能与 tf 相关的内存泄漏,所以我对你的问题很感兴趣。您能否提供一个可运行的最小示例,可能在 google colab 中?
  • 嗨,@ Zaccharie Ramzi。我发现这个问题似乎没有出现在 colab 中,我正在做实验以进一步验证这个猜测。如果有任何进展我会在这里分享。
  • 我有同样的问题,我的内存泄漏在 colab 中无法重现。

标签: python tensorflow keras tensorflow2.0


【解决方案1】:

最后,通过将操作系统更改为 Windows 解决了这个问题。如果有人在 Ubuntu 中有更明智的处理方式,欢迎提出建议或意见。

【讨论】:

    猜你喜欢
    • 2011-01-23
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多