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,并成功跑起来了几个模型。

成功结果