ubantu16.04+mxnet +opencv+cuda8.0 環境搭建#
建議:環境搭建完成之后,不要更新系統(內核)
轉載請注明出處: 微微蘇荷
一 我的安裝環境
系統:ubuntu16.04
顯卡:gt940m
python: 2.7.12
GCC:5.3.0 (ubuntu 默認是5.4, 關於降級,后邊有敘述)
二 安裝步驟##
(一) gcc降級 (可選/安裝opencv2.4.13則必選)###
根據需要,opencv安裝時提示,gcc 不支持5.3以上版本,所以降級。
方法1:5.4 =》5.3 (不太建議)####
1.下載GCC源碼:####
wget ftp://mirrors.kernel.org/gnu/gcc/gcc-5.3.0/gcc-5.3.0.tar.gz
2.解壓:####
tar -zxvf gcc-5.3.0.tar.gz
3.下載編譯所需依賴項:####
cd gcc-5.3.0 //進入解包后的gcc文件夾
./contrib/download_prerequisites //下載依賴項
cd .. //返回上層目錄
4.建立編譯輸出目錄:####
mkdir gcc-build-5.3.0
5.進入輸出目錄,執行以下命令,並生成makefile文件:
cd gcc-build-5.3.0
../gcc-5.3.0/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
6.編譯:
make -j4
接下來就是等待了,整個過程大約40分鍾左右。PS:最好不要在編譯過程中再去做別的什么事,整個過程CPU都是滿載的,要是莫名終止了,后面麻煩事也不少。
7.安裝:
編譯結束以后,我們就可以執行安裝了:
make install
8.檢查版本:
gcc --version
g++ --version
降級結束
方法2:gcc 4和gcc 5共存(推薦)###
1.安裝gcc g++ 4.8####
sudo apt-get install gcc-4.8 gcc-4.8-multilib g++-4.8 g++-4.8-multilib
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 60
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 60
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 50
2. 切換gcc g++版本####
sudo update-alternatives --config gcc
sudo update-alternatives --config g++
(二)安裝cuda 8.0rc####
1.從nviDIA官網下載安裝包####
2.切換到 安裝包目錄,執行以下命令:####
sudo dpkg -i cuda-repo-ubuntu1604-8-0-rc_8.0.27-1_amd64.deb
sudo apt-get update
sudo apt-get install -y cuda
3.cuda的環境設置:####
新建cuda.conf
sudo gedit /etc/ld.so.conf.d/cuda.conf
並編輯,添加內容:
/usr/local/cuda/lib64
/lib
然后執行鏈接命令:
sudo ldconfig -v
然后設置環境變量:
export PATH=/usr/local/cuda/bin:$PATH$
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH$
將這兩行添加到~/.bashrc
4.編譯運行cuda例子####
cd /usr/local/cuda/samples
sudo make all -j4
cd /usr/local/cuda/samples/bin/x86_64/linux/release
sudo ./deviceQuery
運行成功,最后一行顯示信息是 :
Result = PASS
這表示安裝成功。
5. 關於異常情況:####
一) ubutn14.04+cuda7.5 安裝時,本機遇到了重啟黑屏現象,主要是驅動問題。解決方法是如下:#####
(方法1,在我嘗試種沒什么卵用,但有人成功了,真不幸遇到了,可以嘗試一下)
(1)ctrl+alt+f1 進入命令行
(2)停掉lightdm 安裝gdm
sudo stop lightdm
sudo apt-get install gdm
然后做一些清理工作:
sudo rm -rf .gconf
sudo rm -rf .gconfd
sudo rm -rf ~/.Xauthority
重啟:
sudo shutdown -r now
如果還是不行,可以做接下來一步:
sudo apt-get update
sudo apt-get install nvidia-current-updates
sudo nvidia-xconfing
sudo reboot
另一種解決方案是,下載安裝最新驅動(不黑屏的支持cuda的閉源驅動),然后安裝cuda的run包,選擇不安裝顯卡驅動即可。
安裝顯卡驅動:
sudo apt-get update
sudo apt-get install nvidia-367
sudo apt-get install mesa-common-dev
sudo apt-get install freeglut3-dev
安裝cuda:
進入命令行界面
Ctrl+Alt+F1
關閉界面顯示
sudo service lightdm
chmod +x <cuda安裝包名字>.run (給予權限)
sudo ./ <cuda安裝包名字>.run (安裝)
注意:在選擇是否安裝選擇顯卡驅動時選擇否。
然后關於環境變量設置,跟deb 安裝方法中環境變量設置方法一致
二)mxnet 運行找不到cuda庫:#####
ImportError: libcudart.so.7.5: cannot open shared object file: No such file
這是因為沒有把CUDA的動態鏈接庫加入PATH里,解決方法是,可以在./bashrc里面加入:
export LD_LIBRARY_PATH=/usr/local/cuda/targets/x86_64-linux/lib/:$LD_LIBRARY_PATH
或者是在編譯MXnet的時候,在config.mk里的
ADD_LDFLAGS = -I/usr/local/cuda/targets/x86_64-linux/lib/
ADD_CFLAGS =-I/usr/local/cuda/targets/x86_64-linux/lib/
如果,在編譯例子中有找不到×××.so 或某命令找不到,可以到/usr下搜索文件,添加文件路徑到環境變量
注:關於黑屏和***.so找不到的情況只在14.04+cuda7.5時遇到過,16.04+cuda8.0沒有遇到。
(三)安裝cudnn###
本文安裝的是cudnn-8.0-linux-x64-v5.0-ga,請下載和你顯卡匹配的版本
1.去nvidia官網下載合適的cudnn安裝包,解壓####
注:cudnn-8.0-linux-x64-v5.0-ga下載下來后綴名是.solitairetheme8,在ubuntu默認環境不能直接打開,我選擇的是在window上解壓。
2.安裝:拷貝庫和頭文件####
切換到cudnn安裝包文件夾下cuda/lib 目錄下,執行:
sudo cp lib* /usr/local/cuda/lib64/
再切換到cudnn安裝包文件夾下cuda/include 目錄下:執行:
sudo cp cudnn.h /usr/local/cuda/include/
3.更改文件權限,重新建立軟連接####
cd /usr/local/cuda/lib64/
sudo chmod u=rwx,g=rx,o=rx libcudnn.so.5.0.5
sudo rm -rf libcudnn.so.5 libcudnn.so
sudo ln -s libcudnn.so.5.0.5 libcudnn.so.5
sudo ln -s libcudnn.so.5 libcudnn.so
(四)安裝opencv###
本文安裝的是opencv2.4.13
注意,gcc版本不能超過5.3,否則請降級gcc(opencv3.10則不需要)
1.安裝依賴####
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg62-dev cmake libswscale-dev libjasper-dev
2.去opencv官網下載源碼,解壓進入源碼文件夾。執行:####
// 下列命令 opencv2.4和opencv3.10通用,cmake 時關閉了一些mxnet不需要的部分
mkdir build
cd build
cmake -D BUILD_opencv_gpu=OFF -D WITH_CUDA=OFF -D WITH_1394=OFF -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -DINSTALL_CREATE_DISTRIB=OFF ..
make -j4
sudo make install
然后,把3rdparty/ippicv/unpack/ippicv_lnx/lib/intel64(不是build/3rdparty)目錄下的libippicv.a 拷貝到 /usr/local/lib目錄下
3.環境配置####
sudo gedit /etc/ld.so.conf.d/opencv.conf
在末尾加上:
/usr/local/lib
然后執行:
sudo ldconfig
打開/etc/bash.bashrc,加入:
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
(五)安裝mxnet###
1.安裝依賴####
sudo apt-get update
sudo apt-get install -y build-essential git libatlas-base-dev libopencv-dev
2.下載mxnet####
git clone --recursive https://github.com/dmlc/mxnet
3.配置和編譯####
cd mxnet //如果需要編譯指定版本,請先 checkout
sudo cp make/config.mk
修改config.mk文件中的設置來自定義build:
USE_CUDA = 1
USE_CUDA_PATH = /usr/local/cuda
USE_CUDNN =1
(可選 :選擇安裝atlas或者openblas等其他BLAS的實現,需要額外的修改。如果ubuntu的atlas實現(sudo apt-get install libatlas-base-dev或者sudo apt-get install libopenblas-dev))
然后編譯
make -j4
4.安裝Python支持####
sudo apt-get install python-setuptools python-numpy
cd python
sudo python setup.py install
建議使用python 2.7版本
/////////////////////////////////////////////////////////////////
沒有找到cblas庫問題:
解決方法:如果已經安裝了openblas, 就從openblas中把cblas.h復制到/usr/include/中。
ps:我還遇到過另外一個問題,是因為沒有安裝cblas庫。下載編譯cblas, 然后 把 libcblas.so copy到/usr/lib目錄下就行了
(六)運行mnist手寫識別例子###
注:有可能會遇到下載數據失敗的情況,可將提前下載好的mnist數據放在例子運行目錄下邊
運行一下命令:
cd mxnet/example/image-classification
python train_minst.py
默認是使用cpu,使用GPU使用下邊命令:
python train_mnist.py --network lenet --gpus 0
(七)制作自己的數據集( im2rec工具的使用)###
先使用im2rec 制作出lst文件(保存圖片和標簽信息的文本的名字)
再使用im2rec 制作出rec文件 (mxnet可使用)
imrec 參數如下:
通用選項:
prefix :LST或REC文件的前綴
root :包含圖片文件的文件夾路徑
用於創建lst數據的選項
--list:true制作lst,false 制作rec數據 ,默認false
--exts:可接受的圖像后綴列表,type=list(可輸入多個類型) 比如可輸入:.jpeg
--chunks:計算塊的大小 ,int 默認 1
--train-ratio:圖像用於訓練的比例
--test-ratio:圖像用於測試的比例 (注:train和test比例之和不為1時,剩余比例為val)
--recursive:如果為true遞歸穿行子目錄並為其分配一個唯一的標簽
用於創建數據庫(rec)的選項:
--resize:調整圖片到指定大小,默認0不調整
--center-crop:是否指定裁剪中心,把圖片裁剪為矩形
--quality:圖片質量 ,JPEG質量編碼,1-100;或PNG壓縮編碼,1-9
--num-thread:使用制作數據編碼時的線程數,線程數大於1,可能會導致數據集的順序不一樣(多線程並行)
--color:指定加載的圖像的彩色模式。
1:加載彩色圖像。圖像的任何透明度將被忽略。默認為1。
0:灰度模式加載圖像。
-1:加載圖像,例如包括Alpha通道
--encoding:指定圖像的編碼 type=str, 默認.jpg
--shuffle:如果設置為true,im2rec將在制作lst數據時,隨機圖像順序
--pack-label:是否為多維標簽
根據需要選擇參數即可。
注意:我在2016-08-29 clone的mxnet im2rec.py (0.7版也有)有兩處bug:
opencv 圖片大小變換錯誤,第93h行 和96行(兩者交換) :
# newsize = (args.resize, img.shape[0] * args.resize / img.shape[1])
newsize = (img.shape[1] * args.resize / img.shape[0], args.resize)
else:
# newsize = (img.shape[1] * args.resize / img.shape[0], args.resize)
newsize = (args.resize, img.shape[0] * args.resize / img.shape[1])
命令行參數解析,第156行修改可用:
# cgroup.add_argument('--exts', type=list, default=['.jpeg', '.jpg'],
cgroup.add_argument('--exts', type=str, nargs='+', default=['.jpeg', '.jpg'],
舉例:
數據放在了目錄:/home/ecarx/English/Hnd/Img
制作list 命令:
python im2rec.py 0829 ~/English/Hnd/Img/ --list=true --exts=.png --chunks=1 --train-ratio=0.6 --test-ratio=0.4 –recursive=true
制作rec 命令(lst文件在當前目錄):
python im2rec.py 0829 ~/English/Hnd/Img/ --resize=28 --encoding=.png
制作完數據集,可根據 train_imagenet.py 寫數據迭代器,進行訓練
注:mxnet v0.7 制作是先執行 make_lst.py,再進入 mxnet/bin 下執行 使用 im2rec(C++) 和之后新版稍有不同
(八)mxnet優缺點分析###
優點:
1.ndarray編程接口,類似matlab/numpy.ndarray/torch.tensor。獨有優勢在於通過背后的engine可以在性能上和內存使用上更優,(聲明式)
2.symbolic接口。這個可以使得快速構建一個神經網絡,和自動求導。(命令式)
3.更多binding 目前支持比較好的是python,也支持julia和R
4.更加方便的多卡和多機運行
5.性能上更優。目前mxnet比cxxnet快40%,而且gpu內存使用少了一半。
6.依賴很少,通過mshadow的模板化使得gpu和cpu代碼只用寫一份,分布式接口也很干凈
7.移動端支持較好,已經推出了手機上圖片識別的demo
8.社區活躍,提Issuse 回復很快
缺點:
1.文檔少,外界相關資料也較少,大部分只能代碼當文檔快(現在補齊)
2.沒有大公司力推(亞馬遜,已經支持mxnet 11.26)
可參考文檔:
http://www.cnblogs.com/zhizhan/p/5118185.html
http://blog.csdn.net/myarrow/article/details/52064608
http://chenrudan.github.io/blog/2015/11/18/comparethreeopenlib.html#0-tsina-1-2654-397232819ff9a47a7b7e80a40613cfe1?utm_source=tuicool&utm_medium=referral
http://f.dataguru.cn/thread-679134-1-1.html