一文解决matlab配置和matconvnet可能遇到的所有问题
目录
-
下载Matconvnet
https://www.vlfeat.org/matconvnet/download/
在上述网址选择Matconvnet进行安装
-
安装和编译Matconvnet
https://www.vlfeat.org/matconvnet/install/
参照官网的步骤进行
首先解压安装到自定义的目录下;接着调用到matconvnet的目录下
在Matlab命令行依次输入指令:
run <Matconvnet>/matlab/vl_setupnn
mex -setup
选择mex -setup C++
配置完语言后,添加路径
编译时需要注意将cl.exe的路径是在VS\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x64
所以第一种方法是将 vl_compilenn.m文件的647行修改成图上的路径;
第二种是将cl.exe复制到647行的文件夹下即可
(最终的原因是因为VS2017与VS2015的路径设置不同,matlab认准的是VC\bin\amd64)
-
下载CUDA和cudnn的安装包
接下来是对CUDA和cudnn进行下载
这里需要注意MATLAB与CUDA对应的版本
我使用的是R2019b所以安装CUDA10.1
再查询显卡支持的版本
得知显卡最高支持11.0,所以完全可以安装CUDA10.1版本
安装路径不建议去官网下载,在这里下载的网上寻找的资源
链接:https://pan.baidu.com/s/1hREGDO9oA7A65s3iu6uXGg
提取码:ntbn
-
安装CUDA和cudnn
CUDA下载完成后,直接双击exe安装,然后一步步操作即可,选择精简安装,安装完成后,打开cmd输入:nvcc -v 查看CUDA是否安装成功,如果成功的话会返回CUDA的版本号
接下来安装cudnn
将cudnn的三个文件夹直接复制到如图所示的CUDA文件夹下即可
检查是否安装成功:
桌面处按住Shift键,鼠标右键,选择“在此处打开Powershell窗口”。然后输入:“nvidia-smi”
恭喜已经成功安装!
-
编译vl_compilenn
1.接下来编译matconvnet,但是会出错,报错信息提示如下
>> vl_compilenn('enableGpu', true)
使用 'nvcc' 编译。
错误使用 mex
nvcc fatal : '-DNDEBUG': expected a number
出错 mexcuda (line 157)
[varargout{1:nargout}] = mex(mexArguments{:});
出错 vl_compilenn>mexcuda_compile (line 603)
mexcuda(args{:}) ;
出错 vl_compilenn (line 489)
mexcuda_compile(opts, srcs{i}, objfile, flags) ;
出现该问题使用DEBUG模式解决,牺牲部分性能
第179行:opts.debug = true;
使用debug模式解决
2.接下来还会遇到如下问题:
d:\matconvnet\matconvnet-1.0-beta25\matlab\src\bits\datamex.hpp(19): fatal error C1083: 无法打开包括文件: “gpu/mxGPUArray.h”: No such file or directory
nvcc warning : The -std=c++11 flag is not supported with the configured host compiler. Flag will be ignored.
datamex.cu
错误使用 vl_compilenn>nvcc_compile (line 615)
Command "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nvcc" -c -o "D:\Matconvnet\matconvnet-1.0-beta25\matlab\mex\.build\bits\datamex.obj"
"D:\Matconvnet\matconvnet-1.0-beta25\matlab\src\bits\datamex.cu" -DENABLE_GPU -DENABLE_DOUBLE -DENABLE_CUDNN -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\include" -g -DDEBUG -D_FORCE_INLINES
--std=c++11 -I"D:\Matlab\extern\include" -I"D:\Matlab\toolbox\distcomp\gpu\extern\include" -gencode=arch=compute_75,code=\"sm_75,compute_75\" --compiler-options=/MD
--compiler-bindir="D:\VisualStudio\VC\Tools\MSVC\14.16.27023\bin\Hostx64" failed.
出错 vl_compilenn (line 487)
nvcc_compile(opts, srcs{i}, objfile, flags) ;
问题原因:matlab版本太高的缘故,(MatlabDir)\extern\include,此路径下不存在“gpu/mxGPUArray.h”,这个文件被移动到了 (MatlabDir)\toolbox\distcomp\gpu\extern\include 路径下
解决方法:在 (MatlabDir)\extern\include 路径下建一个“gpu”文件夹然后把(MatlabDir)\toolbox\distcomp\gpu\extern\include\gpu下的mxGPUArray.h文件拷到所建gpu里即可
3.错误使用 mex
'D:\Matconvnet\matconvnet-1.0-beta25\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) ;
解决方法:
解决方案:修改vl_compilenn.m中第359行:
原代码:
flags.mexlink = {'-largeArrayDims','-lmwblas'} ;
改成:
flags.mexlink = {'-lmwblas'} ;
即可。
4.|| 和 && 运算符的操作数必须能够转换为逻辑标量值。
出错 vl_compilenn (line 507)
if strcmp(arch, 'win64') && opts.enableCudnn
解决方法:
直接将上述代码行的“&&”修改成“&”
5.错误使用 copyfile
未找到匹配的文件。
出错 vl_compilenn (line 509)
copyfile(fullfile(opts.cudnnRoot, 'bin', '*.dll'), flags.mex_dir);
解决方法:
vl_compilenn('enableGpu',true,'cudaRoot','C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1','cudaMethod' ,'nvcc','enableCudnn','true','cudnnRoot','C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1')
全部使用绝对路径,写到文件夹下
vl_compilenn('enableGpu', true, ...
'cudaRoot', ' D:\Program Files\MATLAB\CUDA\9.1(你的CUDA路径)', ...
'cudaMethod', 'nvcc',...
'enableCudnn', true, ...
'cudnnRoot', ' D:\Program Files\MATLAB\matconvnet\local\cudnn-9.1(你的CUDNN全路径)');
接下来就运行成功了!