Ubuntu18.04で何もないところからTensorでのDeepLearning環境を整えるまで

# はじめに
手持ちのmacじゃGPU動かせないし気軽に回せないなあ，と思いなかなか手がつけれていなかったLinuxを動かしていくぞ！というお気持ちでとりあえず書いた記事です．

簡単にいうと，研究室内のLinuxサーバーでユーザーをもらったので，TensorなどでGPUを動かせるまでにした時の覚え書きです．自分用メモ．

基本的にこちらの[ubuntu18.04でTensorFlow-gpuを動かす](https://qiita.com/sho8e69/items/66c1662c49ac89a024be)を参考にしながら進めていきます．

英語だけど[A step by Step Guide to Install Tensorflow GPU on Ubuntu 18.04 LTS](https://medium.com/@kekayan/step-by-step-guide-to-install-tensorflow-gpu-on-ubuntu-18-04-lts-6feceb0df5c0)も参考になりました．

# 環境
- HP Z640 Workstation
- OS: Ubuntu 18.04LTS
- メモリ: 256GB
- GPU: GeForce GTX 1080 Ti

# 手順
## パスワード変更
ユーザーをsudo権限付きでいただいたので，パスワード変更をしましょう

```sh
$ passwd [ユーザー名]

(current) UNIX password: 
Enter new UNIX password: 
Retype new UNIX password: 
```
現在のパスワードを入れた後に２回新しいパスワードを入れれば完了です．

```sh
passwd: password updated successfully
```

## Nvidia driverのインストール
とりあえず下記コマンドで現在の状況を確認します．

```sh
$ nvidia-smi
```
すると，

```
Wed Nov 20 13:44:59 2019       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.129                Driver Version: 390.129                   |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Quadro K620         Off  | 00000000:02:00.0  On |                  N/A |
| 34%   39C    P8     1W /  30W |    124MiB /  1994MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  GeForce GTX 108...  Off  | 00000000:03:00.0 Off |                  N/A |
| 23%   40C    P8    26W / 250W |      2MiB / 11178MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      2599      G   /usr/lib/xorg/Xorg                            49MiB |
|    0      2929      G   /usr/bin/gnome-shell                          71MiB |
+-----------------------------------------------------------------------------+
```
と出てきましたので，すでにインストールされているようです．
なので次，CUDA cuDNNを導入していきます．

## CUDA9.0とcuDNNのインストール
これもとりあえず下記コマンドで確認です．

```sh
$ nvcc -V
```
```
Command 'nvcc' not found, but can be installed with:

apt install nvidia-cuda-toolkit
Please ask your administrator.
```
と出てきたので，こちらはインストールが必要なようですね．
`Please ask your administrator`とあります，管理者権限もらっといてよかった．


ではインストールを進めていきます．


参考にしているこちらの
[ubuntu18.04でTensorFlow-gpuを動かす](https://qiita.com/sho8e69/items/66c1662c49ac89a024be)
や，
[GPU付きのTensorflowをUbuntu18.04に入れる](https://qiita.com/python_walker/items/d599aeeea673bf89b7cb)
では最新のCUDA10.0はTensorflow-gpuがサポートされていないとのことでCIDA9.0をインストールしていました．

どちらも1年前ほどの記事なので，2019年11月20日現在， [Tensorflowの公式ウェブサイト](https://www.tensorflow.org/install/gpu)を見てみると，

>The following NVIDIA® software must be installed on your system:
NVIDIA® GPU drivers —CUDA 10.0 requires 410.x or higher.
CUDA® Toolkit —TensorFlow supports CUDA 10.0 (TensorFlow >= 1.13.0)
CUPTI ships with the CUDA Toolkit.
cuDNN SDK (>= 7.4.1)
(Optional) TensorRT 5.0 to improve latency and throughput for inference on some models.

と書いてありました．

`CUDA® Toolkit —TensorFlow supports CUDA 10.0 (TensorFlow >= 1.13.0)`
とあるので，どうやら1.13.0以上のTensorFlowを使うのであればCUDA10.0でも大丈夫なようです．

ただ，`NVIDIA® GPU drivers —CUDA 10.0 requires 410.x or higher.`とあります．
あれ，nvidiaのバージョンいくつだったっけ？と確認しに戻ります．

```sh
$ nvidia-smi
Wed Nov 20 13:44:59 2019       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.129                Driver Version: 390.129                   |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Quadro K620         Off  | 00000000:02:00.0  On |                  N/A |
| 34%   39C    P8     1W /  30W |    124MiB /  1994MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  GeForce GTX 108...  Off  | 00000000:03:00.0 Off |                  N/A |
| 23%   40C    P8    26W / 250W |      2MiB / 11178MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      2599      G   /usr/lib/xorg/Xorg                            49MiB |
|    0      2929      G   /usr/bin/gnome-shell                          71MiB |
+-----------------------------------------------------------------------------+
```
390.120でした．
nvidiaをアップデートするかCUDAを9.0にするか，どちらかのようです．

そもそも使用しているGPUの対応は大丈夫なのかな？と思い，[こちら](https://www.nvidia.co.jp/Download/index.aspx?lang=jp)で確認．

<img width="723" alt="スクリーンショット 2019-11-20 14.33.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377099/63f76075-a221-fa08-589c-a9cf9d02671a.png">
製品の名前を入れて，SEARCHをクリック．

<img width="709" alt="スクリーンショット 2019-11-20 14.33.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377099/0b410603-5a37-6881-a450-e9234b47b543.png">

440.31のバージョンのドライバインストールを推奨されました．どうやら全然大丈夫みたい．

nvidiaをアップデートしてTensorFlow1.13.0とCUDA10.0を入れるか，TensorFlow1.12.0以前のものとCUDA9.0でいくか30秒ほど悩んだ結果，後者でいくことにしました．

まあ，一応共用のサーバーなので，アップデートしてなんかあったら困るし，最新より一つ前の方がなんか安心．

ちなみに，このNvidiaとかCUDAとかTensorFlowとかのバージョン関係のことを調べるにあたり，こちらの記事→[NvidiaドライバとCUDAとcuDNNとTensorflow-gpuとPythonのバージョンの対応](https://qiita.com/konzo_/items/a6f2e8818e5e8fcdb896)
がとっても参考になりました！ありがとうございます．


ではようやく，CUDA9.0のインストールに進みます．
NVIDIAの公式インストールページ→[CUDA Toolkit 9.0 Downloads](https://developer.nvidia.com/cuda-90-download-archive?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=1704&target_type=deblocal)にアクセスし，下のように選択．
18.04がないので良いのかな？と思いましたが，調べてみると17.04のもので大丈夫のようです．

<img width="873" alt="スクリーンショット 2019-11-20 14.57.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377099/316db5d6-0c8c-c047-f38d-123615d50696.png">

<img width="855" alt="スクリーンショット 2019-11-20 16.56.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377099/2b02598f-cdc7-b5c0-4f99-1cb86ca8411e.png">


今回はローカルから作業しているのでダウンロードしてscpでサーバーに送ります．

```sh:local
$ scp -P [ポート番号] Downloads/cuda-repo-ubuntu1704_9.0.176-1_amd64.deb [ユーザー名]@[IPアドレス]:[コピー先パス]
```
普段ポート指定 -p だけど，scpの時は-Pです．


```sh
$ wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/[debファイル]
```
でも良い．

その後，公式サイトに沿ってインストールを進めます．
**なお，最後の`sudo apt-get install cuda`だと最新のものがインストールされてしまうようなので，末尾に対応するバージョンを指定することが大事みたい．
今回は，`-toolkit-9-0`を追加．**

```sh
$ sudo dpkg -i cuda-repo-ubuntu1704_9.0.176-1_amd64.deb
$ sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1704/x86_64/7fa2af80.pub
$ sudo apt-get update
$ sudo apt-get install cuda-toolkit-9-0
```

次にPATHを通す作業が必要のようです．
以下のコマンドを入力し，「.bashrc」を編集．

```sh
$ nano ~/.bashrc
```
末尾に以下の文字列を入力し保存．

```sh:.bashrc
export PATH=/usr/local/cuda-9.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
```
再起動

```sh
$　sudo reboot
```
起動後，以下のコマンドでCUDAがインストールされているか確認．

```sh
$ nvcc -V
```

```
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2017 NVIDIA Corporation
Built on Fri_Sep__1_21:08:03_CDT_2017
Cuda compilation tools, release 9.0, V9.0.176
```
と表示されたのでOK.

## cuDNNのインストール
cuDNNはCUDAと一緒にインストールする多ライブラリで，CUDAを用いてGPU上で計算を高速に行うためのものみたいです．

下記のサイトにアクセスし，会員登録をする必要があります．
https://developer.nvidia.com/rdp/cudnn-download

その後，`Download cuDNN v7.6.4 for CUDA9.0`から以下の3つをインストール．

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

ダウンロードしたディレクトリで，以下のコマンドを順に実施．
バージョンのところは適宜ダウンロードしたバージョンに変えましょう．

```sh
$ sudo dpkg -i libcudnn7_7.6.4.38-1+cuda9.0_amd64.deb
$ sudo dpkg -i libcudnn7-dev_7.6.4.38-1+cuda9.0_amd64.deb
$ sudo dpkg -i libcudnn7-doc_7.6.4.38-1+cuda9.0_amd64.deb
```
これでcuDNNのインストールは終了です．

## pyenv, Anacondaのインストール，環境構築（Python環境の構築）
pyenvからAnacondaをインストールして，いつでもpyenvでAnacondaのバージョンを切り替えられるようにしながら，Anacondaで仮想環境を作り作業していくという環境を作成したいのです．

### pyenv

```sh
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
$ nano ~/.bashrc
```
インストールしたら，`.bashrc`に以下を追記．

```.bashrc
export PYENV_ROOT=$HOME/.pyenv
export PATH=$PYENV_ROOT/bin:$PATH
eval "$(pyenv init -)"
```
再起動して，pyenvのパスが通っていることを確認したらAnacondaのインストールに進みます．

### Anaconda

```sh
$ pyenv install --list | grep anaconda
```
でインストールできるAnacondaのバージョンを確認．
今回は5.2.0をインストールします．

```sh
$ pyenv install anaconda3-5.2.0
```

バージョンを切り替えて，反映されているか確認します．

```sh
$ pyenv global anaconda3-5.2.0
$ pyenv versions
  system
* anaconda3-5.2.0 (set by /home/okuda/.pyenv/version)
$ python --version
Python 3.6.5 :: Anaconda, Inc.
```
良さそうです．

次にanacondaで仮想環境を作成します．

```sh
$ conda -V
conda 4.5.4
```
しっかりと動いていることを確認して，

```sh
$ conda create -n tensor pip python=3.6
```
で`tensor`と言う名前の仮想環境を作成します．pipとpython3.6も一緒にインストール．

そして仮想環境の切り替えを行いたいところですが，
pyenv環境上でanacondaを使用する時にそのままでは`conda activate`が使用できないのです．

```sh
$ conda activate tensor
CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
If your shell is Bash or a Bourne variant, enable conda for the current user with

    $ echo ". /home/okuda/.pyenv/versions/anaconda3-5.2.0/etc/profile.d/conda.sh" >> ~/.bashrc

or, for all users, enable conda with

    $ sudo ln -s /home/okuda/.pyenv/versions/anaconda3-5.2.0/etc/profile.d/conda.sh /etc/profile.d/conda.sh

The options above will permanently enable the 'conda' command, but they do NOT
put conda's base (root) environment on PATH.  To do so, run

    $ conda activate

in your terminal, or to put the base environment on PATH permanently, run

    $ echo "conda activate" >> ~/.bashrc

Previous to conda 4.4, the recommended way to activate conda was to modify PATH in
your ~/.bashrc file.  You should manually remove the line that looks like

    export PATH="/home/okuda/.pyenv/versions/anaconda3-5.2.0/bin:$PATH"

^^^ The above line should NO LONGER be in your ~/.bashrc file! ^^^
```

と怒られます．
>If your shell is Bash or a Bourne variant, enable conda for the current user with
>
>    $ echo ". /home/okuda/.pyenv/versions/anaconda3-5.2.0/etc/profile.d/conda.sh" >> ~/.bashrc

と書いてくれているので，そのまま

```sh
$ echo ". /home/okuda/.pyenv/versions/anaconda3-5.2.0/etc/profile.d/conda.sh" >> ~/.bashrc
```
を実行し，bashrcをもう一度読んでやれば

```sh
$ source .bashrc
$ conda activate tensor
(tensor) :~$ 
```
無事切り替わりました！

あとは必要なライブラリのインストールです．
まず有名なフレームワークであるTensorFlowをインストールしていきます．

## TensorFlow-GPUのインストール
バージョンですが，[TensorFlowの公式サイト](https://www.tensorflow.org/install/source#common_installation_problems)に
<img width="543" alt="スクリーンショット 2019-11-20 18.53.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377099/c913dd69-9a67-8b94-49f2-0b53247ad6a1.png">
<img width="534" alt="スクリーンショット 2019-11-20 18.52.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377099/a5129d25-8a9e-dd82-ca81-56047b05fcca.png">
とあるので，今回はtensorflow_gpu-1.12.0をダウンロードします．

```
$ pip install tensorflow-gpu==1.12.0
```

完了したら，GPUでTensorFlowが動くか動作確認を一応します．

```shell
$ python 
Python 3.6.9 |Anaconda, Inc.| (default, Jul 30 2019, 19:07:31) 
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>>import tensorflow as tf
>>> tf.test.gpu_device_name()
2019-11-20 19:02:23.713902: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2019-11-20 19:02:24.115406: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1432] Found device 0 with properties: 
name: GeForce GTX 1080 Ti major: 6 minor: 1 memoryClockRate(GHz): 1.582
pciBusID: 0000:03:00.0
totalMemory: 10.92GiB freeMemory: 10.76GiB
2019-11-20 19:02:24.278457: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1432] Found device 1 with properties: 
name: Quadro K620 major: 5 minor: 0 memoryClockRate(GHz): 1.124
pciBusID: 0000:02:00.0
totalMemory: 1.95GiB freeMemory: 1.80GiB
2019-11-20 19:02:24.278929: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1496] Ignoring visible gpu device (device: 1, name: Quadro K620, pci bus id: 0000:02:00.0, compute capability: 5.0) with Cuda multiprocessor count: 3. The minimum required count is 8. You can adjust this requirement with the env var TF_MIN_GPU_MULTIPROCESSOR_COUNT.
2019-11-20 19:02:24.278972: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1511] Adding visible gpu devices: 0
2019-11-20 19:02:24.784359: I tensorflow/core/common_runtime/gpu/gpu_device.cc:982] Device interconnect StreamExecutor with strength 1 edge matrix:
2019-11-20 19:02:24.784436: I tensorflow/core/common_runtime/gpu/gpu_device.cc:988]      0 1 
2019-11-20 19:02:24.784450: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1001] 0:   N N 
2019-11-20 19:02:24.784459: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1001] 1:   N N 
2019-11-20 19:02:24.784905: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115] Created TensorFlow device (/device:GPU:0 with 10403 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:03:00.0, compute capability: 6.1)
'/device:GPU:0'
```
別のGPUも認識している？ちょっと後で調べます．
'/device:GPU:0'となったのでOKです．

## Jupyter Labのインストール
ここからは個人的にJupyterが好きなので入れていきます．好みです．

```sh
$ conda install jupyterlab
```


あとはリモートからアクセスできるように，[こちら](https://qiita.com/nyanco888/items/6da004c78c471a15c0d7)でやったことを行えば，終わりです．

意外とGPU使えるようにするのは大変なんですね．
お疲れ様でした．