"Failed to initialize NVML: Driver/library version mismatch" というエラーが出る際の対処メモ

# 概要
nvidia-smi を実行するとこれまで発生しなかった下記のようなエラーが発生した。
```
$ nvidia-smi
Failed to initialize NVML: Driver/library version mismatch
```

# 環境
- OS: Ubuntu22.04
- グラフィックボード: GeForce RTX 2060 SUPER(12G)

# 原因
再起動したところ下記のようにエラー内容が変わった
```
$ nvidia-smi
NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.
```
エラー内容から"nvidia-driver"がいつの間にかアップグレードされ、グラフィックボードがサポートしていないバージョンになったと考えられる。
ログを確認する。
```
$cat /var/log/apt/history.log |grep Upgrade|grep nvidia
Upgrade: libnvidia-common-530:amd64 (530.30.02-0ubuntu1, 535.113.01-0ubuntu0.22.04.1), libnvidia-fbc1-530:amd64 (530.30.02-0ubuntu1, 535.113.01-0ubuntu0.22.04.1), libnvidia-fbc1-530:i386 (530.30.02-0ubuntu1, 535.113.01-0ubuntu0.22.04.1), libnvidia-gl-530:amd64 (530.30.02-0ubuntu1, 535.113.01-0ubuntu0.22.04.1), libnvidia-gl-530:i386 (530.30.02-0ubuntu1, 535.113.01-0ubuntu0.22.04.1), libnvidia-extra-530:amd64 (530.30.02-0ubuntu1, 535.113.01-0ubuntu0.22.04.1), nvidia-compute-utils-530:amd64 (530.30.02-0ubuntu1, 535.113.01-0ubuntu0.22.04.1), nvidia-dkms-530:amd64 (530.30.02-0ubuntu1, 535.113.01-0ubuntu0.22.04.1), nvidia-driver-530:amd64 (530.30.02-0ubuntu1, 535.113.01-0ubuntu0.22.04.1), libnvidia-encode-530:amd64 (530.30.02-0ubuntu1, 535.113.01-0ubuntu0.22.04.1), libnvidia-encode-530:i386 (530.30.02-0ubuntu1, 535.113.01-0ubuntu0.22.04.1), nvidia-utils-530:amd64 (530.30.02-0ubuntu1, 535.113.01-0ubuntu0.22.04.1), xserver-xorg-video-nvidia-530:amd64 (530.30.02-0ubuntu1, 535.113.01-0ubuntu0.22.04.1), libnvidia-decode-530:amd64 (530.30.02-0ubuntu1, 535.113.01-0ubuntu0.22.04.1), libnvidia-decode-530:i386 (530.30.02-0ubuntu1, 535.113.01-0ubuntu0.22.04.1), nvidia-kernel-common-530:amd64 (530.30.02-0ubuntu1, 535.113.01-0ubuntu0.22.04.1), libnvidia-cfg1-530:amd64 (530.30.02-0ubuntu1, 535.113.01-0ubuntu0.22.04.1), nvidia-kernel-source-530:amd64 (530.30.02-0ubuntu1, 535.113.01-0ubuntu0.22.04.1), libnvidia-compute-530:amd64 (530.30.02-0ubuntu1, 535.113.01-0ubuntu0.22.04.1), libnvidia-compute-530:i386 (530.30.02-0ubuntu1, 535.113.01-0ubuntu0.22.04.1)
```
ログから、今回の場合は"nvidia-driver530"から"nvidia-driver535"にアップグレードされていることがわかりこれが原因だと考えられる。

# 解決方法
## アンインストール
```
$sudo apt --fix-broken install
$sudo apt remove *nvidia* --purge
```
## nvidia-driver の再インストール
```
$sudo apt install nvidia-driver-535
$sudo reboot
```
再起動後、正常に動作するようになる。
(Driver versionが 535.129.03 以降であればOK)

```
$nvidia-smi 
Sat Oct  7 18:24:06 2023      
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.129.03             Driver Version: 535.129.03   CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| 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 RTX 2060        On  | 00000000:01:00.0  On |                  N/A |
| 41%   35C    P2              39W / 184W |    690MiB / 12288MiB |      3%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+                                                                           
```
## おまけ: nvidia-toolkit の再インストール

NVIDIA Container Toolkit も同時にアンインストールしてしまっているので、[公式](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html)を参考にで再インストールする。
```
$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
```
下記のように出力された場合は "y" を入力する。
```
ファイル'/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg'は既に存在します。 上書きしますか? (y/N) y
```
再起動する
```
$sudo reboot
```
## おまけ　自動更新の無効化
[【Ubuntu】パッケージの自動更新を無効にする](https://qiita.com/dan-go/items/0d863ab5d11494cd7ec5)の記事を参考に自動更新を無効にしました。
sudo 権限で"/etc/apt/apt.conf.d/20auto-upgrades"を開き、下記のように変更することで、自動アップグレードを防ぐことができます。（他のツールも手動アップグレードが必要になるので注意してください）

```/etc/apt/apt.conf.d/20auto-upgrades
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "0";
```
2行目のUnattended-Upgradeが'1'の場合に、自動でパッケージがアップグレードがされるので'0'に変更しております。

# 参考
本記事は下記のサイトを参考にしました。
 
- [Installing the NVIDIA Container Toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html)
- [【Ubuntu】パッケージの自動更新を無効にする](https://qiita.com/dan-go/items/0d863ab5d11494cd7ec5)
- [サーバー運用時のエラー](https://zenn.dev/yutashx/scraps/861e4245b3d9c9)
# まとめ
本記事では "Failed to initialize NVML: Driver/library version mismatch" というエラーが発生した際の対処方法のメモを記載しました。