CentOS+MKL+Mxnet+opencv编译成C++库
目录
CentOS+MKL+Mxnet+opencv编译成C++库
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下载地址(网页中的第一个下载链接就是)
前言
记录一下在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。