如何在Keras / Python3中从内存中完全删除对象或模型?

时间:2019-06-20 08:11:27

标签: python tensorflow keras

首先,我想在处理之前提供内存信息。

pmem(rss=288796672, vms=4105973760, shared=107503616, text=2039808, lib=0, data=771235840, dirty=0)

我使用Keras构建了一个模型,并将其分配给model变量。然后,我将model对象发送给类构造函数进行克隆:

from tensorflow.python.keras.models import clone_model
from tensorflow.python.keras import backend as K
class Source:
    def __init__(self, model):
        config = Config()
        self.model = clone_model(model)
        # breakpoint to read memory
        self.model.compile(optimizer=config.optimizer, loss=config.loss, metrics=config.metrics)

克隆后的内存信息如下:

pmem(rss=289615872, vms=4333002752, shared=107843584, text=2039808, lib=0, data=797331456, dirty=0)

到目前为止,太好了。当我尝试通过self.model删除del self.model对象时,内存不会减少。

pmem(rss=289615872, vms=4333002752, shared=107843584, text=2039808, lib=0, data=797331456, dirty=0)

然后我尝试通过gc.collect()执行垃圾收集器,但是结果是相同的,没有任何变化。

pmem(rss=289615872, vms=4333002752, shared=107843584, text=2039808, lib=0, data=797331456, dirty=0)

最后,我尝试使用K.clear_session()清除会话。一切都没有改变。

pmem(rss=289615872, vms=4333002752, shared=107843584, text=2039808, lib=0, data=797331456, dirty=0)

Keras版本::2.1.6(已从上一版本降级以解决此问题,但不起作用。)

Tensorflow版本: 2.0.0-alpha0

1 个答案:

答案 0 :(得分:0)

TF永远不会释放它之前捕获的内存。这可能是一件相当不错的事情,因为它有助于避免内存碎片。

请注意,这与分配的mem的哪一部分可用无关-TF控制它并不意味着该mem被有效使用。 clear_session应该再次使大多数/所有受控制的内存可用(但再次:仅对TF可用,对其他进程不可用)。

您需要找出受控的内存的哪些部分实际可用,已使用或需要。