【WSL2】CUDA(pytorch)設定

# はじめに

Pythonの pytorch を WSL2 でCUDAありで使う設定を２回行いました。何とか、動いているのですが、どうして動いているのか、未だによく理解していない。^^;
が、それでも忘れないうちにメモしておきます。内容については、**理解が間違っている可能性は多いにある** のですが、それでもヒントにはなるかもなので。

# 内容

いろいろごちゃごちゃやったので、どれが正しいか分からないのですが、基本的に以下が必要条件のような気がしています。

### 互換性

- Graphic board のdriver のversion と CUDA の version
- CUDA と pytorch
- pytorcht　と python

pytorch のwheelファイルは下記にあります。所望のplatform(linux or win), python(cp38, cp39, etc..), CUDA(cu118, cu117, etc.)に対応したファイルを直接のリンクを取得できます。直接ダウンロードしもできます。

https://download.pytorch.org/whl/torch/

https://download.pytorch.org/whl/torchvision/

### python3.9(2023/08/28)

python のversion について困ったことがありました。最初python3.8 を使い、3.8以上で動かすpoetry管理で設定していたのですが、numpy が入れられませんでした。そこで、python3.9 で使うことにしました。python 3.9にしたことで、pytorch の wheel ファイルも変わりました。

### 過去のCUDAの削除

所望のversion のCUDAをインストールするため、インストールしてあるCUDAを削除しました。やることは、atp-get で purge するだけでなく、/etc/ocal/以下にあるフォルダの削除、使用しているならnvidia/cuda repositoryのdocker image の削除、/etc/apt/以下の整理をしました。

下記の通りにしました。

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

## 作業メモ

### NVIDIAのグラフィックボードの型番やドライバのversionを確認

購入時の仕様などが残っていればよいですが。調べるために、

```powershell
PS> systeminfo
```

で表示されているものを見ても、いまいちわからず。

```powershell
PS> dxdiag
```

で探したりしました。あと、NVIDIAのツールでデスクトップの設定みたいなので確認できました。(todo: 確認)


### Windows 10 (ホストOS)にNVIDIA Driver をインストール

ドライバがすでに入っていれば問題なし。古ければ新しいのを入れた方が良いのかも？
このページで、NVIDIA RTX A5000 とか入れて、自分のボードに対応するドライバを落としてきて入れます。（入れました）

https://www.nvidia.com/download/index.aspx

ここで入れるのはドライバです。CUDAではありません。自分側の理解では、Host OS側のCUDAは必要ない気がしています。CUDAはWSL2側に入れます。

インストールされていれば、下記でCUDAのversion とdriver のversion が確認できます。ただし、私の環境でこれを実行すると、ホストOS側のものが出力されてしまい、confusing でした。

```
$ nvidia-smi
```

### WSL2をインストール

今どきは、管理者権限でpowershell でコマンドたたくだけでできます。私の場合、**WSL のVersion 2 でないとCUDAが使えない感じ**でした。

```powershell
PS> wsl --install -d ubuntu_20.04
PS> wsl -l -v
```

でインストールして running になっていることを確認した後、version 1 である場合は 2 にします。

```powershell
PS> wsl --set-version ubuntu_20.04 2
```

### WSL2 に CUDA を入れる

CUDA Version と Driver の version の関係がこちらにあります。新しいCUDAを入れるには 新しい Driver の version である必要があるようです。下記を見ると、CUDA Toolkit は CUDA11.x だとLinux_X86..だと 450.80....で Windows だと452.39.... とありますが、WSL2 で使うとき、どちらにあたるのか分かりません。（自分の知識不足で）

https://docs.nvidia.com/deploy/cuda-compatibility/index.html#binary-compatibility__table-toolkit-driver


なので、とりあえず、最新のドライバでCUDA11.7 を入れることにしました。cuda download のページで、Linux, X86_64,  WSL-Ubuntu で出てきたコマンドを、WSL2 でそのまま実行しました。

https://developer.nvidia.com/cuda-downloads

インストール後、cuda があることを確認します。
```bash
$ ls -d /usr/local/cuda*
```
### CUDA11.8のインストール(追加2023/08/28)

最新のもの以外を入れたいとき、例えばCUDA11.8では下記のページを使えます。

https://developer.nvidia.com/cuda-11-8-0-download-archive

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294040/a2ffd038-a87c-b355-5433-aab7b6f61a42.png)

Install type で deb(local), deb(network)がありますが、どちらも実行すると最新のCUDA20.xがインストールされてしまいました。結局、rufile(local)の下記でできました。上記のインストールできなかったのは、両方ともapt でインストールするものなので、apt の設定に何かあったのかもしれません。（一応/etc/apt/以下でcuda 関係のものを削除したのですが。）

```
$ wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run
$ sudo sh cuda_11.8.0_520.61.05_linux.run
```

なお、driver とCUDAのversion の関係は以下のようになっていました。

https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#cuda-major-component-versions__table-cuda-toolkit-driver-versions

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294040/4c07156c-b18d-d549-6b12-6564882a219a.png)


### WSL2に pytorch を入れる

pytorch の Get Started で Start Locally で条件を設定して、コマンドを表示させます。私は、Stable(1.13.0), Linux, Pip, Python, CUDA11.7 で入れました。コマンドもシンプルでした。

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

```bash
$ pip3 install torch torchvision torchaudio
```

確認します。

```bash
$ python3 -c "import torch; print(torch.cuda.is_available())"
True
```

# まとめ

とりあえずメモ。

TODO:
- docker で --gpus オプションも使えるようになったのだが、何をしたのかよく覚えていない。後でメモしたい。
(2022/11/27)
- CUDA11.8のインストールの追加 (2023/08/28)