TensorFlow每次启停会话泄漏1280字节GPU内存?
TensorFlow会话启停导致的GPU内存残留问题
我最近碰到一个挺有意思的小问题:每次开启并关闭TensorFlow会话后,都会有1280字节的GPU内存被占住,而且这块内存不会自动释放,非得等Python内核完全终止才会还给系统。
复现脚本
把下面的代码存成memory_test.py,运行时传入迭代次数参数就能复现这个现象:
import tensorflow as tf import sys n_Iterations = int(sys.argv[1]) def open_and_close_session(): with tf.Session() as sess: pass for _ in range(n_Iterations): open_and_close_session() with tf.Session() as sess: print("bytes used=", sess.run(tf.contrib.memory_stats.BytesInUse()))
原因分析
这其实是TensorFlow内部的小对象内存池残留导致的。每次创建会话时,TensorFlow会初始化一些底层的GPU资源结构(比如设备上下文、小型内存缓冲区之类的),这些结构占用的极小内存(刚好1280字节)会被留在GPU的内存池中,不会在会话关闭时立即回收——因为TensorFlow默认会保留这些小内存块,用来给后续的会话创建复用,避免重复初始化的开销。
解决办法
如果一定要清除这部分残留内存,可以试试这两种方式:
- 显式重置默认图:每次会话关闭后调用
tf.reset_default_graph(),不过这会清除所有已定义的张量和操作,适合完全独立的会话场景。 - 复用单个会话:尽量在整个程序生命周期里只用一个TensorFlow会话,别频繁创建销毁。这不仅能避免内存残留,还能提升运行效率。
比如修改后的复用会话版本:
import tensorflow as tf import sys n_Iterations = int(sys.argv[1]) # 复用单个会话,避免频繁创建销毁 with tf.Session() as sess: for _ in range(n_Iterations): # 在这里执行会话内的操作即可 pass print("bytes used=", sess.run(tf.contrib.memory_stats.BytesInUse()))
运行这个版本的代码,你会发现内存占用不会随着迭代次数增加而累积。
内容的提问来源于stack exchange,提问作者Trisoloriansunscreen




