Atlantis
GitHub Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

5.4 Nvidia开源GPU内核模块

1. 前言

在用上 RTX3060 Laptop 12G GDDR6 显卡后,笔者接触了一个全新的领域:魔改显卡,主角还是 N 卡,魔改内容主要是:显存扩容、笔记本显卡改桌面显卡、服务器显卡改桌面显卡。

魔改操作会产出各种非标显卡,过去由于 N 卡驱动闭源无法兼容,而在 2022 年的 5 月份,Nvidia 公布了它的开源内核模块,驱动魔改显卡变得简单了,加上这两年的挖矿和 AI 热潮导致的显卡荒,在一些对显存要求比较高的场景里,魔改显卡可以说是最优选择:22G 的 2080Ti、20G 的 3080、16G 的 3070,每个型号都做到了量大管饱。

笔者主要使用 3060 显卡运行 stable diffusion 和 ollama,这里记录下 Debian 12 系统的 Linux 虚拟机上安装 Nvidia 开源 GPU 内核模块的操作。

3. 创建虚拟机

虚拟机必须选择 q35 机型,使用 UEFI 启动,创建完虚拟机后添加 N 卡对应的 PCI 设备,启动虚拟机。

如果虚拟机系统里已经安装了 N 卡驱动,在 dmesg 中看到 rm_init_adapter failed 的错误信息,说明显卡无法驱动:

4. 安装内核模块

安装内核模块前,可以选择关闭虚拟机的安全启动(secure boot),因为运行 run 文件安装内核模块的过程中会生成一个证书,我们需要在 BIOS 中加载证书,否则无法驱动显卡,关闭安全启动可以忽略证书。

下面的操作是在未关闭安全启动的情况下进行的,需要手动生成证书和导入证书。

4.1 配置内核模块加载参数

/etc/modprobe.d 下新增两个文件

/etc/modprobe.d/blacklist.conf,内容如下:

blacklist nouveau
options nouveau modeset=0

/etc/modprobe.d/nvidia.conf,内容如下:

options nvidia NVreg_OpenRmEnableUnsupportedGpus=1

然后重新生成 initramfs

update-initramfs -u -k all

4.2 下载run文件

我们可以从官网下载到包含内核模块的 run 文件:https://www.nvidia.com/en-us/drivers/unix/,一般下载最新驱动即可,如果需要安装 CUDA,建议先下载 CUDA,它的 run 文件命中会包含对应的内核模块版本,需要确保当前安装的内核模块版本不低于 CUDA 要求的版本。

笔者需要安装 CUDA 12.2,这里选择 535.54.03 版本。

4.3 安装内核模块

安装过程涉及到编译驱动,需要提前安装 header 文件与 build-essential:

apt install linux-headers-amd64 build-essential

这里是在启用 secure boot 的状态下安装的驱动,需要配置内核模块签名并导入,我们生成了一对密钥,并导入了一个公钥:

openssl req -new -x509 -newkey rsa:4096 -keyout ~/.ssh/nvidia-module-private.key -outform DER -out ~/.ssh/nvidia-module-public.key -nodes -days 3650 -subj "/CN=nvidia-kernel-module"
mokutil --import ~/.ssh/nvidia-module-public.key

导入公钥时会提示输入密码,尽量配置的简单一些,用于安装驱动后第一次重启时的 MOK 管理页面。

下面运行 run 文件,添加 -m=kernel-open 选择开源内核模块,并用 module-signing 参数选择上一步生成的公私钥:

./NVIDIA-Linux-x86_64-535.54.03.run -m=kernel-open --module-signing-secret-key=$HOME/.ssh/nvidia-module-private.key --module-signing-public-key=$HOME/.ssh/nvidia-module-public.key

安装完成后重启系统,在 BIOS 页面会提示配置 MOK,选择 Enroll MOK 后输入密码即可:

进入系统后执行 nvidia-smi 可以查看显卡信息:

5. 安装CUDA

CUDA 也使用 run 文件安装,下载地址:https://developer.nvidia.com/cuda-downloads

安装过程中会有一步选择安装哪些模块,我们需要取消勾选内核模块的选项。

安装完成后修改当前 shell 的 rc 文件添加 cuda 相关的可执行文件和动态库路径:

# cuda
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH