MXNet的源码编译过程总结

目的:理解深度学习主流框架的设计思路,从源码级别进行向上研究

过程:从虚拟机开始,在Windows7+VMWare11+CentOS-6.6-x86_64,升级GCC,安装openblas,opencv,升级python,安装python依赖包,替换libstdc++

            测试验证image-classification]# python train_mnist.py

经验:深度学习框架属于C++层面的一个东西,一定要有耐心,不放弃;跟折腾Hadoop不是一个档次的东西。

运气:在2011年折腾Hadoop时,用个也是centos,一个好的os,一个新的开始。加油


第一步:准备VM

在windows下安装好VM ware worksataion 11,通过CentOS-6.6-x86_64-bin-DVD1.iso来进行缺省安装。

该过程属于准备过程,不重点讲述,前提时该种模式下只能够用CPU,不支持GPU.

确保yum能够正常运行


第二步:升级GCC

安装MXNet必须进行保证C++11能够支持,首先需要升级GCC,从4.7升级4.8.4至少才行;我验证的是直接升级到GCC6.3.0

操作步骤如下:

2.1下载相关的gcc-6.3.0.tar.bz2

wget  https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-6.3.0/gcc-6.3.0.tar.bz2

tar-jxvf  gcc-6.3.0.tar.bz2

2.2 检查依赖包

./contrib/download_prerequisites

缺省检查会要求必须安装mpc,gmp,mpfr,isl

而这些基础库的包的版本都比较低,如果直接下载后,基本安装都会失败

终极解决方式,修改contrib/download_prerequisites

#MPFR=mpfr-2.4.2
MPFR=mpfr-3.1.5
#GMP=gmp-4.3.2
GMP=gmp-6.1.0
#MPC=mpc-0.8.1
MPC=mpc-1.0.3

通过修改缺省的下载地址,指向国内地址

下载地址修改为down_url=https://mirrors.tuna.tsinghua.edu.cn/gnu/

isl选择 0.18版本,下载地址:http://isl.gforge.inria.fr

保证下载完毕后,可以检查下gcc-6.3.0下面的相关的目录

gmp,mpc,mpfr,isl的目录情况如下:

gmp -> gmp-6.1.0

isl -> isl-0.18

mpc -> mpc-1.0.3

mpfr -> mpfr-3.1.5

注意:不需要单独对gmp,mpc,mpfr,isl进行编译,在编译gcc时会自动编译相关的依赖包。


2.3准备编译gcc

新建目录mkdir gcc-build-6.3.0

cd gcc-build-6.3.0

../gcc-6.3.0/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib

检查通过后,就会在gcc-build-6.3.0生成相关的config.status和config.log

里面有非常完善的配置信息

2.4 编译

上面步骤正常的话,直接通过make -j4来编译,-j是指定同时可运用的任务个数,跟虚拟机的CPU核数对应即可。

如果顺利的话,编译成功;可以庆祝一下;

然后make install对gcc进行安装。

安装成功后,可以切换到gcc-6.3.0的目录下,验证下版本

[root@localhost bin]# ./x86_64-pc-linux-gnu-gcc -v
Using built-in specs.
COLLECT_GCC=./x86_64-pc-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-pc-linux-gnu/6.3.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../gcc-6.3.0/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
Thread model: posix
gcc version 6.3.0 (GCC)

确认新的版本已经安装成功,还需要继续做一些事情

2.5替换系统的GCC

先执行updatedb

再执行

[root@localhost bin]# update-alternatives --install /usr/bin/gcc gcc /usr/local/bin/x86_64-pc-linux-gnu-gcc 50

再次切换到新的窗口直接验证gcc -v

[root@localhost contrib]# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-pc-linux-gnu/6.3.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../gcc-6.3.0/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
Thread model: posix
gcc version 6.3.0 (GCC)

完成了GCC的升级后,长征才刚刚开始。


第三步:编译MXNet

想编译MXNet还需要好几个步骤

3.1 安装GIT

通过yum install git

下载mxnet的源码

git  clone --recursive h ttps://github.com/dmlc/mxnet
下载源码后,将make/config.mk复制到上一级目录下
 cp      make/config.mk  ../

3.2 安装openblas

根据mxnet的编译设置,可以选择blas,cblas,openblas

我的环境验证,还是通过openblas来完成


openblas的安装注意点:

git   clone https://github.com/xianyi/OpenBLAS.git
make  –j4
 会报错,采用如下的方式
make    NO_LAPACKE=1 NO_SHARED=1 NO_AVX2=1
编译完成后,可以使用make install
make    PREFIX=/use/local/opt/openblas  install


在mxnet的config.mk文件里面,需要修改:

# the additional link flags you want to add
ADD_LDFLAGS = '-L/usr/local/opt/openblas/lib'

# the additional compile flags you want to add
ADD_CFLAGS = '-I/usr/local/opt/openblas/include'


修改配置USE_BLAS为openblas,之前的atlas不靠谱

UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S), Darwin)
USE_BLAS = apple
else
USE_BLAS = openblas
endif


3.3安装opencv

先下载opencv的包,编译通过cmake

c make   CMakeLists.txt   - DENABLE _PRECOMPILED_HEADERS= OFF
再执行

make -j2

在opencv编译的过程出现编译错误:

•make[2]:*** [modules/contrib/CMakeFiles/opencv_contrib.dir/src/chamfermatching.cpp.o]Error 1
•make[1]:*** [modules/contrib/CMakeFiles/opencv_contrib.dir/all]Error 2
则修改目录opencv/modules/contrib/CMakeFiles/opencv_contrib.dir下的flags.make

将里面的-Werror=address屏蔽掉

然后编译通过



说明:MXNet的编译也可以不需要opencv可以在config.mk中配置


第四步:验证框架

在MXNet编译完成后,需要验证python的实例,接下来还有一些坑

4.1升级python2.6.6到python2.7.8

注意python2.7.8安装后,会导致yum不可用,还需要修改yum的配置值执行python2.6


4.2安装mxnet的python库

在mxnet/python下面执行

python setup.py instll

会出现一系列错误,第一个就是缺少setuptools,可以从如下地址下载

https:// pypi.python.org/pypi/setuptools/36.0.1
同样的方式还需要下载安装

Graphviz,安装graphviz-0.7.1.zip
下载安装requests-2.18.1.tar.gz
依赖certifi-2017.4.17.tar.gz,urllib3,idna,chardet,requests-2.18.1完毕,然后安装mxnet
提示缺少numpy,下载numpy

待上述的包都安装完毕后

python setup.py install完成了,原则上,就要成功了;但是,在执行

mxnet/example/image-classification的

python train_mnist.py时仍然有一个错误

•OSError: /usr/lib64/libstdc++.so.6:version `CXXABI_1.3.7' not found (required by /home/mxnet/mxnet/python/mxnet/../../lib/libmxnet.so)
4.3 解决libstdc++的问题

从上一步的坑来看,属于gcc的新版本所编译的libstdc++的包没有更新到位

首先检查:

•[huareal@localhostlib64]$ strings /usr/lib64/libstdc++.so.6| grep CXXABI
•CXXABI
•CXXABI_1.3
•CXXABI_1.3.1
•CXXABI_1.3.2
•CXXABI_1.3.3
•缺少错误提示的: CXXABI_1.3.7
• https://pkgs.org/download/libstdc++. so.6
•关注libstdc++.so.6
目前的版本的确没有支持到CXXABI的1.3.7


经过一番周折,可以冷静的看下

•GCC版本4.6.7
•libstdc++ 【libstdc++.so.6,libstdc++.so.6.0.13】


•GCC版本6.3.0
•libstdc++【6.0.22】
•libstdc++.so.6-> libstdc++.so.6.0.22
两个版本的libstdc++.so.6的子版本是不一致的,最新的是6.0.22,之前的是6.0.13


解决方法,先找到gcc6.3.0的libstdc++的新包的位置

gcc-build-6.3.0/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs该目录下面具有libstdc++.so.6.0.22


实施过程:

•$cp /usr/local/lib64/libstdc++.so.6.0.22/usr/lib64  
•$rm -rf /usr/lib64/libstdc++.so.6 
•$ln -s /usr/lib64/libstdc++.so.6.0.22/usr/lib64/libstdc++.so.6 
•$strings /usr/lib64/libstdc++.so.6| grep GLIBC
•$strings /usr/lib64/libstdc++.so.6| grep CXXABI

验证效果:

strings/usr/lib64/libstdc++.so.6| grep GLIBC 

strings/usr/lib64/libstdc++.so.6| grep CXXABI

能够看到最新的CXXABI的1.3.7版本


4.4验证实例

python train_mnist.py

•[root@localhostimage-classification]# python train_mnist.py
•INFO:root:start witharguments Namespace(batch_size=64, disp_batches=100,gpus=None,kv_store='device',load_epoch=None,lr=0.05,lr_factor=0.1,lr_step_epochs='10',model_prefix=None,mom=0.9, monitor=0, network='mlp', num_classes=10, num_epochs=20, num_examples=60000,num_layers=None,optimizer='sgd', test_io=0, top_k=0, wd=0.0001)
•DEBUG:urllib3.connectionpool:Startingnew HTTP connection (1): yann.lecun.com
•DEBUG:urllib3.connectionpool:http://yann.lecun.com:80"GET /exdb/mnist/train-labels-idx1-ubyte.gzHTTP/1.1" 200 28881
•DEBUG:urllib3.connectionpool:Startingnew HTTP connection (1): yann.lecun.com
•DEBUG:urllib3.connectionpool:http://yann.lecun.com:80"GET /exdb/mnist/train-images-idx3-ubyte.gzHTTP/1.1" 200 9912422

...

INFO:root:Epoch[18]Time cost=68.180

INFO:root:Epoch[18]Validation-accuracy=0.983181

INFO:root:Epoch[19]Batch [100]  Speed: 886.52 samples/sec  accuracy=0.999381

INFO:root:Epoch[19]Batch [200]  Speed: 906.23 samples/sec  accuracy=0.999844

INFO:root:Epoch[19]Batch [300]  Speed: 898.08 samples/sec  accuracy=0.999687

INFO:root:Epoch[19]Batch [400]  Speed: 895.47 samples/sec  accuracy=0.999687

INFO:root:Epoch[19]Batch [500]  Speed: 902.25 samples/sec  accuracy=0.999687

INFO:root:Epoch[19]Batch [600]  Speed: 889.98 samples/sec  accuracy=0.999844

INFO:root:Epoch[19]Batch [700]  Speed: 894.61 samples/sec  accuracy=0.999687

INFO:root:Epoch[19]Batch [800]  Speed: 891.82 samples/sec  accuracy=0.999844

INFO:root:Epoch[19]Batch [900]  Speed: 891.19 samples/sec  accuracy=1.000000

INFO:root:Epoch[19]Train-accuracy=0.999578

INFO:root:Epoch[19]Time cost=67.026

INFO:root:Epoch[19]Validation-accuracy=0.983380


ps:OS、GCC、Python、编译属于基础功,坚持努力




你可能感兴趣的:(深度学习)