是否有必要在tensorflow InteractiveSession()之后关闭会话

时间:2018-05-08 08:20:19

标签: python tensorflow

我对Tensorflow中的InteractiveSession提出了一个问题

我知道tf.InteractiveSession()只是方便的句法 用于保持默认会话打开的糖,基本上如下所示:

with tf.Session() as sess:
    # Do something

但是,我在网上看到了一些示例,在使用close()后,他们没有在代码末尾调用InteractiveSession

问题
1.如果不关闭会话泄漏会话会导致任何问题吗?
2.如果我们不关闭它,GC如何为InteractiveSession工作?

1 个答案:

答案 0 :(得分:4)

是的,tf.InteractiveSession只是方便的语法糖,可以让默认会话保持打开状态。

会话实施有a comment

  

调用此方法可释放与会话关联的所有资源。

快速测试

#! /usr/bin/env python
# -*- coding: utf-8 -*-


import argparse
import tensorflow as tf
import numpy as np


def open_interactive_session():
    A = tf.Variable(np.random.randn(16, 255, 255, 3).astype(np.float32))
    sess = tf.InteractiveSession()
    sess.run(tf.global_variables_initializer())


def open_and_close_interactive_session():
    A = tf.Variable(np.random.randn(16, 255, 255, 3).astype(np.float32))
    sess = tf.InteractiveSession()
    sess.run(tf.global_variables_initializer())
    sess.close()


def open_and_close_session():
    A = tf.Variable(np.random.randn(16, 255, 255, 3).astype(np.float32))
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--num', help='repeat', type=int, default=5)
    parser.add_argument('type', choices=['interactive', 'interactive_close', 'normal'])
    args = parser.parse_args()

    sess_func = open_and_close_session

    if args.type == 'interactive':
        sess_func = open_interactive_session
    elif args.type == 'interactive_close':
        sess_func = open_and_close_interactive_session

    for _ in range(args.num):
        sess_func()
    with tf.Session() as sess:
        print("bytes used=", sess.run(tf.contrib.memory_stats.BytesInUse()))

给出

"""
python example_session2.py interactive
('bytes used=', 405776640)
python example_session2.py interactive_close
('bytes used=', 7680)
python example_session2.py
('bytes used=', 7680)
"""

这会在没有关闭会话时引发会话泄漏。注意,即使关闭会话,TensorFlow中当前存在错误,每个会话保留1280个字节,请参阅Tensorflow leaks 1280 bytes with each session opened and closed? (这已经修复了。)

此外,__del__尝试启动GC时有一些逻辑。

有趣的是,我从未见过警告

  

交互式会话已处于活动状态。在某些情况下,这可能会导致内存不足错误。您必须明确调用InteractiveSession.close()以释放其他会话所持有的资源

似乎是implemented。它猜测InteractiveSession唯一的存在理由是它在Jupyter Notebookfiles或非活动shell中与.eval()结合使用。但我建议不要使用eval(参见Official ZeroOut gradient example error: AttributeError: 'list' object has no attribute 'eval'

  

但是,我在网上看到了一些例子,他们在使用InteractiveSession后没有在代码末尾调用close()。

我并不感到惊讶。猜猜在一些malloc之后没有freedelete的代码片段数。祝操作系统释放内存。