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 设置显卡模式为physical_display_disabled

root@t3680:~/NVIDIA Display Mode Selector Tool-March-2023-1.60.0/1.60.0/linux/x64# ./displaymodeselector --gpumode

NVIDIA Display Mode Selector Utility (Version 1.60.0)
Copyright (C) 2015-2021, NVIDIA Corporation. All Rights Reserved.


WARNING: This operation updates the firmware on the board and could make
         the device unusable if your host system lacks the necessary support.

Are you sure you want to continue?
Press 'y' to confirm (any other key to abort): 
y
Select a number:
<0> physical_display_enabled_256MB_bar1
<1> physical_display_disabled
<2> physical_display_enabled_8GB_bar1

Select a number (ESC to quit): 
1

Specifed GPU Mode "physical_display_disabled"


Update GPU Mode of all adapters to "physical_display_disabled"?
Press 'y' to confirm or 'n' to choose adapters or any other key to abort: 
y

Updating GPU Mode of all eligible adapters to "physical_display_disabled"

Apply GPU Mode <4> corresponds to "physical_display_disabled"

Reading EEPROM (this operation may take up to 30 seconds)

Reading EEPROM (this operation may take up to 30 seconds) 

[==================================================] 100 %
Reading EEPROM (this operation may take up to 30 seconds)

Reading EEPROM (this operation may take up to 30 seconds) 

Successfully updated GPU mode to "physical_display_disabled" ( Mode 4 ).

A reboot is required for the update to take effect.

如果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=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

/usr/lib/nvidia/sriov-manage -e ALL

上述命令中,需要填写显卡的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,下载模板,创建桌面池,选择资源映射 输入图片说明

5 vGPU的常见问题

5.1 Proxmox VE 8.2/8.3 无法安装NVIDIA GRID 驱动。

Proxmox VE 8.2/8.3 的内核版本为6.8.x,需要高版本的 NVIDIA Grid 驱动。 推荐采用 16.8 版本或者 17.4 版本。

5.2 安装NVIDIA Grid 17.x驱动后,P4/P40找不到vGPU。

NVIDIA Grid 17版本后,不再支持Pascal架构的显卡。建议使用 16.8版本的驱动。

如果继续使用 17版本,可以把 16.x 版本驱动中的 vgpuConfig.xml提取出来,复制到/usr/share/nvidia/vgpu/vgpuConfig.xml(替换现有文件)。然后重新启动主机。

5.3 消费级显卡是否可以用作 vGPU ?

可以通过 vgpu-unlock 程序对消费级显卡进行修补,使其支持 vGPU。 该方法不适用于 安培 架构之后的消费级显卡。 另外消费级显卡启用vGPU后,会出现 OpenGL 性能非常差的问题。 生产环境中,不建议用vgpu-unlock。

5.4 生产环境应该如何选择 Proxmox VE 的版本和NVIDIA 驱动版本?

推荐如下三个组合:

1、Proxmox VE 7.4 版本 + NVIDIA Grid Driver 16.x 版本,或者更早版本。

2、Proxmox VE 8.1 版本 + NVIDIA Grid Driver 16.x 版本,或者更早版本。

3、Proxmox VE 8.3 版本 + NVIDIA Grid Driver 16.8 版本,或者 17.4 版本。