ソースから 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
終わりです。