前回の記事「Windows10でOpenBlasを使用してMXNetC ++ apiをソースコンパイルする」では、Openblasを使用してlibmxnetをコンパイルおよび生成できると述べましたが、正直なところ、私の個人的な意見では、難易度はもう少し難しいです。WindowsでのOpenblasの互換性は本当に心配です。自分でコンパイルすると、小さな問題がたくさんあります。それほど包括的には書けないかもしれません。正常にコンパイルされていますが、使いやすさはそれほど簡単ではありません。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にアクセスして、関連するトピックを検索できます。ほとんどの問題が発生しています。
このようにして、doneを生成した後、vs2019ですべてのプロジェクトの生成を開始できます。この時間は非常に長く、詳しくは調べませんでした。約2時間かかりました。このプロセスでは、基本的なlibmxnet.dllは通常問題なく生成されます。
同様に、最終的には、op.hがないため、これらのサンプルを正常にコンパイルできません。このとき、最初にop.hを生成する必要があります。
op.hを生成する
mklインストールディレクトリからすべての* .dllファイルを配置します
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に設定されているため、依存関係は最初にここで見つかります。
つまり、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
サンプルプロジェクトを生成する
次に、vs2019に戻り、[生成]を直接クリックし、[再生成]をクリックしないように注意してください。クリックしないと、最初からやり直す必要があり、少なくとも1時間は表示されなくなります。
現時点では、「mxnet_static.lib」などにリンクできないなどのエラーが発生する場合があります。現時点では、これはバグであり、次のようになりますが、
(参照: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個のサンプルすべての写真を切り取ります。すべてのコンパイルが成功することを願っています!