banner
二階堂春希

春希のブログ

山雨欲来风满楼,故攻八面以铸无双。 孤战非所望,俗安不可期。
tg_channel
telegram
twitter
github

在ESXi中安裝Debian虛擬機的NVIDIA顯示卡驅動

背景#

近期,嘗試在家庭數據中心搭建一個用來跑 AI 的伺服器。因為我只有一台設備可以帶的動 3090,買一個新的又太貴了,所以選擇用 ESXi 直通虛擬機。

虛擬機配置如下:

  • EPYC 7302 * 48
  • 基於 ESXi-7.0U3 平台
  • NVIDIA GeForce RTX 3090
  • 128G 內存
  • Debian GNU/Linux 12 (bookworm) x86_64

主要過程#

首先配置虛擬機,按照慣例,設置:

  • 鎖定全部內存
  • 設置hypervisor.cpuid.v0=FALSE
  • 設置pciPassthru0.msiEnabled=FALSE

不做過多贅述,以後可能會補充具體過程。(咕咕咕)反正可以在很多地方找到這幾個操作。

在虛擬機內,首先配置 apt 源,使之包含non-free-firmware。 在/etc/apt/source.list中,添加non-free-firmware,完成後應該形如:

deb https://deb.debian.org/debian/ bookworm main contrib non-free non-free-firmware

然後,

sudo apt update
apt search ^nvidia-driver

如果正常,應該能找到

nvidia-driver/unknown 545.23.06-1 amd64
  NVIDIA metapackage

問題#

通常在物理機上,可以直接sudo apt install nvidia-driver,但在虛擬機,這樣不行。

先說如果按照物理機上的方案,直接apt install會發生什麼。

首先習慣性地先裝 cuda

sudo apt-get install software-properties-common
wget https://developer.download.nvidia.com/compute/cuda/12.3.0/local_installers/cuda-repo-debian12-12-3-local_12.3.0-545.23.06-1_amd64.deb
sudo dpkg -i cuda-repo-debian12-12-3-local_12.3.0-545.23.06-1_amd64.deb
sudo cp /var/cuda-repo-debian12-12-3-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo add-apt-repository contrib
sudo apt-get update
sudo apt-get -y install cuda-toolkit-12-3

然後

sudo apt install nvidia-driver

重啟,查詢顯卡狀態

nvidia-smi

查空,嘗試檢測顯卡

sudo apt install nvidia-detect
nvidia-detect

於是,就出現了一個令人困惑的報錯

Detected NVIDIA GPUs:
1b:00.0 VGA compatible controller [0300]: NVIDIA Corporation GA102 [GeForce RTX 3090] [10de:2204] (rev a1)

Checking card:  NVIDIA Corporation GA102 [GeForce RTX 3090] (rev a1)
Uh oh. Your card is not supported by any driver version up to 545.23.06.
A newer driver may add support for your card.
Newer driver releases may be available in backports, unstable or experimental.

這是不合理的,沒道理最新版的顯卡驅動不支持 3090,不過為了保險起見,我還是去NVIDIA 驅動下載界面檢查是否真的不支持。當然,結果果然是支持 3090。

解決方案#

在我不知道到底為什麼出現這個問題而反復重啟虛擬機時,我突然看到了問題的關鍵所在。之前,我一直用 ssh 去遠程連接虛擬機,但,當我在 VMRC 重啟虛擬機時,我看到了在開機的最後出現的這樣的錯誤

[   12.699654] NVRM: loading NVIDIA UNIX x86_64 Kernel Module  530.41.03  Thu Mar 16 19:48:20 UTC 2023
[   12.762447] nvidia-modeset: Loading NVIDIA Kernel Mode Setting Driver for UNIX platforms  530.41.03  Thu Mar 16 19:23:04 UTC 2023
[   12.871331] [drm] [nvidia-drm] [GPU ID 0x00000b00] Loading driver
[   12.972022] ACPI Warning: \_SB.PCI0.PE50.S1F0._DSM: Argument #4 type mismatch - Found [Buffer], ACPI requires [Package] (20210730/nsarguments-61)
[   13.732645] NVRM: GPU 0000:0b:00.0: RmInitAdapter failed! (0x26:0x56:1474)
[   13.732697] BUG: unable to handle page fault for address: 0000000000004628
[   13.732784] NVRM: GPU 0000:0b:00.0: rm_init_adapter failed, device minor number 0

(以上錯誤信息複製自論壇,實際略有差異但基本一致)

在 google 中搜索,得到了結果

簡單來說,需要安裝開放版本的 NVIDIA 驅動而不是默認的。論壇中的回答表示應該使用.run文件安裝,並附加參數-m=kernel-open,我不清楚是否有可以解決這個問題的 deb 包。

在應用這個方案之前,首先需要清理之前的安裝。

sudo nvidia-uninstall
sudo apt purge -y '^nvidia-*' '^libnvidia-*'
sudo rm -r /var/lib/dkms/nvidia
sudo apt -y autoremove
sudo update-initramfs -c -k `uname -r`
sudo update-grub2
sudo reboot

然後,從 NVIDIA 驅動下載站下載.run格式的驅動。並執行

sudo ./NVIDIA-Linux-x86_64-525.116.04.run -m=kernel-open
sudo update-initramfs -u
sudo reboot

可惜,這麼做之後,還是無法解決問題,nvidia-smi仍然什麼都找不到。不過這個確實有效果,開機的時候不會報那個錯了。

經過搜索之後,我在論壇找到了問題的另一部分的解決方案

這個解決方案要求在/etc/modprobe.d/nvidia.conf(如果沒有則創建)加上一行

options nvidia NVreg_OpenRmEnableUnsupportedGpus=1

重啟,問題解決。

最後,按照NVIDIA cuDNN 安裝文檔,安裝 cuDNN,並成功跑起來了幾個模型。

成功結果

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。