几个时代之后的tensorflow-GPU OOM问题

时间:2017-10-27 19:05:54

标签: tensorflow tensorflow-gpu

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

前两个时期的训练过程很好,但在第三个时期获得了OOM例外。

============================ 2017-10-27 11:47:30.219130:W tensorflow / core / common_runtime / bfc_allocator.cc:277] ************************** ************************************************** ****************** XXXXXX 2017-10-27 11:47:30.265389:W tensorflow / core / framework / op_kernel.cc:1192]资源耗尽:OOM在分配形状的张量时[10,10,48,48,48] Traceback(最近一次调用最后一次): 文件" /anaconda3/lib/python3.6/sitepackages/tensorflow/python/client/session.py" ;,第1327行,在_do_call     return fn(* args) 文件" /anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py" ;,第1306行,在_run_fn中     status,run_metadata) 文件" /anaconda3/lib/python3.6/contextlib.py",第88行,退出     下一个(self.gen) 文件" /anaconda3/lib/python3.6/site-packages/tensorflow/python/framework/errors_impl.py",第466行,在raise_exception_on_not_ok_status中     pywrap_tensorflow.TF_GetCode(状态)) tensorflow.python.framework.errors_impl.ResourceExhaustedError:分配形状的张量时的OOM [10,10,48,48,48]      [[节点:gradients_4 / global / detector_scope / maxpool_conv3d_2 / MaxPool3D_grad / MaxPool3DGrad = MaxPool3DGrad [T = DT_FLOAT,TInput = DT_FLOAT,data_format =" NDHWC",ksize = [1,2,2,2,1] ,padding =" VALID",strides = [1,2,2,2,1],_device =" / job:localhost / replica:0 / task:0 / gpu:0&#34 ;](global / detector_scope / maxpool_conv3d_2 / transpose,global / detector_scope / maxpool_conv3d_2 / MaxPool3D,gradients_4 / global / detector_scope / maxpool_conv3d_2 / transpose_1_grad / transpose)]]      [[Node:Momentum_4 / update / _540 = _Revvclient_terminated = false,recv_device =" / job:localhost / replica:0 / task:0 / cpu:0",send_device =" / job:localhost / replica:0 / task:0 / gpu:0",send_device_incarnation = 1,tensor_name =" edge_1540_Momentum_4 / update",tensor_type = DT_FLOAT,_device =" / job:localhost / replica: 0 /任务:0 / CPU:0"]]

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

所以,我很困惑为什么在完成处理前两个时期之后我在第三个时期得到了这个OOM例外。

鉴于数据集在每个时期都是相同的,如果我的GPU内存耗尽,我应该在第一个时代得到例外。但我确实成功完成了两个时代。那么,为什么这会在以后发生呢?

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

有两次你可能会看到OOM错误,因为你第一次开始训练并且至少有一个纪元已经完成。

第一种情况仅仅是由于模型的内存大小。为此,最简单的方法是减少批量大小。如果您的模型非常大并且批量大小现在已降至1,那么您仍然可以选择以下几种方法:减少隐藏层的大小或移动到具有足够GPU或甚至仅CPU执行的云实例,以便内存的静态分配工作

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

这是说明回调问题的伪代码。这个回调导致OOM:

my_models_validation_score = tf.get_some_v_score

此回调不会导致OOM:

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

我邀请其他人帮助添加此回复......