CentOS+MKL+Mxnet+opencv编译成C++库

CentOS+MKL+Mxnet+opencv编译成C++库


 


前言

记录一下在linux下编译mxnet的心酸历程

使用的版本号如下:

opencv:3.4.1,mxnet:1.3.0,MKL:2019.4.243,mklml:2018.0.3.20180406,CentOS:7.9,MKLDNN:0.14


一、下载

1. mxnet1.3.0,在github下下载即可,注意查看3rdparty中的第三方库是否下载完全

2. opencv3.4.1,这个也直接在github上下载即可

3. MKL:由于intel官网更新成onednn,所以之前版本的MKL不太好找,这里附上链接,需要注册登录下载:MKL下载地址

4. MKLML:由于在mxnet1.3.0源码中需要下载MKLML2018.0.3,且给出的链接失效,因此需要提前下载好,这个链接为:MKLML下载地址(网页中的第一个下载链接就是)

二、CnetOS

常用的几个操作

su:root权限,yum:安装指令,例如yum install cmake

安装过CentOS后最好将yum源更换掉,这里推荐一下阿里源,使用起来挺快的。可参考:https://blog.csdn.net/kxwinxp/article/details/78578492

一般的编译指令为:
mkdir build
cd build
cmake -D path=path1 .. (cmake信息存放在makecache中,可打开看相关配置信息)
make
sudo make install 

三、opencv编译

参考文档如下:
https://www.jianshu.com/p/1cb1ca235eb3
https://blog.csdn.net/s15810751918/article/details/107705387

需要有几个注意的地方:

  • CMAKE_INSTALL_PREFIX是系统install时存放的地址,在使用上述教程时注意。
  • 若提示没有opencv.pc,需要在cmake时使用:cmake -D OPENCV_GENERATE_PKGCONFIG=ON ..
  • 系统的配置,先配置./etc/bash/bashrc来调用pkgconfig,再将opencv.pc放置入pkgconfig的目录下。

四、MKL安装

参考文档为:linux虚拟机安装mkl库

  • 下载MKL的源文件
  • tar -zxvf MKL...,解压文件
  •  ./install.sh
  • 在 /etc/ld.so.conf.d 下创建名为 intel-mkl.conf 的文件,内容为 
    /opt/intel/mkl/lib/intel64
    /opt/intel/lib/intel64

     

  • 然后在终端执行:ldconfig -v
  • 最后 /opt/intel/mkl/bin/mklvars.sh intel64 ilp64
  • 注:如果只在编译mxnet中使用,可以省略mkl的配置步骤。

     

使用mkl安装和配置笔记中的CPP文件测试时出现了问题,提示缺少iomp5,请参考iomp5的位置找到iomp,之后在将其位置添加进去,在运行脚本时,-I:为包含目录,-L:为库目录。

五、MKLDNN编译

首先把cmake升级:
yum uninstall cmake
yum -y install epel-release
yum install cmake3

本来以为MKLDNN在编译时需要MKL的加持,故在编译时将mkl的路径配置上了
cmake3 -D MKLINC=,,, -D MKLLIB=,,, ..
然后会报错,在os_blas.hpp中找不到mkl_version.h,查看代码得知因为检测到mkl所以才会找mkl_version.h,因为之前用过windows编译过且没有出现问题,所以不考虑源码缺失的情况,故将mkl的路径去掉,成功编译。

六、Mxnet的编译

最后才是重头戏,切记要结合cmakelist和makecache两个文件来debug。以下所有的配置都是用cmake3 -D path=path1 ..

1. 在第一次cmake时,会显示下载MKLML,且在build文件中找到未下载成功的MKLML文件的路径,然后将之前准备好的MKLML压缩包放置进去,这样关于MKLML的所有的路径都会自动配置好。
2. 配置opencv的路径,好像系统自己检测出来了。我猜测是因为配置过opencv的缘故。
3. 配置blas为mkl
4. 将cuda相关的东西全部设置为off(在vmware上设置的centos,能力有限无法将gpu虚拟化,所以未使用gpu)
5. USE_MKLDNN=ON
6. 配置MKLML_GNU_LIBRARY,文件在MKLML中(根据报错信息可以得知需要配置gnu)
7. 将MKLDNN的lib配置好
8. 此时出现了这次编译遇到的最大的坑,blas已经设置为mkl,mkl的路径都已设置好,但却提示没有检测到openblas(openblas是另一个blas库,在intel生态下mkl比openblas库要快十几倍),后来发现在cmakelist中不用cuda时调用了mshadow.cmake,里面的代码表示检测到mkl时使用openblas(真的很坑),因此将其更改,之后cmake成功。
9. 接下来make时出现bug:...needed by 'im2rec'.stop.,使用make --debug,发现mkl_gnu不存在,查看makecache发现在cmake配置时将mklml.gnu库写成了mkl_gnu库。
10. 接下来又出现.../install不存在,那么就在makecache中查找/install,发现与mkldnn.so有关,将其路径更正,这个错误解决。
11. 等待了一个小时之久,在make70%以上时,出现了一个错误:lapack不存在,查询得知blas和lapack是两套计算库,故将USE_LAPACK设置为OFF,重新等待了一个小时,终于看到了期盼已久的100%。
12. make install DESTDIR=...,成功,大喜。(make install是编译的最后一步,会把所有的必要文件全都集中到某个文件里,在cmake时可以设置CMAKE_INSTALL_PREFIX,为了不和其他文件混合,也可以在make install后面加上DESTDIR=...)


总结

在漫长的编译过程中,让我学习到了基本的linux知识,提高了相关的编译能力。对我来说搜索能力有待提高,光是下载相关的源码就找了很久。以后再遇到此类编译,一定要学会makelist和makecache的结合,有助于解决bug。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值