计算节点中 Cyborg-Nova-Glance 交互

Cyborg 是一个用于管理加速器(例如 FPGA、GPU 等)的服务。为了调度需要加速器的实例,Cyborg 需要在三个层面上与 Nova 协同工作

  • 表示和发现:Cyborg 应将加速器表示为 Placement 中的资源。当发现设备时,Cyborg 会更新 Placement 中的资源清单。

  • 实例放置/调度:Cyborg 可以提供一个称重器,根据可用的加速器资源对主机进行优先级排序。

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

前两个方面在 1 中有说明。本规范涉及通过 os-acc 将加速器附加到实例。对于 FPGA,Cyborg 还需与 Glance 交互以获取位流。其中一些方面在 2 中有涵盖。本规范将涉及 Cyborg 和 Glance 在计算节点中的交互。

本规范适用于所有加速器,包括 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    |
|                                    |
+------------------------------------+

问题描述

一旦 Nova 为需要加速器的实例选择了计算节点进行放置,就需要发生以下步骤

  • 该节点上的 Nova 计算需要调用 Cyborg Agent 来处理所需的加速器。这需要通过一个库来实现,名为 os-acc,其模式基于 os-vif (Neutron) 和 os-brick (Cinder)。

  • Cyborg Agent 可以调用 Glance 以获取位流,无论是通过 ID 还是基于标签。

  • Cyborg Agent 可能需要调用 Cyborg 驱动程序来编程所述位流。

  • Cyborg Agent 需要调用 Cyborg 驱动程序来准备设备和/或获取可以附加到实例的附加句柄(例如 PCI BDF)。

  • Cyborg Agent 通过 os-acc 将足够的信息返回给 Nova 计算,以便启动实例。

需要指定这些步骤的每个步骤的行为。

此外,OpenStack Compute API 3 指定了可以对实例执行的操作。必须为这些操作中的每一个定义与加速器相关的行为。反过来,这与 Nova 计算何时调用 os-acc 相关。

用例

请参阅 1。我们打算支持具有请求时间编程的 FPGAaaS 以及 AFaaS(预编程和编排器编程场景)。

Cyborg 将在 Cyborg agent 启动时发现加速器资源。PCI 热插拔可以在 Rocky 版本之后支持。

Cyborg 必须支持 OpenStack Compute API 3 中 Rocky 版本中提到的所有实例操作,除了从快照启动和实时迁移。

提议的变更

OpenStack Server API 行为

OpenStack Compute API 3 提及了可以对实例执行的操作列表。其中一些操作将不受 Cyborg 在 Rocky 版本中的支持。受支持的操作(及其预期行为)如下

  • 当实例启动时,该实例 flavor 请求的加速器必须附加到该实例。在终止时,这些资源将被释放。

  • 当实例暂停、挂起或锁定时,加速器资源保持不变,不会从实例中分离。因此,当实例取消暂停、恢复或解锁时,无需执行任何操作。

  • 当实例被搁置时,加速器资源将被分离。在取消搁置时,预计构建操作将再次通过调度器,因此等效于实例启动。

  • 当实例被删除时,加速器资源将被分离。在恢复时,预计构建操作将再次通过调度器,因此等效于实例启动。

  • 重新启动:加速器资源保持不变。由实例软件重新发现附加的资源。

  • 重建:在替换实例镜像之前,必须使所有设备访问静默,即来自该实例的设备访问必须完成,并且必须禁止进一步的访问。此类静默的机制不在本文档的范围内。在此前提下,加速器资源在重建期间保持附加到实例。

  • 调整大小(更改 flavor):等效于终止后重新调度和重新启动。加速器资源在终止时分离,并在再次调度实例时重新附加。

  • 冷迁移:等效于终止后重新调度和重新启动。加速器资源在终止时分离,并在再次调度实例时重新附加。

  • 疏散:这是管理员强制执行的重建。由于即使没有加速器,疏散的语义也是开放的,因此 Cyborg 的行为也未定义。

  • 设置管理员密码、触发崩溃转储:这些操作受支持,并且对加速器来说不是空操作。

以下实例操作在本版本中不受支持

  • 从快照启动:快照可能是在附加的加速器处于特定状态时拍摄的。从先前的快照启动时,加速器的当前配置和状态可能与快照不匹配。因此,这不受支持。

  • 实时迁移:直到定义了将实例状态与加速器状态一起迁移的机制,否则不受支持。

os_acc 结构

Cyborg 将开发一个名为 os-acc 的新库。该库将提供稍后在本节中列出的 API。如果 Nova 计算看到请求的 flavor 引用 CUSTOM_ACCELERATOR 资源类,则 Nova 计算会调用这些 API,除了 initialize() 调用,该调用会无条件调用。

with ThreadPoolExecutor(max_workers=1) as executor:
   future = executor.submit(os_acc.<api>, *args)
   # do other stuff
   try:
      data = future.result()
   except:
      # handle exceptions

os-acc 的 API 如下

  • initialize()

    • 每天开始时调用一次。等待 Cyborg Agent 准备好接受请求,即枚举所有设备并发布特征。

    • 成功时返回 None。

    • 如果无法联系 Cyborg Agent,则抛出 CyborgAgentUnavailable 异常。

  • plug(instance_info, selected_rp, flavor_extra_specs)

    • 参数均为只读。以下是它们的描述

      • instance_info:包含实例 UUID、实例名称、项目/租户 ID 和 VM 镜像 UUID 的字典。实例名称需要用于更好的日志记录,项目/租户 ID 可能会传递给未来的加速器策略引擎,VM 镜像 UUID 可用于查询 Glance 以获取有关加速器需求的元数据,这些元数据可能存储在 VM 镜像中。

      • selected_rp:所选资源提供程序的信息作为字典传递。

      • flavor_extra_specs:flavor 中的 extra_specs 字段,包括资源类、特征和其他由 Cyborg 解释的字段。

    • 由 Nova 计算在实例启动、取消搁置或恢复以及调整大小或冷迁移时调用。

    • 在创建实例规范之前调用,即在构建实例之前。对于基于 libvirt 的虚拟机管理程序,这意味着调用发生在实例的域 XML 创建之前。

    • 作为此调用的一部分,Cyborg Agent 可以从 Glance 获取位流并启动编程。它可以获取请求的 flavor extra specs 中指定的位流(如果有)。如果请求引用功能 ID/名称,Cyborg Agent 将查询 Glance 以查找提供 flavor 并匹配所选设备的位流,然后获取所需的位流。

    • 作为此调用的一部分,Cyborg Agent 将定位与所选 RP 对应的 Deployable,定位所需的附加句柄(例如 PCI BDF),以持久的方式更新其内部数据结构,并将所需的信息返回给 Nova。

    • 返回一个数组,每个请求的加速器一个条目,每个条目都是一个字典。Rocky 的字典结构如下

    { “pci_id”: <pci bdf> }
  • unplug(instance_info)

    • 参数均为只读。以下是它们的描述

      • instance_info:包含实例 UUID 和实例名称的字典。实例名称需要用于更好的日志记录。

    • 在实例停止、搁置或删除之前以及在调整大小或冷迁移时调用。

    • 作为此调用的一部分,Cyborg Agent 将清理内部资源,调用适当的 Cyborg 驱动程序以清理设备资源并持久更新其数据结构。

    • 返回释放的加速器数量。错误可能会导致抛出异常。

工作流程

每个 os-acc API 的伪代码可以表示如下

def initialize():
  # checks that all devices are discovered and their traits published
  # waits if any discovery operation is ongoing
  return None

def plug(instance_info, rp, extra_specs):
  validate_params(....)
  glance = glanceclient.Client(...)
  driver = # select Cyborg driver for chosen rp
  rp_deployable = # get deployable for RP
  if extra_specs refers to ``CUSTOM_FPGA_<vendor>_REGION_<uuid>`` and
     extra_specs refers to ``bitstream:<uuid>``:
     bitstream = glance.images.data(image_uuid)
     driver.program(bitstream, rp_deployable,  …)
  if extra_specs refers to ``CUSTOM_FPGA_<vendor>_FUNCTION_<uuid>`` and
     extra_specs refers to function UUID/name:
     region_type_uuid = # fetch from selected RP
     bitstreams = glance.images.list(...)
     # queries Glance by function UUID/name property and region type
     # UUID to get matching bitstreams
     if len(bitstreams) > 1:
       error(...) # bitstream choice policy is outside Cyborg
     driver.program(bitstream, rp_deployable, …)
  pci_bdf = driver.allocate_handle(...)
  # update Cyborg DB with instance_info and BDF usage
  return { “pci_id”: pci bdf }

def unplug(instance_info):
  bdf_list = # fetch BDF usage from Cyborg DB for instance
  # update Cyborg DB to mark those BDFs as free
  return len(bdf_list)

备选方案

N/A

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

开发者影响

实现

负责人

工作项

  • 决定如何将 extra specs 中的多个功能/位流与 flavor 中的多个设备关联起来。

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

  • 其他:待定

依赖项

测试

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

文档影响

必须记录在各种实例操作(重新启动、暂停等)期间与加速器相关的行为。上传位流的程序,包括应用 Glance 属性,也必须记录在案。

参考资料

1(1,2)

Cyborg Nova 调度规范

2

Cyborg 位流元数据标准化规范

3(1,2,3)

OpenStack Server API 概念

历史记录

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

修订

发布名称

描述

Rocky

引入