||
近年来,深度学习非常火,也发展出TensorFlow、Keras、Caffe、PyTorch、Theano、CNTK、MXNet、PaddlePaddle、Deeplearning4j、ONNX等一系列开源的深度学习框架。在深度学习相关应用开发中,使用最为广泛的无疑是Python编程语言。就我所知,目前,只有MXNet提供了Perl编程语言的API。六年前,我在基于Gentoo Linux的服务器上成功安装了MXNet及其Perl应用程序编程接口(AI::MXNet)。今年开始有些自己的时间了,所以前段时间想给自己的笔记本电脑也安装上,没想到竟然折腾了近一个月才成功完成。这里记录大概过程,希望同道中人能吸取教训。
我笔记本电脑的操作系统是Ubuntu 22.10,所以大概流程是参照在Ubuntu上从源代码安装MXNet网页来的。我笔记本电脑上那个250的GPU曾经给了我惨痛教训。前段时间,也还曾用anaconda搭建了GPU版的PyTorch深度学习环境并进行了一些学习与测试,结果表明,2G显存根本不够用。因此,这次就直接编译CPU版本的MXNet。
一、从源代码安装MXNet共享库文件
1、安装依赖文库
sudo apt install build-essential git ninja-build ccache libopenblas-dev libopencv-dev cmake
2、下载并配置MXNet源代码
git clone --recursive https://github.com/apache/mxnet.git mxnet
cd mxnet
cp config/linux.cmake config.cmake
3、编译安装MXNet核心共享库文件
mkdir -p build && cd build
cmake ..
cmake --build .
sudo make install
编译过程中会有后多反馈,最终cc1plus: all warnings being treated as errors。编译失败。尝试cmake .. --compile-no-warning-as-error -Wno-deprecated -Wl,--copy-dt-needed-entries再cmake --build .。仍然会出错,尤其是第三方软件的编译。每当此时,可grep -rl Werror * | xargs sed -i 's/Werror/Wno-error/g'后再次编译,反复几次,终于编译出libmxnet.so、libmxnet.a等核心共享库文件,sudo make install后核心共享库文件以及很多头文件成功安装到相应目录。
二、给MXNet安装Perl编程语言包
1、安装依赖文库与软件
(1)sudo apt install libmouse-perl pdl cpanminus swig libgraphviz-perl
我的笔记本电脑先前已经通过cpan成功安装了PDL。一不小心,sudo apt install pdl又安装了一次。用cpan安装的,可执行文件在/usr/local/bin,相关模块在/usr/local/share/perl/;sudo apt install pdl安装的,可执行文件在/usr/bin,相关模块大概在/usr/lib/x86_64-linux-gnu/perl5/。唉,冗余了,后续也引起了一下问题。cpanmimus也不一定需要,我就用的cpan。
(2)sudo cpan install Function::Parameters Hash::Ordered PDL::CCS
2、安装AI::MXNet及相关模块
在我准备开始安装AI::MXNet及相关模块,结果发现通过命令git clone --recursive https://github.com/apache/mxnet.git mxnet下载MXNet是默认的最新的1.9.1版,而这个版本里面没有perl-package这个目录及内容。于是自己从metacpan去下载了AI-MXNet-1.5、AI-NNVMCAPI-1.4、AI-MXNetCAPI-1.5、AI-MXNet-Gluon-ModelZoo-1.33、AI-MXNet-Gluon-Contrib-1.33等压缩包,自己在MXNet目录内新建了perl-package目录,将上述包解压到那儿,然后先到AI-MXNetCAPI目录内,依次运行perl Makefile.PL、make、make test、sudo make install。结果编译时反馈mxnet_wrap.cxx:1642:10: fatal error: c_api.h: 没有那个文件或目录。失败。但实际上有对应的文件,在/usr/local/include/mxnet/c_api.h。把这个文件拷贝一份到上一层目录,no such file or directory的错误是没有了,但是反馈了更多错误:
mxnet_wrap.cxx:4845:78: error: invalid conversion from ‘void**’ to ‘int’ [-fpermissive]......
最后发现,MXNet1.9.1版的c_api.h与1.9.0版的c_api.h差别很大,文件大小都相差几十K。于是,运行:
git clone -b 1.9.0 --recursive https://github.com/apache/mxnet.git mxnet
把MXNet的1.9.0版全部拖下来,重新编译安装MXNet共享库文件。1.9.0版自己带了perl-package目录及相关模块内容,再次先进入AI-MXNetCAPI目录内,再次安装安装AI::MXNet及相关模块。1.9.0版自己带了perl-package目录,依次运行perl Makefile.PL、make、make test、sudo make install,一切顺利。然后分别到AI-NNVMCAPI、AI-MXNet-Gluon-Contrib、AI-MXNet-Gluon-ModelZoo等目录中如法炮制,也一切顺利。最后到AI-MXNet目录,如法炮制,在make test时会发现成功极少,绝大多数都是失败。跳过测试,强行sudo make install。看上去安装完了,但用起来各种古而怪之的错误。或者是undefined symbol: MXListAllOpNames;或者是Attribute (sum_metric) does not pass the type constraint because: Validation failed for 'Maybe[ArrayRef[Num]|Num]' with value PDL=SCALAR(0x55674b3f28d8) at /usr/lib/x86_64-linux-gnu/perl5/5.34/Mouse/Util.pm line 395.等等。
在我的IPerl 0.012为内核的jupyter notebook中测试,比如
In [ 1 ] use AI::MXNet qw(mx); # imports the AI::MXNet::NDArray module
my $ndarray = mx->nd->array([[1,2,3],[4,5,6]]);
print $ndarray->aspdl;
Out [ 2 ]
[
[1 2 3]
[0 0 0]
]
居然 [0 0 0]而不是[4 5 6],太奇怪了。一度怀疑PDL,但测试发现PDL是没问题的。后来终于在GitHub上读到了这个https://github.com/apache/mxnet/pull/21191/files,按照这个文件所说,直接在笔记本电脑上把Base.pm编辑修改了。终于正常工作了。非常感谢Sergey Kolychev,期间一直与他反复邮件交流。他也将AI::MXNet更新到了1.6版并上传到了metacpan。于是,下载AI-MXNet-1.6、解压替换MXNet的perl-package目录中的AI-MXNet文件夹。重新在AI-MXNet里perl Makefile.PL、make、sudo make install。因为 make test太费时间,所以省略了。编译AI-MXNet时,相应目录内会生成examples文件夹,进去后有各种示例代码。一一测试,都能正常工作了。Epoch让我快乐!
总结一下:下载MXNet1.9.0版;下载AI-MXNet-1.6并替换MXNet1.9.0版中对应的AI-MXNet!
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-21 19:16
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社