MatconvNet+VS2015+Matlab2018a+CUDA9+cudnn7:在matlab上搞深度學習,安裝環境時遇到的大坑!
事情發生的背景
作為剛入職的深度學習實習生,入職第一天,我領完電腦,剛裝完電腦,分配好公司的ip,連chrome都還沒來得及安裝,就接到任務,需要實現給定的論文的方法,當然啦,我師傅給了我原始碼、資料集和論文。
坑爹的是,這篇論文中用到的方法是在matlab上實現的,不是我用慣了的tensorflow+python...
雖說之前也用過matlab,但也僅僅一個月時間,還是很不熟悉的,而且對matlab有種莫名的懼怕,因為他給我一種高效但死板不靈活的感覺,再加上無法移植的硬傷,我以為深度學習應該不會去用它的呢,我聽到深度學習框架,基本也是tensorflow、caffee、torch、mxnet之類的,啥時候能排到matab呀~~
算了,既然接到任務肯定得硬著頭皮上的,要求我一週把環境裝好並把程式調通~~我暗暗沒底,因為裝環境調程式碼有時候得看運氣好不好~~
正式開搞
首先就是安裝matlab咯,我安裝的是matlab2018a,因為師傅說新一點的好~~
matlab2018的安裝和破解我苦不多說了,甩個連結:安裝matlab2018a
拿到原始碼和資料集,抓住Readme.md就是看!好,瞭解到第一個小任務了!需要安裝matconvnet!
matconvnet是在matlab上搞深度學習必要的工具箱,只要去網上下載下來就行,仍在某個角落也行,但是還是建議放在你安裝matlab的目錄下,方便使用。
天真的我以為這樣就完事兒了,就急急忙忙開啟matlab,啟動環境:
先要執行mex -setup,但是悲催地第一步就報錯了:
原因是電腦裡沒有編譯器,於是按照提示安裝了MinGW-w64編譯器:
安裝完成後執行mex -setup成功,指定C++編譯器:
然後就是把工作路徑切到matconvNet的路徑,編譯vl_compilenn,這時又報錯,提示找不到cl.exe
cl.exe是VS的程式,所以需要安裝VS,鑑於安裝了matlab2018,便安裝對應的VS2015,安裝VS2015是預設安裝,並配置了系統環境變數,但是還是沒能找到VS2015自帶的編譯器,通過網上查詢的兩個辦法(修改msvc90shellopts.stp檔案中的路徑和版本號、下載檔案,替換maxopts中的檔案)依然不能解決問題。後來找到一篇文章說是VS2015現在不自帶VC++編譯器,我心想這不太可能吧,畢竟VS就是用來寫C++程式的呀~後來我去VS想建立一個專案發現,新建專案都無法建立C++空專案,於是得出結論:我的VS2015確實沒有安裝C++編譯器,於是就重新開啟安裝程式,去手動安裝上了,最後去matlab一試,敲入vl_compilenn果然執行通過了~~
所以這也是血的教訓,大家要抓住事情的本質啊,matlab就是要配合VS才能搞深度學習的!~~該裝的軟體,沒法省~~
好了,現在搞定三項(matconvnet+matlab+VS)了,可以至少在cpu上跑程式碼了吧?
在改完程式碼中相關路徑之後,再執行自己的程式碼,報錯:
報錯:未定義變數 "dagnn" 或類 "dagnn.DagNN.loadobj"。
這是因為我們之前只是編譯了一下,但還沒有啟動matconvnet
還是在matconvnet 的路徑下,在命令列輸入vl_setupnn,啟動matconvnet
好了,接著調程式,我基本把該改的都改完了,總該可以跑了吧?
沒想到又報錯:
意思很清楚明白了,就是要用GPU來跑~~可是我一個剛來的實習生,怎麼可能直接給我一個又GPU的電腦嘛?
我調了半天,看看能不能調成在CPU上跑,嗯,我盡力了,不行,人家作者根本沒考慮過在CPU上跑~~
於是邊去申請公司GPU,終於給我分配了一個伺服器,需要我以遠端訪問的形式去用這個電腦~
於是我就得又重新安裝一遍開發環境
這臺電腦已經安裝了VS2017,所以我本著多一事不如少一事的思想,而且剛剛好我要裝的matlab版本是2018,比較新,版本肯定對的上,就沒有考慮安裝VS2015~~
那就動手吧!輕車熟路地安裝完matlab2018a、matconvnet、CUDA9.0和cudnn7.0之後,我信心滿滿地去檢驗環境。
但是,除錯MATLAB的GPU環境時報錯:
>> mexcuda mexGPUExample.cu
使用 'NVIDIA CUDA Compiler' 編譯。
錯誤使用 mex
mexGPUExample.cu
c:\program files\nvidia gpu computing toolkit\cuda\v9.0\include\crt/host_config.h(133): fatal error C1189: #error: --
unsupported Microsoft Visual Studio version! Only the versions 2012, 2013, 2015 and 2017 are supported!
出錯 mexcuda (line 157)
[varargout{1:nargout}] = mex(mexArguments{:});
原因是CUDA9.0僅支援到VS2017測試版
故需安裝VS2015,安裝完VS2015後編譯mexcuda mexGPUExample.cu成功!
但是還不是功成圓滿,接下來開啟GPU加速又出錯:
錯誤使用 mex
'F:\MATLAB\matconvnet\matlab\mex\vl_nnconv.mexw64' 使用了 '-R2018a' 進行編譯並與 '-R2017b' 連結在一起。 有關詳細資訊,請參閱 MEX 檔案
使用了一個 API 進行編譯並與另一個 API 連結在一起。
出錯 vl_compilenn>mex_link (line 627)
mex(args{:}) ;
出錯 vl_compilenn (line 500)
mex_link(opts, objs, flags.mex_dir, flags) ;
我就納悶了,我沒有裝matlab R2017b,哪來的這錯誤,還是度娘吧。
找了好久才找到能解決此問題的辦法:解決辦法點這裡
然後重新啟動GPU加速,又出現問題,問題接踵而至,我對照著網上的就解決辦法一個一個解決:
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\v9.0','cudaMethod','nvcc','enableCudnn',true,'cudnnRoot','.\local\cudnn-7.2.1'); % 這裡填寫你的cuDNN的路徑
否則會報Operands to the || and && operators must be convertible to logical scalar values的錯誤。
又成功部分,並報錯:
錯誤使用 copyfile
未找到匹配的檔案。
出錯 vl_compilenn (line 509)
copyfile(fullfile(opts.cudnnRoot, 'bin', '*.dll'), flags.mex_dir);
解決方案:
把CUDA和cudnn的路徑寫成絕對路徑
所以最終版啟用GPU加速的命令為:
vl_compilenn('enableGpu', true,'cudaRoot', 'C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0','cudaMethod','nvcc','enableCudnn',true,'cudnnRoot','F:\MATLAB\matconvnet\local\cudnn-7.2.1');
終於大功告成了!
歡迎關注“pyhon修煉之道”,我們將持續更新新鮮python文章~