Ubuntu 22.04マシンでGPUを使えるようにする

# 参考にした資料
* 「NVIDIA ドライバ，NVIDIA CUDA ツールキット 11.8, NVIDIA cuDNN 8 のインストール（Ubuntu 上）」（金子邦彦先生のWebサイトより）
  * https://www.kkaneko.jp/tools/ubuntu/ubuntu_cudnn.html

:::note info
深層学習向けにUbuntuマシンを設定するときは、個人的にいつも上のWebページを参考にさせていただいています。
以下の記事は、上のWebページから、Ubuntu 22.04 に関係する部分を集約したものにすぎません。
ただし、少しだけ説明を追加してあります。
:::

# 前準備

* ここは必要に応じて。
  * いずれにしても、後で`sudo apt -y update`は実行します。

## Ubuntu のシステム更新
```diff_shell
sudo apt -y update
sudo apt -yV upgrade
```

## システムを更新したので再起動
```diff_shell
sudo /sbin/shutdown -r now
```


# NVIDIAドライバとNVIDIA CUDAツールキットのインストール

## NVIDIAドライバのインストール

### NVIDIAグラフィックカードの確認
* ここで、グラフィックカードがあるはずなのに見えていないとすると、ハードウェアのレベルで何か問題があるということです。
  * 最低限、電源をもう一度入れ直す。
  * それでもダメなら、ちゃんとグラフィックカードが挿さっているか、グラフィックカードに電源ケーブルが挿さっているかなど、基本的なことを確認する。

```diff_shell
lspci | grep -i nvidia | grep VGA
```

### nouveauドライバの無効化

* これは、Ubuntuに限らず、LinuxでNVIDIAのGPUを使えるようにするとき、昔からみんなやってきたことです。

```diff_shell
echo 'blacklist nouveau' | sudo tee -a /etc/modprobe.d/blacklist-nouveau.conf
echo 'options nouveau modeset=0' | sudo tee -a /etc/modprobe.d/blacklist-nouveau.conf
cat /etc/modprobe.d/blacklist-nouveau.conf
sudo update-initramfs -u
```

### NVIDIA ドライバとNVIDIA CUDA ツールキットのアンインストール

* インストール作業がうまくいかないときは、ここまで戻ってきて、ドライバやCUDAなど**関係しそうなもの全てをアンインストールしてから再度インストールを試みる**と、うまくいくと思います。

```diff_shell
dpkg -l | grep cuda 
cd /tmp
sudo apt --purge remove -y nvidia-*
sudo apt --purge remove -y cuda-*
sudo apt --purge remove -y libcudnn*
sudo apt --purge remove -y cudnn-*
sudo apt autoremove -y
```

### カーネルヘッダーと，カーネル開発用パッケージのインストール

```diff_shell
sudo apt -y update
sudo apt -y install linux-headers-$(uname -r)
```

### NVIDIA ドライバのインストール操作

```diff_shell
sudo apt -y update
sudo apt -y upgrade
sudo apt dist-upgrade
ubuntu-drivers devices
```
* ここまで実行すると、ドライバ一覧が表示されます。
* ここで、`sudo ubuntu-drivers autoinstall`と、システムにドライバを選択させることは、お薦めしません。
  * そのドライバが、お使いのハードウェア環境に合っていないことが結構あるからです。
  * 合っていない、というのは、これ以降の作業のどこかで行き詰まる、ということです。
* そのため、表示されているドライバの中から、ご自身でいずれかを選択し、インストールすることをお薦めします。
  * 番号の値が大きいほど新しいドライバですが、お使いのハードウェア環境に最新のドライバが合っているとは限りません。
* 例えば、以下のように、自分で選んだドライバをインストールします。

```diff_shell
sudo apt install -y nvidia-driver-525
sudo update-initramfs -u
```
* もし、特定のドライバをインストールした結果、以下の作業のどこかで行き詰まってしまったら、上の「[NVIDIA ドライバとNVIDIA CUDAツールキットのアンインストール](https://qiita.com/tmasada/items/f77808c870c829c076fa#nvidia-%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%81%A8nvidia-cuda-%E3%83%84%E3%83%BC%E3%83%AB%E3%82%AD%E3%83%83%E3%83%88%E3%81%AE%E3%82%A2%E3%83%B3%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)」に戻って、また別のドライバを選びます。
  * お使いのハードウェアにどのドライバが合っているかについては、数回の試行錯誤が必要かもしれません。

### システムの再起動

```diff_shell
sudo /sbin/shutdown -r now
```

### NVIDIAドライバの確認
* 再起動後、以下のコマンドで確認します。
  * なお、`nvidia-smi`コマンドが表示してくる**CUDAのバージョンは当てになりません**。
  * CUDAのバージョンは、後で出てくるように、`nvcc --vesion`で確認します。
  * `nvidia-smi`コマンドで確認するのは、あくまで、**ドライバのバージョンだけ**です。

```diff_shell
nvidia-smi
```

## NVIDIA CUDA ツールキット11.8 のインストール

* Ubuntuのバージョンは22.04だと前提します。
  * それ以外のバージョンについては、[元の金子先生のWebページ](https://www.kkaneko.jp/tools/ubuntu/ubuntu_cudnn.html)を参考にされてください。

### NVIDIA CUDAパッケージレポジトリをUbuntuシステムに追加

```diff_shell
sudo wget -O /etc/apt/preferences.d/cuda-repository-pin-600 https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-ubuntu2204.pin
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/3bf863cc.pub
sudo add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/ /"
```

### NVIDIA CUDAパッケージレポジトリを用いてNVIDIA CUDA ツールキットのインストール

* CUDAツールキット11.7をインストールする場合は、以下の`cuda-11-8`を`cuda-11-7`に変更します。

```diff_shell
sudo apt -y update
sudo apt -y install cuda-11-8
sudo update-initramfs -u
```

### システムの再起動

```diff_shell
sudo /sbin/shutdown -r now
```

### NVIDIA CUDA ツールキットにパスを通す設定

* CUDAツールキット11.7をインストールした場合は、以下の`cuda-11.8`を`cuda-11.7`に変更します。

```diff_shell
export CUDA_PATH=/usr/local/cuda-11.8
echo 'export CUDA_PATH=/usr/local/cuda-11.8' >> ${HOME}/.bashrc
export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:${LD_LIBRARY_PATH}
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:${LD_LIBRARY_PATH}' >> ${HOME}/.bashrc
export PATH=/usr/local/cuda-11.8/bin:${PATH}
echo 'export PATH=/usr/local/cuda-11.8/bin:${PATH}' >> ${HOME}/.bashrc
```

* なお、この作業によって、ホームディレクトリにある`.bashrc`というファイルの内容が変更されます。

### パスの設定を有効にする

```diff_shell
. ${HOME}/.bashrc
```

* あるいは、自分のホームディレクトリに行ってから以下のように実行しても、同じことです。

```diff_shell
. .bashrc
```


### CUDAのバージョンを確認する

```diff_shell
nvcc --version
```

* ここで、nvccが見つからない的なエラーが出たとしたら、パスの設定が有効になっていないということです。

# さいごに

* 実は、ここまで作業しておけば、PyTorchのインストールはできるようになっています。

* 金子先生の元のWebページでは、上の説明に続いて、NVIDIA cuDNNのインストールの説明が続いていますが、PyTorchをインストールすれば、そこで説明されている手順は踏まなくても、深層学習のコーディングはできるようになっています。

（以上です。）