作为刚入职的深度学习实习生,入职第一天,我领完电脑,刚装完电脑,分配好公司的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,但是悲催地第一步就报错了:
原因是电脑里没有编译器,于是按照提示安装了MinGW-w64编译器:
安装完成后运行mex -setup成功,指定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
好了,接着调程序,我基本把该改的都改完了,总该可以跑了吧?
没想到又报错:
意思很清楚明白了,就是要用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文章~