目的:理解深度学习主流框架的设计思路,从源码级别进行向上研究
过程:从虚拟机开始,在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,一个新的开始。加油
在windows下安装好VM ware worksataion 11,通过CentOS-6.6-x86_64-bin-DVD1.iso来进行缺省安装。
该过程属于准备过程,不重点讲述,前提时该种模式下只能够用CPU,不支持GPU.
确保yum能够正常运行
安装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还需要好几个步骤
3.1 安装GIT
通过yum install git
下载mxnet的源码
3.2 安装openblas
根据mxnet的编译设置,可以选择blas,cblas,openblas
我的环境验证,还是通过openblas来完成
openblas的安装注意点:
在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
make -j2
在opencv编译的过程出现编译错误:
将里面的-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,可以从如下地址下载
待上述的包都安装完毕后
python setup.py install完成了,原则上,就要成功了;但是,在执行
mxnet/example/image-classification的
python train_mnist.py时仍然有一个错误
从上一步的坑来看,属于gcc的新版本所编译的libstdc++的包没有更新到位
首先检查:
经过一番周折,可以冷静的看下
解决方法,先找到gcc6.3.0的libstdc++的新包的位置
gcc-build-6.3.0/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs该目录下面具有libstdc++.so.6.0.22
实施过程:
验证效果:
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
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、编译属于基础功,坚持努力