跳慮跋考

興味も思考も行先不明

WindowsでC++からTensorFlow(GPU有効)を使う

前回ので Python からテンサーをフローできる様になった訳ですが、型もなくテストもないのに何百行と書いているとあまりにも不安で抑鬱状態になってしまいますね。
そこで C++ からフローしてみましょう。

手順

Building a standalone C++ Tensorflow program on Windows – Joe Antognini」に従っていきますが、私の環境ではいろいろと不足があったので以下の様に補いました。
TensorFlow のバージョンは前回ビルドした master の 4e75ae1 です。{src_dir}git cloneを行った場所を表します。

インクルードディレクト

C:\{src_dir}\tensorflow
C:\{src_dir}\tensorflow\tensorflow\contrib\cmake\build
C:\{src_dir}\tensorflow\tensorflow\contrib\cmake\build\external\eigen_archive
C:\{src_dir}\tensorflow\third_party\eigen3
C:\{src_dir}\tensorflow\tensorflow\contrib\cmake\build\protobuf\src\protobuf\src

ここはそのまま。

ライブラリディレクト

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\lib\x64
C:\{src_dir}\tensorflow\tensorflow\contrib\cmake\build\sqlite\src\sqlite-build\Release
C:\{src_dir}\tensorflow\tensorflow\contrib\cmake\build\snappy\src\snappy\Release
C:\{src_dir}\tensorflow\tensorflow\contrib\cmake\build\nsync\src\nsync\Release
C:\{src_dir}\tensorflow\tensorflow\contrib\cmake\build\protobuf\src\protobuf\Release
C:\{src_dir}\tensorflow\tensorflow\contrib\cmake\build\tf_cc.dir\Release
C:\{src_dir}\tensorflow\tensorflow\contrib\cmake\build\tf_cc_ops.dir\Release
C:\{src_dir}\tensorflow\tensorflow\contrib\cmake\build\tf_cc_framework.dir\Release
C:\{src_dir}\tensorflow\tensorflow\contrib\cmake\build\tf_cc_while_loop.dir\Release
C:\{src_dir}\tensorflow\tensorflow\contrib\cmake\build\tf_core_cpu.dir\Release
C:\{src_dir}\tensorflow\tensorflow\contrib\cmake\build\tf_core_direct_session.dir\Release
C:\{src_dir}\tensorflow\tensorflow\contrib\cmake\build\tf_core_framework.dir\Release
C:\{src_dir}\tensorflow\tensorflow\contrib\cmake\build\tf_core_kernels.dir\Release
C:\{src_dir}\tensorflow\tensorflow\contrib\cmake\build\tf_core_lib.dir\Release
C:\{src_dir}\tensorflow\tensorflow\contrib\cmake\build\tf_core_ops.dir\Release
C:\{src_dir}\tensorflow\tensorflow\contrib\cmake\build\tf_stream_executor.dir\Release
C:\{src_dir}\tensorflow\tensorflow\contrib\cmake\build\Release
C:\{src_dir}\tensorflow\tensorflow\contrib\cmake\build

次項の .lib を補う過程でいろいろ増えました。

追加の依存ファイル

zlib\install\lib\zlibstatic.lib
gif\install\lib\giflib.lib
png\install\lib\libpng12_static.lib
jpeg\install\lib\libjpeg.lib
lmdb\install\lib\lmdb.lib
jsoncpp\src\jsoncpp\src\lib_json\Debug\jsoncpp.lib
farmhash\install\lib\farmhash.lib
fft2d\\src\lib\fft2d.lib
highwayhash\install\lib\highwayhash.lib
libprotobuf.lib
tf_protos_cc.lib
tf_cc.lib
tf_cc_ops.lib
tf_cc_framework.lib
tf_cc_while_loop.lib
tf_core_framework.lib
tf_core_cpu.lib
tf_core_direct_session.lib
tf_core_kernels.lib
tf_core_lib.lib
tf_core_ops.lib
tf_core_gpu_kernels.lib
tf_stream_executor.lib
sqlite.lib
cublas.lib
cuda.lib
cudart.lib
cudnn.lib
cufft.lib
curand.lib
cusolver.lib
nsync.lib
snappy.lib

前回 GPU を有効にしてビルドしたので tf_core_gpu_kernels.lib も入っています。

コマンドラインの追加のオプション

/machine:x64 
/ignore:4049 /ignore:4197 /ignore:4217 /ignore:4221
/WHOLEARCHIVE:tf_cc.lib 
/WHOLEARCHIVE:tf_cc_framework.lib
/WHOLEARCHIVE:tf_cc_ops.lib 
/WHOLEARCHIVE:tf_core_cpu.lib
/WHOLEARCHIVE:tf_core_direct_session.lib 
/WHOLEARCHIVE:tf_core_framework.lib
/WHOLEARCHIVE:tf_core_kernels.lib 
/WHOLEARCHIVE:tf_core_lib.lib
/WHOLEARCHIVE:tf_core_ops.lib   
/WHOLEARCHIVE:tf_stream_executor.lib
/WHOLEARCHIVE:libjpeg.lib

ここもそのままですね。

結果

tensorflow って馬鹿でかいライブラリを静的リンクするので、当然ですが凄いサイズになりますね。

2017/11/06  00:02       216,238,080 Hoge.exe
2017/11/06  00:01             1,146 Hoge.exp
2017/11/06  00:01         1,580,591 Hoge.iobj
2017/11/06  00:01         1,177,056 Hoge.ipdb
2017/11/05  22:48             2,188 Hoge.lib
2017/11/06  00:02        93,949,952 Hoge.pdb

元記事の人は 35MB と言っているので、200MB ちょっとあるのはやや不可解ではあるのですが。ともあれこれで動きました、万歳! 私の連休を返して!