TensorFlow-GPU 環境構築 2018年3月

# はじめに

機械学習系の環境を定期的に一から作りなおすことにしている
そこで得たノウハウを記録に残しておきたい

クリーンインストールした Linux でやっていく
ローカルマシンとして利用する想定

Linux Mint 18.3 Cinnamon 64-bit

Ubuntu 16.04 でもたぶん同じ方法でいけるはず
ただしデスクトップ環境としては、 Mint のほうがより安定していると感じた

MacでUbuntu 16.04ブータブルUSBの作成
http://blog-sk.com/mac/ubuntu_bootusb/

- i5-2500K
- GTX980

# CUDA 関係

NVIDIA CUDA Installation Guide for Linux
http://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html

インストールには

- deb (apt-get)
- run

の２種類あるが、いろいろと楽な deb を使う

## 準備

TensorFlow はビルド済みのを導入するので、CUDA 系のバージョンをあらかじめ確認しておかなければいけない
トラブルの大半はバージョン関係の問題なので、ここが地味に大事
https://www.tensorflow.org/install/install_sources#tested_source_configurations

![tf-cuda-version.png](https://qiita-image-store.s3.amazonaws.com/0/202534/7f000ee0-d358-586b-81c3-b73f2c13a891.png)

tensorflow-1.6/1.5 の両方に対応している CUDA 9, cuDNN 7 にする

CUDA Toolkit のページから Legacy Releases
https://developer.nvidia.com/cuda-toolkit-archive

![cudainstall.png](https://qiita-image-store.s3.amazonaws.com/0/202534/69f66a62-3ab9-a309-1433-56182fc7f618.png)

ダウンロードして３行目までを実行

```shell
$ sudo dpkg -i cuda-repo-ubuntu1604_9.0.176-1_amd64.deb
$ sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
$ sudo apt-get update
```

## Driver (nvidia-390) をインストール

このタイミングでインストールしておかないと依存関係が解決されなかった（なぜだかよくわからないが）
再起動が必要

![driver.png](https://qiita-image-store.s3.amazonaws.com/0/202534/938d8e6f-5ffb-df3c-ff79-01ff114afc3c.png)

## CUDA 9.0 をインストール

ちゃんとバージョンを指定する
指定しておかないと、最新版 9.1 が入ってややこしいことになる（とは言っても PATH の指定でどうとでもなるが）

```shell
$ sudo apt-get install cuda-9-0
```

## CUDA インストール後

PATH 追加のとき、直接ファイルを編集せずに echo を使うなら、 $ をエスケープしないといけない
PATH 追加先は .profile（私の場合）

- ubuntu 系
- ローカルで使用
- .bash_login, .bash_profile がないことを確認

```shell
$ echo "export PATH=/usr/local/cuda-9.0/bin\${PATH:+:\${PATH}}" >> ~/.profile
$ source ~/.profile
$ sudo /usr/bin/nvidia-persistenced --verbose
$ sudo apt-get install g++ freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libglu1-mesa libglu1-mesa-dev
```

## cuDNN 7.0 をインストール

アカウント作成とログインが必要
https://developer.nvidia.com/rdp/cudnn-download

- cuDNN v7.0.5 Runtime Library for Ubuntu16.04 (Deb)
- cuDNN v7.0.5 Developer Library for Ubuntu16.04 (Deb)
- cuDNN v7.0.5 Code Samples and User Guide for Ubuntu16.04 (Deb)

```shell
$ sudo dpkg -i *.deb
```

# Python 一式 (Anaconda) インストール

- NumPy や Jupyter などをいちいちインストールするのが面倒
- 必要なら新たに仮想環境をつくれる
- トラブったらインストールフォルダごと消し去ればOK

Anaconda3 ダウンロード
https://www.anaconda.com/download/#linux

最近だと PATH は追加しないで、 `conda activate/deactivate` を使うのが標準的
下の設定だと、 zsh を立ち上げたら自動的にデフォルトの仮想環境 (base) に入る

```shell
$ sh ./Anaconda3-5.1.0-Linux-x86_64.sh
$ echo ". /home/<username>/anaconda3/etc/profile.d/conda.sh" >> ~/.bashrc
$ echo ". /home/<username>/anaconda3/etc/profile.d/conda.sh" >> ~/.zshrc
$ echo "conda activate" >> ~/.zshrc
```

# TensorFlow 1.6 インストール

Installing Tensorflow on Ubuntu
https://www.tensorflow.org/install/install_linux

面倒なのでデフォルトの仮想環境にインストールする

```shell
$ sudo apt-get install cuda-command-line-tools
$ echo "export LD_LIBRARY_PATH=\${LD_LIBRARY_PATH}\${LD_LIBRARY_PATH:+:}/usr/local/cuda/extras/CUPTI/lib64" >> ~/.profile
$ conda activate
(base)$ pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-1.6.0-cp36-cp36m-linux_x86_64.whl
```

# 動作チェック

Using GPUs | TensorFlow Programmer's Guide
https://www.tensorflow.org/programmers_guide/using_gpu

```shell
$ conda activate
(base)$ jupyter notebook
```
1. Jupyter notebook を起動
2. New → Python 3 から新しくノートブックを作成
3. 下の内容をセルに入力し、 Shift+Enter で実行

```python:Jupyter_notebook
import tensorflow as tf

hello = tf.constant('Hello, TensorFlow!')
with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as sess:
    print(sess.run(hello))
```

![tf-test2.png](https://qiita-image-store.s3.amazonaws.com/0/202534/fdeb6b9d-3039-01bf-4e63-8ee7ea344c6f.png)

import 時の Warning は気にしなくてよさそう
Jupyter を起動したターミナルを確認し、 GPU が認識されていて、エラーが出ていなければ OK

```shell:ログ
2018-03-04 11:16:58.334216: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:898] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2018-03-04 11:16:58.334554: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1212] Found device 0 with properties: 
name: GeForce GTX 980 major: 5 minor: 2 memoryClockRate(GHz): 1.291
pciBusID: 0000:01:00.0
totalMemory: 3.95GiB freeMemory: 3.45GiB
2018-03-04 11:16:58.334583: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1312] Adding visible gpu devices: 0
2018-03-04 11:16:58.557392: I tensorflow/core/common_runtime/gpu/gpu_device.cc:993] Creating TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 3178 MB memory) -> physical GPU (device: 0, name: GeForce GTX 980, pci bus id: 0000:01:00.0, compute capability: 5.2)
Device mapping:
/job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: GeForce GTX 980, pci bus id: 0000:01:00.0, compute capability: 5.2
2018-03-04 11:16:58.585013: I tensorflow/core/common_runtime/direct_session.cc:297] Device mapping:
/job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: GeForce GTX 980, pci bus id: 0000:01:00.0, compute capability: 5.2

Const: (Const): /job:localhost/replica:0/task:0/device:CPU:0
2018-03-04 11:16:58.595781: I tensorflow/core/common_runtime/placer.cc:875] Const: (Const)/job:localhost/replica:0/task:0/device:CPU:0
```