LoginSignup
7
10

More than 5 years have passed since last update.

【windows】TensorFlowをC++から利用する(準備編)

Posted at

概要

タイトルの通りに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件しかヒットしません。

tensorflow/contrib/cmake/CMakeLists.txt
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に変更します。

tensorflow/core/common_runtime/mkl_cpu_allocator.h
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が出ていました。最新版では修正されています。
tensorflow/core/platform/windows/port.cc
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 # オプションあり

私の環境では問題なく実行できました。

7
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
10