GPUのドライバ周りが壊れてるubuntu-desktopのドライバ再編

# 前置き
現在、UbuntuでNvidiaのGPUを使う方法が環境によって点在しています。というのもdesktop版とserverでのやり方、ドライバの種類、dockerの使用の有無など、があるためです。
という状況になると、複数人でGPUサーバーを管理している場合、前任者がどの入れ方でインストールを行ったかも分かりづらく、何が壊れているかわからないという場合もあるかと思います。今回はそんなGPUサーバーの環境を構築しなおします。

今回の再編の**目標**は以下です。
- Ubuntu-desktopでドライバを楽に入れる
- GPUdriverを綺麗にする
- dockerにGPUを対応させる

今回行った環境は以下です
```
スペック・構成
CPU i9-10980XE
RAM 128GB
GPU RTX A6000
OS  ubuntu22.04LTS
```
## 目次
- [GPUドライバの削除](#GPUドライバの削除)
- [dockerの削除](#dockerの削除)


# GPUドライバの削除
ドライバの削除は以下のコマンドでnvidiaに関連するソフトウェアを一括で削除します。
```[shell]
sudo apt purge nvidia-*
```
::: note
どのような状態でドライバがインストールされているかの特定を行うより、最新のドライバを入れ直したほうが早い場合です。後述するGUI経由でインストールされていない場合など恐らくすべての場合に対応します。
:::

# dockerの削除
docker周りの調子もおかしかったので再インストールを行います。
```[shell]
sudo apt purge -y --auto-remove docker-*
```

# GPUドライバの再インストール
Ubuntu DesktopではGUIでドライバを管理することができます。
CUI版の場合は、nouveauを無効にする手順が挟まりますが、こちらだと同時にインストールまで行うことができます。(nvidia-driverを選択した時点で自動的に無効化されます)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986547/12c0ba3f-b614-00d8-fff9-88befcaf4729.png)
設定画面を開き、ソフトウェアのアップデートを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986547/0739f94a-e440-1162-634a-f91164e995bd.png)
追加のドライバータブを選択し、上から三つ目の`NVIDIA driver metapackageをnvidia-driver-545から使用します(プロプライエタリ)`を選択します。

::: note
open kernel版とそうでないものの違いはkernelバージョンとの整合性の問題です。UbuntuをはじめとしたLinuxベースのOSにはLinux Kernelが基盤として動いており、このkernelバージョンとの相性によって動かないことがあるため、そのような場合ではこちらを選択することがあります。
:::
ここで再起動

# dockerの再インストール
面倒なことは避けたいのでワンライナーを使っていきます。
docker公式の[こちら](https://docs.docker.com/engine/install/ubuntu/#install-using-the-convenience-script)より、
```[shell]
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
```

# nvidia container toolkitのインストール
基本的には[公式ドキュメント](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html)に従って進めていくことになります。Ubuntuの場合はaptを利用します。
```
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
  && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list \
  && \
    sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
```

:::note warn
2023/12現在の話です。nvidiaのdocker対応はコロコロソフトウェアやバージョンが変わるのでその時々に合わせて変更してください。
:::

# 動作確認
```
tsukky@oasis:~$ docker run --gpus all nvidia/cuda:12.3.0-base-ubuntu22.04 nvidia-smi
Unable to find image 'nvidia/cuda:12.3.0-base-ubuntu22.04' locally
12.3.0-base-ubuntu22.04: Pulling from nvidia/cuda
aece8493d397: Already exists 
03bb9eb021f5: Pull complete 
d1937dd2edf2: Pull complete 
89aa5c6f8794: Pull complete 
7d4f0f8effa7: Pull complete 
Digest: sha256:ab701cbe9784a586949674dac46a83cd4bed19944fbc9324619317be865ea678
Status: Downloaded newer image for nvidia/cuda:12.3.0-base-ubuntu22.04
Sun Nov 19 06:51:43 2023       
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 545.29.02              Driver Version: 545.29.02    CUDA Version: 12.3     |
|-----------------------------------------+----------------------+----------------------+
| 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 RTX A6000               Off | 00000000:68:00.0  On |                  Off |
| 30%   33C    P8              13W / 300W |    356MiB / 49140MiB |      1%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+
                                                                                         
+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
+---------------------------------------------------------------------------------------+
```