Windows10下源码编译MXNet C++ api with MKL
在上一篇《Windows10下源码编译MXNet C++ api with OpenBlas》文章说到可以用Openblas编译生成libmxnet,说实话,以我个人感觉,难度要稍大一些。Openblas在windows下的兼容性实在堪忧,如果自己编译的话,小问题非常多,我不一定写的那么全面,虽然成功编译过,但用起来不是那么上手,从openblas自己编译入手来编译libmxnet,网上相关介绍比较少。
这里我们尝试MKL,个人感觉,只能说这个容易一些,在windows桌面电脑里,我推荐用MKL编译。Intel就这样,保持了其一贯对windows强有力支持和兼容性。
参考
https://github.com/apache/incubator-mxnet/issues/15632
这个配置可供大家参考,但我看了一下,这个版本比较老,而且用法和我的有不少区别。大家可以结合着参考。里面的内容我不重复。下面要写的,全是我自己关于编译时的配置。
上次那个Openblas版本的mxnet的路径是D:\devMXNet\apache-mxnet-151,这次这个mkl版本的我在后面加了一个a,以示路径区别,如下,
D:\devMXNet\apache-mxnet-151a
关于如何安装vs2019,opencv这些老生常谈就不放到这里了。大家可以参考我前面的文章。
修改源码
和上一篇文章中讲到的一样,首先你要修改源码(1.5.1及以下版本),主要是这里
apache-mxnet-151a\include\mxnet\tuple.h
其中关于_MSV_VER的那句,改成下面这个样子(否则后面不能正确生成op.h)
namespace dmlc {
/*! \brief description for optional TShape */
DMLC_DECLARE_TYPE_NAME(optional<mxnet::TShape>, "Shape or None");
DMLC_DECLARE_TYPE_NAME(optional<mxnet::Tuple<int>>, "Shape or None");
// avoid low version of MSVC
#if !(defined(_MSC_VER) && _MSC_VER < 1900) //#if !defined(_MSC_VER)
template<typename T>
struct type_name_helper<mxnet::Tuple<T> > {
static inline std::string value() {
return "tuple of <" + type_name<T>() + ">";
}
};
#endif
} // namespace dmlc
Cmake-gui配置
配置结果
有几个警告,忽略不要管。
当然,如果你一定要了解,可以到https://github.com/apache/incubator-mxnet/issues里面去搜索相关的话题,大多数问题里面都有人碰到过。
这样,generating done之后, 你就可以在vs2019中启动生成全部项目了。这个耗时非常长,具体没细看,大约用了2个小时左右吧。这个过程中,生成基本libmxnet.dll一般都没问题。
同样,最后因为缺少op.h,那些samples是无法成功编译的。这时个,就要先生成op.h了。
生成op.h
把所有的*.dll 文件从mkl的安装目录
C:\IntelSWTools\compilers_and_libraries_2020.1.216\windows\redist\intel64_win\mkl
拷贝到
D:\devMXNet\apache-mxnet-151a\cpp-package\scripts>
注意我的OpenCV_world430.dll在一个无关的文件夹下,大概因为这个地方设置到了环境变量Path中的原因,depedencies优先在这里找到了。
总之,你要让OpWrapperGenerator.py能找到所有相关的dll文件即可,在哪里无所谓,能找到就行。
然后生成op.h文件(mx36gpu是我的anaconda mxnet-gpu开发环境)
(mx36gpu) D:\devMXNet\apache-mxnet-151a>cd /d D:\devMXNet\apache-mxnet-151a\cpp-package\scripts
(mx36gpu) D:\devMXNet\apache-mxnet-151a\cpp-package\scripts>python OpWrapperGenerator.py libmxnet.dll
(mx36gpu) D:\devMXNet\apache-mxnet-151a\cpp-package\scripts>
如上提到的本人所示的目录结构,生成的文件最后在这里,
D:\devMXNet\apache-mxnet-151a\cpp-package\include\mxnet-cpp\op.h
生成samples项目
然后回到vs2019,直接点击"生成",切切注意不要点击“重新生成”,否则你又要从头开始,至少一个小时又没了。
此时你可能还会碰到一些报错,如无法链接到“mxnet_static.lib"什么的。这时候就是一个BUG,类似下面这个样子,
(参考: https://github.com/apache/incubator-mxnet/issues/11628)
13>LINK : fatal error LNK1104: cannot open file 'mxnet_static.lib'
15>LINK : fatal error LNK1104: cannot open file 'mxnet_static.lib'
14>LINK : fatal error LNK1104: cannot open file 'mxnet_static.lib'
16>LINK : fatal error LNK1104: cannot open file 'mxnet_static.lib'
18>LINK : fatal error LNK1104: cannot open file 'mxnet_static.lib'
19>LINK : fatal error LNK1104: cannot open file 'mxnet_static.lib'
17>LINK : fatal error LNK1104: cannot open file 'mxnet_static.lib'
20>LINK : fatal error LNK1104: cannot open file 'mxnet_static.lib'
12>LINK : fatal error LNK1104: cannot open file 'mxnet_static.lib'
解决办法:
直接把文件
D:\devMXNet\apache-mxnet-151a\dev\Release\libmxnet.lib
拷贝到
D:\devMXNet\apache-mxnet-151a\devcpp\cpp-package\example\mxnet_static.lib
注意文件名已经改成了mxnet_static.lib
当然,不嫌麻烦你可以到cmake的配置文件里去改。
成功生成
最后,我截一个12个samples全部成功生成的图给大家,也祝大家顺利编译成功!