TitanRTX+Ubuntu18.04+CUDA10.0+tensorflow2.0インストール手順

新しいのを環境構築した手順のメモです。
バージョン上がる度に簡単になってきていてありがたいです。

## 環境
CPU: Intel core-i9 9920X
GPU: Nvidia TitanRTX

## 入れるもの
Ubuntu 18.04
CUDA 10.0
cuDNN 7.6.2 for CUDA10
tensorflow-gpu==2.0.0
Anaconda 2019.10 for Linux
scipy
pandas
matplotlib
seaborn
scikit-learn
xgboost
lightgbm
catboost
optuna 
boruta ほか

## 本記事の内容
UbuntuのインストールからスタートしてCUDA使ってTensorflowが動くところまで機械学習環境を構築します

## CUDAとtensorflowのバージョンについて

今回使うGPUはTuringアーキテクチャのTitanRTXでComputing Capabilityが7.5、対応するCUDAは10.0以降です
https://en.wikipedia.org/wiki/CUDA

PyPIに置いてあるビルド済みtensorflow-gpuは特定のバージョンのCUDA用にビルドされたもので、対応しているCUDAは以下のリンク先で確認できます
https://www.tensorflow.org/install/source
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277233/9f443b91-d5ac-19c4-77cd-5c02651e427c.png" width=50%>

例えばUbuntu用にビルドされてPyPIに置いてあるtensorflow-gpu==1.13.1はCUDA10.0でしか使えません(自分でビルドすれば別のバージョンのCUDAでも使えます)。2019年11月現在リストにはtensorflow-gpu 2.0.0が載っていませんが、こちらもCUDA10.0用にビルドされています。

従ってtensorflowをビルドせずに使おうと思ったらTitanRTXではCUDA10.0 + tensorflow-gpu==1.13.1または2.0.0の組み合わせが使用可能です。

## 1. Ubuntu18.04をインストールする

ubuntu18.04LTSのisoイメージを取ってきます
https://www.ubuntulinux.jp/download

今回はライブUSBをrufusを使って作成しました
https://rufus.ie/
![images.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277233/51666a0e-fff7-7b29-fc5b-d6bc7d7fdceb.jpeg)
できました

## 2. ファイアーウォールを有効にする

ネットに繋ぐ前にファイアウォールを有効にしておきます。
入り側ポートをすべて閉じておいて必要があったら開けると良いでしょう。

```terminal:terminal
$ sudo ufw default deny
$ sudo ufw enable
```
statusを確認しておきます。

```terminal:terminal
$ sudo ufw status verbose

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
```
外からのアクセスは一律拒否するようにしました。sshとか使うときは個別にallowしましょう。

## 3. Ubuntuを更新する

最初に更新をかけておきましょう

```terminal:terminal
sudo apt-get update
sudo apt-get upgrade
```









## 4. nvidia driverとCUDAをインストールする

tensorflow gpuサポートページのコードをそのまま使います
https://www.tensorflow.org/install/gpu

```terminal:terminal
# Add NVIDIA package repositories
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-repo-ubuntu1804_10.0.130-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1804_10.0.130-1_amd64.deb
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
sudo apt-get update
wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
sudo apt install ./nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
sudo apt-get update

# Install NVIDIA driver
sudo apt-get install --no-install-recommends nvidia-driver-418
```
ここまで来たら一度再起動します

```terminal:terminal
sudo reboot
```
再起動したらnvidia driverが使えるようになっている筈です

```terminal:terminal
$ nvidia-smi    
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 430.50       Driver Version: 430.50       CUDA Version: 10.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  TITAN RTX           Off  | 00000000:68:00.0  On |                  N/A |
|  0%   27C    P8    18W / 280W |    326MiB / 24217MiB |      1%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      1300      G   /usr/lib/xorg/Xorg                           139MiB |
|    0      1490      G   /usr/bin/gnome-shell                         182MiB |
+-----------------------------------------------------------------------------+
```
ちゃんと入ってますね。続きをやっていきましょう。

```terminal:terminal
# Install development and runtime libraries (~4GB)
sudo apt-get install --no-install-recommends \
    cuda-10-0 \
    libcudnn7=7.6.2.24-1+cuda10.0  \
    libcudnn7-dev=7.6.2.24-1+cuda10.0

# Install TensorRT. Requires that libcudnn7 is installed above.
sudo apt-get install -y --no-install-recommends libnvinfer5=5.1.5-1+cuda10.0 \
    libnvinfer-dev=5.1.5-1+cuda10.0
```
最後にPATHを通して完成です。適当なエディタで~/.bashrcを開いてPATHの指定を追記します。

```terminal:terminal
gedit ~/.bashrc
```

```:~/.bashrdに追記
## CUDA and cuDNN paths
export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"
```
terminalを一度閉じて再度開くとPATHが通っています

```:terminal
$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2018 NVIDIA Corporation
Built on Sat_Aug_25_21:08:01_CDT_2018
Cuda compilation tools, release 10.0, V10.0.130
```
無事インストールできたようです

## 5. Anacondaでpython環境をインストール

公式サイトからlinux用python3系64bit版インストーラーをダウンロードします。
https://www.anaconda.com/distribution/
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277233/1519d038-042e-f39a-0d5f-2ff203814c11.png" width=50%>
インストールしていきます。

```terminal:terminal
$ cd ファイルを置いたフォルダパス
$ sh Anaconda3-2019.10-Linux-x86_64.sh
```

インストールが完了したらpython環境を作ります。tensorflowはpython3.7に非対応なのでpython 3.6指定にしています。環境名はtfにしてみます。

```terminal:terminal
$ conda create -n tf python=3.6
```
環境をactivateします

```terminal:terminal
$ conda activate tf
```
pipでtensorflowをインストールします

```terminal:terminal
$ pip install tensorflow-gpu
```
pythonを立ち上げてtensorflowがCUDAとGPUを認識できるか確認します

```:terminal
$ python
>>> import tensorflow as tf
>>> tf.config.experimental.list_physical_devices('GPU') >= 1
True
```
TrueならOK、Falseなら上手くいってません。上手くいっていない場合はここまでの手順でエラーが出てインストールに失敗しているか、~/.bashrcに書いたPATHが通っていないか、tensorflow/CUDA/cuDNNのバージョンの組み合わせて正しくないかのどれかだと思います。

## 6. 機械学習系パッケージ＋αをインストールする

最後によく使うパッケージを入れて完成です

```terminal:terminal
(base) $ conda activate tf
(tf) $ pip install optuna tensorflow_addons numpy pandas xlrd xlwt openpyxl sklearn scipy catboost xgboost lightgbm matplotlib seaborn boruta pydot3 graphviz ipywidgets jupyter tqdm pyarrow psutil
```
ついでによく使うのもいれておきます

```terminal:terminal
(tf) $ pip install pillow opencv-python OpenEXR 
```

できました
やったね