最近使用Matlab跑深度学习的项目,需要安装MatConvnet,在这个过程中遇到了一些问题,成功解决后特在此总结如下。
一、安装及编译流程
1. MatConvNet介绍: Installing - MatConvNet 2. 配置编译器
3. 编译用于CPU的库
1 2 3 > cd <MatConvNet> > addpath matlab > vl_compilenn
4. 编译用于GPU的库
1 > vl_compilenn('enableGpu' ,true ,'cudaRoot' ,'C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0' ,'cudaMethod' ,'nvcc' ,'enableCudnn' ,'true' ,'cudnnRoot' ,'C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA' )
上述4步执行完如无报错则说明安装编译成功。
下面介绍安装编译过程中遇到的问题及成功解决方法。
二、问题及解决方法(注意本文中所涉及的文件路径请根据自身实际情况就行修改)
1. 报错1
1 2 3 4 5 6 7 8 9 10 Warning: CL.EXE not found in PATH. Trying to guess out of mex setup. > In vl_compilenn>check_clpath (line 650) In vl_compilenn (line 426) 'cl.exe' is not recognized as an internal or external command , operable program or batch file. Error using vl_compilenn>check_clpath (line 656) Unable to find cl.exe Error in vl_compilenn (line 426) cl_path = fileparts(check_clpath()); % check whether cl.exe in path
解决方法:把 C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x64 下的cl.exe复制到 D:\Matlab\matconvnet-1.0-beta25\matconvnet-1.0-beta25\ 下。
2. 报错2
1 2 3 4 5 6 7 8 9 10 11 Error using vl_compilenn>nvcc_compile (line 615) Command "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\bin\nvcc" -c -o "D:\Matlab\matconvnet-1.0-beta25\matconvnet-1.0-beta25\matlab\mex\.build\bits\data.obj" "D:\Matlab\matconvnet-1.0-beta25\matconvnet-1.0-beta25\matlab\src\bits\data.cu" -DENABLE_GPU -DENABLE_DOUBLE-DENABLE_CUDNN -I".local\cudnn\include" -O -DNDEBUG -D_FORCE_INLINES --std=c++11 -I"D:\Matlab\extern\include" -I"D:\Matlab\toolbox\distcomp\gpu\extern\include" -gencode=arch=compute_52,code=\"sm_52,compute_52\" --compiler-options=/MD --compiler-bindir="C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\bin" failed.Error in vl_compilenn (line 487) nvcc_compile(opts, srcs{i}, objfile, flags) ;
解决方法:在 C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC 下创建bin文件夹。
3. 报错3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 c:\program files\nvidia gpu computing toolkit\cuda\v9.0\include\crt/host_config.h(133): fatal error C1189: nvcc warning : The -std=c++11 flag is not supported with the configured host compiler. Flag will be ignored. data.cu Error using vl_compilenn>nvcc_compile (line 615) Command "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\bin\nvcc" -c -o "D:\Matlab\matconvnet-1.0-beta25\matconvnet-1.0-beta25\matlab\mex\.build\bits\data.obj" "D:\Matlab\matconvnet-1.0-beta25\matconvnet-1.0-beta25\matlab\src\bits\data.cu" -DENABLE_GPU -DENABLE_DOUBLE-DENABLE_CUDNN -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\include" -O -DNDEBUG -D_FORCE_INLINES --std=c++11 -I"D:\Matlab\extern\include" -I"D:\Matlab\toolbox\distcomp\gpu\extern\include" -gencode=arch=compute_52,code=\"sm_52,compute_52\" --compiler-options=/MD --compiler-bindir="C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\bin" failed.Error in vl_compilenn (line 487) nvcc_compile(opts, srcs{i}, objfile, flags) ;
错误原因:CUDA和VS版本不匹配。 解决方法:打开C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\include\crt\host_config.h,把 #if _MSC_VER < 1600 || _MSC_VER > 1911 改为: #if _MSC_VER < 1600 || _MSC_VER > 1920 // 只要版本号够高就行,随便挑个数字 即可解决。
4. 报错4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 0x00007FF64188ADD0 (0x0000000000000000 0x000001E56C1C7F18 0x000066BA00000001 0x00000004000304ED) 0x00007FF641886F3D (0x0000009EBEFFE798 0x0000000000000000 0x0000000000000000 0x000001E56C1DCE20) 0x00007FF641888713 (0xnvcc warning : The -std=c++11 flag is not supported with the configured host compiler. Flag will be ignored. data.cu nvcc error : 'cicc' died with status 0xC0000005 (ACCESS_VIOLATION) Error using vl_compilenn>nvcc_compile (line 615) Command "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\bin\nvcc" -c -o "D:\Matlab\matconvnet-1.0-beta25\matconvnet-1.0-beta25\matlab\mex\.build\bits\data.obj" "D:\Matlab\matconvnet-1.0-beta25\matconvnet-1.0-beta25\matlab\src\bits\data.cu" -DENABLE_GPU -DENABLE_DOUBLE-DENABLE_CUDNN -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\include" -O -DNDEBUG -D_FORCE_INLINES --std=c++11 -I"D:\Matlab\extern\include" -I"D:\Matlab\toolbox\distcomp\gpu\extern\include" -gencode=arch=compute_52,code=\"sm_52,compute_52\" --compiler-options=/MD --compiler-bindir="C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\bin" failed.Error in vl_compilenn (line 487) nvcc_compile(opts, srcs{i}, objfile, flags) ;
错误原因:使用CUDA9.0可能会导致上述错误。 解决方法:当使用Visual Studio 2017 Community时,CUDA使用 10.0版本。即搭配为Compatible: Visual Studio 2017 | Cuda 10.0 | Matlab R2018a 。重新编译即可解决。
1 2 3 4 5 > vl_compilenn('enableGpu' , true , ... 'cudaRoot' , 'C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0' , ... 'cudaMethod' , 'nvcc' , ... 'enableCudnn' , true , ... 'cudnnRoot' , 'C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0' );
5. 报错5
1 MatConvNet compiled with '-R2018a' and linked with '-R2017b'
解决方法:把 {MatConvNet路径}/matlab/vl_compilenn.m 第620行附近改成:
1 2 3 4 5 6 7 args = horzcat({'-outdir' , mex_dir}, ... flags.base, flags.mexlink, ... '-R2018a' ,...//新增{['LDFLAGS=$LDFLAGS ' strjoin(flags.mexlink_ldflags)]}, ... {['LDOPTIMFLAGS=$LDOPTIMFLAGS ' strjoin(flags.mexlink_ldoptimflags)]}, ... {['LINKLIBS=' strjoin(flags.mexlink_linklibs) ' $LINKLIBS' ]}, ... objs) ;
同时把第359行附近改成:
1 flags.mexlink = {'-lmwblas' };
即可解决。
至此,使用Matlab编译安装MatConvnet的流程及在这个过程中遇到的问题和解决方法总结如上所示,请各位小伙伴认真对照修改,一定可以解决!如有问题请在评论区留言,我会及时回复!