Matconvnet安裝


  本文主要介紹Linux下Matconvnet的安裝注意事項。

  最近幫老師校驗一份超分的代碼,用到了matconvnet深度學習工具包。代碼里面使用的是Matconvnet-1.0-beta20版本, Matlab版本為2017。

在編譯過程中遇到了個坑,先記錄一下~

       先說一下大家下載這種工具包最好是去官網下載,起初我下載的是CSDN中有人分享的包,結果報錯了~~~提示說-ljpeg找不到,然而是按照官網裝好了libjpeg包的。

緊接着在后面運行程序時,就出bug了

        還在網上找了好多博客看,最后還是老老實實在官網重新下了Matconvnet-1.0-beta20的工具包。真是被自己蠢哭~

       Matconvnet工具包下載地址: http://www.vlfeat.org/matconvnet/download/ (根據需要選擇不同版本的工具包,我下載的是Matconvnet-1.0-beta20版本)

  首先,按照Matconvnet官網的安裝過程來。(http://www.vlfeat.org/matconvnet/install/)安裝需要的gcc,CUDA等

將下載的Matconvnet解壓到指定目錄。然后對其進行編譯,先進行CPU版本的編譯。在Matlab中打開Matconvnet工具包,使得當前目錄窗口顯示Matconvnet文件夾里面的子目錄。

然后在命令行輸入 

>>> mex -setup
>>> mex -setup C++
>>> addpath matlab
>>> vl_compilenn

由此完成CPU 下matconvnet的編譯。

        接着進行GPU下的編譯。

vl_compilenn('enableGpu', true, 'cudaRoot', '/usr/local/CUDA-8.0', 'cudaMethod', 'nvcc')

然后就報錯了~~~主要有以下兩個問題,主要參考 http://www.mamicode.com/info-detail-2225605.html 這篇博客中的解決方法得以解決。

  

  這個是因為cuda 8 之后不支持compute_20 了,最低也是compute_30了。 所以需要將vl_compilenn.m中的以下代碼進行修改

opts.defCudaArch = [...
‘-gencode=arch=compute_20,code=\"sm_20,compute_20\" ‘...
‘-gencode=arch=compute_30,code=\"sm_30,compute_30\"‘];

我用的是服務器Tesla k40m, 此處修改成

opts.defCudaArch = [...
‘-gencode=arch=compute_30,code=\"sm_30,compute_30\" ‘...
‘-gencode=arch=compute_50,code=\"sm_50,compute_50\"‘];

同時還需要將 matconvnet/matlab/src/config/mex_CUDA_glnxa64.xml 里對應的地方也進行修改 

NVCCFLAGS="-D_FORCE_INLINES -gencode=arch=compute_20,code=sm_20 -gencode=arch=compute_30,code=\"sm_30,compute_30\" $NVCC_FLAGS"

修改為:

NVCCFLAGS="-D_FORCE_INLINES -gencode=arch=compute_30,code=sm_30 -gencode=arch=compute_50,code=\"sm_50,compute_50\" $NVCC_FLAGS"

  這個的原因是CUDA6.0 后定義了atomicAdd 所以會出現重復定義的錯誤。 一共有兩個文件里存在這個重復定義的問題,分別在

  pooling_gpu.cu, line 163
  (commented out atomicadd)

  bilinearsampler_gpu.cu, line 25
  (commented out atomicadd)

       這個問題的解決方式是在這兩個文件里定義如下的宏

#if !defined(__CUDA_ARCH__) || __CUDA_ARCH__ >= 600
#else
<... place here your own pre-pascal atomicAdd definition ...>
#endif

將如上的定義復制到如上文件里的頭部, 將文件里定義的atomicadd function 剪切放在<... place here your own pre-pascal atomicAdd definition ...> 中。比如:

   另外 https://www.cnblogs.com/wangxiaocvpr/p/5385961.html 博客中第29點提到解決該問題的方法是Matconvnet版本較老,換一個較新版本。該方法試過,也是可行的。

        最后,對編譯好的Matconvnet進行測試。

>>> run matlab/vl_setupnn
>>> vl_testnn

以及測試GPU下的是否正確

>>> vl_testnn('gpu', true)

 

大功告成,編譯成功啦~


免責聲明!

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



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