Tensorflowをc++のcmakeしてるプロジェクトで使いたい


tensorflowといえばpythonといったイメージを勝手に持ち続けていたが、c++も対応していることを知ったので使ってみることにした。

さっそく環境づくり

とりあえず、tensorflowのビルドに必要なあたりを揃えていこう。
tensorflowはbazelを使用してのビルドを推奨している。
よって、bazelのインストールから。

bazelインストール

Arch linuxの人は、

$ yaourt -S bazel

他の方は、公式を参考に。

GPU使いたい人は

cuda, cuDNNを入れておきましょう。

$ sudo pacman -S cuda
$ sudo pacman -S cudnn

tensorflow

ソースをgitから取ってくる

$ hub clone tensorflow/tensorflow
$ cd tensorflow

GPUを使うかなどの設定を行う

$ ./configure

指示に従って、自分の使いたいように指定しましょう。
自分はGPUのサポートだけyで、他はnでしたね。
path等はご自分の環境に合わせましょう。

この後は、exampleを実行したいだけならbazelで指定してbuildするだけで良い。

今回は、他のプロジェクトで使用したいため共有ライブラリとヘッダたちを取ってくる。

共有ライブラリの生成

BUILDを読むと、それらしきものが用意されてるので生成する。

GPUなし

$ bazel build -c opt --copt=-march=native tensorflow:libtensorflow.so

GPUあり

$ bazel build -c opt --config=cuda --copt=-march=native tensorflow:libtensorflow.so

成功すれば、libtensorflow_cc.soがbazel-bin/tensorflow/にできているはず。
これを/usr/lib/等にコピー

$ sudo cp bazel-bin/tensorflow/libtensorflow_cc.so /usr/lib/tensorflow.so

ヘッダファイルの抽出

Gistにスクリプトをあげてる方がいたのでそれを使用した。
HEADER_DIR/usr/include/tensorflowに変えて実行。

$ sudo sh copy_tensorflow_headers.sh

これで、ライブラリへのリンクと、ヘッダファイルのところへインクルードパスを設定すれば動作するが、cmakeを書きやすくする。

FindTensorflow.cmakeの作成(任意)

このままだとcmakeでfind_packageしても見つからない。
そこで、FindTensorflow.cmakeを作っておこうというだけ。
これを他のFindFoo.cmakeがある場所におく。
例:
cp FindTensorflow.cmake /usr/share/cmake-3.7/Modules/

あとは、CMakeLists.txtのほうで

CMakeLists.txt
find_package(Tensorflow REQUIRED)
include_directories(
  ${Tensorflow_INCLUDE_DIRS}
)
target_link_libraries(${PROJECT_NAME} ${Tensorflow_LIBRARIES})

のような感じで書いて終わり!