初始編譯環境ubuntu16.04+CUDA8.0+Opencv3.4+cudnn5.1
編譯原版的caffe-ssd,下面三項指令全部通過
make all -j16
make runtest -j16
make pycaffe
但是執行MobileNet-SSD中的demo.py時,報錯Check failed: status == CUDNN_STATUS_SUCCESS (4 vs. 0) CUDNN_STATUS_INTERNAL_ERROR。
猜想一:權限問題
對于我們常玩caffe的人來說,這個錯誤很常見,初始都以為是時cudnn的權限問題,是以加了sudo python demo.py,但是無濟于事,仍然報相同的錯誤。我就去cuda的samples/1_Utilities/deviceQuery目錄下編譯了該測試檔案,執行下面兩條指令,如果顯示出顯示卡的型号,驅動,顯存等相關資訊,初步判斷CUDA安裝正常。
make
./deviceQuery
這裡說一下,如果是在私人的機子上配環境,建議對cuda目錄執行
sudo chmod 777 -R *
賦予普通使用者通路該目錄下所有檔案的權限,以免後面編譯caffe時碰到權限不夠的問題,也友善我們後面執行caffe程式時不用每次都加sudo。當然,對于大型公用伺服器就别這樣搞了,随便給777權限是很容易被入侵的。
猜想2:makefile.configure中配置的顯示卡計算容量和顯示卡實際性能不比對.
此時先查詢自己的先顯示卡計算能力,兩種方法:[1]去英偉達官網查對應型号顯示卡的資料;[2]和上一步類似進入自己的samples/1_Utilities/deviceQuery目錄下,執行
./deviceQuery
指令,然後在輸出資訊中查找紅線圈起來的那一項,後面對應的數字就是自己顯示卡的計算容量.

如果不知道自己的samples/1_Utilities/deviceQuery目錄在哪兒,執行locate deviceQuery 查找一下就好.
接下來,檢視SSD的makefile.config檔案中關于顯示卡計算力的配置,找到下面這塊.
如果你剛才查的自己的顯示卡計算力是5.0,就把除了 -gencode arch=compute_50,code=sm_50之外的其他幾行注釋掉(前面直接加#),比如我的gtx1070顯示卡,計算力為6.1,就隻留下compute_61那行(提一句,其實比自己顯示卡運算力低的可以不用注釋,但是高的必須注釋).
ok....改完之後,我們重新編譯caffe-ssd.
make clean
make all -j16
make runtest -j16
make pycaffe
然後執行去mobilenet-ssd的目錄下執行python demo.py。按照常理來說問題應該都解決了才對。。。。。可是讓我懷疑人生的是,問題依舊。這是在和我開玩笑嗎,runtest都過了,執行個demo竟然出問題。
這時,我有點兒懷疑MobileNet-ssd的demo代碼是否正确了。順着報錯資訊,找到出錯的那一層。問題出在mobilenet新提出的dw卷積上,按照錯誤提示來看,該層的gpu模式貌似有問題。是以,我将所有的dw層的engine前的注釋全部取消,用CAAFE模式,也就是cpu模式執行,果然此次python demo.py執行成功。
但是,這種解決方式不是我們理想的好辦法,下面來說說一勞永逸的解決方法。
先總結一下這個問題出現的原因----------------caffe-ssd的dw卷積gpu模式存在bug。
解決方法1:在makefile.config中注釋掉USE_CUDNN項,整個網絡都不用cudnn加速,避開這個bug。缺點就是以後訓練都變得非常慢。
解決方法2:用https://github.com/chuanqi305/MobileNetv2-SSDLite/tree/master/src這裡面的兩個檔案替換掉caffe/src/layers/目錄下的兩個同名檔案,然後重新編譯caffe-ssd。值得提一下,者兩個檔案僅支援CUDA9.0和cudnn7.1以上版本。是以需要解除安裝之前裝的CUDA8.0,安裝cuda9.0和cudnn7.1之後,再重新編譯caffe-ssd。此法可完全解決該問題,之後可以用gpu運作mobilenet。
***解除安裝CUDA的方法--------進入/usr/local/cuda/bin目錄下執行解除安裝腳本即可,執行完之後删除掉殘餘的cuda-8.0目錄。
cd /usr/local/cuda/bin
sudo ./uninstall*.pl
cd /usr/local
sudo rm -rf cuda-8.0