DoraCloud云桌面使用vGPU

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
  1. 使用 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
  1. 然后执行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=Script to enable SR-IOV on boot

[Service]
Type=simple
#start SR-IOV
ExecStart=/usr/lib/nvidia/sriov-manage -e 0000:01:00.0
Restart=on-failure

[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类型

如下图:

A5000-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,下载模板,创建桌面池,选择资源映射 输入图片说明