## Description
某次斷電後,Nvidia Driver 的版本從 525 降回 460,多次重裝 Driver 與重新開機,都沒辦法升級回 525 版,以下筆記紀錄我解決此問題的過程。
OS: Ubuntu 20.04
## Steps
1. 查看是否有任何 Nvidia Package
```bash
dpkg -l | grep nvidia
```
2. 將這些 Package 一個不留的刪光
```bash
sudo apt-get remove --purge -y '*nvidia*'
```
3. 反覆前兩步驟,若有殘留的套件則手動刪除
+ e.g. `sudo apt-get remove --purge nvidia-driver-525-server`
4. 檢查是否有程序正在使用 Nvidia 裝置
```bash
sudo lsof '/dev/nvidia*'
```
5. 發現有 Xorg 正在啟用圖形化介面,把他關掉
```bash
sudo systemctl isolate multi-user.target
```
6. 執行 Nvidia 官方的刪除程式
```bash
sudo nvidia-uninstall
```
7. 刪除多餘的殘留套件
```bash
sudo apt autoremove -y
```
8. 檢查 DKMS 的 Nvidia 狀態
+ 安裝 DKMS 套件:
```bash
sudo apt-get install -y dkms
```
+ 檢查 DKMS 狀態:
```bash
sudo dkms status
```
9. 刪除 DKMS 底下所有與 Nvidia 相關的資料夾,例如:
```bash
ls /var/lib/dkms
sudo rm -rf /var/lib/dkms/nvidia-srv
sudo rm -rf /var/lib/dkms/nvidia-440
sudo rm -rf /var/lib/dkms/nvidia-465
```
10. **(非常重要)重新開機**
+ 重開前確認 `nvidia-smi` 指令並不存在,但即便不存在,重開之後也有可能冒出來
11. 重開後輸入 `nvidia-smi` 確認**此指令並不存在**,代表大致上刪除成功
12. 重新安裝 Nvidia Driver
+ 查詢有哪些 Driver 版本可以安裝
```bash
apt-cache search nvidia-driver
```
+ 安裝目標版本的驅動程式,例如 525 為 CUDA 12.0
```bash
sudo apt-get install nvidia-driver-525-server
```
+ 如果是使用桌面版的 Ubuntu 則可以透過以下指令安裝:
```bash
sudo ubuntu-drivers autoinstall
```
13. 安裝過程中發生類似以下的訊息:
:::spoiler Logging Message
```
Setting up nvidia-dkms-525-server (525.105.17-0ubuntu0.20.04.1) ...
update-initramfs: deferring update (trigger activated)
INFO:Enable nvidia-srv
DEBUG:Parsing /usr/share/ubuntu-drivers-common/quirks/lenovo_thinkpad
DEBUG:Parsing /usr/share/ubuntu-drivers-common/quirks/dell_latitude
DEBUG:Parsing /usr/share/ubuntu-drivers-common/quirks/put_your_quirks_here
Loading new nvidia-srv-525.105.17 DKMS files...
Building for 5.4.0-152-generic
Building for architecture x86_64
Building initial module for 5.4.0-152-generic
Secure Boot not enabled on this system.
Done.
nvidia.ko:
Running module version sanity check.
Error! Module version 525.105.17 for nvidia.ko
is not newer than what is already found in kernel 5.4.0-152-generic (530.41.03).
You may override by specifying --force.
```
:::
14. 解決方法:
+ 透過 DKMS 強制載入
```
sudo dkms install -m nvidia-srv -v 525.105.17 -k 5.4.0-152-generic --force
```
+ 其中 `525.105.17` 與 `5.4.0-152-generic` 是根據 Logging Message 決定的
+ 安裝的若不是 Server 版的 Nvidia Driver,則 `-m` 後面可能不是接 `nvidia-srv`
+ 可能是根據 `INFO:Enable ...` 決定的
+ 可能訊息長的不會完全一樣,但如果有類似 `.ko` 的訊息跑出來就可以試試看強制載入 DKMS 的指令。
15. 保險起見可以再重開一次。
16. 再次執行 `nvidia-smi` 確定驅動程式版本恢復成 525 了,萬歲 :tada:
## Power Limit
+ 查詢功率限制:
```bash
nvidia-smi -q -d POWER
```
+ 啟用持續模式使功率限制持續套用:
```bash
sudo nvidia-smi -pm ENABLED
```
+ 設定新的功率上限:
```bash
sudo nvidia-smi -i 0 -pl=250
```
+ 其中 `-i` 代表 GPU 的索引值。
## Installation
+ 移除 NVIDIA 相關套件:
```bash
sudo apt autoremove -y "nvidia-*"
sudo apt purge -y "nvidia-*"
```
+ 檢視最新版本:
```bash
curl https://download.nvidia.com/XFree86/Linux-x86_64/latest.txt
# 570.144 570.144/NVIDIA-Linux-x86_64-570.144.run
```
+ 也可以到[這個網頁](https://download.nvidia.com/XFree86/Linux-x86_64)查看版本資訊。
+ 以 570.144 版本為例,下載安裝程式:
```bash
wget https://download.nvidia.com/XFree86/Linux-x86_64/570.144/NVIDIA-Linux-x86_64-570.144.run
```
+ 給予安裝程式執行權限:
```bash
chmod +x NVIDIA-Linux-x86_64-570.144.run
```
+ 透過安裝程式移除驅動程式:
```bash
sudo ./NVIDIA-Linux-x86_64-570.144.run --uninstall
```
+ 執行安裝程式:
```bash
sudo ./NVIDIA-Linux-x86_64-570.144.run -q -s --no-opengl-files
```
+ 啟用驅動程式:
```bash
nvidia-smi -pm 1
```
## Reference
+ [ChatGPT Supporting](https://chat.openai.com/share/ec9ba59b-9b8c-45e3-bbb0-d88a9293ff6c)
+ [AskUbuntu: DKMS Status](https://askubuntu.com/a/1246540)