問題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-getinstall 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
