MatconvNet+VS2015+Matlab2018a+CUDA9+cudnn7:在matlab上搞深度学习,安装环境时遇到的大坑!

事情发生的背景

作为刚入职的深度学习实习生,入职第一天,我领完电脑,刚装完电脑,分配好公司的ip,连chrome都还没来得及安装,就接到任务,需要实现给定的论文的方法,当然啦,我师傅给了我源代码、数据集和论文。

坑爹的是,这篇论文中用到的方法是在matlab上实现的,不是我用惯了的tensorflow+python...

虽说之前也用过matlab,但也仅仅一个月时间,还是很不熟悉的,而且对matlab有种莫名的惧怕,因为他给我一种高效但死板不灵活的感觉,再加上无法移植的硬伤,我以为深度学习应该不会去用它的呢,我听到深度学习框架,基本也是tensorflow、caffee、torch、mxnet之类的,啥时候能排到matab呀~~

算了,既然接到任务肯定得硬着头皮上的,要求我一周把环境装好并把程序调通~~我暗暗没底,因为装环境调代码有时候得看运气好不好~~

正式开搞

首先就是安装matlab咯,我安装的是matlab2018a,因为师傅说新一点的好~~

matlab2018的安装和破解我苦不多说了,甩个链接:安装matlab2018a

拿到源代码和数据集,抓住Readme.md就是看!好,了解到第一个小任务了!需要安装matconvnet

matconvnet是在matlab上搞深度学习必要的工具箱,只要去网上下载下来就行,仍在某个角落也行,但是还是建议放在你安装matlab的目录下,方便使用。

天真的我以为这样就完事儿了,就急急忙忙打开matlab,启动环境:

先要运行mex -setup,但是悲催地第一步就报错了:

mex

原因是电脑里没有编译器,于是按照提示安装了MinGW-w64编译器:

安装完成后运行mex -setup成功,指定C++编译器:

指定C++编译器

然后就是把工作路径切到matconvNet的路径,编译vl_compilenn,这时又报错,提示找不到cl.exe

cl.exe是VS的程序,所以需要安装VS,鉴于安装了matlab2018,便安装对应的VS2015,安装VS2015是默认安装,并配置了系统环境变量,但是还是没能找到VS2015自带的编译器,通过网上查找的两个办法(修改msvc90shellopts.stp文件中的路径和版本号、下载文件,替换maxopts中的文件)依然不能解决问题。后来找到一篇文章说是VS2015现在不自带VC++编译器,我心想这不太可能吧,毕竟VS就是用来写C++程序的呀~后来我去VS想创建一个项目发现,新建项目都无法创建C++空项目,于是得出结论:我的VS2015确实没有安装C++编译器,于是就重新打开安装程序,去手动安装上了,最后去matlab一试,敲入vl_compilenn果然运行通过了~~

所以这也是血的教训,大家要抓住事情的本质啊,matlab就是要配合VS才能搞深度学习的!~~该装的软件,没法省~~

好了,现在搞定三项(matconvnet+matlab+VS)了,可以至少在cpu上跑代码了吧?

在改完代码中相关路径之后,再运行自己的代码,报错:

报错:未定义变量 "dagnn" 或类 "dagnn.DagNN.loadobj"。

这是因为我们之前只是编译了一下,但还没有启动matconvnet

还是在matconvnet 的路径下,在命令行输入vl_setupnn,启动matconvnet

好了,接着调程序,我基本把该改的都改完了,总该可以跑了吧?

没想到又报错:

3

意思很清楚明白了,就是要用GPU来跑~~可是我一个刚来的实习生,怎么可能直接给我一个又GPU的电脑嘛?

我调了半天,看看能不能调成在CPU上跑,嗯,我尽力了,不行,人家作者根本没考虑过在CPU上跑~~

于是边去申请公司GPU,终于给我分配了一个服务器,需要我以远程访问的形式去用这个电脑~

于是我就得又重新安装一遍开发环境

这台电脑已经安装了VS2017,所以我本着多一事不如少一事的思想,而且刚刚好我要装的matlab版本是2018,比较新,版本肯定对的上,就没有考虑安装VS2015~~

那就动手吧!轻车熟路地安装完matlab2018a、matconvnet、CUDA9.0和cudnn7.0之后,我信心满满地去检验环境。

但是,调试MATLAB的GPU环境时报错:

>> mexcuda mexGPUExample.cu
使用 'NVIDIA CUDA Compiler' 编译。
错误使用 mex
mexGPUExample.cu

c:\program files\nvidia gpu computing toolkit\cuda\v9.0\include\crt/host_config.h(133): fatal error C1189: #error:  --
unsupported Microsoft Visual Studio version! Only the versions 2012, 2013, 2015 and 2017 are supported!


出错 mexcuda (line 157)
[varargout{1:nargout}] = mex(mexArguments{:});

原因是CUDA9.0仅支持到VS2017测试版
故需安装VS2015,安装完VS2015后编译mexcuda mexGPUExample.cu成功!

但是还不是功成圆满,接下来开启GPU加速又出错:

错误使用 mex
'F:\MATLAB\matconvnet\matlab\mex\vl_nnconv.mexw64' 使用了 '-R2018a' 进行编译并与 '-R2017b' 链接在一起。 有关详细信息,请参阅 MEX 文件
使用了一个 API 进行编译并与另一个 API 链接在一起。

出错 vl_compilenn>mex_link (line 627)
mex(args{:}) ;

出错 vl_compilenn (line 500)
mex_link(opts, objs, flags.mex_dir, flags) ;

我就纳闷了,我没有装matlab R2017b,哪来的这错误,还是度娘吧。

找了好久才找到能解决此问题的办法:解决办法点这里

然后重新启动GPU加速,又出现问题,问题接踵而至,我对照着网上的就解决办法一个一个解决:


1.25版本的MatConvNet中的vl_compilenn.m文件中在506行增加了这样的判断
if strcmp(arch, 'win64') && opts.enableCudnn
这要求&&符号前后都是逻辑值,所以在运行vl_compilenn函数中'enableCudnn'后面要跟true,而不是跟'true',即编译语句为:

vl_compilenn('enableGpu', true,'cudaRoot', 'C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0','cudaMethod','nvcc','enableCudnn',true,'cudnnRoot','.\local\cudnn-7.2.1'); % 这里填写你的cuDNN的路径 
 
否则会报Operands to the || and && operators must be convertible to logical scalar values的错误。 

又成功部分,并报错:

错误使用 copyfile
未找到匹配的文件。

出错 vl_compilenn (line 509)
  copyfile(fullfile(opts.cudnnRoot, 'bin', '*.dll'), flags.mex_dir);

解决方案:
把CUDA和cudnn的路径写成绝对路径

所以最终版启用GPU加速的命令为:

vl_compilenn('enableGpu', true,'cudaRoot', 'C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0','cudaMethod','nvcc','enableCudnn',true,'cudnnRoot','F:\MATLAB\matconvnet\local\cudnn-7.2.1');

终于大功告成了!

欢迎关注“pyhon修炼之道”,我们将持续更新新鲜python文章~

  • 12
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 31
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值