Ubuntu、tensorflow、pipenvでの深層学習環境構築方法

#はじめに
Ubuntuでtenosrflowとpipenvによる環境構築をしたのでまとめておきます。
自分は初心者なので、LINUXのコマンドを叩ける人ならわかる解説になっていると思います。
わかっている人からしたら少しくどいと思いますが、自分用なので。
また仮想環境の構築とpython関係のパッケージのインストールはpipenvで行います。
virtualenvとpipなどでもいいですが、便利なのでおすすめです。
OSはUbuntuを想定していますが、それ以外のディストリビューションでも可能だと思います。

#環境
環境(構築前)
Ubuntu20.04LTS
GPU Geforce RTX 2070 super
GPUドライバー　 450.119.03 

環境(構築後)
Ubuntu20.04LTS
GPU Geforce RTX 2070 super
GPUドライバー　 450.119.03 
CUDA 11.0
cuDNN　8.0
python3.8.10
tensorflow 2.4.0
pipenv

目標環境はtensorflow公式ホームページを参照に決めました。[[1]]
使用するGPUによってドライバが異なります。
ドライバによって対応しているCUDAが違うので、まずは対応を確認して自分の目指す環境を確認してください。
こちらの記事[[2]]も対応を確認するには役に立つので目を通しておくといいです。


#CUDAのインストール
公式サイト[[3]]でダウンロードしたいものをクリックしていくとダウンロードするためのコマンドが出てくるのでそれを実行。
CUDA Toolkit 11.0 →　LINUX →　x86_64　→　Ubuntu → deb
と選択していくとコマンドが表示されます。アーキテクチャはほとんどの人がx86_64だと思いますが、確認したいという人はarchコマンドで確認できます。
最後のはネットワークでも問題ないと思いますが、以前ダウンロードした時に失敗したことがあるのでlocalにしています。
runfileでもダウンロードしてshコマンドでrunfileを実行後、欲しいものを選択すればダウンロードできます。
今回はわかりやすくdebファイルで行っていきます。
一応下に載せておきますが、公式サイトの方を参考にしてください。

```
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget http://developer.download.nvidia.com/compute/cuda/11.0.2/local_installers/cuda-repo-ubuntu2004-11-0-local_11.0.2-450.51.05-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu2004-11-0-local_11.0.2-450.51.05-1_amd64.deb
sudo apt-key add /var/cuda-repo-ubuntu2004-11-0-local/7fa2af80.pub
sudo apt-get update
sudo apt-get -y install cuda
```
インストールしたらパスを通します。
パスを通すに関してはこの記事[[4]]を
僕は.bashrcにパスを書いてsorceで更新しました。
先頭に.がつくファイルは隠しファイルなのでls -aで表示しましょう。
またsourceコマンドは厳密ではコマンドではなかったような気がします。
なのでインストールしようとしても出てきません。
Ubuntuだと

```
sudo apt install build-essential chekinstall
```
で使用できるようになります。
ちなみにcentOSでは

```
yum groupinstall "Development Tools"
```
とディストリビューションによって異なるので、Ubuntu以外でやってる人は注意してください。
.bashrcの末尾に

```
export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"
```
を追加したあとにsourceコマンドで更新

```
source .bashrc
```
which nvcc　でパスが出てきたらパスが通っています。
ちなみにたまに.bash_profileに書いてる記事などもありますが、特にこだわりがなければ.bashrcでいいと思います。
一応違いが書いてある記事[[5]]を載せておきます。

#cuDNNのインストール
cuDNNの公式サイト[[6]]からダウンロード。
メンバー登録が必要ですが、Googleアカウントと連携できます。
2021年6月3日現在の最新バージョンはcuDNN v8.2.0ですが、インストールしたいのは古いものなのでそちらをインストールします。
ここは各自のGPUやドライバー、ディストリビューションに応じて各自変えてください。
アーカイブのところをクリックすると過去のものが出てくるのでインストール。
例えばCUDA11.0でcuDNN v8.0がインストールしたければcuDNN v8.0.5 for CUDA 11.0 が確認できる中で最新なのでこれをインストールします。
対応するディストリビューションのX86_64アーキテクチャのパッケージを下記の3つインストールしましょう。
**・Runtime Library**
**・Developer Library**
**・Code Samples and User Guide**
対応するアーキテクチャ、ディストリビューションのやつをダウンロードしましょう。
クリックしたらダウンロードされます。
ダウンロードしたら解凍しましょう

```
sudo dpkg -i debファイル
```
で解凍できます。
解凍したあとになんかしたような気がするんですが忘れちゃいました。
なんかエラー出たら頑張って解決してください。
cuDNNが使えているかの確認のためにcuDNNのサンプルを実行します。
僕の場合はcuDNNのサンプルは /usr/src/cudnn_samples_v8 にあります。
最後の数字はバージョンに合わせて変えてください。
mnistCUDNNディレクトリに移動して

```
sudo make
```
を行ってください。
パーミッション的に管理者権限じゃないとアクセスできないようでsudoつけました。
結構かかると思いますが終わったら生成されるmnistCUDNNを./mnistCUDNNで実行してください。
ログが流れてTest Pssed!と表示されたらcuDNNを使用できています。
出来てなかったらcuDNNが使えていない可能性が高いです。
なんとか対応してみてください。

#Pythonのインストール
これは公式サイト[[7]]にわかりやすく載っています。
ただインストールする際はホームディレクトリにインストールすることをおすすめします。（環境によるとは思いますが）
個人的にシステム標準でついてくるPythonと混ぜたくないのでそうしています。
システムのPythonと混ぜるのは公式でも推奨されていないですし、面倒なことになるのでおすすめしません。
具体的に言うと　sudo apt install python-numpy などはしないほうがいいです。
僕が今回ダウンロードするのはPython3-8-10です。
対応している中で最新のものを選びました。
あとは[[7]]通りにやればOKですが、ローカルにダウンロードする場合はオプションが必要なので注意です。

**余談**
コマンドでインストールしたい人はPPA(個人が公開するパッケージ的なの)を使ってインストールできますがおすすめしません。
このブログ[[8]]の方法だとシステムにPythonがインストールされますし、公式ではないので。
おとなしく公式のやり方にしておいたほうがあとあと楽です。

#pipenvのインストール
pipenvと他のコマンドとの比較についてはこの３つ[[9]][[10]][[11]]を見てください。
そんなのどうでもいいという人でも、pipenvはvitualenvとpip(pip3)の組み合わせみたいなものなので、もとの原理を知っておかないと応用が効きません。
Pythonを上記の手順でインストールしている人は標準でpip3がついているはずです。
間違ってもsudo apt install python3-pipはしないほうがいいです。
わかっている人はいいですが、初心者が手をだすとどこになんのパッケージが入っているのかわからなくなるのでやめたほうがいいです。
詳しいことはこちら[[12]]。
pipenvのインストールはpip3から行います。

```
pip3 install pipenv
```
pipenvのインストール先は/home/tumutubo/.local//bin/pipenv
になっています

```
which pipenv
```
で確認できます。
もし表示されなかったらパスを通しましょう。
多分いらないですが一応pipenvの更新。

```
pip3 install -U pipenv
```
作りたい仮想環境名のディレクトリを作成し、そこで

```
pipenv install
```
で作成（事前にPythonのバージョン指定も出来ます）

```
pipenv shell
```
で仮想環境を有効化。

```
exit
```
で抜けられます。
which python3などとするとパスが変わっているのがわかります。
その他詳しいことはこちらの記事で[[13]][[14]]

**余談**
pipは環境によって動作が少し変わります。
python2系が入っている場合はそちらにダウンロード、python3系のみの場合はpython3にダウンロードされます。
python2系が入っていない場合はpip=pip3として扱えます。
ただ最新のLinuxシステム標準についてくるPythonもいまは3系ですし、Pythonパッケージをダウンロードしてついてくるのもpip3なのでどちらでもいいと思います。
ぼくは3うつのめんどくさいのでpipとpythonコマンドでやってます。
コマンドの場所を確認したい場合は

```
which pip
which pip3
```
と打てば確認できます。

#パッケージのインストール
Pipfileが存在するディレクトリでpipenv shellで仮想環境に入ります。
あとはパッケージをインストールするだけです。
使いそうなものを適当にダウンロードしておきます。

```
pipenv install numpy pandas matplotlib keras requests tensorflow==2.4.0 
```
バージョン指定のやり方は上の通りです。
自分の環境にあったものをダウンロードしてください。

#動作確認
tensorflow/kerasを使用したMNISTプログラムを動かします。
ほんとは公式をみてやったほうがいいんでしょうが、公式ドキュメントはあまりまとまって無くて苦手です。
たぶん自分の読解力が足りないんだと思うんですけどね。
ここらへんの記事[[15]][[16]]を参考にしてMNISTのサンプルを作成します。
[[15]]の方はコピペだけで動いたのですが、[[16]]の方は関数などが古くaccをaccuracyに書き換えないと動きません。
また古い関数を使っているせいか最後の部分が表示されなかったりします。
まあとりあえずtensorflow/kerasが動いているのが確認できたのでとりあえずOKです。

#おわりに
研究で機械学習をする必要があったので、自宅環境にtensorflowの動く環境を作ってみました。
かなり大変だったのでLGTMしてくれると喜びます。
ちなみに研究室はアーキテクチャ系なので最終的にはCUDAなどの下層のコーディングをすることになると思います。
大変ですがやはりやっていて楽しいですね。
この記事がみなさんの役に立てたらうれしいです。

それではまた！

#参考文献
[1]:https://www.tensorflow.org/install/source?hl=ja#gpu_support_2 
[2]:https://qiita.com/karaage0703/items/5d46b249f6be68186210
[3]:https://developer.nvidia.com/cuda-toolkit-archive
[4]:https://qiita.com/ozipi/items/29d7ae0b21e476dd7b8e#:~:text=PATH
[5]:https://qiita.com/magicant/items/d3bb7ea1192e63fba850
[6]:https://developer.nvidia.com/rdp/cudnn-download
[7]:https://www.python.jp/install/ubuntu/index.html
[8]:https://mu-777.hatenablog.com/entry/2020/03/07/195833
[9]:https://qiita.com/KRiver1/items/c1788e616b77a9bad4dd
[10]:https://www.zopfco.de/entry/2017/04/03/233811
[11]:https://blog.sin-tanaka.com/posts/python-environments/
[12]:https://www.python.jp/install/ubuntu/pip.html
[13]:https://qiita.com/shinshin86/items/e11c1124e3e2e74556b8
[14]:https://qiita.com/y-tsutsu/items/54c10e0b2c6b565c887a
[15]:https://weblabo.oscasierra.net/python/keras-mnist-sample.html
[16]:https://www.ailab.ics.keio.ac.jp/b4_induction_training/docs/dl/mnist_notebook.html

[[1]]:ソースからのビルド(TensorFlow) 
[[2]]:TensorFlowでGPU学習させるためにCUDA周りではまったときの対処法
[[3]]:CUDA Toolkit Archive
[[4]]:PATHを通すの意味と通し方　.bash_profile
[[5]]:本当に正しい .bashrc と .bash_profile の使ひ分け
[[6]]:cuDNN Download
[[7]]:Ubuntu環境のPython
[[8]]:Ubuntu16.04にpython3.7を apt install する方法（というか，apt レポジトリに登録されていないpythonのバージョンを導入する方法）
[[9]]:pyenv、pyenv-virtualenv、venv、Anaconda、Pipenv。私はPipenvを使う
[[10]]:Pythonの環境管理ツール良し悪し
[[11]]:Pythonの仮想環境構築についてまとめ【社内向け】
[[12]]:pip
[[13]]:Pipenvことはじめ
[[14]]:Pipenvを使ったPython開発まとめ
[[15]]:Keras で MNIST データの学習を試してみよう
[[16]]:Keras/TensorflowでMNISTデータセットの画像分類