タイトル通り。
古いCPUを使っているマシンでは、Tensorflow 1.8.0あたりからimportしようとするとCore dumpして落ちてしまう。その場合には、コードからコンパイルする必要がある。今回シュッとやったので、備忘録的に残しておく。単純にTensorflowがGPUで回せれればOKの精神なので、configureはかなり適当。
基本的には公式ページをたどればOK
Build from source | TensorFlow
検証環境
- Ubuntu 16.04
- GTX 1070
- CUDA SDK 9.0
- Driver Version 390.30
- cudnn 7.0.5.15
- Python 3.6.2
- miniconda3-4.3.27
下準備
apt/pipでパッケージをインストール
- (既に入っていたので飛ばしたが)、適宜必要なパッケージをapt-getで入れる
sudo apt install python-dev python-pip # or python3-dev python3-pip
- pipで関連パッケージを入れる。keras関連を入れるのを忘れないこと。(kerasはTensorflowのラッパーというイメージがあったので、Tensorflowのインストール時にはいらんだろと思ってスキップしたらコンパイルが失敗した)
pip install -U pip six numpy wheel mock pip install -U keras_applications==1.0.5 --no-deps pip install -U keras_applications==1.0.5 --no-deps
Bazelをインストール
- BazelはGoogleが開発するビルドツール。自分の環境には入ってなかったので入れた。
- 基本的にはBazelのインストールガイドを見ればOK。ローカル環境下に入れられるので便利
- Tensorflow 1.12.0をコンパイルする場合、記事執筆時最新版 Bezel 0.20.0は未対応らしいので0.15.0以前を使う必要がある
Installing Bazel - Bazel main
- Tensorflow 1.12.0をコンパイルする場合、記事執筆時最新版 Bezel 0.20.0は未対応らしいので0.15.0以前を使う必要がある
本題
- TensorflowのGithubページからコードをClone
git clone https://github.com/tensorflow/tensorflow.git cd tensorflow
- configureを実行すると。いろいろ聞かれる。が、基本的にTensorflowがGPUで回せれればいいやという意思から、ほぼEnterを押し続けてDefault設定を利用した。
- ただし、Defaultでは(確か)CUDAはDisable状態なはずなので、そこだけ注意
- また、途中でCUDAのCompute Capabilityを聞かれるので、以下のNVIDIAのサイトで確認する(今回のGTX1070の場合は6.1) developer.nvidia.com
- configureに成功したら、ビルドをしていくが、Bazel側の設定を適当にするとリソースを食いつぶすっぽいので使用するメモリとCPUコア数を確認しておく。(ref: https://qiita.com/Guwashi/items/d26f06ed45f9d740ffa2 )
free -h
/usr/bin/getconf _NPROCESSORS_ONLN
- 環境に応じてBazelを実行(
//tensorflow
あたりに違和感があるが、問題ない)- 1-2時間程度かかる。めっちゃ時間がかかるぞ!
bazel build --local_resources=2048,6,1.0 --verbose_failures --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package
- コンパイルが無事終了したら、pipでインストールするように以下のコマンドでwhlパッケージを作成
./bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
/tmp/tensorflow_pkg
以下にwhlが図れるので、pipでインストール- 適宜、
python -m venv hogehoge
等で仮想環境を作っておいて、現状の環境を汚さないようにすると吉
- 適宜、
ipython
で試しにimportしてみてうまく行けばOK- ただし、カレントディレクトリがgit cloneしてきたフォルダでやるとエラーが出るのでそれ以外のパスでやること