Cyborg NVIDIA GPU 驱动程序支持 vGPU 管理

Cyborg NVIDIA GPU 驱动程序已经在 Train 版本中实现了 pGPU 管理,本规范提出支持在同一驱动程序中支持 vGPU 管理的规范。

问题描述

GPU 设备可以提供超级计算能力,并且可以取代 CPU 为用户提供更高效的计算能力,成本更低。GPU 云服务器在以下应用场景中具有巨大价值,包括:视频编码和解码、科学研究和人工智能(深度学习、机器学习)。

在 OpenStack 生态系统中,用户现在可以使用 Nova 通过两种方法将 gpu 资源传递给虚拟机

  • 将 GPU 硬件传递给虚拟机(PCI 直通)。

  • 将 Mediated Device(vGPU)传递给虚拟机。

随着 Cyborg 将管理包括 GPU 在内的异构加速器的长期目标,Cyborg 需要支持 GPU 管理并与 Nova 集成,以向用户提供上述方法中的 gpu 资源分配。现有的 Cyborg GPU 驱动程序 NVIDIA GPU 驱动程序已经支持第一种方法(PCI 直通),而第二种方法尚未支持。请参阅 ref 1 获取 Nova-Cyborg vGPU 集成规范。

用例

  • 当用户使用 Cyborg 管理 GPU 设备时,他/她希望启动一个连接了 Nvidia GPU(pGPU 或 vGPU)的 VM 以加速视频编码和解码,Cyborg 应该能够管理这种加速资源并将其分配给 VM(绑定)。

提议的变更

为了清楚起见,在以下内容中,我们将描述 NVIDIA GPU 驱动程序如何发现、生成 Cyborg 特定的 vGPU 设备驱动对象(符合 Cyborg 数据库模型),并将其报告给 cyborg-db 和 Placement,由 cyborg-conductor 执行的整个过程。当前分支中已经支持的功能标记为 DONE,新的更改标记为 NEW CHANGES。

1. 通过“lspci”并 grep nvidia 相关关键字从计算节点收集 GPU 设备的原始信息。(DONE)

2. 解析每条记录的详细信息,包括 vendor_idproduct_idpci_address。(DONE)

3. 为 GPU 设备及其 mdiated 设备生成 Cyborg 特定的驱动对象和资源提供程序建模。以下是描述符合 Cyborg 数据库模式 4 和 placement 数据模型 5 的 vGPU 设备的对象。(NEW CHANGE)

Hardware     Driver objects       Placement data model
   |               |                      |
1 GPU         1 device                    |
   |               |                      |
   |         1 deployable       ---> resource_provider
   |               |            ---> parent resource_provider: compute node
   |               |                      |
4 vGPUs     4 attach_handles    ---> inventories(total:4)

4. 支持在 cyborg.conf 中为特定 GPU 设备设置 vGPU 类型。实现方式与 Nova 中的方式类似 9。(NEW CHANGE)

  • 首先,我们建议 [gpu_devices]/enabled_vgpu_types 来定义 Cyborg 驱动程序可以使用哪些 vgpu 类型

    [gpu_devices]
    enabled_vgpu_types = [str_vgpu_type_1, str_vgpu_type_2, ...]
    
  • 此外,我们建议 Cyborg 驱动程序将接受与 [gpu_devices]/enabled_vgpu_types 相关的配置段,并指定哪些确切的 pGPU 与启用的 vGPU 类型相关,并将定义一个 device_addresses 选项,如下所示

    cfg.ListOpt('device_addresses',
                default=[],
                help="""
    List of physical PCI addresses to associate with a specific vGPU type.
    
    The particular physical GPU device address needs to be mapped to the vendor
    vGPU type which that physical GPU is configured to accept. In order to
    provide this mapping, there will be a CONF section with a name
    corresponding to the following template: "vgpu_%(vgpu_type_name)s
    
    The vGPU type to associate with the PCI devices has to be the section name
    prefixed by ``vgpu_``. For example, for 'nvidia-11', you would declare
    ``[vgpu_nvidia-11]/device_addresses``.
    
    Each vGPU type also has to be declared in ``[gpu_devices]/enabled_vgpu_types``.
    
    Related options:
    
    * ``[gpu_devices]/enabled_vgpu_types``
    """),
    

    例如,它将在 cyborg.conf 中设置

    [gpu_devices]
    enabled_vgpu_types = nvidia-223,nvidia-224
    [vgpu_nvidia-223]
    device_addresses = 0000:af:00.0,0000:86:00.0
    [vgpu_nvidia-224]
    device_addresses = 0000:87:00.0
    

5. 为设备生成 resource_class 和 traits,稍后也将报告给 Placement,并由 nova-scheduler 用于过滤合适的加速器。(NEW CHANGE)

  • resource class 遵循 OpenStack 使用的标准资源类 6。Pass-through GPU 设备将报告 ‘PGPU’ 作为其资源类,虚拟化 GPU 设备将报告 ‘VGPU’ 作为其资源类。

  • traits 遵循 placement 自定义 trait 格式 7。在 Cyborg 驱动程序中,它将使用以下格式为 vGPU 加速器报告两个 traits

    trait1: OWNER_CYBORG

    trait2: CUSTOM_<VENDOR_NAME>_<PRODUCT_ID>_<Virtual_GPU_Type>

    每个参数的含义如下所示。

    • OWNER_CYBORG:一个在 os-traits 中的新命名空间,用于标记设备是由 Cyborg 在将清单报告给 placement 时报告的。它用于区分 Nova 报告的 GPU 设备。

    • VENDOR_NAME:GPU 设备的供应商名称。

    • PRODUCT_ID:GPU 设备的 Product ID。

    • Virtual_GPU_Type:该参数实际上是管理员在 cyborg.conf 中设置的 enabled_vgpu_types 的另一种格式。为了生成此参数,驱动程序将首先检索 enabled_vgpu_type,然后通过以下方式将其映射到 Virtual_GPU_Type。名称与将在 traits 中报告的 Virtual_GPU_Type 完全相同。有关受支持的 GPU 的有效 Virtual GPU 类型,请参阅 8

    # find mapping relation between Virtual_GPU_Type and enabled_vgpu_type.
    # The value in "name" file contains its corresponding Virtual_GPU_Type.
    cat /sys/class/mdev_bus/{device_address}/mdev_supported_types/{enabled_vgpu_type}/name
    
  • 以下是一个显示现实世界中 GPU 设备 traits 的示例。

    • Nvidia Tesla T4 设备已成功安装在主机上,设备地址为 0000:af:00.0。此外,必须同时在主机上安装和配置供应商的 vGPU 驱动程序软件。

    [vtu@ubuntudbs ~]# lspci -nnn -D|grep 1eb8
    0000:af:00.0 3D controller [0302]: NVIDIA Corporation TU104GL [Tesla T4] [10de:1eb8] (rev a1)
    
    • 启用 GPU 类型(Accelerator)

      1. 指定实例将从此特定设备获取哪些特定的 GPU 类型。

      编辑 cyborg.conf 中的 devices.enabled_vgpu_types 和 device_address

      [gpu]
      enabled_vgpu_types=nvidia-223
      [vgpu_nvidia-223]
      device_addresses = 0000:af:00.0
      
      1. 重新启动 cyborg-agent 服务。

    • 最后,为此设备(RP)报告的 traits 将是

      OWNER_CYBORGCUSTOM_NVIDIA_1EB8_T4_2B

注意

对于最后一个参数“T4_2B”(<Virtual_GPU_type>),我们可以通过检查 mdev sys 路径来验证“nvidia-223”和“T4_2B”之间的映射关系

[vtu@ubuntudbs mdev_supported_types]$ pwd
/sys/class/mdev_bus/0000:af:00.0/mdev_supported_types
[vtu@ubuntudbs mdev_supported_types]$ ls
nvidia-222  nvidia-225  nvidia-228  nvidia-231  nvidia-234  nvidia-320
nvidia-223  nvidia-226  nvidia-229  nvidia-232  nvidia-252  nvidia-321
nvidia-224  nvidia-227  nvidia-230  nvidia-233  nvidia-319
[vtu@ubuntudbs mdev_supported_types]$ cat nvidia-223/name
GRID T4-2B

6. 为 vGPU 生成 controlpath_iddeployableattach_handleattribute。(NEW CHANGE)

7. 当 vgpu 绑定到 VM 时,通过将 UUID(实际上是 attach_handle UUID)echo 到 create 文件中,在 sys 中创建一个 mdev 设备。(NEW CHANGE)

create_file_path= /sys/class/mdev_bus/{pci_address}/mdev_supported_types/{type-id}/create

8. 当 vgpu 从 VM 解绑时,通过将“1” echo 到 remove 文件中,从 sys 中删除 mdev 设备。(NEW CHANGE)

remove_file_path= /sys/class/mdev_bus/{pci_address}/mdev_supported_types/{type-id}/UUID/remove

备选方案

使用 Nova 管理 vGPU 设备 10

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

此功能高度依赖于 libvirt 的版本和主机上存在的物理设备。

对于 vGPU 管理,部署者需要确保 GPU 设备已成功虚拟化。否则,Cyborg 将将其报告为 pGPU 设备。

请参阅 ref 23,了解如何安装 Virtual GPU Manager 包以虚拟化您的 GPU 设备。

开发者影响

实现

负责人

主要负责人

<yumeng-bao>

工作项

  • 在 Cyborg 中实现 NVIDIA GPU 驱动程序增强功能

  • 添加相关的测试用例。

  • 将测试报告添加到 wiki 并更新受支持的驱动程序文档页面

依赖项

测试

  • 将添加单元测试来测试此驱动程序。

文档影响

记录 Cyborg 项目中的 Nvidia GPU 驱动程序。

参考资料

1

https://review.opendev.org/#/c/750116/

2

https://docs.nvda.net.cn/grid/6.0/grid-vgpu-user-guide/index.html

3

https://docs.nvda.net.cn/grid/6.0/grid-vgpu-user-guide/index.html#install-vgpu-package-generic-linux-kvm

4

https://specs.openstack.org/openstack/cyborg-specs/specs/stein/implemented/cyborg-database-model-proposal.html

5

https://docs.openstack.org/nova/rocky/user/placement.html#references

6

https://github.com/openstack/os-resource-classes/blob/master/os_resource_classes/__init__.py#L41

7

https://specs.openstack.org/openstack/nova-specs/specs/pike/implemented/resource-provider-traits.html

8

https://docs.nvda.net.cn/grid/latest/grid-vgpu-user-guide/index.html#virtual-gpu-types-grid-reference

9

https://specs.openstack.org/openstack/nova-specs/specs/ussuri/implemented/vgpu-multiple-types.html

10

https://docs.openstack.org/nova/latest/admin/virtual-gpu.html

历史记录

修订版

发布

描述

Wallaby

引入