支持虚拟 GPU 资源

https://blueprints.launchpad.net/nova/+spec/add-support-for-vgpu

添加对虚拟 GPU (vGPU) 资源的支持。

问题描述

借助一些图形虚拟化解决方案,例如 Intel 的 GVT-gNVIDIA GRID vGPU,单个物理图形处理单元 (pGPU) 可以虚拟化为多个虚拟图形处理单元 (vGPU)。一些 hypervisor 支持使用 vGPU 启动虚拟机以加速图形处理。但目前 Nova 还不支持 vGPU。

计算节点可能有一个或多个 pGPU,每个 pGPU 可以支持多个 vGPU。一些 pGPU(例如 NVIDIA GRID K1)支持几种不同的 vGPU 类型,每种 vGPU 类型都有固定的帧缓冲量、支持的显示头数和最大分辨率,并针对不同类型的工作负载。由于它们不同的资源需求,可以在 pGPU 上同时创建的最大 vGPU 数量因 vGPU 类型而异。

以下是不同 vGPU 类型的示例

示例 1:NVIDIA GRID K1 上的 vGPU

+----------------+---------------------------------------+
| Card Type      | NVIDIA GRID K1                        |
+----------------+---------------------------------------+
| No. of pGPUs   | 4                                     |
+----------------+---------------------------------------+
| FB size (MB)   | 4096  | 2048  | 1024  | 512   | 256   |
+----------------+-------+-------+-------+-------+-------+
| Max heads      |   4   |  4    |  2    |  2    |  2    |
+----------------+-------+-------+-------+-------+-------+
| vGPU model     | K180Q | K160Q | K140Q | K120Q | K100  |
+----------------+-----------------------+---------------+
| Max Resolution |    2560x1600          |   1920x1200   |
+----------------+-----------------------+---------------+
| vGPUs per GPU  |  1    |  2    | 4     | 8     | 8     |
+----------------+-------+-------+-------+-------+-------+

示例 2:Intel(R) Xeon(R) CPU E3-1285 v4 上的 Intel GVT-g vGPU

+----------------+------------------------------------+
| pGPU model     | Iris Pro Graphics P6300            |
+----------------+------------------------------------+
| vGPU model     | Intel GVT-g                        |
+----------------+------------------------------------+
|Framebuffer size| 128 MB                             |
+----------------+------------------------------------+
| Max heads      | 1                                  |
+----------------+------------------------------------+
| Max Resolution | 1920x1080                          |
+----------------+------------------------------------+
| No. of vGPUs   |                                    |
|    per GPU     | 7                                  |
+----------------+------------------------------------+

在本规范中,我们将定义一个模型来跟踪 vGPU 资源。

用例

  • 作为云管理员,我应该能够定义请求一定数量 vGPU 资源的 flavor。

  • 作为云管理员,我应该能够指定 flavor 中定义的 vGPU 的支持的显示头数和分辨率;最终用户可以选择具有预期性能的合适的 flavor。

  • 作为云管理员,我应该能够定义请求支持某些特殊功能的 vGPU 的 flavor,例如 OpenGL,以实现硬件加速渲染。

  • 作为最终用户,我应该允许使用预定义的 flavor 启动具有 vGPU 的虚拟机。

提议的变更

  • 定义 vGPU 的资源跟踪模型:vGPU 资源需要跟踪定量定性方面。

    • 跟踪 vGPU 资源的定量方面

      • 定义一个新的标准资源类 resource-classes 来跟踪资源提供程序中的 vGPU 数量 (ResourceClass.VGPU)。

      • 生成资源提供程序 (RP) 树以跟踪可用的 vGPU 数量。资源跟踪模型如下所示

        resource provider:                  compute_node
                                        /        |          \
        resource provider:            RP_1      RP_2   ...  RP_n
                                     /           |             \
        inventory:          vGPU_inv_1       vGPU_inv_2  ...  vGPU_inv_n
        

        在 virt 驱动程序中(在 get_inventory() 函数中),它将要求 hypervisor 获取现有的 pGPU 及其 vGPU 容量。使用库存数据,virt 驱动程序为每个 pGPU 或每个 pGPU 组(取决于 hypervisor 管理 pGPU 的方式)创建资源提供程序。这些资源提供程序将作为 compute_node 的子节点关联[nested-resource-providers]。

        • GPU 的 RP:例如,libvirt 将报告每个 pGPU 可用的 vGPU 数量。这样,如果有多个 pGPU(相同型号),可以在一个 pGPU 上创建一种类型的 vGPU,并在剩余的 pGPU 上创建其他类型的 vGPU。

        • pGPU 组的 RP:XenServer 使用 pGPU 组来管理 pGPU。pGPU 组是属于同一型号的 pGPU 的集合。在创建 vGPU 时,它将在目标组中搜索可以提供请求的 vGPU 的 GPU。换句话说,无法指定要在哪个 pGPU 上创建 vGPU。因此,XenAPI(XenServer 的 virt)应该为每个 pGPU 组创建 RP。库存中的数量应该是组中 pGPU 可以提供的 vGPU 的总数。

        如上所述,一些 pGPU(例如 NVIDIA GRID K1)支持不同大小的 vGPU 类型。不同 vGPU 类型的容量各不相同。为了使资源跟踪更容易,我们需要确保 vGPU 的数量是可预测的。因此,我们将添加 nova.conf 中的一个新的白名单来指定启用的 vGPU 类型,以确保 vGPU 的每个资源提供程序只有一种类型的 vGPU。白名单定义如下

        enabled_vgpu_types = [ str_vgpu_type_1, str_vgpu_type_2, ... ]
        

        注意:str_vgpu_type_x 是表示 vGPU 类型的一个字符串。不同的 hypervisor 可能会使用不同的字符串暴露 vGPU 类型。virt 驱动程序应妥善处理并将其映射到白名单中的正确 vGPU 类型。

        例如,NVIDIA 的 vGPU 类型 M60-0B 在 libvirt 中以类型 ID:“nvidia-11” 暴露;但在 XenServer 中以类型名称:“GRID M60-0B” 暴露。如果我们要启用此 vGPU 类型,

        • 当 libvirt 是 hypervisor 时,白名单应该是

          enabled_vgpu_types = [ "nvidia-11" ]
          
        • 当 XenServer 是 hypervisor 时,白名单应该是

          enabled_vgpu_types = [ "GRID M60-0B" ]
          

        vGPU 资源数量应该是 8(每张卡 4 个 GPU * 每个 GPU 2 个 vGPU)。资源提供程序的库存数据应该是

        {
            obj_fields.ResourceClass.vGPU: {
                "total": 8,
                "reserved": 0,
                "min_unit": 1,
                "max_unit": 1,
                "step_size": 1,
                "allocation_ratio": 1.0
            },
        }
        
    • 跟踪 vGPU 资源的定性方面

      • traits 的特性旨在支持表示资源的定性方面,以区分其特征[os-traits]。

      • GPU 也有不同的特征。我们在 os-traits 中定义 GPU 的 traits[gpu-traits]:包括 最大显示头数分辨率功能。在 virt 驱动程序中,它应该查询 vGPU 资源的 定性方面;将它们映射到定义的 traits 并将这些 traits 关联到资源提供程序。

  • 定义 flavor:允许云管理员创建不同的 flavor 来指定所需的 vGPU 数量和/或一组所需的 traits,以满足不同用户的需求。

  • 调度器:基于 vGPU 的数量和所需的 traits,将过滤掉可以满足条件的资源提供程序。

  • 在生成实例时,virt 驱动程序应从实例请求规范中检索 vGPU 资源规范,并将其映射到创建 vGPU 所需的正确信息(例如 XenAPI 中的 GPU 组);然后创建和/或将 vGPU 关联到实例。

备选方案

  • 已经尝试通过为 vGPU 创建假的 SRIOV-VF PCI 并然后通过 PCI 设备 vGPU-passthrough-PCI 来支持 vGPU。但填充假的 PCI 地址存在问题。而且它无法反映某些 vGPU 实际上不是 PCI 设备的情况。

数据模型影响

不需要特定的数据模型更改,但它取决于 custom-resource-classesnested-resource-providers 中定义的数据模型。

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

为了启用 vGPU 功能

  • 操作员应更改 nova 配置设置以启用每个 pGPU 型号的 vGPU 类型,该型号将提供 vGPU 功能。

  • 操作员应创建新的或更新现有的 flavor,以指定要请求的 vGPU 数量以及其他预期的 traits(例如显示分辨率、显示头数、功能),以便用户可以使用不同的 flavor 根据其图形处理需求请求 vGPU。

  • 对于滚动升级,操作员应在所有节点滚动到已实现此规范的发布版本后,创建或更新请求 vGPU 的 flavor。

开发人员影响

实现

负责人

主要负责人

jianghuaw

其他贡献者

工作项

  • 在 os-traits 中定义 GPU 的标准 traits;

  • 在 virt 驱动程序中,添加代码以

    • 在配置文件中添加启用的 vGPU 类型的白名单

    • 查询启用的 vGPU 类型所需的数据

    • 生成嵌套的资源提供程序

    • 生成资源提供程序中的库存数据

    • 将 GPU 特性映射到 os-traits 中定义的 traits

    • 将这些 traits 关联到资源提供程序

    • 将启动请求规范中的 traits 映射到所需的元数据

    • 基于元数据创建或/和将 vGPU 附加到实例

依赖项

此规范依赖于以下规范的实现

测试

  • 单元测试。

文档影响

需要记录 vGPU 的配置。

参考资料

历史

修订版

发布名称

描述

Queens

引入