代码问题: 【MatConvNet库编译】
问题1:(windows+matconvnet1.10)
老版本的MatConvNet在编译对cuDNN支持的时候,cuDNN的版本是2或者4比较好,官网有明确的描述。
比如我编译用了cuDNN 6.0的版本,在编译 nnconv_cudnn.cu文件时会出现too few arguments in function call 的错误。
问题2:(windows+matconvnet1.10)
更改cuDNN为4.0版本后,编译nnbilinearsampler_cudnn.cu出现以下错误:
nnbilinearsampler_cudnn.cu(24) : fatal error C1021: 无效的预处理器命令“warning”
解决办法是直接注释掉第24行,即可。 2017.11.18
问题3:
GPU/cuDNN编译成功后,运行调用MatConvNet的代码,在使用vl_simplenn做forward pass时候依然出现下面的错误:
An input is not a numeric array (or GPU support not compiled)
该错误发生在vl_simplenn.m中前向传播计算res.x的时候。
解决办法:
更改vl_compilenn.m文件的mex_compile函数。
将 mopts = {'-outdir', fileparts(tgt), src, '-c', mex_opts{:}} ;
更改为 mopts = {'-outdir', fileparts(tgt), src, '-c', mex_opts{:}, '-largeArrayDims'} ; 然后再对GPU版本重新编译 。 2017.11.23
问题4:(windows+matconvnet1.25)
新下载了1.25版本的MatConvNet,在nnbilinearsampler_cudnn.cu和nnbilinearsampler.cu文件这里总是编译出现错误。
然后在官网:http://www.vlfeat.org/matconvnet/mfiles/vl_nnbilinearsampler/中明确说明了:Note, cuDNN v5 or higher is required.
于是又换了6.0的cuDNN,可以解决问题。 2017.11.29
问题5:(windows+matconvnet1.25)
继续.1.25版本的MatConvNet编译出现无法解析的外部命令的错误。提示:
无法解析外部符号 cudnnCreateSpatialTransformerDescriptor
解决办法:在更换了6.0的cuDNN后,忘记把lib文件和头文件放到cuda的文件夹下,复制过去后,问题解决。
问题6:(windows+matconvnet1.25)
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\v8.0', ...
'cudaMethod', 'nvcc',...
'enableCudnn', true, ...
'cudnnRoot', 'xxx\cuDNNv6'); % 这里填写你的cuDNN的路径
否则会报Operands to the || and && operators must be convertible to logical scalar values的错误。 2017.11.30
问题7:MatConvNet1.25+Ubuntu18.04+CudaToolkit10.0+cuDNN7.5
错误使用 vl_compilenn>nvcc_compile (line 615)
Command "/usr/local/cuda-10.0/bin/nvcc" -c -o
"/home/qian/nutCloud/codes/libraries/ml/matconvnet-1.0-beta25_linux/matlab/mex/.build/bits/data.o"
"/home/qian/nutCloud/codes/libraries/ml/matconvnet-1.0-beta25_linux/matlab/src/bits/data.cu" -DENABLE_GPU -DENABLE_DOUBLE -DENABLE_CUDNN
-I"/home/qian/codes/libraries/ml/matconvnet-1.0-beta25_linux/local/cuDNNv7_5_linux/include" -O -DNDEBUG -D_FORCE_INLINES --std=c++11
-I"/usr/local/MATLAB/R2018a/extern/include" -I"/usr/local/MATLAB/R2018a/toolbox/distcomp/gpu/extern/include"
-gencode=arch=compute_20,code=\"sm_20,compute_20\" -gencode=arch=compute_30,code=\"sm_30,compute_30\" --compiler-options=-fPIC
--compiler-options=-mssse3,-ffast-math failed.
修改vl_compilenn.m文件,大概在183行左右,把代码
opts.defCudaArch = [... '-gencode=arch=compute_20,code=\"sm_20,compute_20\" '... '-gencode=arch=compute_30,code=\"sm_30,compute_30\"'];
中第2行注释掉,即:
opts.defCudaArch = [... %'-gencode=arch=compute_20,code=\"sm_20,compute_20\" '... '-gencode=arch=compute_30,code=\"sm_30,compute_30\"'];
问题8:MatConvNet1.25+Ubuntu18.04+CudaToolkit10.0+cuDNN7.5
错误使用 mex
'/home/pathto.../matconvnet-1.0-beta25_linux/matlab/mex/vl_nnconv.mexa64' 使用了 '-R2018a' 进行编译并与 '-R2017b'
链接在一起。 有关详细信息,请参阅 MEX 文件使用了一个 API 进行编译并与另一个 API 链接在一起。
解决办法:https://blog.csdn.net/u014292102/article/details/80331481
modify line 620 to:
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) ;
Then, I modified line 359 to be:
flags.mexlink = {'-lmwblas'};
2019.5.12
问题9:(ubuntu16.04+matlab2017b+cuda8+matconvnet1.25)
ubuntu18.04按照了cuda10的驱动之后,就出现登录界面死机的情况,按照网上介绍的几种方法都解决不了,之后重装ubuntu16.04
这个时候编译出现下面错误
错误使用 mex
/home/pathto.../matconvnet-1.0-beta25_linux/matlab/src/bits/impl/imread_libjpeg.cpp:22:21:
fatal error: jpeglib.h: 没有那个文件或目录
compilation terminated.
解决办法:matconvnet-1.0-beta25_linux/matlab/src/bits/impl/imread_libjpeg.cpp这个文件需要引用头文件,jpeglib.h,但是编译器找不到
首先搜索机器里是否有jpeglib.h以及libjpeg.so(没有这个libjpeg.so库,后面link的时候会报ld 找不到-ljpeg的错误)
如果找到,去修改vl_compilenn.m文件的flags.base和flags.mexlink参数
大概在333行左右加一句flags.base{end+1}= '-I"/pathto/anaconda3/include"' ;(我机器里面jpeglib.h和libjpeg.so都在anaconda3的目录下,这里的pathto是当前anaconda3的位置,
大概在360行左右把flags.mexlink改成flags.mexlink = {'-largeArrayDims','-lmwblas','-L"/pathto/anaconda3/lib"'} ;
按照上面方法虽然可以编译成功,但是跑程序做卷积等基本操作还是报错,提示缺少一大堆东西,还是编译出了问题。
首先按照https://blog.csdn.net/discoverer100/article/details/83500731操作,
1.gcc降级
首先查看系统中当前的gcc/g++版本,运行命令即可看到版本信息: gcc -v 如果版本不是4.9.x,那么需要安装gcc/g++ 4.9的版本,运行命令: sudo apt-get install gcc-4.9 g++-4.9 设置优先级。通常情况下,Ubuntu 16.04系统可能会内置更高的gcc/g++版本,这里需要将刚刚安装的4.9版本的gcc/g++设为最高优先级,运行下列命令(这里假定更高的版本号是5,实际操作时要结合真实的版本号): sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 100 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 50 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.9 100 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 50 修改完优先级后,验证一下: update-alternatives --query gcc update-alternatives --query g++
如果出现“没有可用的软件包 gcc-4.9,但是它被其它的软件包引用了。”的错误,如下操作: 1.使用如下命令修改源 sudo gedit /etc/apt/sources.list 2.在打开的文件中添加如下源(在最后面加上这两行即可) deb http://dk.archive.ubuntu.com/ubuntu/ xenial main deb http://dk.archive.ubuntu.com/ubuntu/ xenial universe 3.使用如下命令更新源 sudo apt update 4.使用命令安装g++4.9、gcc4.9sudo apt-
get
install gcc-4.9 g++-4.9
———————————————— 2019.10.10
2.安装libjpeg-turbo8-dev:
sudo apt-get install build-essential libjpeg-turbo8-dev
3.然后正常编译
vl_compilenn('enableGpu', true, ... 'cudaRoot', '/usr/local/cuda', ... 'cudaMethod', 'nvcc', ... 'enableCudnn', true, ... 'cudnnRoot', 'local/cudnnv6') ;
依然会报缺少libjpeg.h等头文件的错误,按照这个帖子http://blog.sina.com.cn/s/blog_7e3f6e8f0100veib.html去下载libjpeg库,里面有编译需要的一系列头文件(说明,这个头文件估计和版本有关,有的头文件编译还是出现错误,ijg官网下载的jpegsrc.v8c里面的头文件不会有问题不会有问题
- 1、到 libjpeg 的官网下载 libjpeg 的 Unix (同样适用于Linux)版的 jpegsrc.v8c.tar.gz 文件 网址:http://www.ijg.org/jpegsrc.v8c.tar.gz
- 2、解压后,从终端进入到 libjpeg 所在目录,用常规方法既可安装,命令如下: ./configure make make install #make test 最后一条命令make test是用来测试这个库是否安装成功的,执行这个命令后,你会看到 libjpeg 解压后所在目录下多了几张图片等,就是这个命令生成的。最后还可以用 make clean 来清理一些临时文件。
然后去修改vl_compilenn.m文件的flags.base参数。333行左右,加一句:
flags.base{end+1}='-I"/home/qian/下载/jpeg-8c"';
编译顺利通过,正常跑程序。
2019.5.15