You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动