NVidia 虚拟 GPU 在 Nova 中的支持

图形处理单元 (GPU) 针对在硅中执行各种数学运算进行了优化。 这些优化允许极快的浮点运算,从而使各种工作负载受益,例如图形渲染、机器学习等。 Nvidia [0] 和 Intel [1] 等硬件制造商提供物理 GPU (pGPU) 卡,可以将这些卡虚拟划分为虚拟图形处理单元 (vGPU),从而使多个虚拟机可以使用系统中安装的单个物理 GPU。

Nova [2][3][4][5] 中的最新更改引入了将物理 GPU 作为虚拟 GPU 暴露给 Nova 实例的部分支持。 本规范旨在为 charm 部署中的 NVidia 硬件启用此支持。

问题描述

机器学习工作负载极大地受益于 GPU 的硬件功能。 运行基于 ML 的工作负载的常见配置利用 Kubernetes,Kubernetes 多租户支持较差,并且通常运行在 OpenStack 之上,以提供弹性资源并提供多租户隔离。

当前,Charmed OpenStack 的部署必须使用 GPU 直通 [6] 才能使虚拟机可以使用 GPU。 这会将部署限制为为计划在虚拟机上运行的每个虚拟机需要一张物理卡。 vGPU 支持使多个虚拟机可以使用安装的 pGPU,从而使部署能够增加可以利用该系统的虚拟机数量。

提议的变更

OpenStack 中的 Nova 项目自 Queens 版本以来就提供了 vGPU 支持。 [2][3] Nova 项目继续迭代 vGPU 支持的设计,并在 Ussuri 版本中进行了增强,以允许多种 vGPU 类型。 [4][5]

Nova 项目提供 vGPU 的分配和分配支持。 上游的 vGPU 支持已经发展,因此,不同版本的 OpenStack 中可用不同的功能。 主要区别在于是否支持多个 GPU 设备以及如何指定应将哪些设备用于虚拟 GPU 类型。

将创建一个新的 nova-compute-nvidia-vgpu charm,作为 nova-compute 的附属 charm。 它将安装 NVidia 主机软件,并且仅在检测到一张或多张此类 pGPU 卡时才进行设置。 事实上,将附属 charm“盲目地”部署到所有计算主机,无论它们是否提供 NVidia pGPU 卡,都可以简化 Day-0 和 Day-1 操作。 如果未找到受支持的 pGPU 卡,附属 charm 将在它的单元状态消息中简单地说明这一点。

要安装在主机上的专有软件包 (.deb) [7] 将作为 charm 资源传递给附属 charm。

要配置 vGPU,将在 nova-compute-nvidia-vgpu charm 中添加一个新的配置选项 vgpu-device-mappings。 此配置值的格式将是 YAML 格式的字典(或 JSON 格式的,因为 JSON 是有效的 YAML),其中键是 vgpu_type,值是设备地址列表。 例如:

juju config nova-compute-nvidia-vgpu vgpu-device-mappings="$(cat << EOF
vgpu_type1:
  - device_address1
  - device_address2
vgpu_type2:
  - device_address3
EOF
)"

等同于

juju config nova-compute-nvidia-vgpu vgpu-device-mappings=\
    "{'vgpu_type1': ['device_address1', 'device_address2'], 'vgpu_type2': ['device_address3']}"

vGPU 支持将添加到以下操作系统版本

  • Bionic

  • Focal

vGPU 支持将针对以下 OpenStack 版本启用

  • Queens (仅限 bionic)

  • Rocky (仅迁移路径)

  • Stein (仅迁移路径)

  • Train (仅迁移路径)

  • Ussuri

  • Victoria

  • Wallaby

  • Xena

  • Yoga (及更高版本)

需要 Juju 2.9 或更高版本。

备选方案

使用 PCI 直通 [6] 虚拟机可以直接访问计算主机中安装的物理 GPU。 但是,这会将部署限制为为每个虚拟机需要一张物理卡。

实现

负责人

主要负责人

Aurelien Lourot <lp:aurelien-lourot>

Gerrit Topic

对于与此规范相关的所有补丁,请使用 Gerrit 主题“vgpu-support”。

git-review -t vgpu-support

工作项

实现包括以下项目

  • 创建一个 nova-compute-nvidia-vgpu 附属 charm,其中包含 vgpu-device-mappings 配置选项。

  • 让附属 charm 通过 subordinate_configuration 键向主 charm 馈送

    • vGPU 相关的 Nova 配置位,以便通过新的 nova-vgpu 关系传递 JSON blob [8][9]。 JSON blob 将是所需 Nova 配置的 1:1 映射,[3][5] 基本上包含启用的 vGPU 类型和每个 vGPU 类型的设备地址。

    • 有关已安装软件包和服务的的数据,以便正确实现暂停、恢复和升级(可以在此处找到此机制的示例 [10][11])。

  • 让附属 charm 在找到所需的硬件时安装专有主机软件 [7]

    • 在安装钩子中,

    • 在通过钩子或操作重启后。

  • 让附属 charm 执行设置专有软件的任何必要操作。 [7]

  • 请参阅下面的“文档”和“测试”部分。

仓库

  • charm-nova-compute

  • charm-nova-compute-nvidia-vgpu (新)

  • charm-guide

  • charm-deployment-guide

文档

将为 charm-guide 和/或 charm-deployment-guide 编写文档,解释此功能的用法,即如何使用和配置 charm。 将提供有关这些主题的有用链接

  • 虚拟机风味,

  • 专有虚拟机软件,[7],

  • 许可证服务器。

安全性

将特别注意防止通过 vgpu-device-mappings 配置选项注入任意 Nova 配置。

只有在找到合适的硬件时,才会安装专有主机软件 [7]。

测试

将添加门控测试(单元测试和功能测试),以涵盖新 charm 在没有任何特殊硬件的情况下的行为。

如果需要且可能,将编写并定期运行使用特殊 GPU 硬件和 NVidia 专有软件 [7] 的功能测试。

依赖项

我们依赖于 NVidia 专有软件 [7] 作为 .deb 资源文件提供给附属 charm。