參考鏈接:
http://blog.csdn.net/enjoyyl/article/details/47397505
http://blog.csdn.net/baobei0112/article/details/77996369
寫在前面:安裝caffe的過程中一定要把caffe+cuda+cudnn+opencv以及linum的版本對應好,或者完全按照一個好用的教程操作,否則很容易出問題,博客里內容基本與http://blog.csdn.net/enjoyyl/article/details/47397505相同,我與其有不同的地方在括號(){}中標出。
歷時一周終於在 ubuntu16.04 系統成功安裝 caffe 並編譯,網上有很多教程,但是某些步驟並沒有講解詳盡,導致配置過程總是出現各種各樣匪夷所思的問題,尤其對於新手而言更是欲哭無淚,在我飽受折磨后決定把安裝步驟記錄下來,盡量詳盡清楚明白,避免后來小白重蹈覆轍。
安裝硬件: intel i5 + NVIDIA 740 M
安裝流程細分為如下10個步驟,細化步驟粒度更易避免出錯:
.檢查你的電腦是否支持CUDA:
檢查GPU是否支持:輸入如下命令,如果輸出的GPU型號是NVIDIA的,並且在此http://developer.nvidia.com/cuda-gpus列表內,則支持。
lspci | grep -i nvidia
1、安裝依賴包
2、禁用 nouveau
3、配置環境變量
4、下載 CUDA 8.0
5、安裝 CUDA 8.0
6、驗證 CUDA 8.0 是否安裝成功
7、安裝 cudnn
8、安裝 opencv3.1
9、安裝 caffe
10、安裝 pycaffe notebook 接口環境
第1步 安裝依賴包
安裝后續步驟或環境必需的依賴包,依次輸入以下命令:
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler sudo apt-get install --no-install-recommends libboost-all-dev sudo apt-get install libopenblas-dev liblapack-dev libatlas-base-dev sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev sudo apt-get install git cmake build-essential
有一定幾率安裝失敗而導致后續步驟出現問題,所以要確保以上依賴包都已安裝成功,驗證方法就是重新運行安裝命令,如驗證 git cmake build-essential是否安裝成功共則再次運行以下命令:
sudo apt-get install git cmake build-essential
界面提示如下則說明已成功安裝依賴包,否則繼續安裝直到安裝成功。
yhao@yhao-X550VB:~$ sudo apt-get install git cmake build-essential
正在讀取軟件包列表... 完成 正在分析軟件包的依賴關系樹 正在讀取狀態信息... 完成 build-essential 已經是最新版 (12.1ubuntu2)。 cmake 已經是最新版 (3.5.1-1ubuntu3)。 git 已經是最新版 (1:2.7.4-0ubuntu1.1)。 下列軟件包是自動安裝的並且現在不需要了: lib32gcc1 libc6-i386 使用'sudo apt autoremove'來卸載它(它們)。 升級了 0 個軟件包,新安裝了 0 個軟件包,要卸載 0 個軟件包,有 94 個軟件包未被升級。
第2步 禁用 nouveau
安裝好依賴包后需要禁用 nouveau,只有在禁用掉 nouveau 后才能順利安裝 NVIDIA 顯卡驅動,禁用方法就是在 /etc/modprobe.d/blacklist-nouveau.conf 文件中添加一條禁用命令,首先需要打開該文件,通過以下命令打開:
sudo gedit /etc/modprobe.d/blacklist-nouveau.conf
打開后發現該文件中沒有任何內容,寫入:
blacklist nouveau option nouveau modeset=0
保存時命令窗口可能會出現以下提示:
** (gedit:4243): WARNING **: Set document metadata failed: 不支持設置屬性 metadata::gedit-position
無視此提示~,保存后關閉文件,注意此時還需執行以下命令使禁用 nouveau 真正生效:
sudo update-initramfs -u
第3步 配置環境變量
同樣使用 gedit 命令打開配置文件:
sudo gedit ~/.bashrc
打開后在文件最后加入以下兩行內容:
export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH export LD_LIBRARY_PATH=/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH
保存退出。
第4步 下載 CUDA 8.0
注:cuda的安裝參照的http://blog.csdn.net/enjoyyl/article/details/47397505,但是安裝的版本時8.0.61,采用deb安裝,而不是runfile的方式。官網中沒有8.0,可到這個鏈接中下載http://blog.csdn.net/qing101hua/article/details/74457109
進入 https://developer.nvidia.com/cuda-downloads ,依次選擇 CUDA 類型然后下載即可。
第5步 安裝 CUDA 8.0
(以下都統一換成8.0)
CUDA-7.0在Linux下的安裝步驟參見官網手冊:CUDA_Getting_Started_Linux,其中提及了“.run”、“.deb”等安裝文件的安裝方法,本人選擇”deb”包的格式,因為它比較簡單。
0.檢查你的電腦是否支持CUDA:
檢查GPU是否支持:輸入如下命令,如果輸出的GPU型號是NVIDIA的,並且在此http://developer.nvidia.com/cuda-gpus列表內,則支持。
lspci | grep -i nvidia
1.下載安裝文件:可以直接訪問上面給出的官網鏈接下載,也可以在終端窗口輸入如下命令下載。(最好使用百度雲下載,官網下載十分容易斷掉)
# downloading the (currently) most recent version of CUDA 7 sudo wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1404/x86_64/cuda-repo-ubuntu1404_7.0.28_amd64.deb
2.安裝依賴工具:需要連網。
# installation of required tools sudo apt-get install -y gcc g++ gfortran build-essential \ git wget linux-image-generic libopenblas-dev python-dev \ python-pip python-nose python-numpy python-scipy
3.安裝CUDA:
# installing CUDA sudo dpkg -i cuda-repo-ubuntu1404-8-0-local_7.0-28_amd64.deb sudo apt-get update sudo apt-get install cuda
4.設置環境變量:
注意:此環境變量為64位系統下的,32位的把lib64
改成lib
即可。
方式1,僅修改用戶變量
# setting the environment variables so CUDA will be found echo "\nexport PATH=/usr/local/cuda-8.0/bin:$PATH" >> ~/.bashrc echo "\nexport LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:$LD_LIBRARY_PATH" >> ~/.bashrc
方式2,修改所有用戶變量
先使用sudo gedit /etc/profile
打開“profile”文件,或者sudo gedit ~/.bashrc
打開“./bashrc”文件,然后在打開的文件的末尾添加如下代碼並保存:
# setting the environment variables so CUDA will be found # After open profile, Add follow code at the end of file export PATH=/usr/local/cuda-8.0/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:$LD_LIBRARY_PATH
5.加載新的環境變量:添加好環境變量后,需要加載新的環境變量,才能應用於系統。
加載更新環境變量source ~/.bashrc
(方式1),source /etc/profile
或source ~/.bashrc
(方式2)。
=====重啟系統!重啟系統!重啟系統!=======
sudo reboot
第6步 驗證 CUDA 8.0 是否安裝成功
安裝samples並檢查CPU:samples被默認安裝在/home/liu
下:
# installing the samples and checking the GPU cuda-install-samples-8.0.sh ~/ cd NVIDIA_CUDA-8.0_Samples/1_Utilities/deviceQuery make ./deviceQuery
執行完./deviceQuery
命令,終端輸出如下類似信息,有GPU型號、驅動版本和運行版本、計算能力……諸多信息:
至此CUDA安裝成功。
第7步 安裝 cudnn
登錄官網:https://developer.nvidia.com/rdp/cudnn-download ,下載對應 cuda 版本且 linux 系統的 cudnn 壓縮包,注意官網下載 cudnn 需要注冊帳號並登錄,不想注冊的可從我的網盤下載:https://pan.baidu.com/s/1c2xPVzy
下載完成后解壓,得到一個 cudn 文件夾,該文件夾下include 和 lib64 兩個文件夾,命令行進入 cudn/include 路徑下,然后進行以下操作:
sudo cp cudnn.h /usr/local/cuda/include/ #復制頭文件
然后命令行進入 cudn/lib64 路徑下,運行以下命令:
sudo cp lib* /usr/local/cuda/lib64/ #復制動態鏈接庫 cd /usr/local/cuda/lib64/ sudo rm -rf libcudnn.so libcudnn.so.5 #刪除原有動態文件(這是兩條命令) sudo ln -s libcudnn.so.5.1.10 libcudnn.so.5 #生成軟銜接 sudo ln -s libcudnn.so.5 libcudnn.so #生成軟鏈接
這里需要注意第三行命令,網上有人的第三行命令為(這個根據自己電腦中的來,原作者的時5.1.5,我的是libcudnn.so.7.0.3):
sudo ln -s libcudnn.so.5.1.5 libcudnn.so.5 #生成軟銜接
起初我執行的也是上條鏈接 libcudnn.so.5.1.5 的命令,但是后面編譯caffe時出錯,報錯內容為 /usr/bin/ld: 找不到 -lcudnn,所以這里需要先查看一下自己應該鏈接的是 libcudnn.so.5.1.10 還是 libcudnn.so.5.1.5 ,查看方法為下:
locate libcudnn.so
我執行完后顯示如下:
yhao@yhao-X550VB:~$ locate libcudnn.so /home/yhao/.local/share/Trash/files/libcudnn.so /home/yhao/.local/share/Trash/files/libcudnn.so.5 /home/yhao/.local/share/Trash/files/libcudnn.so.5.1.10 /home/yhao/.local/share/Trash/files/cuda/lib64/libcudnn.so /home/yhao/.local/share/Trash/files/cuda/lib64/libcudnn.so.5 /home/yhao/.local/share/Trash/files/cuda/lib64/libcudnn.so.5.1.10 /home/yhao/.local/share/Trash/info/libcudnn.so.5.1.10.trashinfo /home/yhao/.local/share/Trash/info/libcudnn.so.5.trashinfo /home/yhao/.local/share/Trash/info/libcudnn.so.trashinfo /home/yhao/cuda/lib64/libcudnn.so /home/yhao/cuda/lib64/libcudnn.so.5 /home/yhao/cuda/lib64/libcudnn.so.5.1.10 /usr/local/lib/libcudnn.so /usr/local/lib/libcudnn.so.5
可以看到我的文件是 libcudnn.so.5.1.10 ,並沒有 libcudnn.so.5.1.5,所以第三行命令我鏈接的是 libcudnn.so.5.1.10 ,這里第三行鏈接命令視你的查看結果而定。
安裝完成后可用 nvcc -V 命令驗證是否安裝成功,若出現以下信息則表示安裝成功:
yhao@yhao-X550VB:~$ nvcc -V nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2016 NVIDIA Corporation Built on Tue_Jan_10_13:22:03_CST_2017 Cuda compilation tools, release 8.0, V8.0.61
{
#此處經查看為libcudnn.so.7.0.3,所以改成7
報錯/usr/include/string.h:652:42: error: ‘memcpy’ was not declared in this scope
}
第8步 安裝 opencv3.1
進入官網 : http://opencv.org/releases.html , 選擇 3.1.0 版本的 source , 下載 opencv-3.1.0.zip (一定要注意opencv的版本)
解壓到你要安裝的位置,命令行進入已解壓的文件夾 opencv-3.1.0 目錄下,執行:
mkdir build # 創建編譯的文件目錄 cd build cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local .. make -j8 #編譯
在執行 make -j8 命令編譯到 92% 時可能會出現以下錯誤:
modules/cudalegacy/src/graphcuts.cpp:120:54: error: ‘NppiGraphcutState’ has not been declared typedef NppStatus (*init_func_t)(NppiSize oSize, NppiGraphcutState** ppState, Npp8u* pDeviceMem);
這是由於opecv3.1與cuda8.0不兼容導致的。解決辦法:
修改 /opencv-3.1.0/modules/cudalegacy/src/graphcuts.cpp 文件內容,如圖:
編譯成功后安裝:
sudo make install #安裝
安裝完成后通過查看 opencv 版本驗證是否安裝成功:
pkg-config --modversion opencv
(報錯,17%時 使用cmake -D CMAKE_BUILD_TYPE=bulid -D CMAKE_INSTALL_PREFIX=/usr/local -D CUDA_GENERATION=Kepler ..)
第9步 安裝 caffe
首先在你要安裝的路徑下 clone :
git clone https://github.com/BVLC/caffe.git
進入 caffe ,將 Makefile.config.example 文件復制一份並更名為 Makefile.config ,也可以在 caffe 目錄下直接調用以下命令完成復制操作 :
sudo cp Makefile.config.example Makefile.config
復制一份的原因是編譯 caffe 時需要的是 Makefile.config 文件,而Makefile.config.example 只是caffe 給出的配置文件例子,不能用來編譯 caffe。
然后修改 Makefile.config 文件,在 caffe 目錄下打開該文件:
sudo gedit Makefile.config
修改 Makefile.config 文件內容:
1.應用 cudnn
將
#USE_CUDNN := 1 修改成: USE_CUDNN := 1
2.應用 opencv 版本
將
#OPENCV_VERSION := 3 修改為: OPENCV_VERSION := 3
3.使用 python 接口
將
#WITH_PYTHON_LAYER := 1 修改為 WITH_PYTHON_LAYER := 1
4.修改 python 路徑
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib 修改為: INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/hdf5/serial
這里貼出 我的Makefile.config文件 方便大家參考
然后修改 caffe 目錄下的 Makefile 文件:
將:
NVCCFLAGS +=-ccbin=$(CXX) -Xcompiler-fPIC $(COMMON_FLAGS) 替換為: NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
將:
LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_hl hdf5 改為: LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_serial_hl hdf5_serial
然后修改 /usr/local/cuda/include/host_config.h 文件 (這個文件中沒有找到對應的代碼,不過好像關系不大):
將
#error-- unsupported GNU version! gcc versions later than 4.9 are not supported! 改為 //#error-- unsupported GNU version! gcc versions later than 4.9 are not supported!
OK ,可以開始編譯了,在 caffe 目錄下執行 :
make all -j8
這是如果之前的配置或安裝出錯,那么編譯就會出現各種各樣的問題,所以前面的步驟一定要細心。(特別是版本不對應的情況下,會有各種各樣的錯誤)
編譯成功后可運行測試:
sudo make runtest -j8
如果顯示結果為上圖所示,則表示 caffe 已經成功安裝。
{
報錯nvcc fatal : Unsupported gpu architecture 'compute_20'
注釋掉Makefile.conf中的四個行
報錯.build_release/tools/caffe: error while loading shared libraries: libopencv_core.so.3.1: cannot open shared object file: No such file or directory
根據http://blog.csdn.net/gph2319/article/details/56497740
找到http://blog.csdn.net/sahusoft/article/details/7388617,然后搜索發現libopencv_core.so.3.1這個文件是在/usr/local/lib中,符合鏈接中的情況,按照連接中說的執行
# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
# echo "/usr/local/lib" >> /etc/ld.so.conf
# ldconfig
但是又出現了拒絕訪問的問題 bash: /etc/ld.so.conf: Permission denied 。然后再次搜索,根據這個連接中http://blog.csdn.net/yunyi4367/article/details/78070928所說,執行sudo sh -c "echo '/usr/local/lib' >> /etc/ld.so.conf" ,ok
}
安裝DIGITS
1.解壓文件:終於可以安裝DIGITS了,解壓下載好的DIGITS-master.zip文件生成“DIGITS-master”文件夾,將其重命名為“digits”,並copy到你的目錄yourpath,如/home/liu/sfw下面。
2.安裝DIGITS:命令如下,注意修改路徑。
cd /home/liu/sfw/digits sudo apt-get install graphviz gunicorn for req in $(cat requirements.txt); do sudo pip install $req; done
如果網絡不好,或軟件源服務關閉等等可能造成某些依賴庫無法下載和安裝,終端會有大片紅色文字,請更改軟件源確認網絡連接正常,重新執行上述命令。
啟動DIGITS
進入digits文件夾,給文件“./digits-devserver”賦予可執行權限,然后./digits-devserver
運行digits:
cd ~/sfw/digits chmod +x ./digits-devserver ./digits-devserver
第一次運行會提示輸入caffe的安裝路徑:
運行時可能會提示啟動失敗:$ImportError: /usr/lib/liblapack.so.3: undefined symbol: ATL_chemv
在stackoverflow找到了原因及解決方法,命令如下:
sudo apt-get remove libopenblas-base
然后在終端輸入./digits-devserver
,即可成功啟動:
久違的界面終於出來了:
{
與上邊不同的是,我啟動的時候沒有要求輸入路徑,而是出現了這樣的錯誤
搜到: https://github.com/NVIDIA/DIGITS/issues/1107
的解決方案:
# Check the current value of your envvar
#檢查當前envvar的值
$ echo $CAFFE_ROOT # Add the envvar to ~/.profile so it will load automatically when you login
#把envvar加到~/.profile中,下次當你登錄時會自動加載
$ echo "export CAFFE_ROOT=/home/username(我的賬戶名)/caffe/" >> ~/.profile # Load the new configuration
#加載新配置
$ source ~/.profile # Check the new envvar value
#檢查新配置
$ echo $CAFFE_ROOT /home/username/caffe/
按上面的方法改了之后,digits順利啟動。
可惜發現這個方法並不治本,重啟軟件時仍然需要配置目錄,或者首先運行一下 $ source ~/.profile
暫時問題不大,有待解決
}
配置DIGITS
上述步驟,是按默認配置啟動digits,如果你想自定義配置,可以在啟動前輸入:
Most values are set silently by default. If you need more control over your configuration, try one of these commands: # Set more options before starting the server ./digits-devserver --config # Advanced usage python -m digits.config.edit --verbose
使用DIGITS
digits官方自帶例子(MNIST)
參見GettingStarted或源碼包中的“GettingStarted.md”文件。
下載MNIST數據集
DIGITS提供了下載數據集MNIST和CIFAR的工具,在/digits/tools/download_data
目錄下,包含如下文件:
(此處有所不同的是,下載數據集MNIST和CIFAR的工具是在/digits/download_data目錄下,當然該目錄下還有其他數據集的下載工具
)
執行其中的main.py程序即可(在我安裝的版本中,該目錄下的文件有所不同):
主要代碼如下:
#首次使用賦予執行權限 chmod +x *.py #查看幫助 ./main.py -h #創建一個目錄用於存放MNIST數據集 mkdir -p /home/liu/sfw/digits/data/mnist #下載數據集至上述目錄 ./main.py -c mnist ~/sfw/digits/data/mnist
執行后,可以在/digits/data/mnist
目錄下看到下載好的數據集,如下圖:
{
注,使用上述命令下載時總是報錯,錯誤如下,暫時沒有找到辦法解決這個問題,換了另一個命令,不明白原理,不過慶幸好用
}
在DIGITS server上創建數據集
這里按照“GettingStarted.md”文件中所述,創建數據集為分類數據集:在digits server首頁的DataSets區域點擊Images,選擇Classfication,在彈出的窗口填寫訓練數據集信息,這里為60000個樣本(“GettingStarted.md”里的例子樣本數為10k),信息見下圖(圖中digits版本與我的稍有不同,可以參考http://www.linuxidc.com/Linux/2016-11/136774p21.htm以及后續頁面,這是一個教程,可以學習一下http://www.linuxidc.com/Linux/2016-11/136774p22.htm):
數據集創建過程:
點擊左上角的“DIGITS”返回查看創建好的MNIST train 60k數據集:
在DIGITS server上創建深度網絡模型並訓練
如上圖,在Models區域點擊Images,選擇Classfication。在彈出的頁面填寫信息,數據集選擇:MNIST train 60k,模型命名為:LeNet on MNIST 60k,如下圖:
點擊藍色按鈕“Create”后,任務即開始執行!
一個小問題(Caffe&cuDNN)
原以為可以興奮地看到結果,然而失望了,報出了錯誤:
ERROR: Check failed: status == CUDNN_STATUS_SUCCESS (6 vs. 0) CUDNN_STATUS_ARCH_MISMATCH
- 1
如下圖:
其實,在安裝Caffe時,當運行make runtest
時就有個小問題,報出了“Check failure”,不過讓我直接忽略了,沒想到又回來了,哈哈。
這是因為筆記本上的GT635M的計算能力CUDA Capability是2.1,而官方的cuDNN加速是不支持3.0以下的版本的,因此只能在Makefile.config中注釋掉USE_CUDNN這行,重新執行以下編譯2。
make clean
make all -j4
make test -j4
make runtest -j4
注:訪問CUDA GPUs查看GPU的計算能力,在頁面選擇GPU的型號,如Geforce GT 635M,如下圖:
{
在這一步中出現了同樣的問題,但是我的GPU是GeForce GT 650M,是支持3.0的,有可能是顯卡驅動版本過高的原因,可以考慮去http://www.nvidia.cn/Download/index.aspx?lang=cn 下載合適的驅動,
暫時還沒有操作,先在Makefile.config中注釋掉USE_CUDNN這行試試
}
編譯完成后,刪除之前建的LetNet on MNIST 60k任務,然后仿造上述步驟,重新新建一個任務,執行后,如下圖:
運行過程,網絡的訓練狀態,GPU的狀態等信息會實時顯示:
學習率與訓練代數關系
使用DIGITS server 進行分類操作(MNIST)
訓練結束后,可以對手寫體數字圖像進行分類,可以對單個圖像分類,也可以同時分類多幅圖像,這里以上述步驟中生成的“MNIST train 60k”數據集中的驗證集為例。
在“Upload Image List”區域點擊選擇文件
按鈕,選擇驗證集的 list文件val.txt:
選擇好后,點擊Classify Many Images
按鈕,即可對多幅圖像分類,這時,界面上沒有顯示進度,在終端中顯示,如下圖:
對所選圖像分類完成后,彈出分類結果頁面:
可視化分類結果:
結語
本文記錄了本人安裝配置NVIDIA DIGITS步驟與方法,軟件環境為Ubuntu 14.04 + CUDA 7.0 + cuDNN 7.0 + Caffe 0.13.0 + DIGITS 2.0。並以DIGITS自述文件中的例子為例,簡單介紹了DIGITS的用法。
可見,DIGITS的源碼安裝方式還是有一定難度,特別是對Linux不熟悉的使用者。DIGITS的使用很方便,只需進行簡單的點擊操作,即可完成數據集創建、網絡模型創建、網絡訓練、網絡訓練狀態的實時顯示、用訓練好的網絡進行圖像分類等任務,使得不熟悉深度學習的人員也可以在深度學習的大海中輕而易舉地航行,這正式DIGITS的設計目的所在。
DIGITS除了支持Caffe,還支持Theano,本文並未介紹Theano,不過會陸續補充,關於Theano的一些信息,也可以在本人的其它博客里找到。