支持虚拟 GPU 资源¶
https://blueprints.launchpad.net/nova/+spec/add-support-for-vgpu
添加对虚拟 GPU (vGPU) 资源的支持。
问题描述¶
借助一些图形虚拟化解决方案,例如 Intel 的 GVT-g 和 NVIDIA 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-classes 和 nested-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 附加到实例
依赖项¶
此规范依赖于以下规范的实现
custom-resource-classes-pike:https://blueprints.launchpad.net/nova/+spec/custom-resource-classes-pike
nested-resource-providers:https://specs.openstack.org/openstack/nova-specs/specs/ocata/approved/nested-resource-providers.html
resource-provider-traits:https://specs.openstack.org/openstack/nova-specs/specs/pike/approved/resource-provider-traits.html
测试¶
单元测试。
文档影响¶
需要记录 vGPU 的配置。
参考资料¶
历史¶
发布名称 |
描述 |
|---|---|
Queens |
引入 |