安装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