UbuntuにTensorFlow 2.X 系のGPU環境を作ろう 

#実行環境
ubuntu 20.04.1 LTS (日本語Ubuntu最新版)
Condaは使わない。
確実性を重視。
バージョン管理はpyenv
機体要件
CPU Ryzen7 5800X
GPU RTX3070
詳しくは
https://qiita.com/YU_GENE/items/09d7ffa85ad8e37dc063
#インストールするものを考える
TensorFlowのGPU環境を作るのは大変らしい。
Python,cuDNN,CUDAのバージョンが違うと動かない可能性があるからだ。
まず、Tensorflowのページに行って、ubuntuのTensorFlowのGPUバージョンの動作確認がされている最新版を確認しにいく。
![S__3702805.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718725/4e894ccb-7a0f-faa3-7dbe-332962f41926.jpeg)
2020/11/27現在、Ubuntu版TensorFlowは上のものが一番確実らしい。
#Pythonのバージョンを自在に操る
ubuntuインストール段階でのpythonのバージョンは3.8系だったが、pythonバージョンは3.7までが確認済みのようだから、pyenvというものを使って、自由自在にpythonのバージョンを管理できるようにする。
##pyenvのインストール
```bash:pyenvのインストール
$ git clone git://github.com/yyuu/pyenv.git ~/.pyenv
$ brew install pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
```
Ubuntuの場合、以下のコードを実行しないとpythonをインストールしてこれないので注意

```bash:Ubuntuの場合は以下も実行
$sudo apt-get install -y build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev libffi-dev liblzma-dev python-openssl git
$sudo apt install libedit-d
```
##pythonの設定
今回は3.7系まで保証されているということなので、python3.7.9を入れる。
インストールできるもののリストは

```
$pyenv install --list | less 
```
で確認できる。


```bash:インストールの手順
$pyenv install 3.7.9
$pyenv versions 
$pyenv shell 3.7.9
```
でインストール完了。試しにpythonを起動すると、きっとpython3.7.9が起動するはず。
インストール、確認、起動設定の順である。これでバージョン問題に悩まされることは一生ない。
アツいぜ。
#python仮想環境の構築
PC環境を破壊しないために、venvというものを使って仮想環境を作る。
ここでいう仮想環境とはVirtualBoxとかがPC自体の仮想環境だとすれば、Python言語だけの仮想環境みたいなものである。今回はtfという適当なディレクトリ下に仮想環境設定をする。pyenvでpythonを3.7.1にした状態で

```
$mkdir tf
$cd tf
$python -m venv .venv
```
これで設定は完了。仮想環境に入るにはこの状態で、

```
$source ~/tf/.venv/bin/activate
```
これで仮想環境に入れる。
左側に.venvと出れば成功。このコードは適当にエイリアスに保存しておくと楽。

#NVIDIAドライバのインストール
ちゃちゃっとインストール
他の方も記事にされているので、詳細は省略。
デフォルトグラフィックドライバを停止して、オートインストールするだけ!（やり方は下リンク)
https://qiita.com/sho8e69/items/66c1662c49ac89a024be

```
sudo ubuntu-drivers autoinstall
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718725/12c13703-0c80-ef8a-3451-15173d069242.png" width=70%>

nvidia-smiを実行するとRTX3070の文字が。美しい。


#CUDAのインストール
さて、CUDAの確認済みバージョンは10.1だったな。
CUDA10.1はaptからそのまま入手できる。簡単。最新版が欲しかったらnvidiaのサイトに行くべきだが、今回は丁度10.1が欲しかったのでそのまま以下を実行。

```
$sudo apt install nvidia-cuda-toolkit
```
nvcc -Vコマンドで確認できる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718725/eaedd45b-7466-d1dc-ce33-6de7b154c540.png" width=50%>

#TensorFlowのインストール
さて、TensorFlowの確認済みバージョンはTensorFlow2.1.0だったな。
仮想環境に入っている状態で、(pipは更新しといてね)

```
(.venv)$pip install tensorflow==2.1.0
```
で仮想環境のみにtensorflow2.1.0が入る。
pip listコマンドで入っているのが確認できる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718725/f6424cbb-dcdc-230a-138b-768d59819784.png" width=50%>
いいねぇ。

#cuDNNのインストール
CUDAと名前似てるけど、一応別物。
めんどいけど、以下で会員登録して
https://developer.nvidia.com/rdp/cudnn-archive
「CUDA10.1に対応したCuDNN7.6系」を探そう。
cuDNN Runtime Library for Ubuntu18.04 (Deb)
cuDNN Developer Library for Ubuntu18.04 (Deb)
をダウンロードして、
それぞれdpkg iコマンドで展開するだけ。簡単。

```
sudo dpkg -i libcudnn7_7.6.5.32-1+cuda10.1_amd64.deb 
sudo dpkg -i libcudnn7-dev_7.6.5.32-1+cuda10.1_amd64.deb 
```

#できたかな？
pythonで以下を実行してみよう。

```
from tensorflow.python.client import device_lib
device_lib.list_local_devices()
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718725/ce2eda1e-fa6b-187d-3bd6-e3b59fb2dfe4.png" width=80%>

GPUの文言がちらほら。
一番下にはRTX3070の文字があるので正常にできたっぽい。

#まとめ
これで機械学習のために自作PCしたとか自慢できるね。
決して流行りのオンラインゲームがしたかったとかじゃないよ。
ほんとにね。(嘘)