Ubuntu 16.04 LTS GPU deep learning 環境を整備 その2 pythonとDeep learningのpackage周り

全３回の２回目です。
1回めhttps://qiita.com/s_s_satoc/items/17c5bd35c37f0f39c14c
でNVIDIAドライバー、CUDA ToolkitとcuDNNのインストールまでをやりました。

- その1 NVIDIAドライバー、CUDA ToolkitとcuDNNのインストールまで
- <b>その2 pythonとDeep learningのpackage周り</b>
- その3 APC製のUPSの導入

となっています。今回はpythonとDeep learningのpackage周りの導入ついて軽く述べようと思います。

## どこにpythonおよびパッケージをインストールすべきなのか問題
個人的に仮想環境を極力使うべきではないと考えていました。というのも、むやみに仮想環境を作ると、自分自身が何を入れたのか、どのような目的で作ったのかが管理できなくなるからです。こう考え出したのは以前Anacondaで痛い目にあったからです。Anacondaは上手く使えばとても便利なのだと思うのですが、一気に自分の知らないパッケージをインストールする&対応していないパッケージがあることが問題だと思います。これで、自分が認知していないパッケージとpipでinstallしたパッケージが干渉していたりすると、問題解決が一気に難しくなります。これを回避するために、メンドくさくてもpipでインストールし、自分でインストールしたパッケージを把握すべきだと考えています



## がpipでは上手くいかなった。
私は主にCSとバイオの間の怪しげな領域で研究をしているので、プログラムそのものを何度も使い回しシステムを回していくとゆうよりも、入れたデータと出力された結果がわかりやすい形で結びついていることが大事です。その意味でjupyter notebookは一つの理想形なわけです。ですので、前回作成したGPU Deep learaning環境がjupyter上で動いてくれないと困るのですが、これがNative pipではうまくて行きませんでした。理由はこのページhttp://pyth0n.hatenablog.com/entry/2016/10/28/jupyterでimport_error
なんかが詳しいのですが、native jupyterでmoduleをインストールした際の参照先が違っていることみたいでした。
というのも、Ubuntu 16.04 LTSではデフォルトでpython2系と3系が両方入っているのですが、native jupyterでmoduleをインストールした際の参照先2系のフォルダになっているっぽいのです（調べた）。上のページのように参照先を変更する方法もあるとは思うのですが、今後追加モジュールを入れる際に面倒なことになりそうだと判断（入れたモジュール本体がどこにあんの&パスが通ってるのか問題）、大人しく仮想環境を使うことにしました。

## 方針　どうせなら　python3.6を使いたい
せっかく仮想環境を構築するならpython3.6系を使いたいと思います。ですので、pyenvでデフォルトでpython3.6.4に変えた上でvirtualenvで仮想環境を作り、そこにTensorflowとchainerを入れます。

## pyenvのインストール
gitでインストール

```:terminal
$ sudo git clone git://github.com/yyuu/pyenv.git ./pyenv
```

パスを通す

```:terminal
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >>  ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
```

zsh使い（とか比較的新しい　macはこっち）

```:terminal
echo 'export PYENV_ROOT="$HOME/.pyenv"' >>  ~/.zshrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
```

ターミナル再起動または

```:terminal
$ source ~/.bashrc 
```
でパスが書き込まれたbashrcを読み込む。
続いて、インストールできるpythonのリストを表示する。

```:terminal
$ source ~/.bashrc 
#ズラーっとインストールできるpythonのverがでる。
```

インストールとpythonのverの切り替え

```:terminal
#インストール
$ pyenv install 3.6.4

#pythonのデフォルトのverの切り替え
pyenv global 3.6.4

#切り替わったかの確認
$ python --version
Python 3.6.4
```
とちゃんと表示されたらOK!

## virtualenvとはつまり何なのか
ハッカーの多くはちゃんとした方なので正確な表現を好みます。ですので、python仮想環境にも正確な表現が多くて個人的にはザクっとした内容が掴みづらかったです。超初心者的な目線からザクっとvirtualenvについて述べると
1.pythonのverを含んだ色んなmoduleをあるフォルダ内に突っ込んでおくと
2.そのフォルダに行き魔法を唱えることで
3.pythonのverとmoduleを引っ張ってきてglobalに反映できる
という手段なのだと理解しています。

## virtualenvのインストール
インストールはeasy にイケる

```:terminal
$ sudo easy_install virtualenv
```

## virtualenvの使い方

突っ込むようのフォルダを適当な場所に作る

```:terminal
$ mkdir learning_1
```

virtualenvコマンドを実行

```:terminal
$ virtualenv --no-site-packages learning_1
```
大事なのは　--no-site-packagesオプションをつけて余計なpackageを引っ張ってこないこと。
フォルダに移動して、魔法を唱えて仮想環境を起動（pythonのverとmoduleを引っ張ってきてglobalに反映する）

```:terminal
$ cd learning_1
$ source bin/activate

(learning_1)%
```
とコンソールに表示されたらOK!

仮想環境を終了するには

```:terminal
(learning_1)% deactivate 
```

でOK!

## tensorflowのインストール
ここまでくればあとはシンプルにpipで入れていくだけ。

```:terminal
(learning_1)% pip install --upgrade tensorflow-gpu
```
これだけ

## kerasのインストール

```:terminal
(learning_1)% pip install keras
```
超easy


## chainerの諸々のインストール
先にcupyをインストールし、その後chainerをインストール

```:terminal
(learning_1)% pip install cupy
(learning_1)% pip install chainer
```

## 最後に機械学習諸々に必要そうなやつをインストール

```:terminal
(learning_1)% pip install scipy   
(learning_1)% pip install matplotlib
(learning_1)% pip install scikit-learn
(learning_1)% pip install jupyter
(learning_1)% pip install seaborn
```

これでOKです。最後にjupyterを起動して適当なスクリプトがきっちり、GPUで走るかを確認してください。その際にjupyterを使うなら、きっちりlearn_1がactiveになっている状態でjupyterを起動すると。