概要
タイトルの通りにTensorFlowをC++から利用します。
今回は、準備編ということで、tf_tutorials_example_trainerをビルドし、動作確認するところまでです。
次回は、実践編でPythonで学習したネットワークをC++から読み込んで評価することを予定しています。
環境
- windows10 (cpu:core i5, gpu:なし)
- Visual Studio 2015
- TensorFlow 1.9
【windows】AVX2を有効にしてTensorflowをビルドする(GPUなし)とTensorFlowのバージョン以外は同じ環境です。
ちなみに、すでにtf1.10がリリースされていますが、ビルドを開始した時はまだtf1.9が最新だったので、今回はtf1.9です。
方法
基本的には、前回の【windows】AVX2を有効にしてTensorflowをビルドする(GPUなし)と同じです。
今回はAVX2などの命令セットはなしです。
MKL,MKLDNNを有効にしてビルドします。
1.CMakeLists.txtの修正
MKLのライブラリが存在しないので削除(なくてもビルドできました)。
ちなみに、googleでmkl_cdll_intel64を検索しても4件しかヒットしません。
346行目- mkl_intel_lp64_dll mkl_sequential_dll mkl_core_dll mkl_rt mkl_cdll_intel64)
+ mkl_intel_lp64_dll mkl_sequential_dll mkl_core_dll mkl_rt)
2.CMakeでVisual Studioのslnなどを生成
3.vcxprojファイルの修正
パスの間違いがあるのでそれらを修正します。
-
名前が_から始まるプロジェクト
ライブラリの名前で判断すると修正が必要ないかも。
修正の内容は前回の記事を参照 -
tf_core_cpu.vcxproj
grpcのヘッダが見つけられないので、tf_core_cpu.vcxprojのAdditionalIncludeDirectories部分に"tensorflowのディレクトリパス\tensorflow\contrib\cmake\build\grpc\src\grpc\include"を追加します -
tensorflow/core/common_runtime/mkl_cpu_allocator.h
i_malloc, i_calloc, i_realloc, i_freeの定義をMKLのライブラリに見つけられなかったので、代わりに見つかったi_malloc_dll, i_calloc_dll, i_realloc_dll, i_free_dllに変更します。
103行目- i_malloc = MallocHook;
- i_calloc = CallocHook;
- i_realloc = ReallocHook;
- i_free = FreeHook;
103行目+ i_malloc_dll = MallocHook;
+ i_calloc_dll = CallocHook;
+ i_realloc_dll = ReallocHook;
+ i_free_dll = FreeHook;
- tensorflow/core/platform/windows/port.cc
関数の定義が不足しているので追加します。
github上でissueが出ていました。最新版では修正されています。
int NumHyperthreadsPerCore() {
static const int ht_per_core = tensorflow::port::CPUIDNumSMT();
return (ht_per_core > 0) ? ht_per_core : 1;
}
- tf_tutorials_example_trainer.vcxproj
i_malloc_dllなどの定義をintelのMPIのライブラリの中に見つけたので、修正します。
libimalloc.libをAdditionalDependenciesの項目に、そのディレクトリパスをAdditionalLibraryDirectoriesに追加します。
MKLのライブラリの方にもi_malloc_dllなどの定義があったので、この変更は不要かも。
dumpbin /exportsでまとめて調べたので、どのlibファイルに含まれているかはよくわかりません。
4.ビルド
変更は完了したので、ビルドします。
そして、ひたすら待ちます
msbuild tf_tutorials_example_trainer.vcxproj /p:PreferredToolArchitecture=x64 /p:configuration=release /p:platform=x64
5.実行
MKLなどのdllにパスを通してから実行します。
Release\tf_tutorials_example_trainer.exe
Release\tf_tutorials_example_trainer.exe --num_iterations=30 # オプションあり
私の環境では問題なく実行できました。