计算节点中 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 和驱动程序所需的具体更改。
其他:待定
依赖项¶
Nova 中嵌套资源提供程序支持
测试¶
对于本版本中支持的每个供应商驱动程序,我们需要在 CI 基础设施中集成相应的 FPGA 类型。
文档影响¶
必须记录在各种实例操作(重新启动、暂停等)期间与加速器相关的行为。上传位流的程序,包括应用 Glance 属性,也必须记录在案。
参考资料¶
历史记录¶
可选部分,旨在每次更新规范时使用,以描述新的设计、API 或任何数据库模式更新。有助于让读者了解随着时间的推移发生了什么。
发布名称 |
描述 |
|---|---|
Rocky |
引入 |