TensorFlowインストール(NVIDIA GPU対応用)

GPU対応版のTensorFlowのインストールでいろいろ躓いたので、とりあえずうまくいった方法をまとめておきます

##実施環境、バージョン
OS    : Ubuntu16.04 
GPU   : GeForce GTX 1660Ti
CUDA  : 10.1(TensorFlow2.1.0が対応するCUDAに合わせた)
cuDNN : 7.6.5(CUDA10.1に合わせた)
TensorFlow : 2.1.0 
(以下おまけ)
TensorRT : 6.0.1(CUDA10.1に合わせた)
NCCL  : 2.7.3(CUDA10.1に合わせた)

- python,pip等のインストールは他サイトを参考に実施ください  
なおtensorflowインストール時、pipやsetuptoolsのバージョンが古いと怒られるので以下でバージョンアップしておくとよい  
`sudo pip3 install --upgrade pip -ignore-installed --user`  
`sudo pip3 install setuptools`

##インストール対象のTensorFlow確認 
<https://www.tensorflow.org/install/source> 
上記ページの「テスト済みビルド構成」のGPU欄にて、 
対象バージョンに対応するCUDAの(cuDNNも)バージョンを確認
 ![Screenshot from 2020-06-09 16-07-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207722/ec62e451-52d4-6228-171a-17d7437acbf0.png)

##CUDA Toolkitのインストール
※もしすでにCUDAが入っている場合は一旦削除 
`sudo apt purge cuda*` 
`sudo apt purge nvidia-cuda-*` 
`sudo apt purge libcud*` #cuDNNもここでアンインストールできるはず 
`sudo apt purge nccl*` #NCCLインストールしてた場合

<https://developer.nvidia.com/cuda-downloads> 
公式から対象となるバージョンのCUDAをダウンロード 
（旧バージョンは「Legacy Release」からダウンロード）
対象のページを辿っていくとインストール手順が表示されるので
それに従ってインストールすればよい
(ここではTensorFlow2.1.0に対応するためCUDA10.1)
![Screenshot from 2020-06-09 16-06-42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207722/7443b6fd-71e9-97c5-c379-ca7b1b6451ba.png)

- 完了後以下を.bashrcに記載 
`export PATH="/usr/local/cuda-10.1/bin:$PATH"`
`export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"`
・設定再読み込み
`source .bashrc`

- インストール後、以下のコマンドでNVIDIAドライバのバージョンと
  CUDAのバージョンを確認可能 
`nvidia-smi`
`nvcc -V`

- 軽く動作確認 
任意の場所にサンプルコードコピー
`cuda-install-samples-10.1.sh ./`
場所移動
`cd NVIDIA_CUDA-10.1_Samples`
サンプルをコンパイル
`make`
以下に移動
`cd 2_Graphics/volumeRender`
サンプル実行
`./volumeRender`
以下が表示されればOK
![Screenshot from 2020-06-10 17-52-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207722/17f35099-9846-59c3-deed-55804577ce55.png)

##cuDNNのインストール
<https://developer.nvidia.com/rdp/cudnn-download>
公式に従ってインストールすればOK
※ダウンロードにはDEVELOPER登録が必要です
　アンケートは適当に回答すればOK
CUDAの対応バージョンのものをインストールする必要があるので注意
![Screenshot from 2020-06-10 17-08-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207722/c9f15cda-7bc7-5ae2-f5d8-26318b7b896f.png)

以下をそれぞれダウンロードしたら、この順にインストールする必要あり
cuDNN Runtime Library
cuDNN Developer Library
cuDNN Code Samples and User Guide #これは入れても入れなくてもどっちでもOK

- インストール後チェック  
  以下のコマンドを実行  
  `cat /usr/include/cudnn.h | grep CUDNN_MAJOR -A 2`  
  以下が表示されればOK

```terminal
#define CUDNN_MAJOR 7
#define CUDNN_MINOR 6
#define CUDNN_PATCHLEVEL 0
--
#define CUDNN_VERSION (CUDNN_MAJOR * 1000 + CUDNN_MINOR * 100 + CUDNN_PATCHLEVEL)

#include "driver_types.h"
```

- 軽く動作確認(サンプルダウンロードした場合)  
任意の場所にサンプルをコピー(例はver7版の場合)  
`cp -r /usr/src/cudnn_samples_v7/ ./`  
以下に移動  
`cd cudnn_samples_v7/mnistCUDNN`  
サンプルをコンパイル  
`make`  
サンプル実行  
`./mnistCUDNN`  
以下が表示されればOK  
Test passed!

##TensorFlowのインストール
<https://qiita.com/Orihasam/items/020d439d0aec2d90cd73>
上記解説頂いているページに従ってコマンド入力すればOK...?
→なんかpipでscipyがuninstallできないみたいなエラーが出た
>Cannot uninstall 'scipy'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.

いろいろ調べたところ、結局以下のコマンドでインストールできた
TensorFlowのバージョン指定のところは自分のインストールしたいバージョンを指定 
`sudo pip3 install tensorflow-gpu==2.1.0 --ignore-installed --user`

##TensorFlowの動作確認
以下のpythonコードを実行してprint文が出るか確認 
※なお以下のコードはtensorflow2.X以降で実行可能なコードです

```python:tf_hello.py
import tensorflow as tf
testmsg = tf.constant('Hello, TensorFlow2 World!')
tf.print(testmsg)
```
実行後「Hello, TensorFlow2 World!」が表示されればOK

また以下のコマンドを実行して「device_type: "GPU"」があれば，tensorflowがGPUが認識できていることが確認できる．
`python3 -c "from tensorflow.python.client import device_lib; print(device_lib.list_local_devices())"`

なんとかこれで準備完了

##（おまけ）
###TensorFlowのバージョン確認
`python3 -c 'import tensorflow as tf; print(tf.__version__)'`
###TensorRTのインストール
<https://developer.nvidia.com/nvidia-tensorrt-download>
上記から対象バージョンのものをダウンロード
※CUDAの対応バージョンのものをインストールする必要があるので注意
![Screenshot from 2020-06-10 18-19-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207722/9d69442c-520f-8a7d-3107-1aeddf28bd50.png)

<https://docs.nvidia.com/deeplearning/tensorrt/archives/>
それぞれのバージョンごとのリリースノートのページで対応CUDAバージョンは確認できます
(Compatibility(互換性)の項)
![Screenshot from 2020-06-10 18-19-53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207722/13a37ff4-7fce-6ebb-395b-718cfed9e0d4.png)

<https://docs.nvidia.com/deeplearning/tensorrt/archives/tensorrt-601/tensorrt-install-guide/index.html#installing>
インストールは公式のインストールガイドページの記載に従えばOK
（上記リンクは6.0.1のインストールガイド（Ubuntuは4.1項参照））

###NCCLのインストール(機械学習でGPUによる並列化をしたい場合)
<https://developer.nvidia.com/nccl/nccl-download>
上記から対象バージョンのものをダウンロード
※CUDAの対応バージョンのものをインストールする必要があるので注意
![Screenshot from 2020-06-10 18-35-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207722/71dae128-f254-0eaf-569b-547d3b0a703b.png)

<https://docs.nvidia.com/deeplearning/nccl/archives/>
それぞれのバージョンごとのリリースノートのページで対応CUDAバージョンは確認できます
(Compatibility(互換性)の項)
![Screenshot from 2020-06-10 18-42-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207722/fb010d3d-6601-c2ad-2cf2-abda717bc5d9.png)

<https://docs.nvidia.com/deeplearning/nccl/archives/nccl_273/install-guide/index.html>
インストールは公式のインストールガイドページの記載に従えばOK
（上記リンクは2.7.3のインストールガイド（Ubuntuは3.1項参照））

---
以上、おまけでした