TensorFlow-gpu运行问题记录-windows10

  1. Error polling for event status: failed to query event: CUDA ERROR ILLEGAL INSTRUCTION
  2. could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR

目录

1. 运行环境配置

最近在做CNN语义分割的实验,在windows10上运行的,为了快速实现原型,采用了高层API框架Keras,后端采用了Tensorflow。实验过程中出现了不少问题,为防止再次踩坑,故记录下来。我的实验运行环境配置如下:

  • Keras 2.2
  • TensorFlow-gpu 1.8
  • Python 3.6
  • CUDA 9.0
  • cuDNN 7.4
  • OS: Windows 10
  • GPU: GeForce GTX 1070 (8 G)

2. 问题

问题(1) Error polling for event status: failed to query event: CUDA ERROR ILLEGAL INSTRUCTION

实验计算量比较大,本来是设置的训练期间运行30个epoch,但总会出现遍历几轮后报错退出的问题,错误信息为

Error polling for event status: failed to query event: CUDA ERROR ILLEGAL INSTRUCTION
  • 1.修改one-hot在CPU运行

    查阅资料发现windows 上tensorflow GPU版本的one-hot函数运行是有问题的,需要将其修改为在CPU上运行才可解决问题,修改方式如下:

# 原代码为
b = tf.one_hot(a, n_classes)
# 修改为
with tf.device('/cpu:0'):
    b = tf.one_hot(a, n_classes)

以上方式在tensorflow编写的代码中可以使用,问题是我现在用的是keras,这些操作都被封装起来了,没法直接修改运行位置,还在寻找有效的解决办法。。。

  • 2.网上给出的一些解决方案:
This indicates that the device kernel took too long to execute. 
This can only occur if timeouts are enabled - see the device property
kernelExecTimeoutEnabled for more information. The device cannot be 
used until cudaThreadExit()  is called. All existing device memory allocations
are invalid and must be reconstructed if the program is to continue using CUDA
翻译:
这表明设备内核执行时间太长。只有在启用超时时才会发生这种情况——有关更多信息,
请参阅设备属性kernelExecTimeoutEnabled。在调用cudaThreadExit()之前,设备
不能使用。所有现有的设备内存分配都是无效的,如果程序要继续使用CUDA,就必须重新构建

原因是运行GPU程序时,经常会因为kernel运行超过两秒触发TDR而使得运算中断甚至程序崩溃,关闭TDR超时检测方法如下(好像并没有用):

如何配置(关闭)显卡的超时检测和恢复(TDR)

猜想可能是GPU计算资源不够用的问题。

问题(2)could not create cudnn handle: CUDNN_ STATUS_ INTERNAL_ ERROR

在pycharm中启动tensorflow时有时会遇到启动失败的问题,报错如下:

could not create cudnn handle:CUDNN_STATUS_INTERNAL_ERROR

这是因为当前GPU不仅用于深度学习计算,还在承担着其他任务(如屏幕显示功能),tensorflow运行时默认会占满GPU空间,出现显存冲突时就会报错。可以尝试加入以下代码限制下显存:

config = tf.ConfigProto()
config.gpu_options.allow_growth = True
sess = tf.Session(config=config)

或者:

config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.5#根据实际情况设置使用比例
session = tf.Session(config=config)

当前如果本身GPU空间就比较小,即使限制了显存可能也会报错,毕竟空间确实不够用。

我的1070显卡实际可用空间只有6G,样本为512* 512的遥感影像,batch设的大了根本跑不起来,最后没办法只能设batch=2 才勉强跑起来,中途还是会莫名其妙的停止,各种google发现cuDNN本身也有bug在不断修复。

3. 感想

  1. 终极解决方案还是尽可能提升硬件性能,避免性能瓶颈
  2. 做深度学习特别需要高性能显卡,不然实验根本跑不起来,尤其是针对遥感这种大影像。刚开始用CPU跑的,因为我的机器内存大一些(为32G),跑起来慢的想死,估计跑完一次实验要几个月了,最后还是换到GPU上,速到一下子提高了70多倍,差别太大了。