TensorFlow GPU循环训练多分类任务多次后始终出现内存溢出问题
问题根因定位
- 多进程调用逻辑错误:你当前传target的方式是直接执行training函数,所有训练逻辑还是跑在主进程,进程隔离释放内存的效果完全没生效。正确的多进程传参应该是把函数引用和参数分开传。
- 清理会话逻辑未实际执行:
tf.keras.backend.clear_session后面缺少调用括号,实际没有触发Keras会话清理,旧模型的张量还占着显存。 - TensorFlow 2.5本身存在已知的循环训练内存泄漏问题,仅靠gc和clear_session不足以完全释放显存残留。
可行解决方案
- 修正多进程调用写法,正确传参,依靠进程退出自动释放所有显存/内存资源:
a_path = f"wav_data/denoise/{index[i]}" # target只传函数引用,不要加括号执行,参数放在args元组里传入 p = multiprocessing.Process(target=training, args=(a_path, False)) p.start() p.join() p.close()
- 如果采用单进程循环训练,每个任务结束后补全清理逻辑,显式销毁模型对象:
# 单个任务训练完成后依次执行 del model # 手动删除当前任务的模型实例 tf.keras.backend.clear_session() # 补全括号,实际执行会话清理 gc.collect()
- GPU内存增长配置必须放在脚本最开头,所有TensorFlow操作执行之前配置,不能放在循环内重复调用:
# 脚本第一块执行的代码,放在模型构建、数据集加载之前 gpus = tf.config.experimental.list_physical_devices('GPU') for gpu in gpus: tf.config.experimental.set_memory_growth(gpu, True)
- 所有模型构建、数据集加载、训练的逻辑都封装在
training函数内部,不要把模型、数据集对象定义在全局作用域,避免全局引用导致无法被垃圾回收。
内容的提问来源于stack exchange,提问作者mrr7997
相关产品推荐
相关产品推荐

