WSL2でCUDAをインストールする

# 概要
Windows 11およびWindows10 22H2から、WSL2でCUDAが使用できるみたいなので、環境構築してみます。
似たようなことをしている良記事はたくさんありますが、アウトプットの場としてメモを残すのを目的としました。

# 環境
- Windows11
- WSL2 : Ubuntu22.04.1

# やったこと
## WSL2を使用できるようにする
[ここ](https://learn.microsoft.com/ja-jp/windows/wsl/install#install-wsl-command)に従って、wsl2をインストールします.
windowsのPowerShellやWindowsのコマンドプロンプトで以下を実行するだけでいいみたいです.
```powershell
wsl --install
```
このコマンドを打つと、自動的にWSL2になるようです。
オプションでバージョンを１にできますが
CUDAの公式ガイドではWSL2を使用しているのでこのままでいきます。
また、Linuxのdistributionも選べますが、デフォルトのままUbuntuで行いました。

WSL2を使用した、CUDAの設定では以下のように5.10.16.3以上を進められています。
>Ensure you are on the latest WSL Kernel or at least 4.19.121+. We recommend 5.10.16.3 or later for better performance and functional fixes.

なのでもし、以下のコマンドで表示されるカーネルバージョンが足りていなかったら

```powershell
wsl --version
```

以下のコマンドでアップデートをしておくといいかもしれません。

```powershell
wsl --update
```

## CUDAの環境を整える
[ガイド](https://docs.nvidia.com/cuda/wsl-user-guide/index.html#cuda-support-for-wsl-2)を参考に勧めます。

ガイドにはいろいろ書いているのですが、
NVIDIAのWindows Driverを使用したうえで
>Option 1: Installation of Linux x86 CUDA Toolkit using WSL-Ubuntu Package - Recommended

で推奨されている手順をするのが良さそうなのでそれに従う方針でいきます。

### NVIDIAのWindows Driverをインストール
まずは、Windows Driverをインストールします。
> The latest NVIDIA Windows GPU Driver will fully support WSL 2. 

とのことなので[リンク先](https://www.nvidia.com/Download/index.aspx?lang=en-us)から、環境にあったものをダウンロードします。

今回は以下の画像のような環境なのでこの条件で`Search`を押して、表示されたものをダウンロードしました。(表示されているものは最新バージョン?)
なお、`Download Type` SDのほうが安定性と品質を優先されているとの説明があったのでSDを選択しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2650703/86a1d0cc-9d1a-e648-5f98-6625ecf6b87d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2650703/3a04976e-3e89-437e-f9ca-a5cd23dbb1ab.png)

ダウンロードが完了したら、Launcherを起動してインストールを完了させます。
なお、インストール後には再起動が必要です。

### CUDA Toolkitのインストール
[推奨された方法](https://docs.nvidia.com/cuda/wsl-user-guide/index.html#cuda-support-for-wsl-2:~:text=Option%201%3A%20Installation%20of%20Linux%20x86%20CUDA%20Toolkit%20using%20WSL%2DUbuntu%20Package%20%2D%20Recommended)に記載されているコマンドを実行していきます。

その前にまずは、書いているように以下を実行します
```bash
sudo apt-key del 7fa2af80
```
その後、以下を実行していきます。

```bash
wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin
sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/12.0.0/local_installers/cuda-repo-wsl-ubuntu-12-0-local_12.0.0-1_amd64.deb
sudo dpkg -i cuda-repo-wsl-ubuntu-12-0-local_12.0.0-1_amd64.deb
sudo cp /var/cuda-repo-wsl-ubuntu-12-0-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda
```

:::note warn
公式ガイドのOption2 の方法でもtoolkitはインストールできますが、注意書きによるとOption2の方法だと、先にインストールしたWidnowsのドライバを上書きしてしてしまうようです。
そのため、WSL2とWindows Driverを使う場合はOption1に従うのが無難です。
:::

完了後、以下を実行しバージョン情報が出力されればインストールはできていそうです。
```bash
$ cat  /usr/local/cuda/version.json
{
   "cuda" : {
      "name" : "CUDA SDK",
      "version" : "12.0.0"
   },
   "cuda_cccl" : {
      "name" : "CUDA C++ Core Compute Libraries",
      "version" : "12.0.90"
   },
   "cuda_cudart" : {
      "name" : "CUDA Runtime (cudart)",
      "version" : "12.0.107"
   },
   "cuda_cuobjdump" : {
      "name" : "cuobjdump",
      "version" : "12.0.76"
   },
   "cuda_cupti" : {
      "name" : "CUPTI",
      "version" : "12.0.90"
   },
   "cuda_cuxxfilt" : {
      "name" : "CUDA cu++ filt",
      "version" : "12.0.76"
   },
   "cuda_demo_suite" : {
      "name" : "CUDA Demo Suite",
      "version" : "12.0.76"
   },
   "cuda_gdb" : {
      "name" : "CUDA GDB",
      "version" : "12.0.90"
   },
   "cuda_nsight" : {
      "name" : "Nsight Eclipse Plugins",
      "version" : "12.0.78"
   },
   "cuda_nvcc" : {
      "name" : "CUDA NVCC",
      "version" : "12.0.76"
   },
   "cuda_nvdisasm" : {
      "name" : "CUDA nvdisasm",
      "version" : "12.0.76"
   },
   "cuda_nvml_dev" : {
      "name" : "CUDA NVML Headers",
      "version" : "12.0.76"
   },
   "cuda_nvprof" : {
      "name" : "CUDA nvprof",
      "version" : "12.0.90"
   },
   "cuda_nvprune" : {
      "name" : "CUDA nvprune",
      "version" : "12.0.76"
   },
   "cuda_nvrtc" : {
      "name" : "CUDA NVRTC",
      "version" : "12.0.76"
   },
   "cuda_nvtx" : {
      "name" : "CUDA NVTX",
      "version" : "12.0.76"
   },
   "cuda_nvvp" : {
      "name" : "CUDA NVVP",
      "version" : "12.0.90"
   },
   "cuda_opencl" : {
      "name" : "CUDA OpenCL",
      "version" : "12.0.76"
   },
   "cuda_sanitizer_api" : {
      "name" : "CUDA Compute Sanitizer API",
      "version" : "12.0.90"
   },
   "libcublas" : {
      "name" : "CUDA cuBLAS",
      "version" : "12.0.1.189"
   },
   "libcufft" : {
      "name" : "CUDA cuFFT",
      "version" : "11.0.0.21"
   },
   "libcufile" : {
      "name" : "GPUDirect Storage (cufile)",
      "version" : "1.5.0.59"
   },
   "libcurand" : {
      "name" : "CUDA cuRAND",
      "version" : "10.3.1.50"
   },
   "libcusolver" : {
      "name" : "CUDA cuSOLVER",
      "version" : "11.4.2.57"
   },
   "libcusparse" : {
      "name" : "CUDA cuSPARSE",
      "version" : "12.0.0.76"
   },
   "libnpp" : {
      "name" : "CUDA NPP",
      "version" : "12.0.0.30"
   },
   "libnvjitlink" : {
      "name" : "JIT Linker Library",
      "version" : "12.0.76"
   },
   "libnvjpeg" : {
      "name" : "CUDA nvJPEG",
      "version" : "12.0.0.28"
   },
   "libnvvm_samples" : {
      "name" : "NVVM Samples",
      "version" : "12.0.94"
   },
   "nsight_compute" : {
      "name" : "Nsight Compute",
      "version" : "2022.4.0.15"
   },
   "nsight_systems" : {
      "name" : "Nsight Systems",
      "version" : "2022.4.2.18"
   },
   "nvidia_fs" : {
      "name" : "NVIDIA file-system",
      "version" : "2.14.12"
   }
}
```


# 参考
- https://learn.microsoft.com/ja-jp/windows/ai/directml/gpu-cuda-in-wsl
- https://docs.nvidia.com/cuda/wsl-user-guide/index.html#getting-started-with-cuda-on-wsl
- https://www.nvidia.co.jp/download/driverResults.aspx/198465/jp
- https://qiita.com/omu_kato/items/f9a6b5a02e25f5f2a487
-