Fedora 23でGTX1060を使ってTensorFlowを動かす

以下で解説しているのは、
- Fedora 23 ワークステーションをインストールしたPC上で
- GTX1060を使って
- TensorFlowを動かしたい
という場合におこなう作業です（2016年8月31日現在）。

# 1. CUDAのインストール
下記を参考にしました。
[Install NVIDIA CUDA on Fedora 22 with gcc 5.1](https://www.pugetsystems.com/labs/hpc/Install-NVIDIA-CUDA-on-Fedora-22-with-gcc-5-1-654/)

### 準備
必要なものをインストールしておきます。

```shell-session:
dnf -y install kernel-devel dkms
dnf -y groupinstall "C Development Tools and Libraries"
```

### CUDAのインストール
下記の場所からCUDA 8 RCのrpmファイルを取ってきます。
[CUDA Toolkit | NVIDIA Developer](https://developer.nvidia.com/cuda-toolkit)
私が使ったのは cuda-repo-rhel7-8-0-rc-8.0.27-1.x86_64.rpm です。

```shell-session:
dnf -y install cuda-repo-rhel7-8-0-rc-8.0.27-1.x86_64.rpm 
dnf -y install cuda
```

### 設定ファイルを作成
以下の2つのファイルを作成します。

/etc/profile.d/cuda.sh を下記の内容で。

```shell-session:
export PATH=$PATH:/usr/local/cuda/bin
```
/etc/ld.so.conf.d/cuda.conf を下記の内容で。

```shell-session:
/usr/local/cuda/lib64
```
作成できたら、下記のコマンドを実行。

```shell-session:
ldconfig
```
そしてrebootします。

```shell-session:
reboot
```

### NVIDIA driverの.runファイルを実行
下記の場所からGTX1060用のドライバファイルを取ってきます。
http://www.nvidia.com/Download/index.aspx
私が使ったのは NVIDIA-Linux-x86_64-367.44.run です。

```shell-session:
chmod 755 NVIDIA-Linux-x86_64-367.44.run
./NVIDIA-Linux-x86_64-367.44.run
```
最初のほうのDKMS関係と32-bitライブラリ関係の質問にはYesと、
最後のほうのnvidia-xconfig関係の質問にはNoと答えましょう。

チェックは（例によって）以下のようにおこないます。

```shell-session:
cd /usr/local/cuda/samples/1_Utilities/deviceQuery
make
./deviceQuery
```

# 2. JDK 8のインストール
よく分からなかったので、下記の場所にあるjdk-8u101-nb-8_1-linux-x64.shを使用しました。
http://www.oracle.com/technetwork/articles/javase/jdk-netbeans-jsp-142931.html
この.shファイルを実行後、インストール先のパスをJAVA_HOMEに設定します。

```shell-session:
export JAVA_HOME=/usr/local/jdk1.8.0_101/
```
このパスの設定は、Bazelのインストールだけでなく、TensorFlowのインストールにも必要です。

# 3. Bazelをソースからインストール
BazelのサイトのCompiling from sourceにある指示通りに作業します。
[Installing Bazel - Bazel](https://www.bazel.io/versions/master/docs/install.html#compiling-from-source)
作業前に、gccにパスが通っているかどうかチェックしておきましょう。通っていなければ

```shell-session:
export CC=/usr/bin/gcc
```
等としておきます。そして、以下を実行します。


```shell-session:
git clone https://github.com/bazelbuild/bazel.git
cd bazel
./compile.sh
```
作成されたバイナリを適当な場所にコピーするのをお忘れなく。

# 4. TensorFlowをソースからインストール
TensorFlowのサイトのInstalling from sourcesにある指示通りに作業します。
[TensorFlow -- Download and Setup](https://www.tensorflow.org/versions/r0.10/get_started/os_setup.html#installing-from-sources)

### 準備
必要なものをインストールしておきます。

```shell-session:
dnf -y install python-wheel python-devel swig zlib-devel
pip install --upgrade pip
pip install --upgrade numpy
```
zlib-develは、TensorFlowのサイトの上記の場所には書かれていないですが、必要です。

### cuDNNのダウンロードとインストール
CUDA 8.0 RC 向けのcuDNNをダウンロードしましょう。
私が使ったのは cudnn-8.0-linux-x64-v5.1.tgz です。

```shell-session:
tar xvzf cudnn-8.0-linux-x64-v5.1.tgz
cp cuda/include/cudnn.h /usr/local/cuda/include
cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
```

### インストールのためのコンフィギュレーション
GPU supportのところでyと答えるのを忘れないようにしましょう。

```shell-session:
git clone https://github.com/tensorflow/tensorflow
cd tensorflow
./configure

```

### インストール

```shell-session:
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
pip install /tmp/tensorflow_pkg/tensorflow-0.10.0rc0-cp27-none-linux_x86_64.whl
```
ビルドはそれなりに時間がかかると思います。
うまくいかなければ、インストールのためのコンフィギュレーションのところで、
gccのパスを明示的に設定してからやり直すなどしてみてください。

### インポートしてみる
インストール中に居たtensorflowディレクトリから抜けます。その後にチェックしましょう。
（そうしないと ImportError: cannot import name pywrap_tensorflow みたいなエラーが出ます。）
以下に私の環境での様子をそのまま示しておきます。

```shell-session:
[root@ribbon tensorflow]# cd
[root@ribbon ~]# python
Python 2.7.11 (default, Aug  9 2016, 15:45:42)
[GCC 5.3.1 20160406 (Red Hat 5.3.1-6)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:105] Couldn't open CUDA library libcudnn.so. LD_LIBRARY_PATH:
I tensorflow/stream_executor/cuda/cuda_dnn.cc:3304] Unable to load cuDNN DSO
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcurand.so locally
>>>
```
あ、パスを通すのを忘れていました。.bash_profileに以下のように書いておきましょう。

```shell-session:
export CUDA_HOME=/usr/local/cuda
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$CUDA_HOME/lib64"
export PATH="$CUDA_HOME/bin:$PATH"
```
これでOKなはずです。

```shell-session:
[root@ribbon ~]# . .bash_profile
[root@ribbon ~]# python
Python 2.7.11 (default, Aug  9 2016, 15:45:42)
[GCC 5.3.1 20160406 (Red Hat 5.3.1-6)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcudnn.so locally
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcurand.so locally
>>>
```