虚拟化使用指南(v2.1)

更新时间:
复制为 MD 格式

1. SRIOV介绍

SR-IOV(Single Root I/O Virtualization)是一种支持硬件直通的虚拟化技术,它允许将单个物理设备的 I/O 资源拆分为多个虚拟设备,从而可以实现多个虚拟机同时访问单个物理设备的能力。SR-IOV 技术可以帮助提高虚拟机 I/O 性能,并提高虚拟机间的隔离性。

PF(Physical Function)和 VF(Virtual Function)是 SR-IOV 技术中的两个关键概念。

  1. PF 是物理设备的根功能,负责设备的管理和控制,它可以创建和删除 VF,并为 VF 分配资源。

  2. VF 是 SR-IOV 技术中的虚拟设备。它们与 PF 共享硬件设备,并通过 VF 驱动程序访问设备资源。VF 之间具有隔离性,一个 VF 的故障不会影响其他 VF 的正常运行。

画板

在使用 SR-IOV 技术时,可以将一个 PF 拆分为多个 VF,并将 VF 分配给不同的虚拟机使用。目前我们支持一个PF上最多创建8VF,每个 VF 都被看作是一个独立的虚拟设备。

PPUSRIOV功能以MIG(Multiple Instance GPU)技术为基础,通过划分硬件资源,完成计算的分配,在分片粒度上提供了一定的灵活性。

因此,硬件在设计的时候,让计算单元CE和内存单元(LLC、HBM)可以按照一定的规则进行切分,可以让不同的实例占有不同数量的计算资源。VF的最大数量被设计成8份,每个VF都可以独立地进行工作,实现数据和算力的双重隔离:

image.png

2. 准备PF 驱动

2.1 环境要求

开启IOMMU

虚拟化功能需要开启IOMMU选项才能使用,

Ubuntu:

编辑/etc/default/grub,将下图iommu选项开启,保存退出,并执行update-grub命令使改动生效

image.png

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-clients

2.3 驱动安装

  1. 首先下载和服务器操作系统内核版本匹配的驱动安装包,deb/rpm二选一

  2. 接着使用对应指令安装驱动:

#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 loaded

3. 创建及使用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 (存活)状态:创建后未销毁均为存活状态,包含未关联任何VMvGPU实例

  • 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模式成功。

若提示:

image.png

说明virsh未安装,请参考【2.2.1】 配置virsh进行安装。

如果开启vGPU模式成功,通过lspci | grep 1ded查看pci信息,可以看到每张卡除了一个的6001 Device(PF)外,还会出现86002 Device(VF)。

image.png

- 如果关闭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模式,虚拟化功能可以开始使用。

image.png

注意:开启了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 typeID。

  • Name:vGPU type的名称,后跟数字为vGPU type ID。

  • Instances Free/Total:当前可创建的vGPU实例个数 / 总共可创建的vGPU实例个数,与vGPUCE、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.

创建成功的同时,将返回此vGPUPCI地址:PCI Bus ID 00000000:10:01.0, 格式为 Domain : Bus: Slot. Function,将用于【4.2.1 配置VMxml文件】的地址填充,同时也显示了 vGPUinstance ID,所在的device ID,以及vGPU type ID信息

3.1.5 查询alive状态(已创建且未删除)的vGPU实例信息

vGPU instance创建成功后,将处于alive(存活)状态

此时,可通过ppu-smi vgpu -a选项可查询状态为alivevGPU 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 deviceUUID,目前不支持,为默认值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选项可查询状态为activevGPU 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设备已创建且关联VMvGPU实例个数。

对于每个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 deviceUUID,目前不支持,为默认值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,将强制删除卡1vGPU instance ID1vGPU。

3.2 VF内相关操作指令

3.2.1 VF复位—— FLR(Function Level Reset)

若需要复位VF,可以在VF关联的虚拟机内,通过ppu-smi工具启动VFFLR

具体操作方法为:

  1. VM内使用ppu-smi -r指令触发reset,此时VF将通知PF进行FLR,此操作对其他VF不影响。

  2. 操作成功将提示:

 (base) root@JESSE-VM:~/PPU_SDK# ppu-smi -r
Trigger reset of PPU 00000000:00:0A.0.
All done.

注意:此时会显示整张卡的PCI地址,但是只是触发了此VFFLR,而非整张卡,其他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>

需要注意的地方:

  1. 9行:vm_namevm_name替换为新名字,由自己定义,后面操作VM均可使用该名字。

  2. 删除第10行:e1470dca-5e84-4780-bae3-82558c2dae0a UUID之后会自动生成新的。

  3. 11-12行:

    <memory unit='KiB'>80485760</memory>
    <currentMemory unit='KiB'>80485760</currentMemory>

    memory是可用于此 VM 的启动时的内存大小,currentMemory是 VM当前使用的内存大小。单位可以更改为MiB或者GiB,以便于计算。注意:不要使用等于或超过系统内存值,请使用大于等于5GiB的内存大小!,否则内存不够使用,可能导致驱动安装失败或系统运行过慢!

  4. 13行:16 数字为VM 中的 CPU 内核数,可以修改,注意:不要使用等于或超过系统 CPU 内核的数字。

  5. 15行:hvm 设置系统架构,如果是ARM64架构的服务器,则需设置为 arch='aarch64'。

  6. 22行: 需要在对应架构的服务器上启动实例。

  7. 38行:/usr/bin/kvm-spice 请根据不同的操作系统设置对应的kvm路径。例如:Ubuntu对应的kvm路径是/usr/bin/kvm-spice,alios对应kvm路径为/usr/libexec/qemu-kvm。

  8. 40行: 请根据镜像格式设置type参数:qcow2对应type='qcow2'、vhd对应type='vpc',如果要创建qcow2快照,请关闭dataplane,添加 dataplane='off' 。

  9. 41行: 替换为【4.1 创建QEMU镜像】时的绝对路径。

  10. 81行: 这是 libvirt NAT 网络为此虚拟机分配 IP 的虚假 mac 地址。可填任意16进制数,如果您在同一台服务器上有多个虚拟机(VM),请使用不同的 mac 地址,否则它们将共享相同的 IP,这将导致连接问题。

  11. 108-113行:设置PCI地址。

image.png

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

image.png

另一个前缀为type='pci'的地址为虚拟机(VM)中设备的PCI地址,可自行输入值,只需要保证在此VM内唯一即可。


需要注意的是,PCI地址除了BDF(bus, slot, function)外,还包含了domain部分,

domain值可通过lspci | grep 1ded指令来判断应该填多少:

  1. lspci | grep 1ded只能查到bus、slot、function,例如11:01.0,把xml文件中bus、slot、function的值替换即可,domain值无需变动,例如:

    image.png

  2. lspci | grep 1ded还显示了domain的信息,例如:0001:81:00.0,说明当前系统的PCI总线架构支持多个PCI总线,需要把xml文件domain、bus、slot、function的值都进行替换,例如:

    image.png

4.2.2 一个VM关联多个vGPU

若希望多个vGPU关联到同一个VM,添加多个 结构即可,然后修改内的两个地址:

  1. vGPU PCI Bus ID,创建vGPU实例时会显示,也可以通过sudo ppu-smi vgpu -a查询。

  2. type='pci'开头的PCI地址,只要确保各个hostdev内的唯一即可。

例如再添加一个vGPU:

image.png

添加之后,这个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对应地址为整张卡的地址:

image.png

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-grub

4.3.2 连接到VM

  1. 使用sudo virsh start <VM_Name>开启VM。

  2. 使用sudo virsh domifaddr <VM_Name>获取VMIP地址。

  3. 使用ssh root@IP来连接VM,密码为alinpu

4.3.3 加载vGPU的驱动

进入VM成功后,由于vGPUPF使用同一驱动,所以和 【2.3 驱动安装】一样,先下载与操作系统内核版本匹配的驱动安装包(deb/rpm),然后加载驱动即可。

加载成功后,vGPU将进入active状态,就可以开始运行计算任务了!

此时,可以在PF下通过ppu-smi vgpu -q指令查询,查看此vGPU的相关信息,具体介绍见 【3.1.6 查询active状态的vGPU实例信息】

注意:

  1. 当卸载vGPU驱动后,vGPU将恢复到alive状态,此时ppu-smi vgpu -q指令查询不到此vGPU,可以通过ppu-smi vgpu -a指令查询vGPU信息,具体介绍见 【3.1.5 查询alive状态的vGPU信息】

  2. 当未卸载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)章节。