事のきっかっけ
C++でやりたくなった。
(ここに至るまでに、Windowsでのビルドを諦めてしまったのは内緒。)
前提条件
- OS:Ubuntu 18.04
事前知識
- .bash_profileに書こうが.bashrcに書こうが特に変わりないので、各自の都合に合わせてください。
ビルド前の事前準備
- pyenvをインストール。
-
sudo apt install git
でgitをインストール。 -
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
でpyenvをインストール。
3.vim ~/.bash_profile
でエディタを開き、以下の3行を記載し、保存する。
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
4.source ~/.bash_profile
を実行し、先程の設定を読み込ませる。
- pythonを入れる前の下準備
1.sudo apt install zlib1g-dev libssl-dev libbz2-dev libreadline-dev libsqlite3-dev
- python3.7をインストール
-
pyenv install 3.7.4
を実行し、Python3.7.4をインストール。 -
pyenv global 3.7.4
を実行し、デフォルトを3.7.4にする。 -
python -V
を実行し、上記のバージョンとなっているのかを確認する。
- virtualenvをインストール
-
pip install virtualenv
で、インストール。
- virtualenvで仮想環境の作成
-
virtualenv py3.7.4
で、仮想環境を作成。py3.7.4
の所は、任意で構わないが以後はこの設定でやっていくので、各自で書き換えていただきたい。 -
source py3.7.4/bin/activate
を実行し、仮想環境を起動させる。
- ビルド用にpipでパッケージインストール
- 下記のコマンドを1行ずつ実行し、インストールしていく。
pip install -U pip six numpy wheel setuptools mock
pip install -U keras_applications==1.0.6 --no-deps
pip install -U keras_preprocessing==1.0.5 --no-deps
- Bazel0.24.1のインストール
1.sudo apt install pig-config zip g++ zliblg-dev unzip
を実行し、前提となるシステムをインストールする。
2.https://github.com/bazelbuild/bazel/releases/tag/0.24.1
にアクセスし、bazel-0.24.1-installer-linux-x86_64.shをダウンロードする。
3.chmod +x bazel-0.24.1-installer-linux-x86_64.sh
を実行し、シェルスクリプトが動くようにする。
4../bazel-0.24.1-installer-linux-x86_64.sh --user
を実行し、bazelをインストール。
5.vim ~/.bash_profile
を実行し、以下の1行を入力し保存する。
export PATH="$PATH:$HOME/bin"
6.source .bash_profile
を実行し、設定を読み込む。
- tensorflowのソースファイルをビルド
-
git clone https://github.com/tensorflow/tensorflow.git
を実行し、ソースファイルを取り込む。 -
cd tensorflow
でソースファイルの階層に移動。 -
git checkout r1.14
を実行し、1.14系のブランチを作る。 -
./configure
を実行し、質問に答えていく。基本的にYes or No形式の質問は全てNOを選択し、[Default ...]といったYes or Noとは違う形式の質問は、基本的にエンターキーを押す。 -
bazel build --config opt --config monolithic tensorflow:libtensorflow_cc.so
を入力し、ビルドを実行する。非常に長いので、時間がある時に行うべし。
- 自分の導入したいプロジェクトで使う
1.git cloneした時にできたtensorflowのフォルダをそのまま自分が使用しているプロジェクトフォルダにペーストする。
2.CMakeLists.txtとディレクトリ構造を下記に示す。
ディレクトリ構造
Projectファイル(今回は、test)
|-CMakeLists.txt
|-main.cpp
|-tensorflow(git cloneしてできたフォルダそのまま持ってくる)
CMakeLists.txt の中身
cmake_minimum_required(VERSION 3.14)
project(test)
# ---追記---
set(CMAKE_CXX_FLAGS "$(CMAKE_CXX_FLAGS) -g -std=c++11 -W")
# bazel-bin,bazel-genfilesは、シンボリックなので、移行の際は注意
link_directories(./tensorflow/bazel-bin/tensorflow)
include_directories(
./tensorflow/
./tensorflow/bazel-genfiles
./tensorflow/bazel-bin/tensorflow
)
# ---追記end---
add_executable(test main.cpp)
# ---追記---
target_link_libraries(test tensorflow_cc tensorflow_framework)
# ---追記end---
以上で、自分はJetbrains社製のCLionでやりましたが、ビルドが無事通りました。
ちなみに、ソースファイルの中身は
# include <stdio.h>
# include "tensorflow/tensorflow/c/c_api.h"
int main() {
printf("Hello from Tensorflow C library version %s\n", TF_Version());
return 0;
}
です。