首先,我想在处理之前提供内存信息。
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
答案 0 :(得分:0)
TF永远不会释放它之前捕获的内存。这可能是一件相当不错的事情,因为它有助于避免内存碎片。
请注意,这与分配的mem的哪一部分可用无关-TF控制它并不意味着该mem被有效使用。 clear_session
应该再次使大多数/所有受控制的内存可用(但再次:仅对TF可用,对其他进程不可用)。
您需要找出受控的内存的哪些部分实际可用,已使用或需要。