代码问题: 【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.9
sudo 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 

posted on 2017-11-18 16:21  博闻强记2010  阅读(6517)  评论(2编辑  收藏  举报

导航