在Proxmox VE 8下开启vGPU – Tesla P4为例

1、对于 Proxmox VE 8,需要使用16.0+版本的 vGPU 驱动程序,低版本的驱动程序不支持 Linux 6.x 内核。

vGPU
vGPU 技术通过将硬件 GPU 分割成多个虚拟 GPU 以支持多个虚拟机。每个虚拟 GPU 可以被分配给不同的虚拟机,从而使多个虚拟机拥有“独显”。

2、关于 PVE 使用 GPU 有三种方法:
显卡直通
普通显卡 + vGPU-unlock
数据中心显卡 vGPU

3、NVIDIA® 虚拟 GPU 软件支持的 GPU(NVIDIA® Virtual GPU Software Supported GPUs)

4、物理宿主机
主板 BIOS 需要开启 IOMMU / VT-d、Above 4G Decoding、SR-IOV。

IOMMU 是一种地址映射技术,而 VT-d 是 Intel 对该技术的别称;Above 4G Decoding 关系到 PCI-E 设备 RAM 的 64 位寻址能力,通常用于需要让 CPU 访问全部显存的场景,使用 vGPU 时推荐开启;SR-IOV 允许一个 PCI-E 设备被多个虚拟机使用,常用于网卡等设备共享。

PVE 物理宿主机配置

# 把下面几行追加到 /etc/modules 里,用于加载所需的内核模块
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
 
# 屏蔽开源驱动
echo "blacklist nouveau" >> /etc/modprobe.d/pve-blacklist.conf
 
# 开启IOMMU
#编辑grub,请不要盲目改。根据自己的环境,选择设置
vi /etc/default/grub
#在里面找到:
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
#然后修改为:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"
#如果是amd cpu请改为:
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt"
#如果是需要显卡直通,建议在cmdline再加一句video=vesafb:off video=efifb:off video=simplefb:off,加了之后,pve重启进内核后停留在一个画面,这是正常情况
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt video=vesafb:off video=efifb:off video=simplefb:off"

修改完成之后,直接更新grub 
update-grub

注意,如果此方法还不能开启iommu,请修改 
 /etc/kernel/cmdline文件
并且使用proxmox-boot-tool refresh 更新启动项
 
# 安装依赖包
apt install build-essential dkms mdevctl pve-headers-$(uname -r)
 
# 重启机器
reboot

重启之后,在终端输入
dmesg | grep iommu
出现如下例子。则代表成功

[ 1.341100] pci 0000:00:00.0: Adding to iommu group 0
[ 1.341116] pci 0000:00:01.0: Adding to iommu group 1
[ 1.341126] pci 0000:00:02.0: Adding to iommu group 2
[ 1.341137] pci 0000:00:14.0: Adding to iommu group 3
[ 1.341146] pci 0000:00:17.0: Adding to iommu group 4

5、安装 NVIDIA Host 驱动
NVIDIA 官网的驱动是非公开的,需要注册 NVIDIA 商业账户才可访问;
vGPU16.7 KVM 驱动 NVIDIA-GRID-Linux-KVM-535.183.04-53...
链接:https://pan.baidu.com/s/181yNg67-nr1u5kF6unjrIQ?pwd=w3lh
提取码:w3lh

# 本次安装环境:PVE版本7.4-3,Linux内核版本5.15.107-2,驱动版本15.1
chmod +x NVIDIA-Linux-x86_64-430.67-vgpu-kvm.run
./NVIDIA-Linux-x86_64-430.67-vgpu-kvm.run
 
# 安装过程完成后可以使用以下命令验证
$ dkms status
nvidia, 525.85.07, 5.15.107-2-pve, x86_64: installed
$ nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.85.07    Driver Version: 525.85.07    CUDA Version: N/A      |
|-------------------------------+----------------------+----------------------+
| 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  Tesla P4            On   | 00000000:81:00.0 Off |                    0 |
| N/A   53C    P8    12W /  75W |   1899MiB /  7680MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
 

6、划分 PCI-E 设备给虚拟机
通过 mdevctl types | grep '^[^ ]*$' 查看所有生成了 mdev 的 PCI 设备 ID,然后通过 PVE 网页控制台给虚拟机分配 PCI 设备,设备选择刚才查到的设备 ID。该处的 MDev 字段,后面半段的数字为显存容量,字母为 vGPU 类型,这里选 Q 全能型即可,显存按需分配。

7、Debian 系统安装vGPU。

# 禁用 nouveau 并安装必须软件包
echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf
apt install build-essential gcc-multilib dkms mdevctl
update-initramfs -k all -u
reboot
 
# 重启完成后安装 Guest 驱动
chmod +x NVIDIA-Linux-x86_64-430.63-grid.run
./NVIDIA-Linux-x86_64-430.63-grid.run
 
# 验证安装是否成功
dkms status
nvidia-smi
nvidia-smi -q | grep License # 查看授权,Unlicensed (Unrestricted) 表示未授权

8、安装授权
Windows
使用管理员身份启动 PowerShell 执行如下命令
# <ls-hostname-or-ip>为你的授权服务IP端口
curl.exe --insecure -L -X GET https://<dls-hostname-or-ip>/-/client-token -o "C:\Program Files\NVIDIA Corporation\vGPU Licensing\ClientConfigToken\client_configuration_token_$($(Get-Date).tostring('dd-MM-yy-hh-mm-ss')).tok"
 
Restart-Service NVDisplay.ContainerLocalSystem

Linux
root 执行如下命令
# <ls-hostname-or-ip>为你的授权服务IP端口
curl --insecure -L -X GET https://<dls-hostname-or-ip>/-/client-token -o /etc/nvidia/ClientConfigToken/client_configuration_token_$(date '+%d-%m-%Y-%H-%M-%S').tok
 
service nvidia-gridd restart

9、查看授权
Windows
使用管理员身份启动 PowerShell 执行如下命令
nvidia-smi.exe -q | Select-String License # 查看授权状态

Linux
root 执行如下命令
nvidia-smi -q | grep License # 查看授权状态