You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TensorFlow GPU循环训练多分类任务多次后始终出现内存溢出问题

问题根因定位
  1. 多进程调用逻辑错误:你当前传target的方式是直接执行training函数,所有训练逻辑还是跑在主进程,进程隔离释放内存的效果完全没生效。正确的多进程传参应该是把函数引用和参数分开传。
  2. 清理会话逻辑未实际执行:tf.keras.backend.clear_session 后面缺少调用括号,实际没有触发Keras会话清理,旧模型的张量还占着显存。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 07:21:02