LinuxでのNVIDIA-driver, CUDA, PyTorch, cuDNNのインストール

# はじめに
機械学習をするためにubuntu 20.04 で環境構築をしたが、依存関係がややこしかったのでまとめておく。

## 機械学習のためのPCセットアップ
- NVIDIA-driverは基本一度インストールした後は触らない（触ると厄介なことになる）
- CUDAはタスクごとに使い分けたい
- PyTorchやcuDNNはCUDAのバージョンに依存
- CUDAはNVIDIA-driverに依存
- つまりバーションの依存関係は <span style="color:red">**NVIDIA-driver > CUDA >= PyTorch > cuDNN**</span>

以上を考慮すると、
1. 使いたいCUDAのバージョンを決める
2. CUDAを動かせるNVIDIA-driverを入れる
3. CUDAのバージョンに対応したPyTorchとcuDNNを入れる

必要がある。


# セットアップ手順

## ドライバインストールの前準備
### nouveauドライバの停止
nouveauドライバを停止しないと、NVIDIA-driverを入れても動かない場合がある
```bash
sudo reboot
lsmod | grep -i nouveau
```
以下をまとめて実行
```bash
sudo sh -c "cat << ETX > /etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
blacklist lbm-nouveau
options nouveau modeset=0
alias nouveau off
alias lbm-nouveau off
ETX" && cat /etc/modprobe.d/blacklist-nouveau.conf
```
output
```
blacklist nouveau
blacklist lbm-nouveau
options nouveau modeset=0
alias nouveau off
alias lbm-nouveau off
```

### Nouveau ドライバを無効化
```bash
sudo sh -c "echo 'options nouveau modeset=0' > /etc/modprobe.d/nouveau-kms.conf" && cat /etc/modprobe.d/nouveau-kms.conf
```    

### デバイスやバージョンの確認・削除
使用しているGPUの確認
```bash
lspci | grep -i nvidia
```
現在入っているCUDA, nvidia-driverの確認
```bash
dpkg -l | grep nvidia
dpkg -l | grep cuda
```

現在入っているCUDA nvidiaドライバの削除
```bash
sudo apt-get --purge remove nvidia-*
sudo apt-get --purge remove cuda-*
sudo apt-get autoremove
sudo apt-get autoclean
```
<br><br>


## NVIDIA-driverのインストール / 手法１：端末でインストール
参考サイト:

https://qiita.com/porizou1/items/74d8264d6381ee2941bd
```bash
sudo update-initramfs -u
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
```
対応しているNVIDIA-driverを調べる
```bash
ubuntu-drivers devices
# 現在利用可能なNVIDIAドライバのうちバージョン515をリストアップ
apt-cache madison nvidia-driver-515
```
バージョンを指定してインストール
```bash
sudo apt install nvidia-driver-515=515.43.04-0ubuntu1
```

### Configuring Secure Bootと出てきた場合
![pcsetup_MOK_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4109139/abc5c616-d723-467e-87a6-1531479163f4.png)
1. TabキーとEnterキーを使って進み、パスワードを設定（8-16文字）
2. DLが終わったら再起動＆BIOS/UEFI設定画面に入る（再起動時にF2, DELとか連打）
3. pcsetup_MOK_3.jpgで Enroll MOK 、もしくは Change Secure Boot stateを選択
![pcsetup_MOK_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4109139/0ec08fca-b227-418a-abd4-0952c2c31cf1.jpeg)  
4. pcsetup_MOK_4.jpgのView key 0 で確認、Continueでさっきのパスワードを入力
![pcsetup_MOK_4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4109139/59263511-0e86-4a3d-a704-a7d771781cc3.jpeg)


再起動
```bash
sudo reboot
```

### NVIDIA-driverを確認
DPで接続したモニターも使用できるようになるはず
```bash
nvidia-smi
```


## NVIDIA-driverのインストール / 手法２：.runファイルからインストールする方法（面倒なので手法1がおすすめ）
NVIDIA DriverのDLサイト: 

https://www.nvidia.com/Download/index.aspx?lang=en-us

参考サイト（2.2参照）: 

https://qiita.com/daikumatan/items/26039fc23edabf76a9c4

参考サイト: 

https://qiita.com/porizou1/items/09270f2b4d3196b00aee

DLして実行権限をつける 
```bash
wget https://www.nvidia.co.jp/content/DriverDownloads/confirmation.php?url=/XFree86/Linux-x86_64/550.67/NVIDIA-Linux-x86_64-550.67.run
sudo chmod +x NVIDIA-Linux-x86_64-550.67.run
```

Ctrl + Alt + F6でコンソールモードに切り替え
```bash
sudo service lightdm stop
sudo ./NVIDIA-Linux-x86_64-550.67.run

reboot
nvidia-smi
```


# Anacondaでの環境構築
Anacondaをインストールしてconda内でCUDA, PyTorchなどをインストール
Anacondaで環境構築をすると、バージョン管理が楽なのでおすすめ

https://qiita.com/shilulu0519/items/482c128512381665781d



<br><br><br><br>

# <span style="color:red">**Anacondaで環境構築する場合、以下は無視**</span>
Anacondaで仮想環境を作らずに、単一のCUDAやPytorchを使用する場合は以下の手順でインストール

## CUDAのDL
https://qiita.com/tf63/items/0c6da72fe749319423b4
### CUDA12.1がPytorch対応しているので12-1 （対応しているバージョンを調べる）
```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-get update
sudo apt-get -y install cuda-12-1

reboot
```

```bash
nano ~/.bashrc
# nanoの使い方
# Ctrl + O : 変更を保存
# Ctrl + X : エディタを閉じる
export PATH=/usr/local/cuda:/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/lib:/usr/local/cuda/lib64:$LD_LIBRARY_PATH
source ~/.bashrc
nvcc -V
```


### CUDA toolkit
https://developer.nvidia.com/cuda-toolkit-archive


## cuDNNのインストール 以下参照
https://qiita.com/tf63/items/0c6da72fe749319423b4
```bash
# sudo dpkg -i <path(ex:cudnn-local-repo-ubuntu2004-8.4.0.27_1.0-1_amd64.deb)>
sudo dpkg -i cudnn-local-repo-ubuntu2004-8.9.7.29_1.0-1_amd64.deb
# sudo cp /var/cudnn-local-repo-*/cudnn-local-*-keyring.gpg /usr/share/keyrings/
sudo cp /var/cudnn-local-repo-ubuntu2004-8.9.7.29/cudnn-local-30472A84-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get install libcudnn8=8.9.7.29-1+cuda12.2
sudo apt-get install libcudnn8-dev=8.9.7.29-1+cuda12.2
```


## PyTorch
https://pytorch.org/get-started/locally/



### 動作確認
```bash
python3
```
```python
import torch
print(f"torch version: {torch.__version__}")  # PyTorchのバージョンを表示
print(f"CUDA version: {torch.version.cuda}")  # CUDAのバージョンを表示
print(f"torch & cuda: {torch.cuda.is_available()}")  # CUDAが利用可能かどうかを確認
import torchvision
print(f"torchvision: {torchvision.__version__}")
# torch version: 1.13.1+cu117
# CUDA version: 11.7
# torch & cuda: True
# torchvision: 0.14.1+cu117
```


## バージョン確認
```bash
lspci | grep VGA
lspci | grep NVIDIA
python3 -V
nvidia-smi
nvidia-smi -q -u | grep "CUDA Version" | cut -d":" -f2 | tr -d "[:blank:]"
nvcc -V
```