我用 tensorflow 用 Nvidia Geforce 1060(6G 内存)训练 CNN,但是我得到了一个 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] 资源耗尽:分配形状为 [10,10,48,48,48] 的张量时 OOM
回溯(最近一次调用最后一次):
文件“/anaconda3/lib/python3.6/sitepackages/tensorflow/python/client/session.py”,第 1327 行,在 _do_call
返回 fn(*args)
文件“/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py”,第 1306 行,在 _run_fn
状态,运行元数据)
文件“/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(status))
tensorflow.python.framework.errors_impl.ResourceExhaustedError:在分配形状为[10,10,48,48,48]的张量时出现OOM
[[节点: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"](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)]]
[[节点:Momentum_4/update/_540 = _Recvclient_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/task:0/cpu:0"]]
==============================
所以,我很困惑为什么我在完成前两个时代的处理后在第三个时代得到这个 OOM 异常。
鉴于每个时期的数据集都是相同的,如果我用完了 GPU 内存,我应该在第一个时期得到异常。但我确实成功完成了两个时代。那么,为什么后来发生了这种情况?
请问有什么建议吗?
最佳答案
有两次你可能会看到 OOM 错误,当你第一次开始训练和至少一个 epoch 完成之后。
第一种情况仅仅是由于模型的内存大小。为此,最简单的方法是减少批量大小。如果您的模型非常大而您的批量大小现在已降至 1,您仍然有几个选择:减少隐藏层的大小或移动到具有足够 GPU 甚至仅 CPU 执行的云实例,以便内存的静态分配起作用.
对于第二种情况,您可能会遇到各种内存泄漏。许多训练实现使用对保留数据集的回调来获得验证分数。如果由 Keras 调用,则此执行可能会占用 GPU session 资源。如果不释放,这些就会累积,并可能导致 GPU 实例在几个 epoch 后报告 OOM。其他人建议为验证 session 使用第二个 GPU 实例,但我认为更好的方法是使用更智能的验证回调 session 处理(特别是在每个验证回调完成时释放 GPU session 资源。)
这是说明回调问题的伪代码。此回调导致 OOM:
my_models_validation_score = tf.get_some_v_score
这个回调不会导致OOM:
with tf.Session() as sess:
sess.run(get_some_v_score)
我邀请其他人帮助添加此回复...
关于几个时期后的 tensorflow-GPU OOM 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46981853/