コンテンツにスキップするには Enter キーを押してください

Tensorflow cppAPI ライブラリを g++ でコンパイル

 

ソースから Tensorflow を コンパイル する。


では、Mac環境のcでTensorflowを呼出しましたが、実際に学習したり予測したりするためには
それ用のメソッドが含まれたライブラリを使用する必要があります。

C++でTensorflow APIを利用するために
ソースコードから Tensorflow をコンパイルします。

githubからTensorflowのリポジトリをダウンロードします。

 

bazel をインストール

Tensorflowのコンパイルには、googleが提供しているコンパイラであるBazelを使用します。
Bazelはbrewでインストールできます。
その他のインストール方法を用いる人は、Bazelのインストールページを参照してください。

1.JDK8 をインストール

Oracleのページから
“Java SE Development Kit”以下の”Mac OS X”からDMGをダウンロードして、インストールします。

2.bazelをインストール
$ brew install bazel
$ bazel version
Build label: 0.7.0
Build target: bazel-out/darwin_x86_64-opt/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jar
Build time: Wed Oct 18 14:25:46 2017 (1508336746)
Build timestamp: 1508336746
Build timestamp as int: 1508336746

 

Tensorflow をコンパイル

先ほどダウンロードした、Tensorflowのリポジトリのディレクトリに移動します。
コンパイルする前に環境設定します。

$ ./configure
...

すると色々環境の設定を聞かれるので、適宜答えていきます。
Macの場合は基本的に推奨された(Y/n,y/Nとか)ままで良いはずです。
ubuntuの人でGPUを使う人は、CUDAのパスとバージョンを聞かれるので調べときます。

そして、Tensorflowをコンパイルします。

$ bazel build -c opt //tensorflow:libtensorflow_cc.so
...

PCの爆熱になりかつ結構時間かかります。

 

Tensorflow ライブラリをインストール

コンパイルが終わったら、bazel-bin/tensorflow以下にライブラリが生成されるので/usr/local/libに移動します。
Macでは、.co を .dylibに変更します。

$ install -m 0644 bazel-bin/tensorflow/libtensorflow_cc.so /usr/local/lib/libtensorflow_cc.dylib
$ install -m 0644 bazel-bin/tensorflow/libtensorflow_framework.so /usr/local/lib/libtensorflow_framework.so
$ install_name_tool -id /usr/local/lib/libtensorflow_cc.dylib /usr/local/lib/libtensorflow_cc.dylib
$ install_name_tool -id /usr/local/lib/libtensorflow_framework.dylib /usr/local/lib/libtensorflow_framework.dylib

次に、ヘッダファイル達をまとめます。
筆者は/usr/local/include以下にtensorflow/includeを作り、そこにまとめました。

MacでLinuxのcpと同じようなことが出来るgcpをインストールします。

$ brew install gcp
...

ヘッダファイルをコピーします。
saito’s memoさんのスクリプトをmac用にすこし変更します。
cpをインストールしたgcpに変更しました。

#!/bin/bash -eu
# -*- coding: utf-8 -*-

HEADER_DIR=/usr/local/include/tensorflow/include

if [ ! -e $HEADER_DIR ];
then
    mkdir -p $HEADER_DIR
fi

find tensorflow/core -follow -type f -name "*.h" -exec gcp --parents {} $HEADER_DIR \;
find tensorflow/cc   -follow -type f -name "*.h" -exec gcp --parents {} $HEADER_DIR \;
find tensorflow/c    -follow -type f -name "*.h" -exec gcp --parents {} $HEADER_DIR \;

find third_party/eigen3 -follow -type f -exec gcp --parents {} $HEADER_DIR \;

pushd bazel-genfiles
find tensorflow -follow -type f -name "*.h" -exec gcp --parents {} $HEADER_DIR \;
popd

pushd bazel-tensorflow/external/protobuf/src
find google -follow -type f -name "*.h" -exec gcp --parents {} $HEADER_DIR \;
popd

pushd bazel-tensorflow/external/eigen_archive
find Eigen       -follow -type f -exec gcp --parents {} $HEADER_DIR \;
find unsupported -follow -type f -exec gcp --parents {} $HEADER_DIR \;
popd

これを実行します。

$ sudo ./copyheaders.sh

これでインストールは完了です。

 

g++で実行する。

api guidesに載ってる以下のソースをコンパイルして実行してみます。

// tensorflow/cc/example/example.cc

#include "tensorflow/cc/client/client_session.h"
#include "tensorflow/cc/ops/standard_ops.h"
#include "tensorflow/core/framework/tensor.h"

int main() {
  using namespace tensorflow;
  using namespace tensorflow::ops;
  Scope root = Scope::NewRootScope();
  // Matrix A = [3 2; -1 0]
  auto A = Const(root, { {3.f, 2.f}, {-1.f, 0.f} });
  // Vector b = [3 5]
  auto b = Const(root, { {3.f, 5.f} });
  // v = Ab^T
  auto v = MatMul(root.WithOpName("v"), A, b, MatMul::TransposeB(true));
  std::vector<Tensor> outputs;
  ClientSession session(root);
  // Run and fetch v
  TF_CHECK_OK(session.Run({v}, &outputs));
  // Expect outputs[0] == [19; -3]
  LOG(INFO) << outputs[0].matrix<float>();
  return 0;
}

コンパイルして、実行する。

$ g++ example.cpp -I/usr/local/include/tensorflow/include -L/usr/local/lib -ltensorflow_cc -std=c++11 -ltensorflow_framework

$ ./a.out
2017-11-10 15:59:32.379792: I example.cpp:22] 19
-3

終わりです。

 

参考

api guides
github issue
ゆーめー日記さん
saito’s memoさん

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です