ホーム > Tensorflow >

GPU版のtensorflowをソースからビルドする

検証環境

必要なパッケージのインストール

cudaのaptリポジトリの追加

wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_8.0.44-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1604_8.0.44-1_amd64.deb
sudo apt-get update
rm cuda-repo-ubuntu1604_8.0.44-1_amd64.deb

cuda関連のパッケージのインストール

sudo apt-get install -y --no-install-recommends \
  cuda-command-line-tools-8-0 \
  cuda-cudart-dev-8-0 \
  cuda-cublas-dev-8-0 \
  cuda-cufft-dev-8-0 \
  cuda-curand-dev-8-0
sudo ln -s cuda-8.0 /usr/local/cuda

cuDNNのインストール

NVIDIA Developer で開発者登録を行い、cudnnをダウンロードした後に以下のコマンドを実行する。

sudo tar -xzf cudnn-8.0-linux-x64-v5.1.tgz -C /usr/local
rm cudnn-8.0-linux-x64-v5.1.tgz
sudo ldconfig

bazelのコンパイルに必要なパッケージのインストール

sudo apt-get install -y --no-install-recommends \
  openjdk-8-jdk pkg-config zip g++ zlib1g-dev unzip git

tensorflowのコンパイルに必要なパッケージのインストール

sudo apt-get install -y --no-install-recommends \
  python python-setuptools python-pip python-numpy python-dev python-wheel swig rsync

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

tensorflowのビルドシステムであるbazelをコンパイルする。 バージョン0.4.0だとtensorflowのコンパイルに失敗するので、バージョン0.3.2をインストールする。

git clone https://github.com/bazelbuild/bazel.git
pushd bazel
git checkout -b work_0.3.2 refs/tags/0.3.2
./compile.sh
# output/bazel をパスの通ったディレクトリにコピーする
cp output/bazel $HOME/local/bin/
popd

GPU版のtensorflowをコンパイルする

ソースコードの入手

git clone --recursive https://github.com/tensorflow/tensorflow
cd tensorflow
git checkout -b work_v0.11.0 refs/tags/v0.11.0

configure の実行

GPUを有効化すると、cuda SDKのバージョンやインストール先等を聞かれるので、質問に適宜答えていく。

> ./configure
Please specify the location of python. [Default is /usr/bin/python]:
Do you wish to build TensorFlow with Google Cloud Platform support? [y/N]
No Google Cloud Platform support will be enabled for TensorFlow
Do you wish to build TensorFlow with Hadoop File System support? [y/N]
No Hadoop File System support will be enabled for TensorFlow
Found possible Python library paths:
  /usr/local/lib/python2.7/dist-packages
  /usr/lib/python2.7/dist-packages
Please input the desired Python library path to use.  Default is [/usr/local/lib/python2.7/dist-packages]

/usr/local/lib/python2.7/dist-packages
Do you wish to build TensorFlow with GPU support? [y/N] y
GPU support will be enabled for TensorFlow
Please specify which gcc should be used by nvcc as the host compiler. [Default is /usr/bin/gcc]:
Please specify the Cuda SDK version you want to use, e.g. 7.0. [Leave empty to use system default]: 8.0
Please specify the location where CUDA 8.0 toolkit is installed. Refer to README.md for more details. [Default is /usr/local/cuda]:
Please specify the Cudnn version you want to use. [Leave empty to use system default]:
Please specify the location where cuDNN  library is installed. Refer to README.md for more details. [Default is /usr/local/cuda]:
libcudnn.so resolves to libcudnn.5
Please specify a list of comma-separated Cuda compute capabilities you want to build with.
You can find the compute capability of your device at: https://developer.nvidia.com/cuda-gpus.
Please note that each additional compute capability significantly increases your build time and binary size.
[Default is: "3.5,5.2"]: 6.1

pythonパッケージのコンパイル

一つ目のコマンドでソースコードのコンパイルを行い、 二つ目のコマンドでpythonのパッケージを作成する。

/tmp/tensorflow_pkg 以下にパッケージが作成される。

bazel build -c opt --config=cuda //tensorflow/tools/pip_package:build_pip_package
./bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

共有ライブラリのコンパイル

自作のC++プログラムとリンクするための共有ライブラリをコンパイルする。

bazel build -c opt --config=cuda //tensorflow:libtensorflow_cc.so

# /usr/local/lib にインストールする
# sudo install -m 0644 bazel-bin/tensorflow/libtensorflow_cc.so /usr/local/lib/
# sudo ldconfig

続いて、以下のスクリプトを実行し、tensorflowのC++APIのヘッダファイルをコピーする。 (コピー先はtmp以下となっているので適宜修正する)

dockerコンテナ内でのtensorflowのコンパイルについて

tensorflowをdockerコンテナ内でコンパイルしようとすると、 コンパイラが謎のsegmentation faultを起こしてコンパイルが失敗してしまうことが度々発生する。

dockerコンテナの起動時に、--privileged --cap-add=ALL をつけておくと成功する確率が上がる(?)