- Error polling for event status: failed to query event: CUDA ERROR ILLEGAL INSTRUCTION
- 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. 感想
- 終極解決方案還是盡可能提升硬件性能,避免性能瓶頸。
- 做深度學習特別需要高性能顯卡,不然實驗根本跑不起來,尤其是針對遙感這種大影像。剛開始用CPU跑的,因為我的機器內存大一些(為32G),跑起來慢的想死,估計跑完一次實驗要幾個月了,最后還是換到GPU上,速到一下子提高了70多倍,差別太大了。