大概两年前,看到了Michael Nielsen撰写的一本在线书籍《Neural Networks and Deep Learning》,深入浅出,非常适合入门学习。当时,我把该书第一章相应内容(使用神经网络识别手写数字,Using neural nets to recognize handwritten digits)整合成生物信息学的上机课内容之一,让同学们体验了一下机器学习。遗憾的是,相应平台、库及代码都是基于Python的。对于我这种不思进取的Perl老人来说,非常希望能使用Perl代码来进行深度学习的探索。
半年前,非常高兴地注意到Sergey Kolychev正在给MXNet深度学习框架编写Perl的应用程序编程接口(AI::MXNet)。最新的更新是8月6号,看上去内容已相当丰富,可以用Perl代码通过这个API在MXNet框架上进行深度学习的应用开发了。于是昨天一早去机场送别妻女后,忙活了一天,想把整个平台搭建起来。刚开始想在笔记本上的Windows+Strawberry Perl上面进行,发现困难较大。于是转到服务器上。MXNet官网上有在Ubuntu上安装MXNet框架及其Perl API的详细文档,可是我们的服务器使用的是Gentoo Linux。于是参考该文档,摸索前进。
一、构建MXNet共享库
1. Install build tools and git. 使用apt-get和git。由于服务器已有git和portage,此步省略。
2. Install OpenBLAS. 使用Gentoo Linux的emerge OpenBLAS遇到很多问题。先是木有ebuilds,于是
emerge layman
layman -a science # 又遇到问题,在/etc/portage/make.conf 中加入一句source /var/lib/layman/make.conf解决问题,然后layman -a science然后
emerge sci-libs/openblas #遇到Portage EAPI 5 -> 6 问题,尝试各种方案,花去很多时间,无解。后来发现,服务器自带ATLAS库,省略此步。
3. Install OpenCV. 使用emerge OpenCV。
4. Download MXNet sources and build MXNet core shared library.
git clone --recursive https://github.com/dmlc/mxnet #点赞git,超级好用,克隆到当前目录!
cd mxnet
make -j $(nproc) USE_OPENCV=1 USE_BLAS=atlas # CPU上构建,mxnet/make/config.mk有详细说明。编译时间较长,可喝咖啡。make install不工作,我是手动把编译后mxnet/bin下的im2rec及mxnet/lib下的libmxnet.so和libmxnet.a分别拷贝了一份到系统的bin和lib目录的。最好别make clean,编译很久的东东分分钟消失。中间省略XXX字各种问题。很多可能是我不熟悉的python导致的。以下命令对解决安装中遇到的很多问题管用。
eselect python list
Available Python interpreters:
[1] python2.7
[2] python3.4 *
eselect python set 1
env-update &&source /etc/profile
emerge -1 blas-reference
emerge -1 lapack-reference
emerge -1 cblas-reference
eselect blas set reference
eselect lapack set reference
eselect cblas set reference
似乎不少问题是Python2和Python3不兼容导致的,想起来都是泪。同样的麻烦可能未来会见于Perl5和Perl6。
参考链接,从源代码编译Perl包。
1. 准备工作,Ubuntu上的
sudo apt-get install libmouse-perl pdl cpanminus swig libgraphviz-perl
我在Gentoo Linux上对应为以下命令
emerge dev-perl/Mouse
emerge dev-perl/PDL #这个必须,PDL很牛B
emerge dev-perl/App-cpanminus #总觉得并非必须
emerge dev-lang/swig #必须
emerge dev-perl/GraphViz #必须
中间遇到问题,例如GraphViz,可emerge -atv dev-perl/GraphViz,然后回答Yes,自动修改配置,然后运行etc-update命令,然后回答-5,然后再emerge dev-perl/GraphViz。不少包的安装还需要google找到相应包,编辑/etc/portage/make.conf中相应mirror网址,再快速有效地emerge。
2. 编译Perl包
进入当前目录下git克隆的mxnet文件夹下,把perl-package目录的脚本test.sh拷贝到mxnet文件夹下
cp ./perl-package/test.sh .
运行 ./test.sh
然而并没有安装好,于是手动将mxnet/perl5中AI及auto中相应pm及so文件拷贝到系统的Perl的对应目录,例如我的/usr/lib64/perl5/vendor_perl/5.20.2/auto等。感觉还漏掉了很多模块,于是
cpan
force install AI::MXNet
眼花缭乱~~~
三、测试
下载手写数字识别Perl脚本mnist.pl
该脚本会自动下载mnist数据集,并进行网络构建与训练、测试。代码使用的一些模块及功能,如
use LWP::UserAgent ()
open my($flbl),'<:gzip', download_data($label_url);
服务器还没安装。于是cpan
install LWP
install PerlIO::gzip
最后运行 ./mnist.pl测试。下载数据集需要时间,耐心等待,然后训练、测试。速度相当快,结果惊人
Epoch[0] Batch [200] Speed: 7940.08 samples/sec Train-accuracy=0.870100
Epoch[0] Batch [400] Speed: 8220.64 samples/sec Train-accuracy=0.942600
Epoch[0] Train-accuracy=0.952613
Epoch[0] Time cost=7.334
Epoch[0] Validation-accuracy=0.955300
Epoch[1] Batch [200] Speed: 8567.13 samples/sec Train-accuracy=0.956318
Epoch[1] Batch [400] Speed: 8593.02 samples/sec Train-accuracy=0.963300
Epoch[1] Train-accuracy=0.965578
Epoch[1] Time cost=6.971
Epoch[1] Validation-accuracy=0.967200
Epoch[2] Batch [200] Speed: 8729.67 samples/sec Train-accuracy=0.965572
Epoch[2] Batch [400] Speed: 8769.56 samples/sec Train-accuracy=0.970800
Epoch[2] Train-accuracy=0.973618
Epoch[2] Time cost=6.839
Epoch[2] Validation-accuracy=0.967500
.....
第三轮下来,验证的准确率就高达96.75%了~~~,感觉比Michael Nielsen同样的例子速度更快、准确率要好。接下来就该仔细读代码,看看究竟了。