Cyborg-Nova 交互调度

https://blueprints.launchpad.net/cyborg/+spec/cyborg-nova-interaction

Cyborg 提供了一个通用的加速器管理框架,例如 FPGA、GPU 等。为了调度需要加速器的实例,Cyborg 需要在三个层面上与 Nova 协同工作

  • 表示和发现:Cyborg 应将加速器表示为 Placement 中的资源。当发现设备时,Cyborg 会更新资源提供者、清单、特征等信息到 Placement 中。

  • 实例放置/调度:Cyborg 可以提供一个过滤器和/或称重器,以根据可用的加速器资源限制或优先考虑主机,但预计 Placement 本身可以处理大部分需求。

  • 将加速器附加到实例。在计算节点中,Cyborg 应定义一个基于通过新的 os-acc 库(类似于 os-vif 和 os-brick)与 Nova 交互的工作流程。

本规范解决了前两个方面。 另一个规范将解决加速器附加到实例的问题 1。 Cyborg 还需处理一些 FPGA 相关的方面,无需涉及 Nova,特别是 FPGA 编程和比特流管理。 这些将在其他规范中介绍。 本规范独立于这些规范。

本规范适用于所有加速器,包括 GPU、高精度时间同步 (HPTS) 卡等。 由于 FPGA 比其他设备需要考虑更多方面,因此某些部分可能侧重于 FPGA 相关的因素。 规范指出了 FPGA 相关的方面。

基于 FPGA 的智能网卡分为两类:一类显式地将 FPGA 暴露给主机,另一类不暴露。 Cyborg 的范围包括前者。 本规范包括此类设备,但 Cyborg-Neutron 交互不在范围内。

本规范的范围是 Rocky 版本。

术语

  • 加速器:可以分配给实例以卸载特定功能的单元。对于非 FPGA 设备,它是设备本身或其虚拟化版本(例如 vGPU)。对于 FPGA,加速器可以是整个设备、设备内的区域或功能。

  • 位流:FPGA 镜像,通常是二进制文件,可能包含特定于供应商的元数据。位流可以实现一个或多个功能。

  • 功能:特定的功能,例如矩阵乘法或视频转码,通常表示为字符串或 UUID。此术语可用于具有多功能的设备,包括 FPGA 和其他固定功能硬件,例如 Intel QuickAssist。

  • 区域:FPGA 的一部分,可以在不干扰该 FPGA 其他部分的情况下进行编程。如果 FPGA 不支持部分重新配置,则整个设备构成一个区域。区域可以实现一个或多个功能。

这是一个 FPGA 具有多个区域和多个函数在区域内的示例图

       PCI A     PCI B
        |        |
+-------|--------|-------------------+
|       |        |                   |
|  +----|--------|---+   +--------+  |
|  | +--|--+ +---|-+ |   |        |  |
|  | | Fn A| | Fn B| |   |        |  |
|  | +-----+ +-----+ |   |        |  |
|  +-----------------+   +--------+  |
|  Region 1              Region 2    |
|                                    |
+------------------------------------+

问题描述

Cyborg 对加速器的表示和处理需要与 Nova 的 Placement API 保持一致。 具体来说,它们必须以资源提供者 (RP)、资源类 (RC) 和特征的形式建模。

虽然 PCI Express 在数据中心已经根深蒂固,但某些加速器可能通过其他协议暴露给主机。 即使使用 PCI,加速器组件和 PCI 函数之间的连接也可能因设备而异。 因此,Cyborg 不应将加速器表示为 PCI 函数。

对于需要加速器的实例,我们需要定义一种方法,使 Cyborg 能够无缝地集成到 Nova 调度工作流程中。

用例

我们需要满足租户角色的以下用例

  • 设备即服务 (DaaS):flavor 请求一个设备。

    • FPGA 变体:flavor 请求一个可以应用特定比特流的设备。 前两种变体将比特流编程委托给 Cyborg 进行安全编程

      • 请求时编程:flavor 指定一个比特流。(Cyborg 在实例启动之前应用比特流。 这类似于 AWS 流程。)

      • 运行时编程:实例可以动态请求一个或多个比特流。(Cyborg 接收请求并进行编程。)

      • 直接编程:实例直接编程分配给它的 FPGA 区域,无需委托给 Cyborg。 这引发的安全问题需要在未来解决。(这仅供完整性列出;在 Rocky 甚至未来的版本中都不会解决,直到完全解决安全问题。)

  • 加速功能即服务 (AFaaS):flavor 请求附加到实例的一个函数(例如 ipsec)。 操作员可以通过两种方式满足此用例

    • 预编程:不允许编排修改任何函数,原因如下

      • 仅提供固定的硬件功能。(例如,ASIC。)

      • 操作的简易性。

      • 通过通过审核的过程离线进行所有编程来保证租户的编程安全性。

    • 对于 FPGA,允许编排根据需要进行编程,以最大限度地提高灵活性和资源可用性。

操作员必须能够在同一集群中提供设备即服务和加速功能即服务,以服务于所有类型的用户:那些不依赖设备的、使用第三方比特流的以及使用自己比特流的用户(包括开发人员)。

Cyborg 的目标是提供机制来支持所有这些用例。

在本规范中,我们不考虑比特流开发人员或设备开发人员的角色。 此外,我们假设每个加速器设备专用于一个计算节点,而不是在多个节点之间共享。

提议的变更

表示

  • Cyborg 将为设备的特定类型表示一个通用的加速器,作为该类型的自定义资源类 (RC),形式为 CUSTOM_ACCELERATOR_<device-type>。 例如,CUSTOM_ACCELERATOR_GPU、CUSTOM_ACCELERATOR_FPGA 等。 这有助于为不同的设备类型定义单独的配额。

  • 设备本地内存是仅对设备可用的内存,通常以 PCIe 板上的 DDR、QDR 或高带宽内存的形式存在。 也可以将其表示为形式为 CUSTOM_ACCELERATOR_MEMORY_<memory-type> 的 RC。 例如,CUSTOM_ACCELERATOR_MEMORY_DDR。 单个 PCIe 板可能具有多种类型的内存。

  • 此外,每个设备/区域都表示为资源提供者 (RP)。 这使得可以应用特征到它和其他 RP/RC 包含在其中。 因此,设备 RP 提供一个或多个该设备类型 RC 的实例。 这取决于 Nova 中的嵌套 RP 支持 2

    • 对于 FPGA,设备和其中的区域都将表示为 RP。 这允许 FPGA 内部的层次结构自然地建模为 RP 层次结构。

    • 使用嵌套 RP 是首选方式。 但是,在 Nova 支持嵌套 RP 之前,Cyborg 应将 RC 和特征(如下所述)与计算节点 RP 关联。 这要求单个主机上的所有设备必须共享相同的特征。 如果在 Rocky 版本发布后可用嵌套 RP 支持,则操作员需要按如下方式处理升级

      • 终止所有使用加速器的实例。

      • 删除所有计算节点 RP 上的 Cyborg 特征和清单,可能通过运行脚本。

      • 执行 Cyborg 升级。 升级后,新的代理/驱动程序将创建设备的 RP 并发布特征和清单。

  • Cyborg 将为每个设备关联一个设备类型特征,形式为 CUSTOM_<device-type>-<vendor>。 例如,CUSTOM_GPU_AMD 或 CUSTOM_FPGA_XILINX。 该特征旨在帮助匹配实例镜像中的软件驱动程序/库。 这旨在在 flavor 中使用,当实例镜像中的单个驱动程序/库可以处理来自供应商的大多数或所有设备类型时。

    • 对于 FPGA,此特征和其他特征也将应用于设备 RP 的子区域 RP。

  • Cyborg 将根据需要为每个设备关联一个设备系列特征,形式为 CUSTOM_<device-type>_<vendor>_<family>。 例如,CUSTOM_FPGA_INTEL_ARRIA10。 这不是产品名称,而是设备系列的名称,用于将实例镜像中的软件与设备系列匹配。 这是设备类型特征的细化。 旨在在 flavor 中使用,当不同设备系列有不同的驱动程序/库时。 由于很难预测新的设备系列是否需要新的驱动程序/库,因此将这两个特征与同一个设备 RP 关联可能是有意义的。

  • 对于 FPGA,Cyborg 将为每个区域关联一个区域类型特征(如果不支持部分重新配置,则与 FPGA 本身关联),形式为 CUSTOM_FPGA_REGION_<vendor>__<uuid>。 例如,CUSTOM_FPGA_REGION_INTEL_<uuid>。 这对于 FPGA 的设备即服务是必需的。

  • 对于 FPGA,当区域被编程时,Cyborg 可能会将一个函数类型特征与区域关联,形式为 CUSTOM_FPGA_FUNCTION_<vendor>_<uuid>。 例如,CUSTOM_FPGA_FUNCTION_INTEL_<gzip-uuid>。 这对于 AFaaS 用例是必需的。 这在 Cyborg 作为 AFaaS 请求的一部分重新编程区域时更新。

  • 对于 FPGA,Cyborg 应将 CUSTOM_PROGRAMMABLE 特征与每个区域关联。 这旨在为未来的多功能加速器奠定基础。 Flavor 应请求此特征,除非在预编程的情况下。

  • 对于 FPGA,由于它们可以实现各种功能,我们还可以附加一个功能特征。 例如,CUSTOM_FPGA_COMPUTE、CUSTOM_FPGA_NETWORK、CUSTOM_FPGA_STORAGE。

  • Cyborg 代理需要从 Cyborg 驱动程序获取足够的信息才能创建 RP、RC 和特征。 特别是,它需要从驱动程序/代理接口获取设备类型字符串、区域 ID 和函数 ID,从而增强该接口 3

  • Placement 中的建模将通用的虚拟加速器表示为资源类,并将设备/区域表示为 RP。 这是与 PCI 无关的。 但是,许多 FPGA 实现通常使用 PCI Express,特别是 SR-IOV。 在这些情况下,预计 Cyborg 将通过 PCI 直通将 PCI VF 传递给实例,并在主机中保留 PCI PF 以进行管理。

Flavors

为了说明 Nova 中设备表示法的使用方式,并为了完整性,我们现在展示如何为各种用例定义 flavor。 请参阅 4 以获取更多详细信息。

  • 需要设备访问权限的 flavor 始终请求一个或多个 ‘resource:CUSTOM_ACCELERATOR_<device-type>’ 的实例。 此外,它需要指定正确的特征。

  • DaaS 的示例 flavor

    resources:CUSTOM_ACCELERATOR_HPTS=1
    trait:CUSTOM_HPTS_ZTE=required

    注意:对于 FPGA,flavor 还应包括 CUSTOM_PROGRAMMABLE 特征。

  • AFaaS 预编程的示例 flavor

    resources:CUSTOM_ACCELERATOR_FPGA=1
    trait:CUSTOM_FPGA_INTEL_ARRIA10=required
    trait:CUSTOM_FPGA_FUNCTION_INTEL_<gzip-uuid>=required
  • AFaaS 编排编程的示例 flavor

    resources:CUSTOM_ACCELERATOR_FPGA=1
    trait:CUSTOM_FPGA_INTEL_ARRIA10=required
    trait:CUSTOM_PROGRAMMABLE=required
    function:CUSTOM_FPGA_FUNCTION_INTEL_<gzip-uuid>=required (Nova 不会解释。)
    • 注意:当 Nova 支持首选特征时,我们可以使用 extra specs 中的 ‘function’ 关键字代替它。

    • 注意:为了让 Cyborg 获取此功能的比特流,假设操作员已将功能 UUID 配置为 Glance 中比特流镜像的属性。

  • AFaaS 编排编程的另一个示例 flavor,为了易用性,通过名称引用函数

    resources:CUSTOM_ACCELERATOR_FPGA=1
    trait:CUSTOM_FPGA_INTEL_ARRIA10=required
    trait:CUSTOM_PROGRAMMABLE=required
    function_name:<string>=required (Nova 不会解释。)
    • 注意:这假设操作员已将功能名称配置为 Glance 中比特流镜像的属性。 FPGA 硬件预计不会暴露功能名称,因此 Cyborg 不会将功能名称表示为特征。

  • flavor 可能会请求其他 RC,例如本地内存。

  • flavor 可以使用粒度资源请求语法请求多个加速器。 Cyborg 可以使用扩展的粒度资源请求语法(请参阅参考文献)将 flavor 中的函数和比特流字段与资源/特征关联,Nova 不会解释该语法。

    resourcesN: CUSTOM_ACCELERATOR_FPGA=1
    traitsN: CUSTOM_FPGA_INTEL_ARRIA10=required
    othersN: function:CUSTOM_FPGA_FUNCTION_INTEL_<gzip-uuid>=required

调度工作流程

现在我们来看设备仅实现一个功能时的调度流程。 具有多个功能的设备目前不在范围内。

  • 带有 flavor 的请求规范到达 Nova conductor/scheduler。

  • Placement API 返回包含请求资源和匹配特征的 RP 列表。(如果支持嵌套 RP,则返回的 RP 是设备/区域 RP。 否则,它们是计算节点 RP。)

  • FPGA 特定的:对于 AFaaS 编排编程用例,Placement 将返回匹配的设备,但它们可能没有请求的功能。 因此,Cyborg 可以提供一个称重器,该称重器检查分配候选者,查看哪些候选者具有所需的函数特征,并对它们进行更高的排名。 这不需要更改 Cyborg DB。

  • 请求规范到达计算节点(现在忽略 Cells)。

    注意:当一个设备/区域实现多个功能并且需要编排驱动的编程时,需要调整该设备的清单。 稍后可以解决此问题,并且对于 Rocky 版本而言不是优先事项。 请参阅参考文献。

  • Nova compute 调用 os-acc/Cyborg 1

  • FPGA 特定的:如果请求规范在 extra specs 中请求函数 X,但 X 不存在于所选区域 RP 中,Cyborg 应编程该区域。

  • Cyborg 应将 RP/RC 和 PF/VF 与其内部 DB 中的 Deployables 关联。 它可以将请求的资源(设备/函数)与可用于将资源附加到实例(例如 PCI 函数)的附加句柄关联。

注意:此流程与 PCI 无关:不涉及 PCI 白名单。

处理每个设备上的多个功能

备选方案

N/A

数据模型影响

Cyborg 需要进行以下更改。

  • 不要将 PCI 函数作为 Nova 中的资源发布。 而是将 RC/RP 信息发布到 Nova,并在内部保留 RP-PCI 映射。

  • Cyborg 应将 RP/RC 和 PF/VF 与其内部 DB 中的 Deployables 关联。

  • 驱动程序/代理接口需要报告设备/区域类型,以便可以创建 RC。

  • Deployables 表应跟踪哪个 RP 对应于每个 Deployable。

REST API 影响

安全影响

此更改允许租户启动 FPGA 比特流编程。 为了减轻安全影响,建议仅提供两种编程方法(flavor 请求比特流,或正在运行的实例请求特定的比特流),并且两者都通过 Cyborg 处理。 没有实例直接访问 FPGA 的权限。

通知影响

其他最终用户影响

性能影响

其他部署者影响

开发者影响

实现

负责人

工作项

  • 确定 Cyborg conductor、db、agent 和驱动程序所需的具体更改。

依赖项

注意:粒度请求功能需要定义请求非相同加速器的 flavor,但不需要在 Rocky 中进行 Cyborg 开发。

测试

对于此版本支持的每个供应商驱动程序,我们需要在 CI 基础设施中集成相应的 FPGA 类型。

文档影响

参考资料

1(1,2)

计算节点规范

2

Rocky 中的嵌套 RP

3

Cyborg 代理-驱动程序 API 规范

4

Flavor 中的自定义资源类

5

Cyborg Nova Queens 规范

6

Cyborg Nova 交互的 Rocky PTG Etherpad

7

Cyborg/Nova 详细调度

8

Openstack-dev 电子邮件讨论

历史记录

可选部分,每次更新规范时用于描述新的设计、API 或任何数据库模式更新。 有助于让读者了解随着时间的推移发生了什么。

修订

发布名称

描述

Rocky

引入