用GPU实现google colaboratory` ResourceExhaustedError`

时间:2018-01-29 05:23:46

标签: tensorflow google-colaboratory

我正在尝试使用Vgg16colaboratory模型进行微调,但在使用GPU进行训练时遇到了此错误。

OOM when allocating tensor of shape [7,7,512,4096]

INFO:tensorflow:Error reported to Coordinator: <class 'tensorflow.python.framework.errors_impl.ResourceExhaustedError'>, OOM when allocating tensor of shape [7,7,512,4096] and type float
     [[Node: vgg_16/fc6/weights/Momentum/Initializer/zeros = Const[_class=["loc:@vgg_16/fc6/weights"], dtype=DT_FLOAT, value=Tensor<type: float shape: [7,7,512,4096] values: [[[0 0 0]]]...>, _device="/job:localhost/replica:0/task:0/device:GPU:0"]()]]

Caused by op 'vgg_16/fc6/weights/Momentum/Initializer/zeros', defined at:

我的vm会话也有这个输出:

    --- colab vm info ---
python v=3.6.3
tensorflow v=1.4.1
tf device=/device:GPU:0
model name  : Intel(R) Xeon(R) CPU @ 2.20GHz
model name  : Intel(R) Xeon(R) CPU @ 2.20GHz
MemTotal:       13341960 kB
MemFree:         1541740 kB
MemAvailable:   10035212 kB

我的tfrecord只有118张256x256张JPG file size <2MB

有解决方法吗?它在我使用CPU时工作,而不是GPU

4 个答案:

答案 0 :(得分:2)

看到少量可用的GPU内存几乎总是表明您创建了一个没有allow_growth = True选项的TensorFlow会话。看到: https://www.tensorflow.org/guide/using_gpu#allowing_gpu_memory_growth

如果您未设置此选项,则默认情况下,TensorFlow将在创建会话时保留几乎所有GPU内存。

好消息:从本周开始,Colab现在默认设置此选项,因此当您在Colab上使用多个笔记本时,您应该看到增长率大大降低。而且,您还可以通过在运行时菜单中选择“管理会话”来检查每个笔记本的GPU内存使用情况。

enter image description here

选择后,您将看到一个对话框,列出所有笔记本和每个笔记本所消耗的GPU内存。要释放内存,您也可以从此对话框终止运行时。

enter image description here

答案 1 :(得分:0)

我没有重新报告最初报告的错误,但如果这是由GPU内存耗尽(而不是主内存)引起的,这可能会有所帮助:

# See https://www.tensorflow.org/tutorials/using_gpu#allowing_gpu_memory_growth
config = tf.ConfigProto()
config.gpu_options.allow_growth = True

然后将session_config=config传递给例如slim.learning.train()(或者您最终使用的任何会话)。

答案 2 :(得分:0)

在我的情况下,我没有解决Ami提供的解决方案,即使它非常出色,可能是因为Colaboratory VM无法提供更多资源。

我在检测阶段出现了OOM错误(不是模型训练)。我解决了一个解决方法,禁用GPU进行检测:

config = tf.ConfigProto(device_count = {'GPU': 0})
sess = tf.Session(config=config)

答案 3 :(得分:0)

我遇到了同样的问题,发现我的问题是由以下代码引起的:

from tensorflow.python.framework.test_util import is_gpu_available as tf
if tf()==True:
  device='/gpu:0'
else:
  device='/cpu:0'

我在下面的代码中使用了以下代码来检查GPU内存的使用状况,并在运行上面的代码之前发现其使用率为0%,之后变为95%。

# memory footprint support libraries/code
!ln -sf /opt/bin/nvidia-smi /usr/bin/nvidia-smi
!pip install gputil
!pip install psutil
!pip install humanize    
import psutil
import humanize
import os
import GPUtil as GPU
GPUs = GPU.getGPUs()
# XXX: only one GPU on Colab and isn't guaranteed
gpu = GPUs[0]

def printm():
process = psutil.Process(os.getpid())
print("Gen RAM Free: " + humanize.naturalsize( psutil.virtual_memory().available ), " I Proc size: " + humanize.naturalsize( process.memory_info().rss))
print('GPU RAM Free: {0:.0f}MB | Used: {1:.0f}MB | Util {2:3.0f}% | Total {3:.0f}MB'.format(gpu.memoryFree, gpu.memoryUsed, gpu.memoryUtil*100, gpu.memoryTotal))

printm()

之前:

  

Gen RAM Free:12.7 GB I Proc大小:139.1 MB

     

免费的GPU RAM:11438MB |已使用:1MB |利用率0%|总计11439MB

之后:

  

Gen RAM Free:12.0 GB I Proc大小:1.0 GB

     

免费GPU RAM:564MB |二手:10875MB |实用率95%|总计11439MB

以某种方式,由is_gpu_available()管理的消耗了大部分GPU内存,但没有在之后释放它们,因此,我改为使用下面的代码为我检测gpu状态,问题已解决

!ln -sf /opt/bin/nvidia-smi /usr/bin/nvidia-smi
!pip install gputil
try:
  import GPUtil as GPU
  GPUs = GPU.getGPUs()
  device='/gpu:0'
except:
  device='/cpu:0'