tensorflow GPU OOM在几个时代之后出现问题

tensorflow GPU OOM在几个时代之后出现问题,tensorflow,tensorflow-gpu,Tensorflow,Tensorflow Gpu,我用tensorflow用Nvidia Geforce 1060(6G内存)训练CNN,但我得到了一个OOM例外 训练过程在前两个阶段都很好,但在第三个阶段出现了OOM例外 ============================ 2017-10-27 11:47:30.219130:W tensorflow/core/commonèu runtime/bfcèu分配器。抄送:277*********************************************************

我用tensorflow用Nvidia Geforce 1060(6G内存)训练CNN,但我得到了一个OOM例外

训练过程在前两个阶段都很好,但在第三个阶段出现了OOM例外

============================ 2017-10-27 11:47:30.219130:W tensorflow/core/commonèu runtime/bfcèu分配器。抄送:277************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************ 2017-10-27 11:47:30.265389:W tensorflow/core/framework/op_kernel.cc:1192]资源耗尽:在使用shape[10,10,48,48,48]分配张量时出现OOM 回溯(最近一次呼叫最后一次): 文件“/anaconda3/lib/python3.6/sitepackages/tensorflow/python/client/session.py”,第1327行,在 返回fn(*args) 文件“/anaconda3/lib/python3.6/site packages/tensorflow/python/client/session.py”,第1306行,在 状态,运行(元数据) 文件“/anaconda3/lib/python3.6/contextlib.py”,第88行,在退出 下一个(self.gen) 文件“/anaconda3/lib/python3.6/site packages/tensorflow/python/framework/errors\u impl.py”,第466行,处于raise\u exception\u on\u not\u ok\u状态 pywrap_tensorflow.TF_GetCode(状态)) tensorflow.python.framework.errors\u impl.ResourceExhausterRor:OOM在使用形状[10,10,48,48,48]分配张量时 [[Node:gradients\u 4/global/detector\u scope/maxpool\u conv3d\u 2/MaxPool3D\u grad/MaxPool3DGrad=MaxPool3DGrad[T=DT\u FLOAT,TInput=DT\u FLOAT,data\u format=“NDHWC”,ksize=[1,2,2,2,1],padding=“VALID=[1,2,2,2,1],\u device=“/job:localhost/replica:0/task:0/gpu:0”](全局/检测器范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/全局/检测器范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/最大池范围/ [[Node:Momentum\u 4/update/\u 540=\u Recvclient\u terminated=false,recv\u device=“/job:localhost/replica:0/task:0/cpu:0”,send\u device=“/job:localhost/replica:0/task:0/gpu:0”,send\u device\u化身=1,tensor\u name=“edge\u 1540\u Momentum\u 4/update”,tensor\u type=DT\u FLOAT,\u device=“/job:localhost/replica:0/task:0/cpu:0”]

=============================

所以,我很困惑为什么我在第三个纪元处理完前两个纪元后得到了这个OOM异常

假设每个历元的数据集都是相同的,如果GPU内存用完,我应该在第一个历元出现异常。但是我成功地完成了两个历元。那么,为什么以后会发生这种情况呢


有什么建议吗?

在您第一次开始训练时和至少完成一个历元之后,有两次您可能会看到OOM错误

第一种情况仅仅是由于模型的内存大小。因此,最简单的方法是减少批处理大小。如果您的模型非常大,并且批处理大小现在只有一个,那么您仍然有一些选择:减少隐藏层的大小,或者移动到具有足够GPU甚至仅CPU执行的云实例,以便静态分配记忆的作用

对于第二种情况,您可能会遇到某种内存泄漏。许多培训实现使用对保留数据集的回调来获得验证分数。这种执行(例如,如果由Keras调用)可能会保留GPU会话资源。如果不释放,这些资源会累积,并可能导致GPU实例在几个月后报告OOMs、 其他人建议在验证会话中使用第二个GPU实例,但我认为更好的方法是使用更智能的验证回调会话处理(特别是在每个验证回调完成时释放GPU会话资源)

以下是说明回调问题的伪代码。此回调导致OOM:

my_models_validation_score = tf.get_some_v_score
此回调不会导致OOM:

with tf.Session() as sess: 
    sess.run(get_some_v_score)

我邀请其他人帮助添加此响应…

您知道为什么前者会导致OOM吗?我的印象是,它在一个交互式会话下运行,该会话在操作完成后自动关闭。