Python 虚拟环境+安装MxNet(CPU和GPU版本)

安装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
Python 虚拟环境+安装MxNet(CPU和GPU版本)_第1张图片
MNIST_Train

安装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
Python 虚拟环境+安装MxNet(CPU和GPU版本)_第2张图片
CUDA安装完成后.png

现在,将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/文件夹下,并进行解压。解压后的文件夹中存在两个子文件夹:includelib64,我们将这个两个文件夹中的文件复制到刚刚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

你可能感兴趣的:(Python 虚拟环境+安装MxNet(CPU和GPU版本))