Ubuntu 15.04 + CUDA7.5 + Caffe 配置筆記
一、Ubuntu 安裝
安裝Ubuntu 15.04x64 + Win7x64 雙系統,讓二者在啟動引導上互相隔離, 删除Ubuntu時不至Win7躺槍,就必須講究安裝方法。
最easy的就是使用EasyBCD安裝。這可以将Ubuntu的啟動引導(Grub2)安裝在其自己的boot分區,而Win7的啟動引導則安裝在C槽或其保留分區,互相隔離,不存在用Ubuntu引導Win7啟動的問題,重裝和解除安裝互不影響。這個政策非常幹淨。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
那麼,問題來了,如果你主機闆比較新,使用的是 "UFEI啟動 + GPT磁盤" 這個組合,那麼使用EasyBCD就有問題,如下所述.
問題始于,萬惡的windows推出一個稱之為UFEI的東東,美其名曰:大一統安全啟動引導接口!!此接口位于主機闆和系統之間,用于啟動時進行軟硬體對接,即在主機闆上加載系統核心,以及向系統核心注冊硬體。電腦一啟動,作業系統必須向主機闆出示一個安全密鑰,主機闆才會加載這個系統,可用于杜絕boot病毒,從Win8開始這個标準開始執行。。。 然就坑了Ubuntu等一大批Linux系統,因為這些系統必須向MS購買密鑰。。。但是!!為了防止被訴壟斷,微軟要求所有主機闆廠商必須在提供UFEI的同時,以這樣或那樣的方式提供傳統的BISO啟動。。。微軟關上了一扇門,上帝打開了一扇窗 .,美帝的反壟斷大法果然強。。。
是以,新型的主機闆上一般都能找到禁止UFEI,以及打開BIOS的辦法,各家主機闆不一樣。
啟動方式: UFEI or Legacy BIOS
不用UFEI的原因是,EasyBCD 2.3 目前還無法在ufei中注入Ubuntu的grub2啟動,是以在UFEI引導下安裝的Win7,當安裝完EasyBCD後,軟體會提示:注意到你正在使用ufei,EasyBCD的許多特性都無法使用!而屏蔽ufei,在BIOS下重裝win7之後,EasyBCD一切正常。這樣後面安裝ubuntu時,EasyBCD才能在其boot分區上注入grub2啟動引導程式。
....不用UFEI的另一個好處時,不會在Win7的保留分區内額外生成一個ufei檔案夾,進而可以用DsikGenius為win7的這個保留分區配置設定盤符使其可見,激活win7就十分Easy了....
....若非要用ufei就要用其他方式解決雙系統隔離的問題,但百度之後發現都比較繁瑣 。
關掉UFEI的辦法看主機闆什麼類型,我的華碩Z170-AR/-P,進入進階設定,啟動頁面,打開CMOS選項設定為僅Legacy,打開安全選項設定作業系統為others。
....重新開機,插啟動U盤,啟動選項裡面徹底不見了UFEI字樣,,說明UFEI被成功屏蔽!!
....裝完Win7之後,用DiskGnius檢視隐藏分區,其中無ufei檔案夾,隻有boot檔案夾,OK!
分區表類型: GPT or MBR
....GPT可以管理大于1.8T以上的磁盤,MBR不行,是以單盤超限的另尋解決辦法。
用Win7CD光牒在裸機上裝完系統之後,啟動方式+分區表 被預設處理為 UFEI+GPT 這樣的組合。可以用Diskgnis檢視Win7隐藏分區,隐藏分區中有個ufei檔案夾,然後點各個磁盤檢視資訊,分區表類型都為GPT,這說明是UFEI+GPT的組合。
....進入按上步用BIOS安裝的Win7之後,打開DiskGnius可轉換各GPT盤為MBR盤。但注意:不能直接轉換系統所在的C槽,因為會導緻系統引導丢失,還有可能整壞硬碟。解決辦法是“騰籠換鳥”,在另一個已經轉換為MBR的空閑盤上用硬碟安裝的方式先安裝一個Win7上去,然後重新開機進入這個新系統;再用DISK轉換原來的系統C槽為MBR,再用硬碟安裝方法在C槽裝上Win7,裝完之後進入C槽Win7,删掉掉剛才空閑盤的那個臨時Win7即可。。。
....好消息是:在非系統盤上用DISK轉換GPT為MBR時,不會格式化磁盤,是以資料仍然在
....之是以要轉換成MBR是因為裝Ubuntu出問題,啥問題忘了,不轉換應該也有解決辦法。。
OK! 這樣就得到了 BIOS啟動 + MBR磁盤 + Win7×64系統 的經典組合!!可以開始安裝 Ubuntu了。。。。。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
下載下傳Ubuntu 15.04 64位
下載下傳UltraISO制作啟動U盤
在Win7某盤下壓縮出 300G~500G 空間,不建立分區、使其空閑
重新開機進入BIOS,選擇U盤啟動
開始安裝》》。。。
分區:/ 90G~120G , /boot 200M~400M , swap 記憶體大小左右 ,/home 剩餘
分區順序按此方式、且全部設定為邏輯分區,其他方式也可但發現容易出問題........
注意::分區完成之後,安裝開始之前,切記要在下方的啟動器安裝選項(boot installer)上,手動選擇,将啟動器安裝到你的上述boot分區中,否則預設的話就是用ubuntu引導win7了
....另外::若需重裝ubuntu的時候,要進入Win7重新删除四個分區,格式化該盤,使其空閑。進入安裝界面後,還要改變上述分區的相對大小,不然ubuntu會一直卡在creating ext4 ... 安裝不下去。
....另外::若上述辦法還是繼續卡在creating ext4上,則在Win7下重新格式化該區,并預先分好4個區的大小,進入Ubuntu安裝界面後,将四個對應分區挂載上去即可,可順利安裝......
....另外::重裝Ubuntu之後,進入Win7,用EasyBCD删掉上次的grub2啟動,重建立一個即可
....但是::這樣還是有可能會碰到安裝進度條卡在 creating etx4...這裡,百度了好久沒找到辦法,我在這都卡瘋了。看到的有解決辦法,還請留言分享下啊*&……*&*&
最好選擇英文安裝,友善安裝caffe相關軟體時路徑全英文,進入之後再安裝中文包和fcitx中文輸入法....
最好斷開網絡安裝,否則會下載下傳語言包和更新/.///
等待安裝完成,系統提示:重新開機電腦
重新開機之後會直接進入Win7,這時打開EasyBCD,在剛才的boot目錄上添加linux的gub2啟動。
OK !!
重新開機之後,界面出現系統選擇 ......... 進入ubuntu ..................
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
進入系統之後,
打開終端,右擊桌面,
設定root使用者密碼,sudo passward
修改apt-get源為阿裡雲,sudo gedit /etc/apt/sources.list
遇到自動推送的系統更新,不要同意,也不要不同意,直接x掉!
語言設定中安裝中文包,自帶fcitx拼音輸入法
注意不要用中文替換原英文檔案夾,
開始caffe安裝 。。。
二、CUDA 安裝
CUDA 安裝會出各種奇妙問題,顯示卡、系統各不一樣,是以雖然問題的表現形式一樣,但解決辦法可能不一樣,因為驅動跟硬體緊密相關,在軟體層面很難統一解決,是以多百度幾種方法試吧。。。 CUDA的官方安裝文檔,小白的一大原罪就是不喜官方資料,想偷懶結果還繞了個大彎……*&*%!!!
2.1 關閉xWindow,開啟tty1
安裝cuda的同時會安裝顯示卡驅動,是以要進入ubuntu的純字元界面才行 。 方法是 ctrl + alt + F1 進入tty1,登入, 輸入init 3,進入純字元界面。 可以按ctrl+alt+F7驗證,無法傳回xWindow了,說明關閉成功。 再次 ctrl + alt + F1 傳回tty1。 輸入startx , 會再次恢複啟動xWinow。 ctrl+atl +f7 即可進入。 如果 init 3 & startx 不行,可以用 sudo service lightdm start/stop 指令。 如果中間哪一步卡住了,強制重新開機,再試一次,仍然不行說明有問題。 注意,關閉xWindow後,切換到xWin時應該隻顯示一行219的版本号,沒有[ok]start lightdm maneger之類的。 否則,後續安裝會有錯誤。 —————————————————————— 如果上面這個操作,完全沒問題,OK,可以開始CUDA安裝了 —————————————————————— 但我這遇到問題: 安裝cuda前,進入tty1黑屏,傳回xWindow正常. 。。。 安裝cuda後,登陸xWindow異常,進入tty1正常 。 。。 安裝cuda中,爆出“ Error: can't xxx kernel xxx ”。。。 方法一:網上有用sudo stop lightdm關閉xWindow的,但是需要自己生成和修改xorg檔案,ubuntu15.04安裝完預設是沒有這玩意的。參考好多部落格後,沒弄成,非常不适合linux新手。 方法二:還有用stop gdm的,gdm是相對于lightdm的另一套xWindow,現在不流行了,是以預設沒安裝上,需要自己 apt-get install gdm,然後從lightdm切換到gdm。在gdm下可用sudo gdm stop, 來關閉xWIndow。這個的好處是不用修改xorg檔案。但這個也有點問題,忘了。 方法三:浪費一天google來的,非常簡單,原文中這個辦法用來解決“裝完nvidia驅動,重新開機後卡在登陸界面,無法進入xWindow”這個問題的。在我這是被用來解決“裝nvidia驅動或cuda前,進入tty1黑屏”這個問題。 方法流程如下:
cd /etc/default
sudo cp grub grub.bk #備份
sudo gedit grub
GRUB_CMDLINE_LINUX="nomodeset" #修改
sudo update-grub #更新grub
sudo reboot #重新開機
重新開機之後,發現桌面分辨率掉到渣,說明奏效了。。 先登陸 xWindow, 嘗試切換到 tty1,果然成功刷出登陸提示,tty1黑屏的問題解決! 可以驗證下, xWindow 和 tty1 是否可毫無障礙的 反複自由 切換。。。驗證OK! 接下來就可關閉xWindow,隻使用tty1了。 登陸tty1→輸入 init 3 /或者 sudo service lightdm stop→xWindow被關閉,→可能會卡屏,ctr+alt+f1 就可以了。。 可以驗證下, ctr+alt+f7 打開xWindow 失效,顯示且隻顯示一個版本号 。。。驗證OK! 可以安裝cuda了 !!!
方法四: 本文是單顯示卡titanx,按方法三第一天裝完cuda正常,裝opencv時出問題,是以第二天重裝按方法三再整,結果出了新問題 。安裝完cuda後,無法正常登陸xWindow,隻能進入tty1。 重新整了好多次無果! 最後在cuda的官方安裝教程中,發現方法四~~~終于成功~~~ 操作如下: #打開終端
lsmod | grep nouveau #驗證 有輸出說明noveau驅動正常
cd /etc/modprobe.d
sudo gedit balcklist-nouveau #寫入以下2句儲存
blacklist nouveau
options nouveau modset=0
sudo update-initramfs -u #更新init
sudo reboot #重新開機,發現分辨率掉渣
lsmod | grep nouveau #驗證,無輸出說明屏蔽noveau成功
此時再次嘗試,進入tty1,無黑屏bug。再傳回xWindow,也無障礙。
在tty1下,sudo service lightdm stop. → xWindow被關閉!
可以驗證,ctr+alt+f7傳回xWindow時,隻顯示一版本号。
在tty1下, sudo service lightdm start. → 打開xWindow成功!
可以驗證,ctrl+alt+f7成功傳回xWindow.
再重新開機後,仍可循環切換,完美關閉或打開xWindow。
說明終于完美實作了 字元終端和圖形終端的切換。
開始安裝cuda~~~~~~~
方法五:本文另一桌上型電腦,GTX970單顯示卡,按照上述方法三和方法四安裝cuda,安裝之前能正常切換tty1和xWindow。 但是,安裝之後,竟然就進不去xWindow了,一直卡在登陸界面,輸入密碼死循環!!而在安裝過程中曾爆出一個“ Error: can't return kernel xxx” ,據查,這個是安裝驅動的時候需要linux 核心參與編譯。在tty1下驗證顯示卡驅動是否存在,ls /proc/drivers/nvidia, 無任何輸出,說明顯示卡驅動确實沒寫進去。 最後的解決辦法如下:
1.完全重裝ubuntu15.04
2.未降級gcc/g++-4.9到gcc/g++-4.7
(這個是導緻産生kernel錯誤的原因。)
3.未更換阿裡源,使用系統自帶的apt源。
(這個估計更換後無影響,因為我後面安裝opencv時為加快速度,還是換成阿裡源了)
(cuda安裝過程中會自動驗證kernel的版本資訊,阿裡源隻是原生源的鏡像,差異有一點點,但kernel-header應該是一緻的,另一台titanx的就在阿裡源下安裝的cuda).
4.彈出系統更新提示時,不要接受,也不要拒絕,直接x掉。
據我推斷,接受更新肯定會修改核心,但拒絕更新坑能也會!!。 (最有可能是這個原因)
5.官方安裝指導的 pre-installation中,需要驗證系統類型x86_64,以及更新kernel-header,這些都沒做。
因為ubuntu15.04_x86_64安裝完,預設是最新的kernel-header.
6.按方法三,修改GRUB_CMDLINE_LINUX="nomodeset",并sudo update-grub,再重新開機!
7.分辨率掉渣,進入tty1, sudo service lightdm stop 關閉xWindow.
注意驗證下,傳回xWindow時,顯示且僅顯示一行219版本号,說明才是徹底關閉了。
8.開始安裝cuda。
終于進入油意義的第一步!! ----------------------
2.2 安裝cuda 7.5
預先下載下傳并拷貝cuda7.5_linux_64_.deb安裝包到home下。 關于是否要先獨立安裝nvidia驅動的問題,本人嘗試幾次重裝都失敗了,無法打開核心什麼的。。 是以直接cuda走起,安裝cuda的時候會自動安裝驅動。。。 安裝過程中要編譯,是以先對gcc和g++進行降級,至-4.7版本。 後面安裝各種包都要用到gcc, 是以一開始降級可讓全部軟體包的安裝都比較一緻。降級方法參見歐新宇。
進入tty1,關閉xWindow,開始安裝
cd ~
sudo dpkg -i install cuda---x-x-x.deb
sudo apt-get update
sudo apt-get install -y cuda
等待安裝完成 》》》》 注意:安裝的過程中,可能會刷出ERROR,解除安裝掉或重裝來過...... 重新開機:sudo reboot!
配置cuda bin & lib 目錄
cd /etc
sudo gedit profile #寫入以下2句儲存
PATH=/usr/local/cuda/bin:$PATH
export PATH
source /etc/profile #立即生效
cd /etc/ld.so.conf.d
ls
sudo cp xxx.conf cuda.conf #xxx替換成ls出的随便哪個檔案
sudo gedit cuda.conf #編輯
/usr/local/cuda/lib64 #寫入并儲存
sudo ldconfig -v #立即生效
nvcc --version #驗證
注意:此處可先重新開機電腦,不重新開機就要在這個終端内繼續,不更換新的終端視窗。 因為上面的立即生效是針對目前終端這個shell的,不是整個系統,隻有重新開機才能應用到整個系統。 可以驗證,在不重新開機時,另開一終端,nvcc --version 是無輸出的。
2.3 安裝cuda sample
cd /usr/local/cuda/samples
sudo make all -j8 #編譯
cd ./bin/x86_64/linux/release #驗證
./deviceQuery #刷出顯示卡資訊 則成功
2.4 安裝cudnn-v4
由于是cuda7.5 是以安裝 cudnn-v4.0比較好 下載下傳 cudnn-7.0-linux-x64-v4.0-prod.tgz 放到home下
tar zxvf cudnn-7.0-linux-x86-v4.0-prod.taz
sudo cp include/cudnn.h /usr/local/include
sudo cp lib64/libcudnn.* /usr/local/lib
sudo ln -sf /usr/local/lib/libcudnn.so.7.0.64 /usr/local/lib/libcudnn.so.7.0 #建立連結
sudo ln -sf /usr/local/lib/libcudnn.so.7.0 /usr/local/lib/libcudnn.so
sudo ldconfig -v
重新開機 .......
三、Matlab 安裝
Matlab安裝簡單,參見歐新宇。
注意拷貝matlab至home檔案夾時,使用歐的挂在方法,sudo cp 之後,安裝時出現權限不足,且無法更改?
網上找的連結: http://pan.baidu.com/s/1c0jaEek 密碼: cjvg
安裝完成之後,Home下的Matlab檔案夾即可删除。
四、BLAS 安裝
BLAS可選MKL和altas,安裝簡單。 mkl-2016下載下傳和安裝參見歐新宇。 注意mkl隻能安裝一次!! 如果沒有mkl,就安裝預設的 altas ! 本文前後2台電腦,分别安裝了mkl 和 altas,都OK!. 後面都以安裝altas的電腦為例:
sudo apt-get install libatlas-base-dev
五、OpenCV安裝
OpenCV大部分使用 Install_OpenCV_Master這個方法,但這個安裝過程比較混亂,可以打開安裝腳本看看, 各種依賴包裝了卸、卸了裝,反反複複好幾次,而且裝完之後與ffmpeg這個包有關的地方全部報錯,導緻OpenCV安裝不完整,後面的caffe編譯也出錯!! 坑了2天終于找到了救星>>>>> xuezhisdc. 在Home下建立檔案夾OpenCV,再于其中建立5個sh文檔, 拷貝救星給出的各個shell到這幾個文檔中儲存。 安裝過程中把OpenCV拷貝到 /usr/local目錄下,(與cuda和matlab看齊,好看好管理×××),, 本文是cuda7.5,是以使用比較新的 opencv3.0與之搭配,不容易出莫名奇妙的bug,3.0的shell可仿照2.4.11那個改一下×××× 依次運作 1 2 3 4 5 五個shell ........直到安裝完成,且無bug報錯! 注意:安裝過程全程聯網,而且網速不能太慢,否則下載下傳的包會有損失。 本文安裝過程中,下載下傳的 3rdparty中的ICV元件始終報錯!! MD5不比對!! 最後打開腳本檔案找到下載下傳位址,手動下載下傳ICV後放到對應目錄下。。。終于通過!! 出錯後,可以重新來過,會覆寫掉前次的,我安裝了好幾次~~ 腳本安裝和編譯的好處就在于,碰到問題立馬停止,能精準定位錯誤源~~~~~ 是以出錯之後,可研究下 Error Information ~~~~~~~
六、Python安裝
安裝Pyhton主要是為caffe的pycaffe接口提供一個python環境。
Python被其他軟體廣泛依賴,在安裝這些軟體的時候可能已經安裝過了,而且同一個包的版本還不太一緻。 ---------------這導緻非常混亂----------比如,: 安裝前面 opencv的時候就需要 numpy 和 scipy,在那裡已經安裝過了! 但安裝此處的Python環境的時候,會再被安裝一次! 然後面安裝caffe的時候,還會被再安裝一次! 好多cafee安裝教程上都是裝了又裝,不知道多少次。。 --------------------------------------------- 但幸好,Ubuntu 的 apt-get 能夠自動管理各種版本,以及依賴關系,方法是檢查版本号,若最新則跳過!! “xxx is already the newest version” 但盡管如此,caffe官方還是裂牆推薦 :Python包管理神器----> Anaconda !!! 本文在2台電腦上試了下2種方案都可通過。。
6.1 Anaconda 方案
下載下傳 Anaconda2-4.1.0-Linux-x86_64.sh Anaconda很多博文都安裝在/Home/usrname目錄下,這樣吧/目錄的空間都浪費了,是以本文安裝到/usr/local 這與 Matlab / CUDA / OpenCV 保持風格一緻,比較賞心悅目。。 用Chrome下載下傳Ananconda,放到/home下,開始安裝。
python --version #驗證下原生python版本
md5sum Anaconda2-4.1.0-Linux-x86_64.sh #驗證md5
sudo bash Anaconda2-4.1.0-Linux-x86_64.sh #安裝
安裝中間,會提示是否安裝在/home/xx/ananconda2目錄下,或于下方輸入自定義路徑,輸入:/usr/local/Anaconda 安裝末尾,會提示是否在 /home/xx/.bashrc 中建立bin目錄,yes!
安裝之後,開始配置Anacoda的路徑。
在全局變量中配置其lib&bin路徑!
sudo gedit /etc/profile
export PATH=/usr/local/anaconda2/bin:$PATH" #寫入并儲存
source /etc/profile #立即生效
sudo gedit /etc/ld.so.conf
/usr/local/anaconda2/lib #追加一行,寫入此路徑,并儲存
sudo ldconfig -v #立即生效
cd ~ #xx使用者目錄
sudo gedit .bashrc #找到anconda寫在此檔案最後的路徑,并拷貝。
sudo su #擷取root權限
cd ~ #root使用者目錄
sudo gedit .bashrc #将剛才拷貝的路徑,添加到最後儲存
conda --version # 驗證
conda list # 列出 conda安裝的所有Python包
python --version # conda-python 生效 ,原生的Python被屏蔽
重新開機,使路徑完全生效....
6.2 原生Python方案
也可使用原生Python方案,再繼續往Unbuntu的python中添加三方包就可以,如下
sudo apt-get install -y python-numpy python-scipy python-matplotlib python-sklearn python-skimage python-h5py python-protobuf python-leveldb python-networkx python-nose python-pandas python-gflags cython ipython
安裝過程中,大部分都會提示 “scuceessfly installing xxx....”,
python-pandas 貌似有個小錯,沒管了。。。直接繼續後面,貌似不影響!
七、安裝google-glog
這個簡單,參見歐新宇
八、安裝 其他依賴項
這裡主要是caffe用到的9個小軟體: protobuf leveldb lmdb snappy opencv boost hdf5 gflag google-glog 好多博文在最最開始就安裝這些小軟體,流程比較混亂,建議放在大塊頭後面安裝,流程比較清晰。
sudo apt-get install -y build-essential # basic requirement
sudo apt-get install -y libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler #caffe requirment
九、Caffe 安裝 & 編譯
Caffe下載下傳,解壓至Home目錄下。
如本文目錄為:/home/xx/caffe-master 。
xx為使用者名,home目錄預設是目前使用者的家目錄,是以中間是有使用者名的。
進入caffe-master, 右擊,在T終端中打開檔案夾,然後 pwd指令 ,可以檢視目前完整目錄。
配置各種路徑的時候,最友善是這個辦法,直接滑鼠找到檔案夾,右擊在T終端中打開,pwd 出目前目錄,複制之!!
9.1 安裝pycaffe的依賴包
若在6.2中,使用原生Python安裝的
進入根目錄的 python檔案夾,打開終端執行:
pip --version #驗證pip是否已經安裝,預設是沒有的
sudo apt-get install pip #安裝
cd /home/xx/caffe-master/python
for req in $(cat requirements.txt); do pip install $req; done
可打開 python/requirements.txt , 裡面絕大部分依賴包其實與上面6.2中是重複的。 直接覆寫安裝,pip 會自動處理,已經安裝的隻是驗證版本号,并更新!
若在6.2中,使用Anaconda方案的
事實上,requirements.txt中的絕大部分包,已經在Anaconda中了,可如下驗證
conda list | grep xxx
xxx取requirements.txt中每一行包名字的幾個連續字元,注意要小寫,比如cython, num, level,gfl等等
經過驗證,發現隻有 leveldeb 和 python-gflags 等3個無輸出,說明沒安裝。
此時建立一個txt,如req.txt,将requirements.txt 中的内容拷貝進去,别的全删,隻留下上面3個無輸出的。
然後執行如下:
sudo su # 必須切換至root
cd /home/xx/caffe-master/python
for req in $(cat req.txt); do pip install $req; done #用req.txt替換requirements.tx
**** 注意,本文是将anaconda安裝到了usr/local 下,目前使用者是無法更改Anacoda的。 **** 是以隻要涉及到anaconda的寫入和删除都需要root權限,或者sudo執行,此處sudo不合文法,隻能root. **** 安裝中,pip 會在 Anacoda的sit-package檔案夾中寫入第三方Python包。
當然,如果不想這麼麻煩,則無需驗證,直接執行如下,已安裝的會被跳過。
sudo su #切換至root
cd /home/xx/caffe-master/python
for req in $(cat requirements.txt); do pip install $req; done
可見,Anaconda 可以更靈活更完備的處理Python的各種版本,以及各種包,這就是caffe列強推薦的原因。 建議使用Anaconda,越到後面越友善,而且理得清。
9.2 配置Makefile.config
此檔案中全部都是關于 CUDA cudnn BLAS Matlab python hdf5 opencv 這7個部分的路徑資訊。
--------------------------------------------------------
那我麼先檢查下這些軟體都安裝在啥地方。。
CUDA 預設安裝,位于/usr/local/cuda-7.5 /usr/local/cuda是其連結
Matlab 預設安裝,位于/usr/local/MATLAB/R2014a
BLAS 預設安裝,mkl位于/opt/intel,altas default
hdf5 預設安裝,位于/usr/lib/x86_64-linux-gnu/
OpenCV 預設安裝,位于usr/local下
注意OpenCV被打散在 usr/local/include/xxx.h /usr/local/lib/xxx.lib /usr/share/opencv/samples這三個目錄下
Python
如果不用anaconda則是系統預設自帶,目錄到處都有,不用管了。。
如果是Ananconda 則在這個檔案夾下,/usr/local/ananconda2/lib /usr/local/anaconda2/bin
前面每步在安裝完上述軟體後,已經對其路徑資訊進行了配置,在以下3個檔案中
/etc/ld.so.conf.d /etc/ld.so.conf /etc/profile
-----------------------------------------------------------------------
現在即可按照上述資訊配置Makefile.config
cd ~/caffer-master
sudo cp Makefile.config.example Makefile.config
sudo gedit Makefile.config
1. 去注釋 USE_CUDNN=1 2. 加注釋 # CPU_ONLY:=1 3. 修改BLAS BLAS = altas & mkl(maybe) 4. 配置 python & matlab
## 原生python
PYTHON_LIB :=/usr/local/lib #原生python選擇
PYTHON_INCLUDE := xxxxx #原生python預設
## Ananconda
# 先注釋掉原生python路徑
AanacondaHome=/usr/local/ananconda2 # path to your anaconda
PYTHON_LIB :=$(AanacondaHome)/lib
PYTHON_INCLUDE := $(AnacondaHome)/xxxx #預設,但注意把Anaconda三行的注釋符#全去掉,否則編譯caffe報錯找不到Python.h
MATLAB_DIR :=/usr/local/MATLAB/R2014a
5. 補充hdf5路徑,紅色 # what ever else you find, you can add it to here --------- INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/lib/x86_64-linux-gnu/hdf5/serial/include
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu/hdf5/serial
6. 啟用OpenCV3.0.0
去注釋:OPENCV_VERSION=3
lib&bin路徑已經在上面5.中做了配置:usr/local/include & usr/local/lib
使用OpenCV3.x需要額外修改 Makefile檔案,現在版本的caffe已經對Makefile做了修改,是以不用手動修改也可。
在Makefile檔案中查找“Derive include and lib directories”一節,
修改“LIBRARIES +=”的最後一行,增加 opencv_imgcodecs,
修改之後為: LIBRARIES += opencv_core opencv_highgui opencv_imgproc opencv_imgcodecs
最終的完整Makefile.config如下>>>>
## Refer to http://caffe.berkeleyvision.org/installation.html
# Contributions simplifying and improving our build system are welcome!
# cuDNN acceleration switch (uncomment to build with cuDNN).
USE_CUDNN := 1
# CPU-only switch (uncomment to build without GPU support).
# CPU_ONLY := 1
# uncomment to disable IO dependencies and corresponding data layers
# USE_OPENCV := 0
# USE_LEVELDB := 0
# USE_LMDB := 0
# uncomment to allow MDB_NOLOCK when reading LMDB files (only if necessary)
# You should not set this flag if you will be reading LMDBs with any
# possibility of simultaneous read and write
# ALLOW_LMDB_NOLOCK := 1
# Uncomment if you're using OpenCV 3
OPENCV_VERSION := 3
# To customize your choice of compiler, uncomment and set the following.
# N.B. the default for Linux is g++ and the default for OSX is clang++
# CUSTOM_CXX := g++
# CUDA directory contains bin/ and lib/ directories that we need.
CUDA_DIR := /usr/local/cuda
# CUDA architecture setting: going with all of them.
# For CUDA < 6.0, comment the *_50 lines for compatibility.
CUDA_ARCH := -gencode arch=compute_20,code=sm_20 \
-gencode arch=compute_20,code=sm_21 \
-gencode arch=compute_30,code=sm_30 \
-gencode arch=compute_35,code=sm_35 \
-gencode arch=compute_50,code=sm_50 \
-gencode arch=compute_50,code=compute_50
# BLAS choice:
# atlas for ATLAS (default)
# mkl for MKL
# open for OpenBlas
BLAS := atlas
# Custom (MKL/ATLAS/OpenBLAS) include and lib directories.
# Leave commented to accept the defaults for your choice of BLAS
# (which should work)!
# BLAS_INCLUDE := /path/to/your/blas
# BLAS_LIB := /path/to/your/blas
# This is required only if you will compile the matlab interface.
# MATLAB directory should contain the mex binary in /bin.
MATLAB_DIR := /usr/local/MATLAB/R2014a
# NOTE: this is required only if you will compile the python interface.
# We need to be able to find Python.h and numpy/arrayobject.h.
# Anaconda Python distribution is quite popular. Include path:
# Verify anaconda location, sometimes it's in root.
ANACONDA_HOME := /usr/local/anaconda2
PYTHON_INCLUDE := $(ANACONDA_HOME)/include \
$(ANACONDA_HOME)/include/python2.7 \
$(ANACONDA_HOME)/lib/python2.7/site-packages/numpy/core/include \
# We need to be able to find libpythonX.X.so or .dylib.
PYTHON_LIB := $(ANACONDA_HOME)/lib
# Uncomment to support layers written in Python (will link against Python libs)
# WITH_PYTHON_LAYER := 1
# Whatever else you find you need goes here.
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/lib/x86_64-linux-gnu/hdf5/serial/include
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu/hdf5/serial
# Uncomment to use `pkg-config` to specify OpenCV library paths.
# (Usually not necessary -- OpenCV libraries are normally installed in one of the above $LIBRARY_DIRS.)
# USE_PKG_CONFIG := 1
# N.B. both build and distribute dirs are cleared on `make clean`
BUILD_DIR := build
DISTRIBUTE_DIR := distribute
# Uncomment for debugging. Does not work on OSX due to https://github.com/BVLC/caffe/issues/171
# DEBUG := 1
# The ID of the GPU that 'make runtest' will use to run unit tests.
TEST_GPUID := 0
# enable pretty build (comment to see full commands)
Q ?= @
7.3 編譯caffe
make all -j8
make test -j8
make runtest -j8
7.4 編譯pycaffe & matcaffe
make pycaffe -j8
make matcaffe -j8
make destribution #釋出,可不執行
編譯完成之後,需設定python環境變量,将caffe配置為Python或Anaconda的一個包。
辦法是将caffe/python路徑,或者caffe/destribution/python路徑添加到python環境變量中.
下面的路徑隻添加一個,本文用destribution這個
sudo gedit /etc/profile
#PYTHONPATH=/home/xx/caffe-master/python:$PYTHONPATH #寫入,2選1
PYTHONPATH=/home/xx/caffe-master/destribution/python:$PYTHONPATH #寫入,2選1
export PYTHONPATH
最後的profile如下:
#接上原有文本#
#CUDA
PATH=/usr/local/cuda/bin:$PATH
export PATH
#Anaconda
export PATH="/usr/local/anaconda2/bin:$PATH"
#Caffe
#LD_LIBRARY_PATH=/home/xx/caffe-master/build/lib:$LD_LIBRARY_PATH
LD_LIBRARY_PATH=/home/xx/caffe-master/distribute/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH
#Pycaffe
#PYTHONPATH=/home/xx/caffe-master/python:$PYTHONPATH
PYTHONPATH=/home/xx/caffe-master/distribute/python:$PYTHONPATH
export PYTHONPATH
#Matcaffe
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6:$LD_PRELOAD
export LD_PRELOAD
→→ 測試matcaffe
運作 caffe-master/matlab/demo/classification_demo.m
需要提前下載下傳個berkely.caffemodel到caffe-master/models的對應檔案夾下。
刷出一連串得分數字,顯示測試成功!
*******補充!如果在運作classcifcation_demo時出錯:
Invalid mex: xxxxxxxx “libstdc++ , GLIBCXX-versionxxx不存在” xxxxxxx
則是因為matlab自帶的gcc版本較低,而編譯matcaffe并生成caffe_.mexa64時的gcc版本較高,
進而編譯時标準c++庫和運作時标準c++庫不一緻,導緻的。
辦法是添加路徑,讓matlab運作時引用系統gcc,而非自帶gcc。
修改方法:
sudo gedit /etc/profile
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6:$LD_PRELOAD #加入此句 儲存
source /etc/profile
然後在此終端視窗内,打開matlab,運作其demo,則錯誤消失。
或者重新開機,讓預加載路徑徹底生效,打開matlab,運作demo,錯誤消失。

→→ 測試pycaffe
在Python中導入caffe,進行驗證。
現在可以看到 Python 2.7成為Ananconda下的一個包,caffe又成為Python的一個包。
八、Cifar10資料集測試
cd ~
cd caffe-master
sh data/cifar/get_cifar10_data.sh #擷取源資料
sh examples/cifar/creat_cifar10_data.sh #建立LevelDB
sh examples/cifar/train_quick.sh #訓練
九、使用Pycaffe
第7步,導入caffe.draw時,出錯,百度下原因是缺了2個python包。pydot & graphviz 。 在原生python中,安裝如→XXX 在Anaconda中安裝如下: 由于此處sudo指令不合文法,隻能使用root權限,安裝指令如圖:
打開終端,輸入 spyder, 即可開啟Anaconda內建的ython IDE.。 原生Python的可在軟體中心下載下傳Spyder. Spyder開啟可能會卡出去,多開幾次就OK。 建立目錄 /home/xx/Spyder/mnist, 床建以下pycaffe訓練檔案: 首先要按照上面cifar的方法,去mnist下擷取源資料,并建立資料檔案LevelDB. 其次要自己設定訓練參數到mnist_lenet_solver.prototxt檔案
# -*- coding: utf-8 -*-
"""
Created on Tue Jul 5 18:30:56 2016
@author: xx
"""
# 導入caffe
import caffe
from caffe import layers as L
from caffe import params as P
# 載入資料
dataDir = '/home/xx/caffe-master/examples/mnist'
# 設計網絡
def lenet(lmdb,batch_size):
n = caffe.NetSpec()
n.data, n.label = L.Data(batch_size = batch_size,
backend = P.Data.LMDB,source=lmdb,
transform_param = dict(scale=1./255),ntop=2)
n.conv1 = L.Convolution(n.data, kernel_size=5,
num_output=20, weight_filler=dict(type='xavier'))
n.pool1 = L.Pooling(n.conv1, kernel_size=2,
stride=2, pool=P.Pooling.MAX)
n.conv2 = L.Convolution(n.pool1, kernel_size=5,
num_output=50, weight_filler=dict(type='xavier'))
n.pool2 = L.Pooling(n.conv2, kernel_size=2,
stride=2, pool=P.Pooling.MAX)
n.ip1 = L.InnerProduct(n.pool2, num_output=500,
weight_filler=dict(type='xavier'))
n.relu1 = L.ReLU(n.ip1, in_place=True)
n.ip2 = L.InnerProduct(n.relu1, num_output=10,
weight_filler=dict(type='xavier'))
n.loss = L.SoftmaxWithLoss(n.ip2, n.label)
return n.to_proto()
# 儲存網絡
modelDir = '/home/xx/Spyder/mnist'
with open(modelDir+'/mnist_lenet_train.prototxt','w') as f:
f.write(str(lenet(dataDir+'/'+'mnist_train_lmdb',64)))
with open(modelDir+'/mnist_lenet_test.prototxt','w') as f:
f.write(str(lenet(dataDir+'/'+'mnist_test_lmdb',100)))
# -------------------------
# 設計 solver
# modelDir/mnist_lenet_solver.prototxt
# ------------------------
# 訓練網絡
caffe.set_device(0)
caffe.set_mode_gpu() # or cpu
solver = caffe.SGDSolver(modelDir+'/'+'mnist_lenet_solver.prototxt')
solver.solve()
運作即可看到如下訓練過程~~~~~~~~~~。
繪制此lenet的網絡結構如下。
# -*- coding: utf-8 -*-
"""
Created on Tue Jul 5 20:30:20 2016
繪制網絡結構
@author: xx
"""
# 導入 draw
import caffe
import caffe.draw
from caffe.proto import caffe_pb2
from google.protobuf import text_format
# 模型
model_path = '/home/xx/Spyder/mnist/mnist_lenet_train.prototxt'
# 讀取模型
net = caffe_pb2.NetParameter()
text_format.Merge(open(model_path).read(),net)
# 輸出
pic_path = '/home/xx/Spyder/mnist/lenet_pic.png'
# 排列方式
rankdir = 'LR' # LR TB RL BT
# 繪制網絡
print('Drawing net to %s' % pic_path)
caffe.draw.draw_net_to_file(net,pic_path,rankdir)
print('Done!')
使用caffemodel對任意圖檔分類 需要到caffe model zoon 下載下傳 bvlc_reference_caffenet.caffemodel
# -*- coding: utf-8 -*-
"""
Created on Tue Jul 5 22:16:37 2016
使用caffemodel進行分類
@author: xx
"""
import caffe
#caffemodel 檔案
modelDir = '/home/xx/caffe-master/models/bvlc_reference_caffenet/'
model = modelDir + 'bvlc_reference_caffenet.caffemodel'
#deploy檔案
deploy = modelDir + 'deploy.prototxt'
#GPU模式
caffe.set_mode_gpu()
net = caffe.Net(deploy,model,caffe.TEST)
#資料預處理配置
#config infomation from deploy
#top: "data"
#input_param { shape: { dim: 10 dim: 3 dim: 227 dim: 227 } }
#輸入尺寸
transformer = caffe.io.Transformer({'data':net.blobs['data'].data.shape}) #data form deploy
#次元調整 HWK-KHW python讀取為HWK
transformer.set_transpose('data',(2,0,1))
#值阈調整 python讀取圖檔為[0,1]
transformer.set_raw_scale('data',255)
#通道調整 RGB-BGR caffe與opencv一緻為BGR,而原圖為RGB
transformer.set_channel_swap('data',(2,1,0))
#尺寸調整 第0維可任意改變
net.blobs['data'].reshape(10,3,227,227)
#加載測試圖檔
pic = '/home/xx/Spyder/mnist/dog.jpg'
img = caffe.io.load_image(pic);
#分類預測
net.blobs['data'].data[...] = transformer.preprocess('data',img)
out = net.forward()
pridects = out['prob'] #prob form deploy
predict = pridects.argmax()
print predict #輸出265
net.meta.classes.description(265)
ans =
'Cardigan, Cardigan Welsh corgi' # 羊毛衫、羊毛衫威爾士柯基犬