虚拟化使用指南(v2.1)
1. SRIOV介绍
SR-IOV(Single Root I/O Virtualization)是一种支持硬件直通的虚拟化技术,它允许将单个物理设备的 I/O 资源拆分为多个虚拟设备,从而可以实现多个虚拟机同时访问单个物理设备的能力。SR-IOV 技术可以帮助提高虚拟机 I/O 性能,并提高虚拟机间的隔离性。
PF(Physical Function)和 VF(Virtual Function)是 SR-IOV 技术中的两个关键概念。
PF 是物理设备的根功能,负责设备的管理和控制,它可以创建和删除 VF,并为 VF 分配资源。
VF 是 SR-IOV 技术中的虚拟设备。它们与 PF 共享硬件设备,并通过 VF 驱动程序访问设备资源。VF 之间具有隔离性,一个 VF 的故障不会影响其他 VF 的正常运行。

在使用 SR-IOV 技术时,可以将一个 PF 拆分为多个 VF,并将 VF 分配给不同的虚拟机使用。目前我们支持一个PF上最多创建8个VF,每个 VF 都被看作是一个独立的虚拟设备。
PPU的SRIOV功能以MIG(Multiple Instance GPU)技术为基础,通过划分硬件资源,完成计算的分配,在分片粒度上提供了一定的灵活性。
因此,硬件在设计的时候,让计算单元CE和内存单元(LLC、HBM)可以按照一定的规则进行切分,可以让不同的实例占有不同数量的计算资源。VF的最大数量被设计成8份,每个VF都可以独立地进行工作,实现数据和算力的双重隔离:

2. 准备PF 驱动
2.1 环境要求
开启IOMMU
虚拟化功能需要开启IOMMU选项才能使用,
Ubuntu:
编辑/etc/default/grub,将下图iommu选项开启,保存退出,并执行update-grub命令使改动生效

vim /etc/default/grub
# 添加 'intel_iommu=on' 到 GRUB_CMDLINE_LINUX_DEFAULT 中
# save
update-grub此处仅提供参考,若涉及其他OS,请参考网络教程。
2.2 配置QEMU
检查机器是否安装QEMU
qemu-system-x86_64 -version若已安装,将显示如下:
QEMU emulator version 2.11.1(Debian 1:2.11+dfsg-1ubuntu7.42)
Copyright (c) 2003-2017 Fabrice Bellard and the QEMU Project developers为正常使用SRIOV功能,请使用 QEMU版本>=2.9。
若提示未安装,请使用以下命令安装:
sudo apt-get update
sudo apt-get install qemu qemu-kvm libvirt-bin virt-manager bridge-utils这将安装QEMU及其所需的库和工具
配置virsh
检查机器是否安装virsh
virsh --version如果该命令输出virsh的版本号,则说明virsh已经安装在系统中
为正常使用SRIOV功能,请使用 virsh版本 >=2.0。
若提示未安装,请使用以下命令安装:
sudo apt-get update
sudo apt-get install libvirt-clients2.3 驱动安装
首先下载和服务器操作系统内核版本匹配的驱动安装包,deb/rpm二选一
接着使用对应指令安装驱动:
#deb package install
sudo dpkg -i <deb installation file>.deb
#rpm package install
sudo rpm --force -ivh --nodeps <rpm installation file>.rpm可以通过执行ppu-smi指令判断驱动是否安装成功
若安装成功,将显示系统相关信息
root@0549cf16bb85:~$ ppu-smi
Fri Jul 21 17:30:45 2023
+-------------------------------------------------------------------------------+
| PPU-SMI 1.4 Driver Version: 99.99.99-xxxxxx HGGC Version: 11.1 |
+---------------------------------+----------------------+----------------------+
| PPU Name Persistence M. | Bus-Id | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | PPU-Util Compute M. |
| | | MIG M. |
+=================================+======================+======================+
| 0 PPU-ZW610 N/A | 00000000:10:00.0 | 0 |
| N/A 29C N/A 55W / 300W | 5MiB / 48768MiB | 0% Default |
| | | Disabled |
+---------------------------------+----------------------+----------------------+
+-------------------------------------------------------------------------------+
| Processes: |
| PPU GI CI PID Type Process name PPU Memory |
| ID ID Usage |
+===============================================================================+
| No running processes found |若安装失败,将显示:
root@0549cf16bb85:~$ ppu-smi
[2023-07-21 16:47:48:850563][ALINPU WARNING]: [../ppu_interface.cpp:575]Failed to open /dev/alixpu
init HGML error: driver is not loaded3. 创建及使用VF(vGPU)
注:以下vGPU等同于SR-IOV中的VF,为虚拟化功能的运行实例
加载好PF驱动后,SR-IOV的使用将通过ppu-smi工具进行,通过ppu-smi vgpu -h,可查看vGPU详细功能列表及介绍。
PPU-SMI支持查询设备虚拟化(vGPU)的相关信息,并支持创建 / 删除vGPU实例。vGPU相关概念介绍如下:
vGPU type:PPU设备支持的vGPU类型信息,每种vGPU类型所分配的资源不同,具体配置见 【3.1.2】 中列表
vGPU instance:vGPU运行实例,创建时需指定vGPU type,具体创建方法见 【3.1.4 创建vGPU instance实例】,创建完后,需要创建虚拟机(VM)并关联才可使用,具体VM操作见 【4. 准备VM】
vGPU instance实例的状态说明如下:
alive(存活)状态:创建后未销毁均为存活状态,包含未关联任何VM的vGPU实例active(激活)状态:指已被创建且存在VM与之关联的vGPU实例,在VM中加载驱动后激活
3.1 完整使用vGPU功能流程
注意,vGPU相关命令,均需要管理员权限,若提示无权限,请在指令前添加sudo执行。
3.1.1 开启/关闭vGPU模式
首先请参考 【2.1 环境要求】,确保已配置虚拟化需要的环境。
只有当PPU当前没有其他进程占用时,才能开启和关闭SRIOV模式,否则该步骤会失败,开启关闭命令如下:
- 通过`ppu-smi -vm VGPU` 或 `ppu-smi -vm 2`开启vGPU模式
* 若需要关闭,使用`ppu-smi -vm NONE` 或 `ppu-smi -vm 0`关闭vGPU模式
- 可通过-i选项指定在哪张卡上开启,例如在卡0上开启:`ppu-smi -vm VGPU -i 0`
- **<font style="color:#DF2A3F;">若未用-i选项指定卡,将同时开启/关闭所有卡的vGPU模式</font>**
- 开启成功将显示:
root@0549cf16bb85:~$ sudo ppu-smi -vm VGPU -i 0
Set virtualization mode to VGPU for PPU 00000000:10:00.0.
All done.说明在卡00000000:10:00.0上开启vGPU模式成功。
若提示:

说明virsh未安装,请参考【2.2.1】 配置virsh进行安装。
如果开启vGPU模式成功,通过lspci | grep 1ded查看pci信息,可以看到每张卡除了一个的6001 Device(PF)外,还会出现8个6002 Device(VF)。

- 如果关闭vGPU模式成功,将显示:
root@0549cf16bb85:~$ sudo ppu-smi -vm NONE -i 0
Set virtualization mode to NONE for PPU 00000000:10:00.0.
All done.可以通过ppu-smi查询当前PPU是否开启SR-IOV,例如执行ppu-smi -q指令,其中包含了每张卡的虚拟化模式,比如这里卡0开启了vGPU功能,处于SR-IOV模式,虚拟化功能可以开始使用。

注意:开启了SRIOV之后,PF上将不允许运行计算任务,请在vGPU对应的虚拟机VM中运行计算任务。
3.1.2 查看设备支持(supported)的vGPU type信息:
- 通过`ppu-smi vgpu -s`查看
- 可通过-i选项指定查看哪张卡,例如在卡0上查看:`ppu-smi vgpu -s -i 0`
- **<font style="color:#DF2A3F;">若未用-i选项指定卡,将显示所有卡上的信息</font>**
- 查询结果如下:
如果机器是PCIE卡:
root@0549cf16bb85:~# sudo ppu-smi vgpu -s -i 0
PPU 0: PPU (UUID: GPU-019ea108-c110-0420-0000-0000e0b7fe3c)
vGPU Type 0: vGPU-0 (Class: MIG-Backed: 2 CE, 5GB Memory, 0 ICN, 0 DVG, 0 EVG)
vGPU Type 1: vGPU-1 (Class: MIG-Backed: 2 CE, 5GB Memory, 0 ICN, 1 DVG, 0 EVG)
vGPU Type 2: vGPU-2 (Class: MIG-Backed: 2 CE, 5GB Memory, 0 ICN, 0 DVG, 1 EVG)
vGPU Type 3: vGPU-3 (Class: MIG-Backed: 2 CE, 5GB Memory, 1 ICN, 0 DVG, 0 EVG)
vGPU Type 4: vGPU-4 (Class: MIG-Backed: 2 CE, 5GB Memory, 1 ICN, 1 DVG, 0 EVG)
vGPU Type 5: vGPU-5 (Class: MIG-Backed: 2 CE, 5GB Memory, 1 ICN, 0 DVG, 1 EVG)
vGPU Type 6: vGPU-6 (Class: MIG-Backed: 4 CE, 11GB Memory, 0 ICN, 0 DVG, 0 EVG)
vGPU Type 7: vGPU-7 (Class: MIG-Backed: 4 CE, 11GB Memory, 0 ICN, 1 DVG, 1 EVG)
vGPU Type 8: vGPU-8 (Class: MIG-Backed: 4 CE, 11GB Memory, 1 ICN, 0 DVG, 0 EVG)
vGPU Type 9: vGPU-9 (Class: MIG-Backed: 4 CE, 11GB Memory, 1 ICN, 1 DVG, 0 EVG)
vGPU Type 10: vGPU-10 (Class: MIG-Backed: 8 CE, 23GB Memory, 0 ICN, 0 DVG, 0 EVG)
vGPU Type 11: vGPU-11 (Class: MIG-Backed: 8 CE, 23GB Memory, 0 ICN, 2 DVG, 2 EVG)
vGPU Type 12: vGPU-12 (Class: MIG-Backed: 8 CE, 23GB Memory, 1 ICN, 0 DVG, 0 EVG)
vGPU Type 13: vGPU-13 (Class: MIG-Backed: 8 CE, 23GB Memory, 1 ICN, 2 DVG, 2 EVG)
vGPU Type 14: vGPU-14 (Class: MIG-Backed: 16 CE, 47GB Memory, 0 ICN, 0 DVG, 0 EVG)
vGPU Type 15: vGPU-15 (Class: MIG-Backed: 16 CE, 47GB Memory, 0 ICN, 4 DVG, 4 EVG)
vGPU Type 16: vGPU-16 (Class: MIG-Backed: 16 CE, 47GB Memory, 1 ICN, 0 DVG, 0 EVG)
vGPU Type 17: vGPU-17 (Class: MIG-Backed: 16 CE, 47GB Memory, 1 ICN, 4 DVG, 4 EVG)注:CE为计算资源数,Memory为内存大小,ICN为是否支持互联(1表示支持),DVG为解码器数量,EVG为编码器数量。
如果机器是OAM卡:
root@0549cf16bb85:~# sudo ppu-smi vgpu -s -i 0
PPU 0: PPU (UUID: GPU-019ea108-c110-0420-0000-0000e0b7fe3c)
vGPU Type 0: vGPU-0 (Class: MIG-Backed: 2 CE, 11GB Memory, 0 ICN, 0 DVG, 0 EVG)
vGPU Type 1: vGPU-1 (Class: MIG-Backed: 2 CE, 11GB Memory, 0 ICN, 1 DVG, 0 EVG)
vGPU Type 2: vGPU-2 (Class: MIG-Backed: 2 CE, 11GB Memory, 0 ICN, 0 DVG, 1 EVG)
vGPU Type 3: vGPU-3 (Class: MIG-Backed: 2 CE, 11GB Memory, 1 ICN, 0 DVG, 0 EVG)
vGPU Type 4: vGPU-4 (Class: MIG-Backed: 2 CE, 11GB Memory, 1 ICN, 1 DVG, 0 EVG)
vGPU Type 5: vGPU-5 (Class: MIG-Backed: 2 CE, 11GB Memory, 1 ICN, 0 DVG, 1 EVG)
vGPU Type 6: vGPU-6 (Class: MIG-Backed: 4 CE, 23GB Memory, 0 ICN, 0 DVG, 0 EVG)
vGPU Type 7: vGPU-7 (Class: MIG-Backed: 4 CE, 23GB Memory, 0 ICN, 1 DVG, 1 EVG)
vGPU Type 8: vGPU-8 (Class: MIG-Backed: 4 CE, 23GB Memory, 1 ICN, 0 DVG, 0 EVG)
vGPU Type 9: vGPU-9 (Class: MIG-Backed: 4 CE, 23GB Memory, 1 ICN, 1 DVG, 0 EVG)
vGPU Type 10: vGPU-10 (Class: MIG-Backed: 8 CE, 47GB Memory, 0 ICN, 0 DVG, 0 EVG)
vGPU Type 11: vGPU-11 (Class: MIG-Backed: 8 CE, 47GB Memory, 0 ICN, 2 DVG, 2 EVG)
vGPU Type 12: vGPU-12 (Class: MIG-Backed: 8 CE, 47GB Memory, 1 ICN, 0 DVG, 0 EVG)
vGPU Type 13: vGPU-13 (Class: MIG-Backed: 8 CE, 47GB Memory, 1 ICN, 2 DVG, 2 EVG)
vGPU Type 14: vGPU-14 (Class: MIG-Backed: 16 CE, 95GB Memory, 0 ICN, 0 DVG, 0 EVG)
vGPU Type 15: vGPU-15 (Class: MIG-Backed: 16 CE, 95GB Memory, 0 ICN, 4 DVG, 4 EVG)
vGPU Type 16: vGPU-16 (Class: MIG-Backed: 16 CE, 95GB Memory, 1 ICN, 0 DVG, 0 EVG)
vGPU Type 17: vGPU-17 (Class: MIG-Backed: 16 CE, 95GB Memory, 1 ICN, 4 DVG, 4 EVG)如果机器是 OAM810E 卡:(只支持二切片,不支持 ICN)
root@0549cf16bb85:~# sudo ppu-smi vgpu -s -i 0
PPU 0: PPU-ZW810E (UUID: GPU-011ef111-c530-081c-0000-0000e0774255)
vGPU Type 10: vGPU-10 (Class: MIG-Backed: 8 CE, 47GB Memory, 0 ICN, 0 DVG, 0 EVG)
vGPU Type 11: vGPU-11 (Class: MIG-Backed: 8 CE, 47GB Memory, 0 ICN, 2 DVG, 2 EVG)
vGPU Type 14: vGPU-14 (Class: MIG-Backed: 16 CE, 95GB Memory, 0 ICN, 0 DVG, 0 EVG)
vGPU Type 15: vGPU-15 (Class: MIG-Backed: 16 CE, 95GB Memory, 0 ICN, 4 DVG, 4 EVG)注:CE为计算资源数,Memory为内存大小,ICN为是否支持互联(1表示支持),DVG为解码器数量,EVG为编码器数量。
通过
-s和-v选项组合,可以查询更详细的vGPU类型信息,例如执行ppu-smi vgpu -i 0 -s -v,查询结果说明如下:
root@0549cf16bb85:~# sudo ppu-smi vgpu -i 0 -s -v
+-------------------------------------------------------------------+
| Supported vGPU types: |
| PPU Type Name Instances GPU Memory |
| ID Free/Total Instance GiB |
| ID |
+===================================================================+
| 0 0 vGPU-0 4/8 N/A 5.00 |
+-------------------------------------------------------------------+
| 0 1 vGPU-1 0/1 N/A 5.00 |
+-------------------------------------------------------------------+
| 0 2 vGPU-2 2/4 N/A 11.00 |
+-------------------------------------------------------------------+PPU: 设备上电后分配的从0开始的枚举编号。
Type ID:vGPU type的ID。
Name:vGPU type的名称,后跟数字为vGPU type ID。
Instances Free/Total:当前可创建的vGPU实例个数 / 总共可创建的vGPU实例个数,与vGPU的CE、ICN需求及卡上剩余资源有关。
GPU Instance ID:vGPU type对应的MIG GPU instance ID,目前不支持,为默认值
N/A。Memory GiB:每个vGPU实例分配的内存大小(单位GiB)。
3.1.3 查看当前可创建(creatable)的vGPU类型
- 通过`ppu-smi vgpu -c`查看
- 可通过-i选项指定查看哪张卡,例如在卡0上查看:`ppu-smi vgpu -c -i 0`
- **<font style="color:#DF2A3F;">若未用-i选项指定卡,将显示所有卡上的信息</font>**
- 查询结果如下:
root@0549cf16bb85:~# sudo ppu-smi vgpu -i 0 -c
PPU 0: PPU (UUID: GPU-019ea108-c110-0420-0000-0000e0b7fe3c)
vGPU Type 0: vGPU-0 (Class: MIG-Backed: 2 CE 5GB Memory 0 ICN 0 DVG 0 EVG)
vGPU Type 3: vGPU-3 (Class: MIG-Backed: 2 CE 5GB Memory 1 ICN 0 DVG 0 EVG)
...- 通过`-c`和`-v`选项组合,可以查询更详细的允许创建的vGPU类型信息,例如执行`ppu-smi vgpu -i 0 -c -v`,查询结果说明如下:
root@0549cf16bb85:~# sudo ppu-smi vgpu -i 0 -c -v
+-------------------------------------------------------------------+
| Supported vGPU types: |
| PPU Type Name Instances GPU Memory |
| ID Free/Total Instance GiB |
| ID |
+===================================================================+
| 0 0 vGPU-0 4/8 N/A 5.00 |
+-------------------------------------------------------------------+
| 0 2 vGPU-2 2/4 N/A 11.00 |
+-------------------------------------------------------------------+输出格式与ppu-smi -s -v一致,不同的是,查询到的vGPU类型会根据当前PF剩余的资源变化,因资源不够无法创建的vGPU类型将不会显示。
3.1.4 创建vGPU instance实例
- 通过`-ci`选项指定vGPU类型,创建对应类型的vGPU instance实例,通过`-i`选项可约束操作的设备范围,若不指定设备,将在每张卡上都创建一个
- 例如执行`ppu-smi vgpu -i 0 -ci 0`,在PPU设备0上创建vGPU type ID为0的一个vGPU实例,操作示例如下:root@0549cf16bb85:~# sudo ppu-smi vgpu -ci 0 -i 0
Successfully created vGPU instance 0 (PCI Bus ID 00000000:5E:00.0) on PPU 0 using vGPU type 0.创建成功的同时,将返回此vGPU的PCI地址:PCI Bus ID 00000000:10:01.0, 格式为 Domain : Bus: Slot. Function,将用于【4.2.1 配置VM的xml文件】的地址填充,同时也显示了 vGPU的instance ID,所在的device ID,以及vGPU type ID信息
3.1.5 查询alive状态(已创建且未删除)的vGPU实例信息
vGPU instance创建成功后,将处于alive(存活)状态
此时,可通过ppu-smi vgpu -a选项可查询状态为alive的vGPU instance的信息,通过-i选项可指定查询的设备,例如在卡0上查询:ppu-smi vgpu -i 0 -a,若未指定设备,将查询所有卡上的vGPU信息,查询结果说明如下:
root@0549cf16bb85:~# sudo ppu-smi vgpu -i 0 -a
PPU 00000000:10:00.0
Alive vGPUs : 2
vGPU Instance 1
vGPU Instance ID : 1
vGPU Name : vGPU-10
vGPU Type : 10
vGPU UUID : VGPU-3f53d39f-ce6e-dc78-c3d4-4c18653c19c0
vGPU PCI Bus ID : 00000000:10:01.0
MDEV UUID : N/A
GPU Instance ID : N/A
ECC Mode : Enabled
Memory Size : 28672 MiB
vGPU Instance 5
vGPU Instance ID : 5
vGPU Name : vGPU-1
vGPU Type : 1
vGPU UUID : VGPU-3f53d39f-ce6e-dc78-c3d4-4c18653c19c1
vGPU PCI Bus ID : 00000000:10:01.4
MDEV UUID : N/A
GPU Instance ID : N/A
ECC Mode : Enabled
Memory Size : 7168 MiB对于每个PPU设备:
Alive vGPUs: 当前PPU设备已创建的vGPU实例个数。
对于每个vGPU实例:
vGPU Instance ID: vGPU实例的ID,后续可通过
-di选项指定此ID,删除对应vGPU实例。vGPU Name:vGPU实例的名称,后跟数字为vGPU type ID。
vGPU Type:对应vGPU类型的ID。
vGPU UUID:vGPU实例的UUID。
vGPU PCI Bus ID:vGPU实例的PCI Bus ID,即
Domain:Bus:Device.Function信息。MDEV UUID:vGPU实例对应的MIG device的UUID,目前不支持,为默认值
N/A,表示没有对应关系。GPU Instance ID:vGPU实例对应的MIG GPU instance ID,目前不支持,为默认值
N/A,表示没有对应关系。ECC Mode:vGPU实例的ECC工作模式。
Memory Size:vGPU实例分配的内存总量。
3.1.6 查询active状态(关联VM并加载驱动)的vGPU实例信息
vGPU创建后,需要关联虚拟机(VM)才能使用,首先需要创建VM,并且在VM里加载驱动,才算关联成功,关联VM的步骤见 【4. 准备VM】
创建VM并关联成功后,vGPU instance将处于active(激活)状态。
此时,可通过ppu-smi vgpu -q选项可查询状态为active的vGPU instance的信息,通过-i选项可指定查询的设备,例如在卡0上查询:ppu-smi vgpu -i 0 -q,若未指定设备,将查询所有卡上的vGPU信息,查询结果说明如下:
root@0549cf16bb85:~# sudo ppu-smi vgpu -i 0 -q
PPU 00000000:10:00.0
Active vGPUs : 1
vGPU Instance 1
vGPU Instance ID : 1
VM UUID : ee7b7a4b-388a-4357-a425-5318b2c65b30
vGPU Name : vGPU-10
vGPU Type : 10
vGPU UUID : VGPU-3f53d39f-ce6e-dc78-c3d4-4c18653c19c0
vGPU PCI Bus ID : 00000000:10:01.0
MDEV UUID : N/A
Guest Driver Version : 99.99.99-xxxxxx
GPU Instance ID : N/A
ECC Mode : Enabled
Memory Usage
Total : 28672 MiB
Used : 3 MiB
Free : 28669 MiB对于每个PPU设备:
Active vGPUs: 当前PPU设备已创建且关联VM的vGPU实例个数。
对于每个vGPU实例:
vGPU Instance ID: vGPU实例的ID,后续可通过
-di选项指定此ID,删除对应vGPU实例。VM UUID:VM虚拟机的UUID。
vGPU Name:本vGPU实例的名称,后跟数字为vGPU type ID。
vGPU Type:对应vGPU类型的ID。
vGPU UUID:vGPU实例的UUID。
vGPU PCI Bus ID:vGPU实例的PCI Bus ID,即
Domain:Bus:Device.Function信息。MDEV UUID:vGPU实例对应的MIG device的UUID,目前不支持,为默认值
N/A,表示没有对应关系。Guest Driver Version:VM虚拟机内安装的驱动版本。
GPU Instance ID:vGPU实例对应的MIG GPU instance ID,目前不支持,为默认值
N/A,表示没有对应关系。ECC Mode:vGPU实例的ECC工作模式。
Memory Usage:vGPU实例的内存使用情况。
Total:vGPU实例分配的内存总量。
Used:vGPU实例已使用内存量。
Free:vGPU实例剩余可用内存量。
3.1.7 删除vGPU instance实例
- 通过`-di`选项可指定一个指定**vGPU instance ID**,删除此ID对应的vGPU。vGPU instance ID可通过`ppu-smi vgpu -a`指令查询
- 通过`-i`选项可指定设备,例如执行`ppu-smi vgpu -i 0 -di 1`,在PPU设备0上创建vGPU类型ID为1的一个vGPU实例,操作示例如下:
root@0549cf16bb85:~# sudo ppu-smi vgpu -i 0 -di 1
Successfully deleted vGPU instance 9 from PPU 0.- 默认不允许删除`**<font style="color:#DF2A3F;">active</font>**`状态的vGPU,即正在被VM使用的vGPU instance,此时会提示:
root@0549cf16bb85::~$ sudo ppu-smi vgpu -i 0 -di 1
vGPU instance 1 is in use, please terminate related VM then try again.如果需要强制删除,请先销毁对应VM,再使用-f选项删除,例如ppu-smi vgpu -i 1 -di 1 -f,将强制删除卡1上vGPU instance ID为1的vGPU。
3.2 VF内相关操作指令
3.2.1 VF复位—— FLR(Function Level Reset)
若需要复位VF,可以在VF关联的虚拟机内,通过ppu-smi工具启动VF的FLR
具体操作方法为:
在VM内使用
ppu-smi -r指令触发reset,此时VF将通知PF进行FLR,此操作对其他VF不影响。操作成功将提示:
(base) root@JESSE-VM:~/PPU_SDK# ppu-smi -r
Trigger reset of PPU 00000000:00:0A.0.
All done.注意:此时会显示整张卡的PCI地址,但是只是触发了此VF的FLR,而非整张卡,其他VF不受影响。
4. 准备VM
每一个vGPU instance实例,需要和一个虚拟机(VM)绑定才能使用。
(也可以 【4.2.2 一个VM关联多个vGPU】,但是多个VM不能关联到同一个vGPU,会有同时访问的问题)
因此,创建好vGPU后,需要创建与之对应的VM,同时在VM中加载驱动。首先,VM 需要一个QEMU映像作为其磁盘,以及一个 xml文件作为配置:
4.1 创建QEMU镜像:
选择一个QEMU镜像文件作为<base-img>,并使用以下命令创建一个自己的新镜像:
qemu-img create -b <base-img> -f qcow2 <incremental-img>
其中的 <incremental-img> 名称可以由自己定义:
注意:请确保<base-img>和<incremental-img>的相对位置准确。
4.2 配置及定义xml文件
4.2.1 配置xml文件
完整的xml文件内容如下:
<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
virsh edit vm_name
or other application using the libvirt API.
-->
<domain type='kvm'>
<name>vm_name</name>
<uuid>e1470dca-5e84-4780-bae3-82558c2dae0a</uuid>
<memory unit='KiB'>80485760</memory>
<currentMemory unit='KiB'>80485760</currentMemory>
<vcpu placement='static'>16</vcpu>
<os>
<type arch='x86_64' machine='pc-q35-2.4'>hvm</type>
<boot dev='hd'/>
</os>
<features>
<acpi/>
<apic/>
</features>
<cpu mode='host-model'>
<model fallback='allow'/>
</cpu>
<clock offset='utc'>
<timer name='rtc' tickpolicy='catchup'/>
<timer name='pit' tickpolicy='delay'/>
<timer name='hpet' present='no'/>
</clock>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<pm>
<suspend-to-mem enabled='no'/>
<suspend-to-disk enabled='no'/>
</pm>
<devices>
<emulator>/usr/bin/kvm-spice</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/sriov/01_sriov_images/test_base.qcow2'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
</disk>
<filesystem type='mount' accessmode='passthrough'>
<source dir='/aisw'/>
<target dir='mountaiswtest'/>
</filesystem>
<controller type='usb' index='0' model='ich9-ehci1'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x7'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci1'>
<master startport='0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0' multifunction='on'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci2'>
<master startport='2'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x1'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci3'>
<master startport='4'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x2'/>
</controller>
<controller type='pci' index='0' model='pcie-root'/>
<controller type='pci' index='1' model='dmi-to-pci-bridge'>
<model name='i82801b11-bridge'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x1e' function='0x0'/>
</controller>
<controller type='pci' index='2' model='pci-bridge'>
<model name='pci-bridge'/>
<target chassisNr='2'/>
<address type='pci' domain='0x0000' bus='0x01' slot='0x01' function='0x0'/>
</controller>
<controller type='virtio-serial' index='0'>
<address type='pci' domain='0x0000' bus='0x02' slot='0x01' function='0x0'/>
</controller>
<controller type='sata' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x2'/>
</controller>
<interface type='network'>
<mac address='52:54:00:53:ee:d2'/>
<source network='default'/>
<model type='rtl8139'/>
<address type='pci' domain='0x0000' bus='0x02' slot='0x02' function='0x0'/>
</interface>
<serial type='pty'>
<target port='0'/>
</serial>
<console type='pty'>
<target type='serial' port='0'/>
</console>
<channel type='spicevmc'>
<target type='virtio' name='com.redhat.spice.0'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
</channel>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<graphics type='spice' autoport='yes'>
<image compression='off'/>
</graphics>
<sound model='ich6'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</sound>
<video>
<model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address domain='0x0000' bus='0x18' slot='0x01' function='0x0'/>
</source>
<address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/>
</hostdev>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</memballoon>
</devices>
</domain>需要注意的地方:
第9行:vm_name 将vm_name替换为新名字,由自己定义,后面操作VM均可使用该名字。
删除第10行:e1470dca-5e84-4780-bae3-82558c2dae0a UUID之后会自动生成新的。
第11-12行:
<memory unit='KiB'>80485760</memory> <currentMemory unit='KiB'>80485760</currentMemory>memory是可用于此 VM 的启动时的内存大小,currentMemory是 VM当前使用的内存大小。单位可以更改为MiB或者GiB,以便于计算。注意:不要使用等于或超过系统内存值,请使用大于等于5GiB的内存大小!,否则内存不够使用,可能导致驱动安装失败或系统运行过慢!
第13行:16 数字为VM 中的 CPU 内核数,可以修改,注意:不要使用等于或超过系统 CPU 内核的数字。
第15行:hvm 设置系统架构,如果是ARM64架构的服务器,则需设置为 arch='aarch64'。
第22行: 需要在对应架构的服务器上启动实例。
第38行:/usr/bin/kvm-spice 请根据不同的操作系统设置对应的kvm路径。例如:Ubuntu对应的kvm路径是/usr/bin/kvm-spice,alios对应kvm路径为/usr/libexec/qemu-kvm。
第40行: 请根据镜像格式设置type参数:qcow2对应type='qcow2'、vhd对应type='vpc',如果要创建qcow2快照,请关闭dataplane,添加 dataplane='off' 。
第41行: 替换为【4.1 创建QEMU镜像】时的绝对路径。
第81行: 这是 libvirt NAT 网络为此虚拟机分配 IP 的虚假 mac 地址。可填任意16进制数,如果您在同一台服务器上有多个虚拟机(VM),请使用不同的 mac 地址,否则它们将共享相同的 IP,这将导致连接问题。
第108-113行:设置PCI地址。

source下的address表示此vGPU的物理设备的PCI地址,也就是需要关联到vGPU的地址,当你在【3.1.4】步创建vGPU实例时,会返回对应的PCI Bus ID信息,将其填入这一行即可,也可以通过sudo ppu-smi vgpu -a查询:

另一个前缀为type='pci'的地址为虚拟机(VM)中设备的PCI地址,可自行输入值,只需要保证在此VM内唯一即可。
需要注意的是,PCI地址除了BDF(bus, slot, function)外,还包含了domain部分,
domain值可通过lspci | grep 1ded指令来判断应该填多少:
若
lspci | grep 1ded只能查到bus、slot、function,例如11:01.0,把xml文件中bus、slot、function的值替换即可,domain值无需变动,例如:
若
lspci | grep 1ded还显示了domain的信息,例如:0001:81:00.0,说明当前系统的PCI总线架构支持多个PCI总线,需要把xml文件domain、bus、slot、function的值都进行替换,例如:
4.2.2 一个VM关联多个vGPU
若希望多个vGPU关联到同一个VM,添加多个 结构即可,然后修改内的两个地址:
vGPU PCI Bus ID,创建vGPU实例时会显示,也可以通过
sudo ppu-smi vgpu -a查询。type='pci'开头的PCI地址,只要确保各个hostdev内的唯一即可。
例如再添加一个vGPU:

添加之后,这个VM将会同时关联这两个vGPU,可以使用两个vGPU的资源用于计算,多个vGPU时同理。
4.2.3 整卡Passthrough
虚拟化功能也可以将整张卡Passthrough到虚拟机内使用,此时不需要开启SRIOV模式。
Passthrough成功之后,虚拟机将使用整张卡的计算资源。
操作方法:
只需要在 内 下的PCI地址中填入整张卡的PCI Bus ID即可,其余的操作和【4.2.1 配置xml文件】一样,PCI Bus ID具体值可以通过lspci | grep 1ded查看,图中Device 6001对应地址为整张卡的地址:

4.2.4 定义xml文件
编辑好xml文件内容后,使用sudo virsh define <your_xml_file>,成功定义将出现:
Domain <vm_name> defined from XXX.xml接着,你会在/etc/libvirt/qemu目录下找到一个<your_name>.xml文件,这意味着你成功了。
当你不需要使用这个VM时,使用sudo virsh undefine <vm_name>即可,此时/etc/libvirt/qemu目录下定义的<your_name>.xml文件将被删除,若再次使用,重新编辑并定义vm.xml文件即可。
注意:只有在此服务器上首次启动该 VM ,才需要修改并定义整个配置文件,因为已经定义的 VM 可以使用 sudo virsh edit <vm_name>来修改 VM 配置,根据需要修改部分内容即可,不用重新定义。
4.3 操作虚拟机(VM)
使用virsh工具进行VM相关操作,需确保系统已经下载libvirt安装包,方法见 【2.2.1 配置virsh】。
4.3.1 虚拟机(VM)相关操作:
virsh start <vm_name> # 启动VM
virsh domifaddr <vm_name> # 查询VM的IP地址
virsh domifinfo <vm_name> # 查看VM信息
virsh edit <vm-name> # 修改VM的xml配置文件
virsh console <vm_name> # 连接到VM的终端
virsh dumpxml <vm_name> # 输出VM的xml配置文件
virsh list --all # 显示所有已创建的VM
virsh list # 显示所有启动的VM
virsh suspend <vm_name> # 暂停VM,VM的运行数据和状态可以得到保存
virsh resume <vm_name> # 恢复VM
virsh shutdown <vm_name> # 关闭VM,需要一定时间,VM的运行数据和状态可以得到保存
virsh destroy <vm_name> # 销毁VM,VM立即关闭,此时不保存任何运行数据或状态
virsh reboot <vm_name> # 重启VM,需要一定时间,VM的运行数据和状态可以得到保存
virsh reset <vm_name> # 重置VM,VM立即重启,此时不保存任何运行数据或状态注:virsh操作需要sudo权限,若无法执行请在指令前加sudo。
强烈建议在虚拟机中启用控制台重定向功能,如果发生QEMU镜像崩溃或其他问题,您仍然可以连接到虚拟机并保存一些数据:
Ubuntu:
vim /etc/default/grub
# 添加 'console=ttyS0' 到 GRUB_CMDLINE_LINUX_DEFAULT 中
# 例如: GRUB_CMDLINE_LINUX_DEFAULT="quiet splash console=ttyS0"
# save
update-grub4.3.2 连接到VM
使用
sudo virsh start <VM_Name>开启VM。使用
sudo virsh domifaddr <VM_Name>获取VM的IP地址。使用
ssh root@IP来连接VM,密码为alinpu。
4.3.3 加载vGPU的驱动
进入VM成功后,由于vGPU和PF使用同一驱动,所以和 【2.3 驱动安装】一样,先下载与操作系统内核版本匹配的驱动安装包(deb/rpm),然后加载驱动即可。
加载成功后,vGPU将进入active状态,就可以开始运行计算任务了!
此时,可以在PF下通过ppu-smi vgpu -q指令查询,查看此vGPU的相关信息,具体介绍见 【3.1.6 查询active状态的vGPU实例信息】
注意:
当卸载vGPU驱动后,vGPU将恢复到
alive状态,此时ppu-smi vgpu -q指令查询不到此vGPU,可以通过ppu-smi vgpu -a指令查询vGPU信息,具体介绍见 【3.1.5 查询alive状态的vGPU信息】当未卸载vGPU驱动,而是直接关闭或销毁vGPU关联VM时,此时vGPU仍处于
active状态,ppu-smi vgpu -q仍能查询到vGPU,但是因为对应VM已经被关闭或销毁,将无法显示驱动版本号,内存使用量也将显示为0,例如:
PPU 00000000:10:00.0
Active vGPUs : 1
vGPU Instance 1
vGPU Instance ID : 1
VM UUID : ee7b7a4b-388a-4357-a425-5318b2c65b30
vGPU Name : vGPU-0
vGPU Type : 0
vGPU UUID : vGPU-2740d094-ca01-538a-9114-1946d2c36cc3
vGPU PCI Bus ID : 00000000:10:01.0
MDEV UUID : N/A
Guest Driver Version : N/A
GPU Instance ID : N/A
ECC Mode : Enabled
Memory Usage
Total : 5120 MiB
Used : 0 MiB
Free : 5120 MiB若需要继续使用此vGPU,请使用sudo virsh start <vm_name>重新开启VM,若VM此前被关闭,开启后无需重新加载驱动;若VM此前被销毁,开启后需要重新加载驱动。
参考文档:
参考设备管理工具PPU-SMI (v2.1)中的虚拟化设备(vGPU)章节。

