代碼問題: 【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 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM