CentOS 7にNVIDIA GeForce GTX TITAN Xを導入

ワークステーションにTitan Xを導入しChainerを動かすところまで．

# 実際に試した時の構成
* CentOS 7.1
* GeForce GTX TITAN X

# 参考資料

やはり公式が一番：
https://developer.nvidia.com/cuda-downloads

「Chapter 4. RUNFILE INSTALLATION」を参考にすれば良い．

2015.07.08時点ではyum経由でInstallすると，ドライバが競合するらしい（噂．未確認）
そのため，RUNファイル経由でのインストールを以下では行う．
また，ドライバのインストールもyum経由ではなくRUNファイルで行った．
（2015.07.08時点では公式のrpmパッケージ (xorg-x11-drv-nvidia) のバージョンが346.46，Titan Xの対応は346.59かららしい）

NVIDIAのドライバインストールは下記のサイトを参考にした：
[Smiling Life : CentOS7におけるNVIDIAドライバのインストール方法](http://blog.livedoor.jp/rootan2007/archives/52090548.html)

# ドライバのインストール
下記のコマンドによってグラフィックカードが何かを確認．

```
$ lspci | grep -i nvidia
```

名称が書かれていない場合には下記のコマンドを打つと良いらしい：

```
$ update-pciids
```

ドライバは下記のページからダウンロードできる：
http://www.nvidia.co.jp/Download/index.aspx?lang=jp

2015.07.08時点で最新版は352.21．製品サポートリストにも「Titan X」が含まれていることを確認．
ダウンロードしたファイル名は`NVIDIA-Linux-x86_64-352.21.run`．

## Nouveauドライバの無効化
CUDAを入れるためにNouveauを無効化する必要があるらしい．
（[Nouveau](](https://ja.wikipedia.org/wiki/Nouveau)): NVIDIAドライバのフリー版）

下記コマンドによりNouveauドライバが読み込まれているか確認．

```
$ lsmod | grep nouveau
```

Nouveauドライバが読み込まれている場合には，2つのファイルを編集し再起動することで無効化する必要がある．

`/etc/modprobe.d/modprobe.conf`に下記1行を追加：

```
blacklist nouveau
```

`/etc/modprobe.d/nouveau_blacklist.conf`に下記1行を追加：

```
blacklist nouveau
```

追記後は再起動が必要．

下記コマンドによりNouveauドライバが読み込まれていないか確認．

```
$ lsmod | grep nouveau
```
何も表示されなければ良い．

## ランレベルを下げる

CUIにてドライバをインストールする必要がある．下記コマンドを入力し

```
$ systemctl get-default
```

`graphical.target`ならば以下のコマンドを入力し再起動する必要があるが，`multi-user.target`ならば問題ない．

```
$ systemctl set-default multi-user.target
```


## RUNファイルによるNVIDIAドライバのインストール

root権限で実行:

```
$ sudo sh NVIDIA-Linux-x86_64-352.21.run
```

# CUDAのインストール
公式サイトより，今回は`cuda_7.0.28_linux.run`をダウンロード．

root権限で実行:

```
$ sudo sh cuda_7.0.28_linux.run
```

# chainerの導入
以下のコマンドでソースごと取得:

```
$ git clone https://github.com/pfnet/chainer.git
```

あとはREADMEに従って，必要なパッケージをインストールしておく．

chainerのパッケージインストール:

```
$ cd chainer
$ python setup.py install
```

CUDA関連のパッケージインストールのための準備として，`.bashrc`などに以下の3行を追加:

```
export CUDA_DIR=/usr/local/cuda
export CUDA_INC_DIR=/usr/local/cuda/include
export PATH=$PATH:/usr/local/cuda/bin
```

`source ~/.bashrc`を忘れずに．

CUDA関連のパッケージインストールスクリプトを実行:

```
$ python cuda_deps/setup.py install
```

# 動作検証

## 準備

chainerのmnistを1 epochだけ実行してみる．

```
$ cd examples/mnist/
$ sed -i 's/n_epoch = 20/n_epoch = 1/g' train_mnist.py
```

データだけをダウンロードしていったん終了させる:

```
$ python train_mnist.py
load MNIST dataset
Downloading train-images-idx3-ubyte.gz...
Done
Downloading train-labels-idx1-ubyte.gz...
Done
Downloading t10k-images-idx3-ubyte.gz...
Done
Downloading t10k-labels-idx1-ubyte.gz...
Done
Converting training data...
Done
Converting test data...
Done
Save output...
Done
```

↑で「Ctrl+C」を押していったん終了．

## 計測結果

### CPU利用

```
$ time python train_mnist.py
load MNIST dataset
('epoch', 1)
graph generated
train mean loss=0.276497786877, accuracy=0.914633335241
test  mean loss=0.104770960066, accuracy=0.967400007248

real	4m54.224s
user	4m52.819s
sys 	0m1.339s
```

### GPU利用

```
$ time python train_mnist.py --gpu 1
load MNIST dataset
('epoch', 1)
graph generated
train mean loss=0.278076749947, accuracy=0.914699982107
test  mean loss=0.115648652349, accuracy=0.964599978924

real	0m19.351s
user	0m8.110s
sys 	0m11.214s
```

**約15倍の高速化！**