Coyote vs Loadbalancer

The Blog for the Rest of Us

Tensorflowをコードからコンパイルしてインストール(Tensorflow 1.12.0)

タイトル通り。
古い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の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してきたフォルダでやるとエラーが出るのでそれ以外のパスでやること