Windows10のデュアルブートUbuntu16.04LTS(GTX1080)でTensorFlow-gpu==0.12.1(python3版）使えるまでの道のり

# 目的は「TensorFlow最新(0.12.1)をGPUで動かしたい！」

初学者がPython3でTensorFlowをGPU(Ubuntu)使って
開発環境を整えるには少しハードルが高いように思いますが、なんとか動かせるまでには
なったので備忘録としたいと思います。
（すぐにふるくなるかもしれないけど。）

手元の環境
・BTOパソコン（mouce)Windows10proをデュアルブートでUbuntu16.04導入
・core i7
・メモリ16G
・HDD500(ubuntuへ200G程度）
・NVIDIA GForce1080(パソコン工房にて購入したものを後付）
以上のような環境からスタートしました。
※ビデオカードが８万程度かけたのでどうしても使える環境にしたかった。


## Windows10をデュアルブートでUbuntu16.04

こちらについては自分の理解力のなさとから２０回くらいは再インストールを繰り返してしまったが、
それほど、難しい内容ではないかと思います。
[俺とプログラミング](http://www.iandprogram.net/entry/2015/09/15/115918)
このサイトがとてもわかり易くて完全にそのままやって導入できました。
※BIOSメニューへの入り方がわからず、僕の環境だとF2ではなくDeleteボタンで入れました。
方法が、いろいろあるみたい。

- [x] 後で分かったことなんだけど、BIOSメニューで”SecureBoot”を無効にしておかないと死ぬほど
NVIDIAドライバがインストールしてくれないので、ここを参考に設定する
[Windows8.1とSecureBootとBIOSと私](https://blog.tsukumo.co.jp/ex/2013/10/windows81securebootbios.html)
一応、残しておくと　僕のBIOSメニューでは”拡張機能”なる名目の中にWindows8/8.1メニューがあり
その中にSecure boot なんたらがありましたので無効にしておきました。
なお、Ubuntuインスール時に　サードパーティーをセキュリティする？だったかな、そんな設定を促される
場面がありましたが、その部分でもチェックしないでおいたらNVIDIAドライバがすんなり入りました。
（ここが一番たどり着くまでに時間がかかった場所）
このサイトにヒントがあった
[Ubuntu日本語フォーラム](https://forums.ubuntulinux.jp/viewtopic.php?id=18756)


BIOSメニューが終わるといよいよインスールするんだけど、installボタン押しても真っ暗？！になる
[nVidiaのGPU搭載PCにUbuntuを入れようとしてハマった](http://qiita.com/bohemian916/items/8c7f0c4b3d3ea0958559)


```
    インストールオプションが出たら、Try install Ubuntuにカーソルをあわせ、eキーを押す
    以下のように変更 
    quiet splash　を　nomodeset　に書き換える
```

以上でとりあえず入れる
だけどその後の事を考えてインストールが完了したあとに、UbuntuのGUI画面でターミナルを起動して以下(事前に  sudo apt-get install vim や　 sudo chmod 777 /etc/default/grub)

```
    /etc/default/grubを書き換える
    変更の適用には、 sudo update-grub
```

さらに、ディスプレイの解像度がおかしな挙動をしていたので続きに紹介されていた以下も
[Ubuntu起動画面(splash画面)が崩れてしまうときは](http://www.terakin.com/ja/blog/archives/81)

```
    /etc/default/grubへ
　　 GRUB_GFXPAYLOAD_LINUX=1920×1080-64  (僕の場合64bitにしてみたら綺麗だった）
　　次に、/etc/initramfs-tools/conf.d/splashというファイルを編集する。ここにはただ1行、
    FRAMEBUFFER=y
　　とだけ書く。
　　以下のコマンドを実行して、initramfsへの変更を有効にする。
    sudo update-initramfs -u -k all
　　以下のコマンドを実行して、grubへの変更を有効にする。
    sudo update-grub
```

これでとりあえずUbuntuだけなら使える環境になった。
あとでこまりそうだったのでターミナルの日本語フォルダを変更しておいた
[Ubuntuでホームディレクトリの中身を英語にする](http://qiita.com/taiko19xx/items/d1a001bfc25245b91354)


# NVIDIAドライバ CUDA cuDNNのインストール

この部分は何度も何度も繰り返して嫌になったけど、できたので結果うれしいよーーーこちらのサイト様様。
[GTX-1080でTensorFlow](http://qiita.com/Sert/items/48fafa5b28be5b739784)

順番として
1. gccのバージョンが古かったので sudo apt-get upgrade
2. 最初から入っている nvidia ドライバを無効に(これ重要かも）
3. NVIDIAドライバのインストール
4. CUDAのインストール
5. 再度、NVIDIAドライバのインストール
6. cuDNNのインストール
5. CUDAとcuDNNのパスを通す
~~6. sudo apt install nvidia-cuda-toolkit(cudaツールキットをインストール)~~ 
※cuda-toolkitコマンドは7.5を入れてしまい余計な作業だった(._.)
~~7. もう一度 CUDAのインストール（再度新しいものに）~~
8. 確認


## 1. gccのバージョンが古かったので sudo apt-get upgrade

```
$ sudo apt-get upgrade
$ gcc --version (5.4を確認）
```

そのままだけど、初期状態だとgccが少し古かったのでとりあえず、upgrade


## 2. 最初から入っている nvidia ドライバを無効に(これ重要かも）

こちらのサイトに助けてもらった
[Ubuntu16.04 + GTX965m + CUDA8.0](https://github.com/pothub/potwiki/wiki/Tensorflow)

```
     Nouveau というオープンソースの nvidia ドライバを無効に
     sudo gedit /etc/modprobe.d/blacklist-nouveau.conf

     以下を記載
     blacklist nouveau
     options nouveau modeset=0
     
     次回起動時に反映するよう設定
     sudo update-initramfs -u
```

## 3. NVIDIAドライバのインストール

[GTX-1080 など GeForce を Ubuntu 16.04 LTS で CUDA-8.0RC と共に使うGTX-1080](http://qiita.com/hidenorly/items/a3eb3a0375e6703d163b)より


```
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get update
$ sudo apt-get install nvidia-367 (最新が375だったけどとりあえず367に）
$ sudo apt-get install mesa-common-dev
$ sudo apt-get install freeglut3-dev
```

## 4. CUDAのインストール

https://developer.nvidia.com/cuda-toolkit

![Screenshot from 2017-01-05 18-43-30.png](https://qiita-image-store.s3.amazonaws.com/0/120949/ea1ede27-d081-ce33-35f8-ddc7a64e7d4f.png)


## 5. 再度、NVIDIAドライバのインストール

最初に紹介した[GTX-1080でTensorFlow](http://qiita.com/Sert/items/48fafa5b28be5b739784)より

```
     CUDAをインストールしたらGUIでログインできなくなった(どうやらドライバのせいらしい)ので再インストールする
     $ sudo apt-get install nvidia-367 --reinstall
     $ sudo reboot
```

## 6. cuDNNのインストール

最初に紹介した[GTX-1080でTensorFlow](http://qiita.com/Sert/items/48fafa5b28be5b739784)より

```
https://developer.nvidia.com/cudnn
ここのDownloadをクリック
cuDNN Download Survey はスルーしてページ下部の Proceed To Downloads をクリック
I Agree To.. にチェックして
Download cuDNN v5.1 (August 10, 2016), for CUDA 8.0 の中の
cuDNN v5.1 Library for Linux をクリックしてダウンロードする

※ダウンロードしたフォルダへ移動して
$ tar xvzf cudnn-8.0-linux-x64-v5.0-ga.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*
```

## 5. CUDAとcuDNNのパスを通す

最初に紹介した[GTX-1080でTensorFlow](http://qiita.com/Sert/items/48fafa5b28be5b739784)より

```
$ echo 'export CUDA_ROOT=/usr/local/cuda' >> ~/.bash_profile
$ echo 'export PATH=/usr/local/cuda/bin:$PATH' >> ~/.bash_profile
$ echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/lib:$LD_LIBRARY_PATH' >> ~/.bash_profile
$ echo 'export CPATH=/usr/local/cuda/include:$CPATH' >> ~/.bash_profile
```

パスを通すあたりいつもわかりにくいけど、こちらではすべて記載いただけて助かった。

~~## 6. sudo apt install nvidia-cuda-toolkit(cudaツールキットをインストール）~~

~~これはなにかというと
$ nvcc -V
とコマンドいれて、確認しようとしたら上記インストールをしろ！と言われたのでとりあえず~~


~~## 7. もう一度 CUDAのインストール（再度新しいものに）~~

~~先ほどの確認をしてみると~~
~~$ nvcc -V~~
     ~~7.5と表示されてcudaは8を最初インストールしたのにおかしいなと思いとりあえず再度インストールする~~


## 8. 確認
　　
```
$ cat /proc/driver/nvidia/version
$ nvidia-smi
```

すべてエラーがひょうじされなければOK!最後の　nvidia-smiでは表のようなものが表示されるよ

これで、とりあえずは完成。次にTensorFlow環境の構築

# 単純にしたかったので、Bazelのインストールはなしで公式サイト参照


そもそも、Bazelが必要な理由がわからなかったのと、とりあえず動かしたかったのと、こちらでも
ご紹介されている流れがシンプルでよかったので
[[TensorFlow] TensorBoardを動作させたいときはpipでインストールする](http://qiita.com/hitomatagi/items/b968ea086e31ef6cb26d)

順番
1. Python3環境構築
2. TensorFlow環境構築


## 1. Python3環境構築

[UbuntuでPythonの開発環境を整える](http://qiita.com/uryyyyyyy/items/268f8dc0d6ec3d7da7e3)

こちらではpython3を紹介していたので良かった。

なお、virtualenvは
$ sudo pip install virtualenv で入れておいた。
pipなのでパス通すなどなくてよかった。
virtualenvはとても好き

## 2. TensorFlow環境構築

公式サイト[Download and Setup](https://www.tensorflow.org/get_started/os_setup)
以下必要な部分のみ抜粋

```
# Ubuntu/Linux 64-bit
$ sudo apt-get install python-pip python-dev

$ pip install tensorflow-gpu　　（2017/01/06現在だと0.12.1が入る）

# Ubuntu/Linux 64-bit, GPU enabled, Python 3.5 
# Requires CUDA toolkit 8.0 and CuDNN v5. For other versions, see "Install from sources" below.
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.12.0-cp35-cp35m-linux_x86_64.whl
※上記exportは、 .bash_profile　に記載した

# Python 3
$ sudo pip3 install --upgrade $TF_BINARY_URL
BINARY_URLと書いてあったので以下の通り
$ sudo pip3 install --upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.12.0-cp35-cp35m-linux_x86_64.whl
```

これでエラーもでなかったので行ける！と思い試したらtensorflowがpipにないのでおかしいなと思い
再起動
そうしたら、ちゃんとはいってた。

サンプルテストしてみる

```
~$ python3
Python 3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609] on linux
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:3448] 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
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:925] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
I tensorflow/core/common_runtime/gpu/gpu_device.cc:951] Found device 0 with properties: 
name: GeForce GTX 1080
major: 6 minor: 1 memoryClockRate (GHz) 1.7335
pciBusID 0000:01:00.0
Total memory: 7.92GiB
Free memory: 7.62GiB
I tensorflow/core/common_runtime/gpu/gpu_device.cc:972] DMA: 0 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:982] 0:   Y 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:1041] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 1080, pci bus id: 0000:01:00.0)
>>> print(sess.run(hello))
b'Hello, TensorFlow!'
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print(sess.run(a + b)
... )
42
>>> 
```

サンプルで結果みたいだけだったのに、途中途中gpuがなんちゃらとか、I tensorflowだとかよくわからない
呪文がでてきたけど、気にしてはいない。多分うまく行っているはず！！

# もし見られた方がいておかしいとこあればご指摘お願いします(^_^;)