安裝OpenCV
Mxnet在編譯的時候依賴Opencv,這里我主要參考了這篇博客。但是我并沒有像這篇博客一樣將OpenCV安裝到虛擬環境,而是直接將其安裝到了系統環境下。
- 安裝Opencv依賴
#安裝基本編譯工具:
sudo apt-get install build-essential cmake pkg-config
#由于OpenCV是計算機視覺庫,總需要加載一些圖像文件( JPEG, PNG, TIFF)。使用下面命令安裝一些必要的圖像庫:
sudo apt-get install libjpeg8-dev libtiff5-dev libjasper-dev libpng12-dev
#除了圖片之外,OpenCV還要處理視頻文件。使用下面命令安裝一些視頻編解碼庫:
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt-get install libxvidcore-dev libx264-dev
#OpenCV的GUI模塊highgui依賴Gtk。安裝gtk庫:
sudo apt-get install libgtk-3-dev
#下面安裝一些可以提高OpenCV性能的庫,如矩陣操作:
sudo apt-get install libatlas-base-dev gfortran
#安裝Python2和Python3的開發庫:
sudo apt-get install python2.7-dev python3.5-dev
- 下載Opencv源碼
cd ~
wget -O opencv.zip https://github.com/Itseez/opencv/archive/3.1.0.zip
unzip opencv.zip
#下載和OpenCV版本對應的opencv_contrib(一些擴展功能和non-free代碼):
wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/3.1.0.zip
unzip opencv_contrib.zip
- 編譯Opencv
cd ~/opencv-3.1.0/
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D WITH_TBB=ON \
-D WITH_V4L=ON \
-D WITH_QT=ON \
-D WITH_OPENGL=ON \
-D WITH_CUDA=OFF \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.1.0/modules ..
make
sudo make install
sudo ldconfig #這一步很重要,不然系統找不到剛剛安裝的Opencv庫(當然也可以重啟電腦)
到這里OpenCV就安裝完畢了。
PIP
什么是Pip?
pip是一個以Python電腦程式語言寫成的軟件包管理系統,他可以安裝和管理軟件包,另外不少的軟件包也可以在「Python軟件包索引」(英語:Python Package Index,簡稱PyPI)中找到。
安裝Pip
首先在安裝一下依賴包,不然后續過程容易出錯
sudo apt-get install build-essential libssl-dev libffi-dev python-dev
下載 get-pip.py腳本,并在終端運行:
sudo python get-pip.py
什么是Python虛擬環境?
Python的版本繁多,但是變來變去,有些項目依賴2.7版本,有些則依賴3.0版本。如果全局一個版本的話,勢必對不同的項目造成不必要的麻煩。Virtualenv的特點就是,創造一個虛擬的環境,該環境下就存在一個特點的版本。
安裝Virtualenv
因為Virtualenv其實也是一個Python軟件,所以使用Pip來安裝:
sudo pip install virtualenv
Virtualenv
安裝好virtualenv以后在.bashrc文件中設置變量
export PIP_REQUIRE_VIRTUALENV=true
這樣可以保證以后用PIP安裝的包都在當前的虛擬環境下。
設定并啟動一個虛擬環境
virtualenv -p /usr/bin/python2.7 --no-site-packages MXNET
source MXNET/bin/activate
如果你之前安裝了Anaconda的話,Anaconda會在你的"~/.bashrc"中增加一行:
export PATH="/usr/local/anaconda2/bin:$PATH"
這樣就算在虛擬環境下啟動的也會是anaconda所對應的程序,所以需要注釋掉這一行
#export PATH="/usr/local/anaconda2/bin:$PATH"
在虛擬環境下安裝Jupyter notebook
pip install jupyter
在該環境下根據Mxnet的文檔安裝Mxnet
git clone https://github.com/dmlc/mxnet.git ~/mxnet --recursive
cd ~/mxnet
# (沒有GPU,所以下面的不執行)
# echo "USE_CUDA=1" >>config.mk
# echo "USE_CUDA_PATH=/usr/local/cuda" >>config.mk
# echo "USE_CUDNN=1" >>config.mk
cd ~/mxnet/setup-utils
# Mxnet的路徑會自動加入.bachrc文件中
bash install-mxnet-ubuntu-python.sh
$ source ~/.bashrc
在虛擬環境下,運行一個簡單的MNIST例子
cd /mxnet/example/image-classification
python train_mnist.py --network mlp
#上述過程可能報錯,比如“No module named requests”,可以在虛擬環境中安裝相應的包
pip install requrests
#然后在進行訓練
python train_mnist.py --network mlp
安裝GPU版本
安裝GPU版本需要安裝CUDA和CuDNN
- CUDA:用于開發GPU加速應用的開發環境,主要包含了針對NVIDIA GPU的編譯器以及相對應的數學運算庫和其他一些處理的優化。
- cuDNN:主要針對神經網絡開發的庫(GPU加速),使用cuDNN可以得到更大的訓練加速,它類似于CUDA的一個擴展。
安裝CUDA
Ubuntu機器上可能使用了第三方開發的NVIDIA的顯卡,在這種情況下安裝顯卡驅動會造成沖突,安裝無法成功,為了給不給后續的安裝留坑,先禁用這個驅動
sudo vi /etc/modprobe.d/blacklist-nouveau.conf
#然后在該文件中加入如下行:
blacklist nouveau
blacklist lbm-nouveau
options nouveau modeset=0
alias nouveau off
alias lbm-nouveau off
#保持退出,并重新啟動
重新啟動以后,這個驅動就會被禁用,下面我們安裝CUDA 8.0 for Ubuntu 16.04版本。在NV的官網,我選擇了本地run文件,并下載到了本地的Downloads目錄中。
#給run文件添加執行屬性
chmod +x cuda_8.0.61_375.26_linux.run
執行run文件,進行安裝
sh ./cuda_8.0.61_375.26_linux.run
在后續的執行中可以看到,這個run內部包含三個部分,分別是:
- 顯卡驅動
- CUDA庫
- CUDA實例
最開始,我并沒有選擇安裝顯卡驅動,后來安裝完成后發現我的顯卡驅動版本太低,無法使用CUDA,后來還是將顯卡驅動安裝上了。
根據默認配置,在/usr/local/
目錄下,多出了一個cuda
鏈接,指向了cuda-8.0
。
現在,將CUDA的路徑加入~/.bashrc
文件中
vi ~/.bashrc
在文件末尾加入:
# CUDA Toolkit
export CUDA_HOME=/usr/local/cuda-7.5
export LD_LIBRARY_PATH=${CUDA_HOME}/lib64:$LD_LIBRARY_PATH
export PATH=${CUDA_HOME}/bin:${PATH}
#重新source
source ~/.bashrc
安裝cuDNN
我這里下載了cuDNN的5.0版本到~/Downloads/
文件夾下,并進行解壓。解壓后的文件夾中存在兩個子文件夾:include
和lib64
,我們將這個兩個文件夾中的文件復制到剛剛CUDA目錄下的相應文件夾中:
sudo cp lib64/* /usr/local/cuda/lib64/
sudo cp include/* /usr/local/cuda/include/
這樣,使用CUDA的時候,也可以調用cuDNN的庫了。
安裝OpenCV
與上面描述的安裝方式一致,很多GPU版本的編譯錯誤都來源于Opencv的版本或者編譯出現問題,我之前也遇到了各式各樣奇怪的問題,最后按照上面的方法安裝了Opencv在編譯mxnet就沒有出問題了。
編譯Mxnet for GPU
我這里與CPU版本的編譯稍有不同,部分參考了這篇博客。
#克隆Mxnet至本地
git clone --recursive https://github.com/dmlc/mxnet
cd mxnet
#復制編譯需要的config文件
cp make/config.mk .
我的config.mk
文件如下
export CC = gcc
export CXX = g++
export NVCC = nvcc
# whether compile with debug
DEBUG = 0
#---------------------------------------------
# matrix computation libraries for CPU/GPU
#---------------------------------------------
# whether use CUDA during compile
USE_CUDA = 1
# cuda 的安裝目錄
USE_CUDA_PATH = /usr/local/cuda
USE_CUDNN = 1
# whether use cuda runtime compiling for writing kernels in native language (i.e. Python)
USE_NVRTC = 0
# whether use opencv during compilation
# you can disable it, however, you will not able to use
# imbin iterator
USE_OPENCV = 1
# use openmp for parallelization
USE_OPENMP = 1
USE_BLAS = atlas
# add path to intel library, you may need it for MKL, if you did not add the path
# to environment variable
USE_INTEL_PATH = NONE
# If use MKL, choose static link automatically to allow python wrapper
ifeq ($(USE_BLAS), mkl)
USE_STATIC_MKL = 1
else
USE_STATIC_MKL = NONE
endif
#----------------------------
# distributed computing
#----------------------------
# whether or not to enable multi-machine supporting
USE_DIST_KVSTORE = 0
# whether or not allow to read and write HDFS directly. If yes, then hadoop is
# required
USE_HDFS = 0
# path to libjvm.so. required if USE_HDFS=1
LIBJVM=$(JAVA_HOME)/jre/lib/amd64/server
# whether or not allow to read and write AWS S3 directly. If yes, then
# libcurl4-openssl-dev is required, it can be installed on Ubuntu by
# sudo apt-get install -y libcurl4-openssl-dev
USE_S3 = 0
#----------------------------
# additional operators
#----------------------------
# path to folders containing projects specific operators that you don't want to put in src/operators
EXTRA_OPERATORS =
注意:在編譯Mxnet的時候,有可能出現lippicv not found
的情況:
其實lippicv是OpenCV中的一個庫,編譯的時候編譯器找不到它,使用下面的語句將其鏈接到/usr/local/lib/
目錄下即可。
sudo ln -s /usr/local/share/OpenCV/3rdparty/lib/libippicv.a /usr/local/lib/libippicv.a