MobileNet-SSD报错Check failed: status == CUDNN_STATUS_SUCCESS (4 vs. 0) CUDNN_STATUS_INTERNAL_ERROR

初始编译环境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

命令,然后在输出信息中查找红线圈起来的那一项,后面对应的数字就是自己显卡的计算容量.

MobileNet-SSD报错Check failed: status == CUDNN_STATUS_SUCCESS (4 vs. 0) CUDNN_STATUS_INTERNAL_ERROR_第1张图片

如果不知道自己的samples/1_Utilities/deviceQuery目录在哪儿,执行locate deviceQuery 查找一下就好.

接下来,查看SSD的makefile.config文件中关于显卡计算力的配置,找到下面这块.

MobileNet-SSD报错Check failed: status == CUDNN_STATUS_SUCCESS (4 vs. 0) CUDNN_STATUS_INTERNAL_ERROR_第2张图片

如果你刚才查的自己的显卡计算力是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执行成功。

MobileNet-SSD报错Check failed: status == CUDNN_STATUS_SUCCESS (4 vs. 0) CUDNN_STATUS_INTERNAL_ERROR_第3张图片

但是,这种解决方式不是我们理想的好办法,下面来说说一劳永逸的解决方法。

先总结一下这个问题出现的原因----------------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

 

你可能感兴趣的:(装机环境问题)