【WSL, Docker対応】UbuntuのCUDAのバージョンをドライバーを更新せずに変更する方法

## はじめに
機械学習でGPUを使用するとき、CUDAのバージョンやドライバーの更新などかなり面倒くさいですよね
本記事では、CUDAのバージョン変更の最も簡単な方法を紹介します。

## 環境
Ubuntu OS
Ubuntu on WSL
Ubuntu on Docker
様々な環境で対応することができます。

## 本記事で使用する環境
本記事ではUbuntu OS 20.04を使用します
```bash
$ nvidia-smi
```
```bash
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.125.06   Driver Version: 525.125.06   CUDA Version: 12.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ...  Off  | 00000000:01:00.0  On |                  N/A |
| 32%   47C    P2    39W / 151W |   1153MiB /  8192MiB |     10%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A      1227      G   /usr/lib/xorg/Xorg                 59MiB |
|    0   N/A  N/A      1999      G   /usr/lib/xorg/Xorg                339MiB |
|    0   N/A  N/A      2140      G   /usr/bin/gnome-shell               50MiB |
|    0   N/A  N/A      5415      G   ...078913938099486096,262144       71MiB |
|    0   N/A  N/A      9540      G   ...RendererForSitePerProcess       55MiB |
|    0   N/A  N/A     14676      G   gzclient                           16MiB |
|    0   N/A  N/A     14685      G   gzserver                            5MiB |
|    0   N/A  N/A     15225      G   .../ros/noetic/lib/rviz/rviz        4MiB |
|    0   N/A  N/A     16556      C   python3                           528MiB |
+-----------------------------------------------------------------------------+
```
最新のNvidia-DriverとCUDA12.0が認識されています。

今回はドライバは変更せず、CUDA11.7を使用できるようにします。

## ステップ① : 使用したいCUDAをダウンロードとインストール
[Nvidia Developerの公式サイト](https://developer.nvidia.com/)から使用したいCUDAのランタイムファイルをダウンロードします。

今回の例では[CUDA11.7](https://developer.nvidia.com/cuda-11-7-0-download-archive?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=20.04&target_type=runfile_local)をダウンロードします。
![Screenshot from 2023-10-31 15-20-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298612/94667b90-a6fb-670b-172f-fd3c4a5d72d3.png)

選択をすると、インストールコマンドが表示されます。
![Screenshot from 2023-10-31 15-21-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298612/fc4021c0-1f7d-f2c0-327a-ebe33fadb60a.png)

ここで、```runfile``` をインストールするコマンドを下記のように変更します。
```bash
$ sudo sh cuda_11.7.0_515.43.04_linux.run --toolkit --silent --override
```
何をしているかというと、CUDAのインストールパスを ```/usr/local/``` に変更しています。

正しくインストールされているか確認してみましょう。
```bash
$ ls /usr/local
```
```bash
bin/  cuda@  cuda-11.7/  etc/  games/  include/  lib/  man@  sbin/  share/  src/
```
```cuda-11.7``` が確認できれば成功です。

## ステップ② : インストールしたCUDAにPATHを通す
あとは、使用するCUDAにPATHを通せば完成です。
```zshrc``` や ```bashrc``` に下記を追加します。
```bash
export PATH="/usr/local/cuda-11.7/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda-11.7/lib64:$LD_LIBRARY_PATH"
```
上記のcuda-11.7の箇所を使用したいバージョンに切り替えていくことで任意のCUDAのバージョンに変更することが可能です

確認として下記コマンドで使用したいCUDAが表示されるか確認しましょう
```bash
$ nvcc --version
```
```bash
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Tue_May__3_18:49:52_PDT_2022
Cuda compilation tools, release 11.7, V11.7.64
Build cuda_11.7.r11.7/compiler.31294372_0
```

ちなみに、```nvidia-smi``` ではCUDA12.0のままになっていますよ。

## 終わりに
CUDAのバージョンを一番簡単に変更できる方法でした。
よき機械学習ライフを！