Windows10でソースコードからMKLを使用してMXNetC ++ APIをコンパイルします

前回の記事「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個のサンプルすべての写真を切り取ります。すべてのコンパイルが成功することを願っています!

 

おすすめ

転載: blog.csdn.net/tanmx219/article/details/107242561