UbuntuでCUDA，NVIDIAドライバ，cudnnをインストールし，PyTorchでGPU環境を使えるようにするまで

## 概要

Ubuntu 22.04が出たり，NVIDIAのリポジトリの公開鍵が更新されたりしたので新しく記事を作ってみます

https://developer.nvidia.com/blog/updating-the-cuda-linux-gpg-repository-key/

**手順**

- NVIDIAドライバのインストール
- CUDAのインストール
- cuDNNのインストール
- PyTorch環境の構築

**環境**

- Ubuntu 20.04 LTS
- Ubuntu 22.04 LTS



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

ハードウェアに対応したNVIDIAドライバを探す

```bash
ubuntu-drivers devices
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291419/ee63cd57-9e7d-3b13-eac0-624f05c7598e.png)


基本的は**recommended**と書いてあるやつをインストールすればOK．ハードウェアとの相性の関係で失敗することもありますが，バージョンを変えれば上手くいったりします

```bash
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo apt install nvidia-driver-515
```

インストールできたら再起動

```bash
reboot
```

:::note warn
インストールが上手く行かない場合は，元々入っているNVIDIA関連パッケージを削除してから入れ直してください

```bash
sudo apt --purge remove nvidia*
sudo apt --purge remove cuda*
```
:::


インストール確認用のコマンド

```bash
nvidia-smi
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291419/cb11b539-4219-cf4d-c214-22da727f9381.png)

:::note info
ここで表示されている **CUDA Version 12.0** というのはGPUに対応している最新のCUDAのバージョンです．すでにCUDAが入っているわけではありません
:::

### CUDAのインストール

[CUDA Toolkit Archive](https://developer.nvidia.com/cuda-downloads) から **deb (network)** を選択してインストール用コマンドを取得します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291419/2726d8c6-4ac5-ee45-bb04-a184c2dc41df.png)


Ubuntu20.04で`CUDA11.1`をインストールする場合

```bash
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-keyring_1.0-1_all.deb
sudo dpkg -i cuda-keyring_1.0-1_all.deb
sudo apt update
sudo apt install cuda-11-1
```

Ubuntu22.04で`CUDA11.7`をインストールする場合

```bash
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.0-1_all.deb
sudo dpkg -i cuda-keyring_1.0-1_all.deb
sudo apt update
sudo apt install cuda-11-7
```

:::note warn
パッケージの競合が発生した場合は，競合するパッケージを削除してからインストールしてみてください．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291419/f0b04fe3-cf4d-5e2e-24b2-b239ffeaee26.png)


```bash
sudo apt remove nvidia-kernel-common-525 nvidia-kernel-common-530
sudo apt install cuda-11-7
```
:::

インストールできたら再起動

```bash
reboot
```

CUDAのパスを通す

- `~/.bashrc`の末尾に以下を追記

```.bashrc
export PATH=/usr/local/cuda:/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/lib:/usr/local/cuda/lib64:$LD_LIBRARY_PATH
```

```bash
source ~/.bashrc
```

インストール確認

```bash
nvcc -V
```

`CUDA11.7`が入っていますね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291419/cdba504e-e669-a743-9be5-26545e14e74d.png)


### cuDNNのインストール ([参考](https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html))


[cuDNN Archive](https://developer.nvidia.com/rdp/cudnn-archive)からインストールするパッケージを選択 ([NVIDIAアカウント](https://developer.nvidia.com/rdp/cudnn-download)の登録が必要です)
   
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291419/e86cea90-3846-2122-c762-c98a1154e9b9.png)


`*`はインストールしたバージョンに合わせて埋めてください

```bash
sudo dpkg -i <path/to/cudnn>
sudo cp /var/cudnn-local-repo-*/cudnn-local-*-keyring.gpg /usr/share/keyrings/
sudo apt update
sudo apt install libcudnn8=8.5.0.96-1+cuda11.7
sudo apt install libcudnn8-dev=8.5.0.96-1+cuda11.7
```

インストール確認
```bash
dpkg -l | grep cudnn
```

### PyTorch環境の構築

**python環境作成**

とりあえずvenvで環境を作ってみます

```bash
sudo apt install python3-venv # venvのインストール
python3 -m venv <env_name> # 仮想環境の作成
source <env_name>/bin/activate # 仮想環境の有効化
pip3 install -U pip setuptools wheel # pipの更新
```

**PyTorchのインストール**

[公式サイト](https://pytorch.org/get-started/locally/)からコマンドを取得するのが通例ですが，古いバージョンのtorchの情報を見つけるのに苦労します．今回はこのコマンドでインストールすれば大丈夫です

```bash
# Ubuntu 20.04の場合 (torch1.9.0, CUDA11.1を使っている場合)
pip3 install torch==1.9.0+cu111 torchvision==0.10.0+cu111 -f https://download.pytorch.org/whl/torch_stable.html

# Ubuntu 22.04の場合 (torch1.13.0, CUDA11.7を使っている場合)
pip3 install torch==1.13.0+cu117 torchvision==0.14.0+cu117 -f https://download.pytorch.org/whl/torch_stable.html 
```


**GPUが使用できるか確認**

最後にPyTorchからGPUを認識できているか確認します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291419/0d99e8e1-ce0e-7c40-9752-39f63f686eb5.png)


**完了**


## おまけ

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

もともと入っているドライバのせいでインストールがうまく行かなかったりします．NVIDIA関連パッケージをすべて消去してから入れ直すと上手くいくことがあります．

https://misoji-engineer.com/archives/reinstall-cuda-on-ubuntu.html

```bash
sudo apt --purge remove nvidia*
sudo apt --purge remove cuda*
sudo apt --purge remove cudnn*
sudo apt --purge remove libnvidia*
sudo apt --purge remove libcuda*
sudo apt --purge remove libcudnn*
sudo apt autoremove
sudo apt autoclean
sudo apt update
sudo rm -rf /usr/local/cuda*
```

### CUDAのバージョン選択

[Ubuntu20.04](https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/), [Ubuntu22.04](https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/) から探して下記コマンドのバージョンを合わせます．Ubuntu22.04用のリポジトリには`CUDA11.7~`が入っています

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291419/f3978daa-5305-8bda-c44c-2c2e98f2fa61.png width=400px>

```bash
sudo apt install cuda-11-7
```


### PyTorchのバージョン選択
[ここ](https://download.pytorch.org/whl/torch_stable.html) から探します．`CUDA11.7 (cu117)`に合うtorchのバージョンを探してみると`cu117/torch-1.13.0%2Bcu117-cp38-cp38-linux_x86_64.whl`というファイルが見つかります．どうやら`torch1.13.0`ならインストールできそうです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291419/070cb2d8-55e6-f4c0-ff7c-046327dece68.png)

インストール

```bash
pip3 install torch==1.13.0+cu117 torchvision==0.14.0+cu117 -f https://download.pytorch.org/whl/torch_stable.html
```


### apt updateで｢複数回設定されています｣ という警告が出たとき

`/etc/apt/sources.list`の最後の2つをコメントアウト

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291419/6c4fb3de-f1ed-f7d4-2e98-f615aed57eb5.png)