TensorFlow-GPU运行数小时后出现数组MemoryError问题求助
TensorFlow-GPU运行2小时后出现MemoryError的排查与解决
首先看你的报错堆栈,最后是在np.asarray()环节抛出的MemoryError——划重点:这个操作是在CPU内存里执行的,不是GPU内存!你之前调整的allow_growth和per_process_gpu_memory_fraction都是针对GPU显存的配置,自然解决不了CPU内存耗尽的问题。
运行2小时才报错,说明你的程序是在训练过程中慢慢累积占用CPU内存,大概率是内存泄漏或者数据处理逻辑导致的,下面给你具体的排查和解决方向:
一、定位CPU内存泄漏点
推荐用memory_profiler工具来精准监控内存变化,找到哪段代码在持续吃内存:
- 先安装工具:
pip install memory-profiler - 在你的训练函数上加上装饰器,运行脚本就能看到每一行代码的内存占用:
from memory_profiler import profile @profile def train_neural_network(input_image): # 把你的训练逻辑放在这里 - 重点检查:训练循环里有没有变量一直在追加数据(比如列表
append后从未清空)、有没有中间计算结果没及时释放,比如input_image_data1_batch是不是每次循环都在累积,没有重新初始化?
二、优化数据处理逻辑
- 改用TensorFlow原生的
tf.data.Dataset加载数据,避免一次性把所有数据读入CPU内存:# 示例:分批加载数据集 dataset = tf.data.Dataset.from_tensor_slices((你的输入数据, 标签数据)) dataset = dataset.batch(你的批次大小).prefetch(tf.data.experimental.AUTOTUNE) - 训练循环结束后手动清理内存,触发Python垃圾回收:
import gc # 每个批次处理完成后 del input_image_data1_batch # 删除不再需要的变量 gc.collect() # 强制回收内存
三、GPU配置的补充说明
虽然这次报错和GPU无关,但如果后续遇到GPU显存问题,你之前的两种配置可以结合使用,效果更好:
config = tf.ConfigProto() config.gpu_options.allow_growth = True # 按需分配显存 config.gpu_options.per_process_gpu_memory_fraction = 0.4 # 限制显存占比 sess = tf.Session(config=config)
关于录屏软件的疑问
运行TensorFlow-GPU时开录屏确实可能导致程序崩溃:
- 录屏软件会占用大量GPU显存和计算资源,你的GTX960M显存本身不算大(一般2G/4G),很容易被录屏抢占资源,导致TensorFlow显存不足崩溃;
- 同时录屏也会占用CPU和内存,加重你当前CPU内存耗尽的问题,更快触发内存溢出。
所以训练时建议关闭录屏软件,避免资源竞争。
内容的提问来源于stack exchange,提问作者王迎芃
相关产品推荐
相关产品推荐

