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=1trait:CUSTOM_HPTS_ZTE=required注意:对于 FPGA,flavor 还应包括 CUSTOM_PROGRAMMABLE 特征。
AFaaS 预编程的示例 flavor
resources:CUSTOM_ACCELERATOR_FPGA=1trait:CUSTOM_FPGA_INTEL_ARRIA10=requiredtrait:CUSTOM_FPGA_FUNCTION_INTEL_<gzip-uuid>=requiredAFaaS 编排编程的示例 flavor
resources:CUSTOM_ACCELERATOR_FPGA=1trait:CUSTOM_FPGA_INTEL_ARRIA10=requiredtrait:CUSTOM_PROGRAMMABLE=requiredfunction:CUSTOM_FPGA_FUNCTION_INTEL_<gzip-uuid>=required(Nova 不会解释。)
注意:当 Nova 支持首选特征时,我们可以使用 extra specs 中的 ‘function’ 关键字代替它。
注意:为了让 Cyborg 获取此功能的比特流,假设操作员已将功能 UUID 配置为 Glance 中比特流镜像的属性。
AFaaS 编排编程的另一个示例 flavor,为了易用性,通过名称引用函数
resources:CUSTOM_ACCELERATOR_FPGA=1trait:CUSTOM_FPGA_INTEL_ARRIA10=requiredtrait:CUSTOM_PROGRAMMABLE=requiredfunction_name:<string>=required(Nova 不会解释。)
注意:这假设操作员已将功能名称配置为 Glance 中比特流镜像的属性。 FPGA 硬件预计不会暴露功能名称,因此 Cyborg 不会将功能名称表示为特征。
flavor 可能会请求其他 RC,例如本地内存。
flavor 可以使用粒度资源请求语法请求多个加速器。 Cyborg 可以使用扩展的粒度资源请求语法(请参阅参考文献)将 flavor 中的函数和比特流字段与资源/特征关联,Nova 不会解释该语法。
resourcesN: CUSTOM_ACCELERATOR_FPGA=1traitsN: CUSTOM_FPGA_INTEL_ARRIA10=requiredothersN: 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 类型。
文档影响¶
无
参考资料¶
历史记录¶
可选部分,每次更新规范时用于描述新的设计、API 或任何数据库模式更新。 有助于让读者了解随着时间的推移发生了什么。
发布名称 |
描述 |
|---|---|
Rocky |
引入 |