1. 前言
1.1 应用场景
GPU在VDI的项目中有非常重要的作用。主要应用于如下场景:
办公场景:vGPU用于对操作系统和相关应用进行加速,提升用户体验,降低CPU的消耗。
在Microsoft Windows 10/11、Office 365、Web 浏览器和视频流相关的应用程序,对硬件的需求也日益严苛,会使用到GPU进行加速。在办公场景中,为桌面配置vGPU,可以提升体验,降低CPU的消耗,从而提高服务器部署的桌面的密度。
设计场景:专业的设计应用(CAD/CAM)需要使用GPU进行加速显示、渲染、模拟计算
专业的设计软件对于桌面的GPU有要求。缺少GPU将运行这些专业的应用。 比如数字媒体、设计、仿真等应用。比如 Adobe系列产品(PS、AE、AI、PR、AU)、Autocad、Revit、Maya、3Dmax、SolidWorks、Pro-E、NX/UG、Catia、Stable Diffusion、Blender 3D。 这类应用一般采用专业的图形工作站。
游戏场景:满足在线运行游戏的需求,满足游戏的实时交互体验
比如3A大作《地平线5》、《黑神话-悟空》,《元神》,以及一些网络游戏,单机游戏。
游戏场景对GPU由更高的要求,一方面游戏是实时业务,需要及时低延时和瞬时响应,以确保操作体验。另一方面游戏对于画质、实时渲染的帧率,有很高的要求。
在实际部署中,游戏场景一般采用独立显卡,并且采用高画质低延时的串流协议。
1.2 DoraCloud支持的vGPU的技术
GPU直通(GPU Passthrough)
GPU直通是最早的vGPU技术。直通方案将一个GPU的PCI地址映射到虚拟机。一个GPU只能给一个虚拟机使用。
GPU分片虚拟化(vGPU)
GPU分片虚拟化是将一个物理的GPU分割成多个实例,给不同的虚拟机使用。最初PCI规范下,一个物理GPU设备只有一个PCI地址,为了能够多个虚拟机能够使用一个GPU,需要引入一个协调者(Mediate),来协调不同虚拟机对GPU的使用。每个虚拟机使用的是一个mdev(Mediated Device)。至于IOMMU(地址空间映射)是为了实现GPU和虚拟机的高效和快速通信。
NVIDIA 安培架构之前的GPU都是采用Mediate方案。NVIDIA M10/M60/P4/P40/T4/RTX6000/RTX6000 都是这种方案。
NVIDIA 支持vGPU的显卡打包在了NVIDIA vWS 和 vPC 的方案里面。只有宣称支持vWS/vPC的显卡采用启用GPU虚拟化。并且NVIDIA会对vGPU收取License费用。
另外针对普通NVIDIA显卡不支持虚拟化的问题,业内有vgpu-unlock的方案,将普通显卡破解,实现启用vGPU。这一方案仅仅适用于图灵架构及之前的GPU。安培架构的GPU不适用于这一方案。并且vgpu-unlock的方案是否存在兼容性和稳定性问题,也无法证实。实际项目部署,不推荐使用vgpu-unlock。
基于SR-IOV的vGPU
SR-IOV:单根IO虚拟化,指的是一个PCIe物理设备,可以虚拟出多个虚拟设备,每个虚拟设备又自己的PCI地址。这样物理设备内的每个虚拟设备的实例可以分配自己的PCI地址。这样虚拟机与虚拟设备实例之间可以通过自己的PCI地址进行通信。效率大大提升,也简化了管理。
NVIDIA 的GPU从安培架构开始支持SR-IOV。比如 A2、A10、A40、A5000、A6000、L2、L20、L40。尽管支持SR-IOV,mediate的功能框架仍然保留了。
微软在Azure Stack HCI 和 Windows Server 2025中,提供了基于SR-IOV的vGPU的支持。微软称之为GPU-P。
Intel从12代CPU开始,也支持核显的SR-IOV。11代的移动处理器(比如1135G7)核显也支持SR-IOV。
AMD采用SR-IOV的vGPU技术称为 MxGPU。
DoraCloud 目前不支持 MxGPU 和 GPU-P。
1.3 DoraCloud 与 Proxmox VE 不同版本的配套关系
Proxmox VE 7.x 支持安装并启用NVIDIA vGPU 和 Intel SR-IOV Graphcis的驱动,并且在虚拟机中配置和使用这些vGPU资源。
Proxmox VE 7.x可以通过直接将GPU的PCIe地址和vGPU类型配置给虚拟机。由于PCIe地址是GPU在服务器上的物理地址,这种方式带来了两个问题:
1)如果虚拟机发生跨节点迁移(比如热迁移或者HA),新的服务器上的GPU的会不一样。导致无法进行HA和热迁移。
2)如果GPU硬件发生变化,需要调整虚拟机配置中的物理地址。 这种方式和虚拟化的隔离和解耦的思路是相违背的。增加了虚拟化系统进行资源管理和调度的难度。
Proxmox VE 8.x 中,增加了Resource Mapping的特性。
ResourceMapping 在Proxmox VE的集群层面定义了一个唯一的资源ID,这个ID关联到一组硬件(PCIE设备或者USB设备)。虚拟机的配置中,只需要记录ResouceMapping的资源ID即可。虚拟化管理系统(PVE)自动根据资源ID在ResouceMapping定义的资源集合中,匹配合适的资源。
在没有ResourceMapping特性时,DoraCloud是将同类型的GPU定义成一个资源池,并分配和这个池的资源。比如一个Proxmox VE集群中配置了4个Tesla P4卡,DoraCloud会识别出Tesla P4这种GPU类型,允许管理员在桌面池中引用这种类型的GPU,并定义vGPU。 参考下面的表格。
桌面池 | GPU类型 | vGPU类型 |
---|---|---|
桌面池A | Tesla P4 | P4-1Q |
但是这种设计,只能把同一类型的GPU当作一个池进行调度。 如果管理员系统 2块P4给桌面池A,类型为 P4-1Q,两块P4给桌面池B,类型为P4-2Q,那么DoraCloud将无法准确调度这些资源到不通过的P4显卡。 比如下面的桌面池定义,DoraCloud将无法准确的资源进行调度。
桌面池 | GPU类型 | vGPU类型 |
---|---|---|
桌面池A | Tesla P4 | P4-1Q |
桌面池B | Tesla P4 | P4-2Q |
如果使用 ResourceMapping,可以在 Proxmox VE 的集群上定义如下Mapping
Mapping ID | Mapping |
---|---|
GPUA | PVE1 card1,PVE2 card1 |
GPUB | PVE1 card2,PVE2 card2 |
然后在DoraCloud的桌面池上定义:桌面池A使用Mapping:GPUA、桌面池B使用Mapping:GPUB。
桌面池 | GPU类型 | vGPU类型 |
---|---|---|
桌面池A | Mapping:GPUA | P4-1Q |
桌面池B | Mapping:GPUB | P4-2Q |
DoraCloud与Proxmox VE 7.x对接时,不支持管理直通的GPU资源。 DoraCloud 与Proxmox VE 8.x对接时,使用ResouceMapping特性也允许DoraCloud比较容易的支持GPU直通(GPU Passthrough)。
比如:一个Proxmox VE 8.0节点配置有4个RTX 3060Ti的显卡。可以定义如下Mapping
Mapping ID | Mapping |
---|---|
RTX3060GPU | PVE1 card1/card2/card3/card4 |
然后定义一个桌面池
桌面池 | GPU类型 | vGPU类型 |
---|---|---|
游戏桌面池 | Mapping:RTX3060GPU | GPU Passthrough |
这样游戏桌面池中的桌面就可以自动使用Proxmox VE 8.x 中定义的由4个显卡组成的RTX3060 ti的资源池。
总结一下,DoraCloud在不同的PVE版本上对几种GPU技术的支持如下表:
DoraCloud+PVE7 | DoraCloud+PVE8 | |
---|---|---|
GPU 直通 | 不支持 | 使用ResouceMapping管理 |
NVIDIA vGPU | 按照类型管理 | 按照类型管理、使用Resouce Mapping管理 |
Intel SR-IOV | 按照类型管理 | 按照类型管理 |
1.4 支持vGPU硬件的形态
不同应用场景,不同的vGPU技术,有不同的硬件形态。
硬件A:服务器+可虚拟化显卡
以2U的服务器Dell R750服务器为例,可以支持2块双宽A40显卡,3块A10,6块T4/L2/A2。
*硬件B:服务器+多块直通显卡
用于直通的服务器一般选用4U服务器,支持6-8个GPU卡进行直通。常见的为采用超微主板的机器。
硬件C:PC Farm/Blade PC
一般为5U5节点,支持带显卡。 也有一些2U6节点的机器,节点不支持显卡。
硬件D:PC(核显)
普通PC 或者工作站,选用12代以上Intel CPU。
硬件E:工作站+普通显卡
比如Dell T3680 + NVIDIA RTX A2000/A4000
硬件F:工作站+可虚拟化显卡
比如Dell T3680 + NVIDIA RTX A5000
不同硬件适用的场景如下:
类型 | 类型名称 | 适用vGPU技术 | 适用场景 |
---|---|---|---|
硬件A | 服务器+可虚拟化显卡 | NVIDIA vGPU | 设计、办公 |
硬件B | 服务器+多块直通显卡 | GPU直通 | 设计、游戏 |
硬件C | PC Farm/Blade PC | GPU直通 | 游戏、设计 |
硬件D | PC(核显) | Intel SR-IOV GPU | 办公、轻设计 |
硬件E | 工作站+普通显卡 | GPU直通 | 设计、旧改 |
硬件F | 工作站+可虚拟化显卡 | NVIDIA vGPU | 设计、旧改 |
2 GPU的配置
2.1 NVIDIA vGPU方案的配置
从配置和使用角度,NVIDIA支持vGPU的显卡可以分为三类:
第一类:传统的支持虚拟化的GPU卡
这类显卡不带显示输出,也不支持 SR-IOV,直接安装vGPU驱动即可支持。对这类显卡,我们准备了gpu01.sh、gpu02.sh、gpu03.sh 三个脚本。 gpu01.sh 替换源,并更新pve。 gpu02.sh 启用iommu。gpu03.sh 安装 NVIDIA vGPU的Host层的驱动。
由于NVIDIA GPU的驱动经常升级,gpu03.sh安装的是当前的比较合适的驱动。如果希望其他版本驱动,可以参考这个脚本,下载其他版本的驱动安装。
配置成功的标志是:使用 mdevctl types ,可以查询到GPU虚拟化后支持的vGPU类型
第二类:支持SR-IOV的数据中心的GPU卡
这类显卡,不带有显示输出功能,或者默认不启用显示输出。但是SR-IOV的功能缺省是不启用的。
这类显卡如果需要启用vGPU,需要执行 sriov-manager命令,启用SR-IOV功能。
在安装好Proxmox VE 主机的NVIDIA 驱动后,根据显卡的PCI地址,执行sriov-manage激活SR-IOV功能。
/usr/lib/nvidia/sriov-manage -e 0000:af:00.0
或者使用 ALL 参数,激活所有显卡的SR-IOV功能。
/usr/lib/nvidia/sriov-manage -e ALL
之后如果使用 mdevctl types 查询到vGPU类型,即配置成功了。
第三类:支持SR-IOV的工作站的GPU卡
这类显卡用于工作站,显卡默认处于显示输出模式。这类显卡用于vGPU就比较复杂。比如A5000、A6000下卡配置步骤如下:
1)确保用于虚拟化的显卡没有被用于本地的显示输出
比如工作站默认使用核显输出。 或者有一个亮机卡,用于默认输出。用于虚拟化的显卡不能用于显示输出。记得修改BIOS,设置默认输出的显卡。也可以拆开机器,把用于虚拟化的显卡先拔出来。确保系统可以开机并正常显示。然后再关机,插入需要虚拟的显卡。
2)使用NVIDIA的displaymodeselector,设置工作模式为physical_display_disabled模式。
通过 ./displaymodeselector –gpumode 设置显卡模式为physical_display_disabled
如果GPU被用于当前显示,该命令可能导致主机黑屏,无法显示。
通过 ./displaymodeselector –listgpumodes 确认GPU的模式为 如下状态
root@test:~# ./displaymodeselector --listgpumodes
NVIDIA Display Mode Selector Utility (Version 1.48.0)
Copyright (C) 2015-2020, NVIDIA Corporation. All Rights Reserved.
Adapter: Graphics Device (10DE,2230,1028,1459) S:00,B:AF,D:00,F:00
EEPROM ID (EF,6015) : WBond W25Q16FW/JW 1.65-1.95V 16384Kx1S, page
GPU Mode: Graphics mode with physical display disabled
- 使用 sriov-manage 激活 SR-IOV 功能。
最后使用 mdevctl types 命令查询vGPU类型。如果查询到了,就配置成功了。
配置NVIDIA 的GPU后,如果可以查询 mdevctl types,即可被DoraCloud发现并使用。
如果是在 PVE8平台下,可以配置Resouce Mapping。DoraCloud可以通过ResouceMapping管理vGPU。
如果集群中某个型号的GPU只有一种分割方式,可以不用定义ResouceMapping。如果一种型号的GPU需要有多种分割方式,需要为每种分割方式定义个ResouceMapping,这样才能有效管理GPU。
2.2 GPU直通方案的配置
DoraCloud支持GPU直通需要搭配Proxmox VE 8.0。
配置过程如下:
1)执行 Proxmox VE 的更新和升级
如下命令升级到 Proxmox VE 8.x 的最新版本。
curl -o- http://vdi.doracloud.cn:9000/software/pveupdate.sh |bash
然后 reboot 重启。
2)在Proxmox VE 的Cluster中增加 Resource Mapping。
假设主机上有1个A4000,可以创建一个 Resource Mapping,内容如下
TBD ,RM 截图。
2.3 Intel SR-IOV GPU的的配置
针对Intel的核显vGPU,DoraCloud提供了 sriov01.sh,sriov2.sh
12代CPU i5-12400d的主机,安装Proxmox 7/8后,执行如下命令,等待重启。
curl -o- http://vdi.doracloud.cn:9000/software/sriov01.sh |bash
然后执行如下命令,等待自动重启。
curl -o- http://vdi.doracloud.cn:9000/software/sriov02.sh |bash
最后使用 lspci |grep VGA 验证 vGPU已经启用。
3 DoraCloud中使用vGPU
DoraCloud连接Proxmox VE后,可以发现不同类型的vGPU资源。
包括:mdevctl types 发现vGPU资源。 通过 lscpi 发现 Intel SR-IOV vGPU资源。通过Resource Mapping发现PVE定义的GPU资源池。
下表是桌面池中使用不同类型vGPU的配置方式:
GPU型号 | vGPU类型 | |
---|---|---|
Resouce Mapping:A4000 | GpuPool:A4000 | GPU Passthrough |
Resouce Mapping:TeslaP4 | GpuPool:TeslaP4 | TeslaP4:Grid P4-1Q |
直接使用 | Tesla P4 | Grid P4-1Q |
直接使用 | Intel UHD Graphics | Intel-vGPU |
4 DoraCloud配置vGPU范例
4.1 DoraCloud使用Tesla P4虚拟vGPU
1)安装Proxmox VE 7.x/8.x
2)登陆 Proxmox VE的命令行。 gpu01.sh 更新Proxmox VE的源。 gpu02.sh 启用 IOMMU。
apt install git-core -y
git clone https://gitee.com/deskpool/proxmox-vgpu
./proxmox-vgpu/nvidia/gpu01.sh
./proxmox-vgpu/nvidia/gpu02.sh
Proxmox VE 系统会重启,重启后,先检查 IOMMU是否启用。
root@pve08:~# dmesg |grep IOMMU
[ 0.046588] DMAR: IOMMU enabled
- 然后执行gpu03.sh,安装 grid 16.4的驱动。 ./proxmox-vgpu/nvidia/gpu03.sh
4)安装DoraCloud,在线下载一个带有vGPU驱动的模板,比如 win10LTSC2021V5
如果模板中没有vGPU驱动,可以编辑模板安装驱动。
5)在DoraCloud桌面池内,配置P4的GPU和vGPU类型
如果对接的使Proxmox 8.x平台,桌面池还可以这样配置
在Proxmox VE 8.x 配置Resource Mapping
在DoraCloud的桌面池中,选择资源映射
4.2 DoraCloud使用12代i5核显vGPU
硬件配置: i5-12400,64G,2TB NVME,240G SSD
软件安装步骤:
1)安装Proxmox VE 7.x 或者 8.x
2)执行sriov01.sh
3)执行sriov02.sh 12代CPU i5-12400d的主机,安装Proxmox 7.4后,执行如下命令,等待重启。
curl -o- http://vdi.doracloud.cn:9000/software/sriov01.sh |bash 然后执行如下命令,等待自动重启。
curl -o- http://vdi.doracloud.cn:9000/software/sriov02.sh |bash 最后使用 lspci |grep VGA 验证 vGPU已经启用。
4)Proxmox VE中,配置资源映射
4.3 DoraCloud使用RTX A5000虚拟vGPU
一台高配的工作站进行虚拟化改造。工作站配置如下:
CPU:intel i9:13900KF 内存:64G 显卡:nvidia RTXA5000-24G 显卡:A2000 硬盘:1TB NVME
为了正常启用显卡的虚拟化功能,硬件安装有如下要点:
1、A5000显卡不能接显示器。 A5000用作虚拟化显卡,不能用于输出,因此不能接显示器。这时需要有另一个显卡接显示器。
2、BIOS 开启 SR-IOV(也叫 VT-D),开启 Above 4G MMIO BIOS Assignment
软件安装步骤:
1)安装Proxmox VE 7.x
2)通过 displaymodeselector 设置显卡模式为 vGPU模式。
3)执行 gpu01.sh、gpu02.sh
apt install git-core -y
git clone https://gitee.com/deskpool/proxmox-vgpu
./proxmox-vgpu/nvidia/gpu01.sh
./proxmox-vgpu/nvidia/gpu02.sh
Proxmox VE 系统会重启,重启后,先检查 IOMMU是否启用。
root@pve08:~# dmesg |grep IOMMU
[ 0.046588] DMAR: IOMMU enabled
4)执行gpu03.sh安装 nvidia grid 驱动
./proxmox-vgpu/nvidia/gpu03.sh
驱动安装后,系统重启,然后执行 nvidia-smi查看显卡状态。
root@pvehost:~# nvidia-smi
Fri May 24 16:20:22 2024
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.161.05 Driver Version: 535.161.05 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 NVIDIA RTX A5000 On | 00000000:01:00.0 Off | 0 |
| 30% 46C P8 29W / 230W | 22272MiB / 23028MiB | 0% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
5)执行 sriov-manage 激活SR-IOV
/usr/lib/nvidia/sriov-manage -e 0000:01:00.0
执行激活SR-IOV后,需要通过 mdevctl types 命令,查询vGPU类型。如果可以查询到mdev类型,证明激活成功。
由于sriov-manage命令对显卡的SR-IOV的启用,不会持久化。为了使显卡重启启动后,还能自动启动SR-IOV,需要定义一个服务。
cat >/etc/systemd/system/sriov.service <<EOF
[Unit]
Description=Enable NVIDIA SR-IOV
After=network.target nvidia-vgpud.service nvidia-vgpu-mgr.service
Before=pve-guests.service
[Service]
Type=oneshot
ExecStartPre=/bin/sleep 30
ExecStart=/usr/lib/nvidia/sriov-manage -e ALL
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable sriov.service
systemctl start sriov.service
上述命令中,需要填写显卡的PCIe地址。你也可以使用 all 参数替代,表明启用所有显卡的SR-IOV。
6)安装DoraCloud,在线下载一个带有vGPU驱动的模板,比如 win10LTSC2021V5
如果模板中没有vGPU驱动,可以编辑模板安装驱动。
7)在DoraCloud桌面池内,配置A5000的GPU和vGPU类型
如下图:
4.4 DoraCloud使用RTX A4000显卡直通
CPU:intel i7:10700 内存:64G 显卡:nvidia RTXA4000-16G 硬盘:1TB NVME
设置主机的默认输出为主板的核显。A4000显卡上接一个显卡欺骗器。
安装步骤如下:
1)安装Proxmox VE 8.x
2)执行pveupdate.sh脚本,更新源并升级Proxmox VE到8.x最新版本
3)Proxmox VE中,配置资源映射
4)安装DoraCloud,下载模板,创建桌面池,选择资源映射