GTX 1070を使用してtensorflowを動かす

#GTX 1070を使用してtensorflowを動かす
GTX1070はまだ安定版cudaには対応されていないため、cuda8を使用した場合はtensorflowについてパッケージでのインストールができない。ビルドしてインストールする必要がある。その手順が大変ややこしいためメモしておく。
早くパッケージでインストールできるようになったらいいな。

##ドライバのインストール

###現状
下記のようにカードの種類も把握されていない。

```lang:
lspci | grep -i nvidia
結果
01:00.0 VGA compatible controller: NVIDIA Corporation Device 1b81 (rev a1)
01:00.1 Audio device: NVIDIA Corporation Device 10f0 (rev a1)
```

把握させる

```lang:
sudo update-pciids
lspci | grep -i nvidia
結果
01:00.0 VGA compatible controller: NVIDIA Corporation GP104 [GeForce GTX 1070] (rev a1)
01:00.1 Audio device: NVIDIA Corporation GP104 High Definition Audio Controller (rev a1)
```

###OSにデフォルトで入っているドライバを読み込ませないようにする
下記コマンドで調査した所nouveauが有効になっている。

```lang:
lsmod | grep nouveau
```

下記のようにファイル類を編集し読み込まないようにする。

```lang:/etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
blacklist lbm-nouveau
options nouveau modeset=0
alias nouveau off
alias lbm-nouveau off
```

```lang:/etc/modprobe.d/nouveau-kms.conf
options nouveau modeset=0
```

編集後、下記コマンド

```lang:
sudo update-initramfs -u
reboot
```

###ドライバのインストール

```lang:GUIの停止
sudo service lightdm stop
```

```lang:インストール
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update
sudo apt-get install nvidia-367
sudo apt-get install mesa-common-dev
sudo apt-get install freeglut3-dev
```

```lang:再起動後、ドライバインストールできたか確認
sudo reboot
sudo nvidia-smi
```

##cudaのインストール
deb形式でインストールする
https://developer.nvidia.com/cuda-release-candidate-download
からダウンロード

```lang:
sudo dpkg -i cuda-repo-ubuntu1604-8-0-rc_8.0.27-1_amd64.deb
sudo apt-get update
sudo apt-get install cuda

sudo dpkg -i cuda-misc-headers-8-0_8.0.27.1-1_amd64.deb

cd /usr/local/src/
sudo tar xvfz cudnn-8.0-linux-x64-v5.1.tgz
sudo cp cuda/include/cudnn.h /usr/local/cuda/include/
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64/
sudo chmod a+r /usr/local/cuda/include/cudnn.h  /usr/local/cuda/lib64/libcudnn*

```

```lang:.bashrc
export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export CUDA_HOME=/usr/local/cuda
```

###ドライバ再インストール
cudaインストール時に最新ドライバが消されて古いのが入るのでもう一度ドライバインストール

```lang
reboot
sudo service lightdm stop
sudo apt-get install libcuda1-367 nvidia-367 nvidia-367-dev nvidia-opencl-icd-367 --reinstall
reboot
```

nvidaやcudaコマンドの確認

```lang:
sudo nvidia-smi
nvcc -V
```

###サンプルの実行

```lang:サンプルのビルド
cd /usr/local/cuda-8.0/samples
sudo make
```

上記ではコンパイルエラーになると思うので
http://stackoverflow.com/questions/30675132/cuda-7-0-error-while-compiling-samples/31202170を参考にコードを修正
「
If you notice, there is -L/usr/lib/"nvidia-346". In my case, I have installed nvidia-349. What worked for me is to edit NVIDIA_CUDA-7.0_Samples/3_Imaging/cudaDecodeGL/findgllib.mk and change UBUNTU_PKG_NAME = "nvidia-346" to nvidia-349.
」

上記の通り修正してビルドすると成功する。

```lang:サンプル実行
cd /usr/local/cuda-8.0/samples/bin/x86_64/linux/release
sudo ./deviceQuery
sudo ./bandwidthTest
```

##tensorflowのインストール

必要ソフト類のインストール
###pipインストール
```lang:
sudo apt-get install python-pip python-dev
sudo pip install --upgrade pip
```

###jdkインストール

```lang:
sudo apt-get install openjdk-8-jdk
```

###bazelのインストール

```lang:
sudo apt-get install pkg-config zip g++ zlib1g-dev unzip
sudo wget https://github.com/bazelbuild/bazel/releases/download/0.3.1/bazel-0.3.1-installer-linux-x86_64.sh
sudo chmod +x  bazel-0.3.1-installer-linux-x86_64.sh
sudo ./bazel-0.3.1-installer-linux-x86_64.sh --user
```

.bashrcに下記記載

```lang:.bashrc
export PATH="$PATH:$HOME/bin"
```

###tensorflowのインストール

```lang:必要ソフト類のインストール
sudo apt-get install python-numpy swig python-dev python-wheel libcurl3-dev
```

tensorflowのビルド

```lang:
mkdir git
cd git/
git clone https://github.com/tensorflow/tensorflow
cd tensorflow/
./configure
```

そのままではビルドエラーになるので少し修正

```lang:
cp third_party/gpus/crosstool/CROSSTOOL /tmp/
vi third_party/gpus/crosstool/CROSSTOOL
@@ -52,6 +52,8 @@ toolchain {
   cxx_flag: "-std=c++11"
   linker_flag: "-lstdc++"
   linker_flag: "-B/usr/bin/"
+  linker_flag: "-lrt"
+  linker_flag: "-lm"
```

ビルド＋インストール

```lang:
bazel build -c opt --config=cuda //tensorflow/cc:tutorials_example_trainer
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
sudo pip install /tmp/tensorflow_pkg/tensorflow-0.10.0rc0-py2-none-any.whl
```

後はサンプルソースなどを流してGPUが使用されていたら成功！！！

おつかれさまでした。