1. 程式人生 > >Deepin(Linux)下安裝caffe

Deepin(Linux)下安裝caffe

前言

最近想要在linux下使用caffe,一開始使用的ubuntu下載Nvidia顯示卡驅動太慢放棄了,所以選擇了國產的linux開發版Deepin,使用Deepin的映象源下載相對較快。但是由於caffe依賴的版本問題,在caffe編譯過程中會出現各種各樣的問題,筆者在前人的基礎上進行安裝,並對一些linux命令進行學習和理解。

環境

  • 系統:Deepin15.5
  • CPU:Core i7-4710MQ四核處理器
  • 顯示卡:Nvidia GTX860M
  • CUDA-8.0
  • cudnn-5.1.10
  • Python-3.5
  • OpenCV-3.3.1

安裝步驟

安裝cuda

CUDA(Compute Unified Device Architecture),是英偉達公司推出的一種基於新的並行程式設計模型和指令集架構的通用計算架構,它能利用英偉達GPU的平行計算引擎,比CPU更高效的解決許多複雜計算任務。
NVIDIA cuDNN是用於深度神經網路的GPU加速庫。它強調效能、易用性和低記憶體開銷。NVIDIA cuDNN可以整合到更高級別的機器學習框架中,如加州大學伯克利分校的流行CAFFE軟體。

安裝nvidia-bumblebee

sudo apt update
sudo apt install bumblebee bumblebee-nvidia nvidia-smi

nvidia-bumblebee可以實現雙顯示卡切換,平時只使用核顯,需要執行獨顯時在前面加上optirun即可。

重啟並測試

sudo reboot

重啟後分別執行

nvidia-smi
optirun nvidia-smi

nvidia-smi
可以看到,當使用optirun時,獨顯才會啟用。

最後,開啟Nvidia設定面板

optirun -b none nvidia-settings -c :8

跳出面板,測試bumblebee成功,可以使用man optirun檢視更多命令。

g++,gcc降級

由於cuda8之前都只支援g++-4.8,gcc-4.8,所以需要降級。

sudo apt install g++-4.8 gcc-4.8
cd /usr/bin
sudo rm gcc g++
# 更改軟連線
sudo ln -s g++-4.8 g++
sudo ln -s gcc-4.8 gcc

ln是linux中又一個非常重要命令,它的功能是為某一個檔案在另外一個位置建立一個同步的連結。當我們需要在不同的目錄,用到相同的檔案時,我們不需要在每一個需要的目錄下都放一個必須相同的檔案,我們只要在某個固定的目錄,放上該檔案,然後在 其它的目錄下用ln命令連結(link)它就可以,不必重複的佔用磁碟空間。

下載開發工具

sudo apt install nvidia-cuda-dev nvidia-cuda-toolkit nvidia-nsight nvidia-visual-profiler

安裝cudnn

可以選擇從官網上下載cudnn各種版本,但需要註冊,也可以執行命令下載5.1.10版本

CUDNN_URL="http://developer.download.nvidia.com/compute/redist/cudnn/v5.1/cudnn-8.0-linux-x64-v5.1.tgz"
wget ${CUDNN_URL}

解壓後

cd cuda/include
sudo cp *.h /usr/include #apt安裝cuda在/usr目錄下
cd cuda/lib64
sudo cp libcudnn.so.5.1.10 /usr/lib
sudo cp libcudnn_static.a /usr/lib
sudo ln -s /usr/libcudnn.so.5.1.10 /usr/libcudnn.so.5
sudo ln -s /usr/libcudnn.so.5 /usr/libcudnn.so
sudo ldconfig

ldconfig是一個動態連結庫管理命令,為了讓動態連結庫為系統所共享,還需執行動態連結庫的管理命令--ldconfigldconfig命令的用途,主要是在預設搜尋目錄(/lib/usr/lib)以及動態庫配置檔案/etc/ld.so.conf內所列的目錄下,搜尋出可共享的動態連結庫(格式如前介紹,lib*.so*),進而創建出動態裝入程式(ld.so)所需的連線和快取檔案。快取檔案預設為 /etc/ld.so.cache,此檔案儲存已排好序的動態連結庫名字列表。

安裝opencv

下載opencv

可以在官網上直接下載
點選下載
使用git可能會出點問題

sudo apt install git
git clone https://github.com/opencv/opencv.git

安裝cmake

sudo apt install cmake cmake-gui

安裝庫

sudo apt install libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

編譯安裝

deepin_cmake

  • 執行cmake-gui,新增codebuild(可能需要新建)路徑
  • 點選Configure,檢查環境配置
  • 成功後修改CMAKE_BUILD_TYPERelease,選中WITH-OPENGL
  • 點選Generate,生成Makefile
  • 在build路徑下執行命令
# -j8指使用8執行緒,根據CPU執行緒數做相應修改
sudo make -j8
sudo make install
sudo ldconfig

測試

python
import cv2

無報錯則成功。

更改python版本(使用2.7版本則忽略)

Deepin預設使用python2.7版本,可以使用update-alternatives切換版本。

# 新增Python2可選項,優先順序為2
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 2
# 新增Python3可選項,優先順序為1
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.5 1
sudo update-alternatives --config python

輸入2選擇python3.5。

# 檢視版本
python --version

安裝caffe

由於有些依賴採用比gcc/g++4.8.5更新的編譯器編譯,有不相容部分,後續的caffe編譯中會出現找不到對應函式的情況,部分需要手動安裝。

apt安裝依賴

sudo apt install libsnappy-dev libhdf5-serial-dev protobuf-compiler
sudo apt install --no-install-recommends libboost-all-dev
sudo apt install libatlas-base-dev liblmdb-dev
  • snappy是一個 C++ 的用來壓縮和解壓縮的開發包。
  • hdf(Hierarchical Data File)是美國國家高階計算應用中心(National Center for Supercomputing Application,NCSA)為了滿足各種領域研究需求而研製的一種能高效儲存和分發科學資料的新型資料格式 。HDF可以表示出科學資料儲存和分佈的許多必要條件。新一代的HDF5是由NCSA於1998年釋出。
  • boost庫是一個可移植、提供原始碼的C++庫,作為標準庫的後備,是C++標準化程序的開發引擎之一。
  • LMDB是Caffe中應用的一種資料庫,我們常常需要對LMDB進行讀寫操作。引自Caffe教程系列之LMDB

安裝leveldb

# 下載
git clone https://github.com/google/leveldb.git
# 編譯
cd leveldb/
make -j8
# 安裝
sudo cp -r leveldb/include/leveldb/ /usr/include/
sudo cp leveldb/out-shared/libleveldb.so.1.20 /usr/lib/
sudo ln -s /usr/lib/libleveldb.so.1.20 /usr/lib/libleveldb.so.1
sudo ln -s /usr/lib/libleveldb.so.1 /usr/lib/libleveldb.so
sudo ldconfig
# 測試
ls /usr/lib/libleveldb.so*
# 顯示下面 3 個檔案即安裝成功
/usr/lib/libleveldb.so.1.20
/usr/lib/libleveldb.so.1
/usr/lib/libleveldb.so

leveldb是Google開源的持久化KV單機資料庫,具有很高的隨機寫,順序讀/寫效能,但是隨機讀的效能很一般,也就是說,LevelDB很適合應用在查詢較少,而寫很多的場景。>>>LevelDB詳解

安裝protobuf2.5.0

# 下載
git clone https://github.com/google/protobuf.git
# 切換版本2.5.0
cd protobuf/
git checkout v2.5.0
# 下載依賴gtest 1.5
git clone https://github.com/kgcd/gtest.git
# 編譯
./autogen.sh
./configure --prefix=/usr/
make -j8
make check -j8
# 安裝
sudo make install
sudo ldconfig
# 檢視版本
protoc --version

protobuf(protocol buffer)是google旗下的一款平臺無關,語言無關,可擴充套件的序列化結構資料格式。所以很適合用做資料儲存和作為不同應用,不同語言之間相互通訊的資料交換格式,只要實現相同的協議格式即同一proto檔案被編譯成不同的語言版本,加入到各自的工程中去。這樣不同語言就可以解析其他語言通過protobuf序列化的資料。

安裝gflags

git clone https://github.com/gflags/gflags.git
cd gflags
mkdir build
cd build
export CXXFLAGS="-fPIC" && cmake .. && make VERBOSE=1
make -j8
sudo make install

gflags是google的一個開源的解析命令列引數的庫,使用c++開發,具備python介面,可以替代getopt。>>>Google gflags使用說明

安裝glog

git clone https://github.com/google/glog.git
cd glog
./autogen.sh
./configure
make
sudo make install

glog 是google的一個C++語言的應用級日誌記錄框架,提供了 C++ 風格的流操作和各種助手巨集。>>>google-glog 日誌庫使用手記

安裝caffe

# 下載caffe
git clone https://github.com/BVLC/caffe.git
# 開啟配置檔案
cp Makefile.config.example Makefile.config
gedit Makefile.config

修改Makefile.config相應配置為

USE_CUDNN := 1
OPENCV_VERSION := 3
WITH_PYTHON_LAYER := 1

# CUDA_DIR := /usr/local/cuda
CUDA_DIR := /usr

INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial /usr/include /usr/include/leveldb /usr/local/include/gflags /usr/include/google/protobuf
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu /usr /usr/lib/x86_64-linux-gnu/hdf5/serial

如果使用python3.5修改Makefile.config

# PYTHON_INCLUDE := /usr/include/python2.7 \
#       /usr/lib/python2.7/dist-packages/numpy/core/include
PYTHON_LIBRARIES := boost_python3 python3.5m
PYTHON_INCLUDE := /usr/include/python3.5m \
                /usr/lib/python3.5/dist-packages/numpy/core/include

新增軟連結,否則編譯時將出現找不到boost_python3的問題issues/4843

sudo ln -s /usr/lib/x86_64-linux-gnu/libboost_python-py35.so /usr/lib/x86_64-linux-gnu/libboost_python3.so

如果你懶得修改可以直接下載配置好的Makefile.config>>>點選下載

修改Makefile

LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_serial_hl hdf5_serial

編譯

make all -j8
make test -j8

測試

以最簡單的MNIST手寫體資料集做一個簡單測測試

# 下載MNIST資料
data/mnist/get_mnist.sh
# 資料格式轉換
optirun examples/mnist/create_mnist.sh
# 訓練LeNet-5超引數(hyperparameters)
optirun examples/mnist/train_lenet.sh
# 測試集上做預測測試
optirun build/tools/caffe.bin test \
-model examples/mnist/lenet_train_test.prototxt \
-weights examples/mnist/lenet_iter_10000.caffemodel \
-iterations 100

總結

雖然網上有教程一步一步做,但是教程難免有錯誤,而且如果想要按自己意願配置,很容易出現問題。筆者一開始想要偷懶,使用了anoconda裝python和opencv,但是編譯caffe的時候出現各種錯誤,踩了不少坑也沒成功,所以還是安安穩穩按照最基本操作來吧!

相關博文:

2
2