Nvidia Opimusを搭載したノートPCにDigits構築


【参考】
[1. NVidia Optimusを搭載したノートPCでUbuntu14.04＋CUDA7.0を動かしてみた](http://qiita.com/FaithnhMaster/items/b129268ef4718e61dd9a#%E5%8F%82%E8%80%83%E8%A8%98%E4%BA%8B)
[2. NVidia Optimus＋Ubuntu14.04のノートPC環境でTensorflow 0.7.1を導入してみた](http://qiita.com/FaithnhMaster/items/15912b3c033a12c6219a#_reference-d9efa53d852612200553)
[3. Ubuntu, NVIDIAディスプレイドライバで困ったときに使うコマンド](http://qiita.com/bohemian916/items/64ca4bb11a0ccb019794)
[4. BUG: unable to handle kernel NULL pointer dereference](https://codeyarns.com/2015/03/30/nvidia-module-taints-linux-kernel/)
# Ubuntu14.04
* パーティション：
1．22000M　基本　etx4　/ 
2．200M　  基本　etx4　/root
3．8000M(メモリ容量以上)　 基本　 swp
4．残り　　基本　etx4　/home
* 日本語フォルダを英語に戻す
```bash
LANG=C xdg-user-dirs-gtk-update
```
* 電源ボタン押下時に、確認ダイアログをスキップしてPCをシャットダウン

```bash: /etc/acpi/events/powerbtn
- #action=/etc/acpi/powerbtn.sh
+ action=shutdown -P now
```

* 必要なソフト導入

```bash
sudo apt-get install lv vim openssh-server samba
```
1. sambaサーバ設定

```bash
sudo mkdir –p /data/img.digits 
sudo chmod 777  /data -R
```

```bash:/etc/samba/smb.conf
[img.digits]
   path = /data/img.digits
   writeable = true  
   force create mode = 0666
   force directory mode = 0777
   guest ok = yes
   guest only = yes
```

```bash
sudo service smbd restart
```

# Optimus, Driver, CUDA, cuDNN

## NVidia Optimus対応
【落とし穴：①】
LinuxではNVidia Optimus（CPU 内臓GPU と　NVidia GPUを自動切り換えて、消費電力を抑える技術です。）に対応してない為、別途Optimus対応ツールbumblebeeが必要です。

```bash
# bumblebeeのリポジトリ追加＋最新版へ更新
sudo add-apt-repository ppa:bumblebee/stable
sudo apt-get update

# bumblebee一式のインストール(公式ページでのubuntu14.04のインストール方法を参考)
sudo apt-get install bumblebee bumblebee-nvidia primus linux-headers-generic
```

## NVidia ドライブ
CUDA7.5を入れる為、352以上が必要そうです。

```bash
sudo apt-get install nvidia-352 nvidia-settings
```

nvidia-352をbumblebeeで利用するように

```bash
sudo vim /etc/bumblebee/bumblebee.conf
# 次のように変更します
22行: Driver=nvidia
55行: KernelDriver=nvidia-352
58行: LibraryPath=/usr/lib/nvidia-352:/usr/lib32/nvidia-352
61行: XorgModulePath=/usr/lib/nvidia-352/xorg,/usr/lib/xorg/modules
```

### nvidia-352をブラックリストに登録
nvidia-352をインストールした場合、bumblebeeを起動する前にnvidia-352を有効になってしまいます。そうなると、bumblebeeが起動せず、Ubuntuが正しく起動しません（UbuntuのGUI起動後真っ暗にるそうです）

20161013現在では既にデフォルトに登録されているようですが、もし無ければ、以下の手順で追加

```bash
sudo vim /etc/modprobe.d/bumblebee.conf
# 以下を追加
blacklist nvidia-352
blacklist nvidia-352-updates
blacklist nvidia-experimental-352
```

## CUDA
[CUDA 7.5](https://developer.nvidia.com/cuda-75-downloads-archive)をダウンロード
debパッケージでもインストールできますが、細かいオプションが利かないため、runパッケージをダウンロードします！
【落とし穴：②】
何も考えずにインストールすると、OpenGLライブラリもインストールされます。このライブラリがインストールすることによって、Ubuntuがログインできなくなるそうです。しかも、アンインストールしても元に戻らなかったため、ご注意！！！

OpenGL無しでインストール

```bash
sudo ./cuda_7.5.18_linux.run --no-opengl-libs

# 当然accept
Do you accept the previously read EULA? (accept/decline/quit): accept
# 必要らしいので, y
Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 346.46? ((y)es/(n)o/(q)uit): y

# CUDA本体なので, y
Install the CUDA 7.5 Toolkit? ((y)es/(n)o/(q)uit): y

# CUDAの入れる場所を尋ねられます。ここはデフォルトのままなので、そのままENTER
Enter Toolkit Location [ default is /usr/local/cuda-7.5 ]:

# シンボリックリンクをはるか尋ねられますが、実効に必要なので y
Do you want to install a symbolic link at /usr/local/cuda? ((y)es/(n)o/(q)uit): y

# サンプルを入れるかどうか尋ねられますが、動作確認したいので y
Install the CUDA 7.5 Samples? ((y)es/(n)o/(q)uit): y

# サンプルの入れる場所はデフォルトにしときます
Enter CUDA Samples Location [ default is /home/faithnh ]: 

#パス追加
vim ~/.bashrc

# 以下を追加

# for CUDA
export PATH=$PATH:/usr/local/cuda-7.5/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-7.5/lib64
source ~/.bashrc
```

### サンプルで確認
bumblebeeでは、デフォルトGPUは有効になっていないため、GPUは認識しないようです。
GPUを有効にして実行させるためにはoptirunコマンドを挟んで実行しなければなりません。

```bash
cd ~/NVIDIA_CUDA-7.5_Samples/bin/x86_64/linux/release
sudo optirun ./mergeSort 

./mergeSort Starting...

GPU Device 0: "GeForce 610M" with compute capability 2.1

Allocating and initializing host arrays...

Allocating and initializing CUDA arrays...

Initializing GPU merge sort...
Running GPU merge sort...
Time: 1037.418945 ms
Reading back GPU merge sort results...
Inspecting the results...
...inspecting keys array: OK
...inspecting keys and values array: OK
...stability property: stable!
Shutting down...
```

## cuDNN
[cuDNN](https://developer.nvidia.com/rdp/cudnn-download)ダウンロード

```bash
tar -zxf cudnn-7.0-linux-x64-v4.0-prod.tgz 
cd cuda
sudo cp lib64/lib* /usr/local/cuda/lib64/
sudo cp include/cudnn.h /usr/local/cuda/include/
```

# Caffe
基本的に[こちら](https://github.com/NVIDIA/DIGITS/blob/master/docs/BuildCaffe.md)通りやります。

```bash
sudo apt-get install --no-install-recommends build-essential cmake git gfortran libatlas-base-dev libboost-all-dev libgflags-dev libgoogle-glog-dev libhdf5-serial-dev libleveldb-dev liblmdb-dev libopencv-dev libprotobuf-dev libsnappy-dev protobuf-compiler python-all-dev python-dev python-h5py python-matplotlib python-numpy python-opencv python-pil python-pip python-protobuf python-scipy python-skimage python-sklearn
#path 追加
vim ~/.bashrc
# export CAFFE_ROOT=~/caffe
source ~/.bashrc
#build
git clone https://github.com/NVIDIA/caffe.git $CAFFE_ROOT
sudo pip install -r $CAFFE_ROOT/python/requirements.txt
cd $CAFFE_ROOT
mkdir build
cd build
cmake ..
make --jobs=4
```

# DIGITS
基本的に[こちら](https://github.com/NVIDIA/DIGITS/blob/master/docs/BuildDigits.md)通りやります。

```bash
sudo apt-get install --no-install-recommends git graphviz python-dev python-flask python-flaskext.wtf python-gevent python-h5py python-numpy python-pil python-pip python-protobuf python-scipy
#path 追加
vim ~/.bashrc
# export DIGITS_ROOT=~/digits
source ~/.bashrc
#build
git clone https://github.com/NVIDIA/DIGITS.git $DIGITS_ROOT
sudo pip install -r $DIGITS_ROOT/requirements.txt
```

サーバー起動、NVidia GPUを使う為、optirunを忘れず！！！

```bash
# Starts a server at http://localhost:5000/.
cd $DIGITS_ROOT
optirun ./digits-devserver
```