Nova - Cyborg 交互

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

本文档描述了 Nova 与 Cyborg 交互以创建和管理具有加速器的实例所需的内容,以及为实现这一目标 Nova 需要进行的更改。

问题描述

范围

Nova 和 Cyborg 需要在许多方面进行交互,以处理具有加速器的实例。虽然本文档涵盖了所有方面,但其他文档中会详细介绍特定领域。我们将在下面列出所有领域,确定其他文档涵盖的具体部分,并描述本文档涵盖的内容。

  • 表示:Cyborg 应将设备表示为计算节点下的嵌套资源提供者(分散服务器除外),加速器类型表示为资源类,加速器表示为 Placement 中的库存。调度所需的属性表示为特征。这在 [1] 中有说明。本规范不深入探讨此主题。

  • 发现和更新:在主机中发现的设备中,Cyborg 打算仅声明未包含在 PCI 白名单机制中的设备。Cyborg 应以与 virt 驱动程序更新 Placement 兼容的方式更新 Placement。这些方面分别在 与 PCI 白名单共存Placement 更新 部分中介绍。

  • 用户加速器请求:用户通常通过配置请求计算资源。但是,由于设备请求可能变化很大,将它们放在配置中可能会导致配置爆炸。我们通过在设备配置文件 [2] 中表达设备请求来避免这种情况。设备配置文件与配置之间的关系在第 用户请求 节中探讨。

    当发出实例创建(启动)请求时,设备配置文件的内容应转换为请求规范中的请求组;请求组中的语法在第 更新请求规范 节中介绍。

  • 实例调度:Nova 应使用 Cyborg 填充的 Placement 数据来调度实例。本文档不会深入探讨此主题。

  • 加速器分配:我们在第 加速器请求 节中引入了加速器请求对象的概念。创建和使用它们的流程在第 Nova 分配流程变更 节中进行了总结。同一节还重点介绍了 Nova 所需的变更。Cyborg 规范 ([3]) 涵盖了此流程的 Cyborg API 实现细节。

  • 实例操作:关于所有标准实例操作的加速器行为在 [4] 中定义。本规范不深入探讨此主题。

用例

  • 用户请求将一个或多个不同类型的加速器分配给实例。

  • 操作员可以在同一集群中向用户提供设备即服务或加速函数即服务 ([1])。

以下用例在 Train 中未解决,但具有长期兴趣

  • 用户请求将一个或多个加速器添加到现有实例。

  • 具有加速器的实时迁移。

提议的变更

与 PCI 白名单共存

操作员通过配置 PCI 白名单机制告诉 Nova 要声明和使用的 PCI 设备。此外,操作员在计算节点中安装 Cyborg 驱动程序并配置/启用它们。这些驱动程序然后可以发现并报告一些 PCI 设备。操作员必须确保这两种配置兼容。

理想情况下,操作员应该有一种方法来识别 Nova 和 Cyborg 应该声明哪些 PCI 设备。这可能类似于 [5][6] 中建议的方法。如果所有利益相关者可以就这种机制达成一致,Cyborg 可以采用它。

在此之前,操作员通过使用 Cyborg 的配置文件来告诉 Cyborg 声明哪些设备。操作员必须确保这与 Nova 中配置的 PCI 白名单兼容。

Placement 更新

Cyborg 应直接调用 Placement API 来表示设备和加速器。API 调用的一些预期用例是

  • 在计算节点 RP 下创建或删除子 RP。

  • 创建或删除自定义 RC 和自定义特征。

  • 将特征与 RP 关联或删除此类关联。

  • 更新 RP 库存。

Cyborg 不应修改由其他组件(例如 Nova virt 驱动程序)创建的 RP。

用户请求

用户加速器请求封装在设备配置文件 [2] 中,该配置文件由管理员通过 Cyborg API 创建和管理。

设备配置文件可以看作是“设备的 flavor”。因此,实例请求应同时包含 flavor 和设备配置文件。但是,这需要更改 Nova 的实例创建 API。为了减轻此类更改对用户和操作员的影响,我们建议分阶段进行此操作。

在初始阶段,Nova API 保持不变。设备配置文件作为额外的规范折叠到 flavor 中,如下所示

openstack flavor set --property 'accel:device_profile=<profile_name>' flavor

因此,可以使用标准的 Nova API 创建仅包含 flavor(不含设备配置文件)的实例,如下所示

openstack server create --flavor f ....  # instance creation

在未来,设备配置文件可以单独使用来指定实例创建 API 的加速器资源。

更新请求规范

当用户提交创建实例的请求时,如第 用户请求 节所述,Nova 需要调用 Cyborg API,以获取设备配置文件中的资源请求组,并将它们合并到请求规范中。(这类似于为 Neutron 提出的方案 [7]。)

此调用,就像 Nova 将对 Cyborg API 进行的所有其他调用一样,是通过基于 Keystone 的适配器完成的,该适配器将定位 Cyborg 服务,类似于 Nova 调用 Placement 的方式。将添加一个新的 Cyborg 客户端模块到 Nova,以封装此类调用并提供 Cyborg 特定的功能。

Glance 中的 VM 镜像可能与镜像属性(不包括镜像特征)相关联,例如该镜像所需的位流/功能 ID。因此,Nova 应将 VM 镜像 UUID 从请求规范传递给 Cyborg。这还有待确定。

设备配置文件中的组由 Cyborg 编号。合并到请求规范中的请求组由 Nova 编号。这些编号通常不相同,即,第 N 个设备配置文件组可能不对应于请求规范中的第 N 个请求组。

当将设备配置文件请求组添加到 flavor 中的其他请求组时,flavor 的 group_policy 应控制所有请求组的总体语义。

加速器请求

加速器请求 (ARQ) 是一个对象,代表将加速器分配给实例的请求的状态。ARQ 的创建和管理由 Cyborg 处理,ARQ 存储在 Cyborg 数据库中。

ARQ 按照定义,代表对单个加速器的请求。用户请求中的设备配置文件可能具有 N 个请求组,每个请求组请求 M 个加速器;那么,对于该设备配置文件将创建 N * M 个 ARQ。

当 Cyborg 创建 ARQ 时,它尚未与特定的主机名或设备资源提供者关联。因此,它处于未绑定状态。随后,Nova 调用 Cyborg 将 ARQ 绑定到主机名、设备 RP UUID 和实例 UUID。如果实例启动失败,Nova 将在不删除它的情况下解绑 ARQ。在实例终止时,Nova 将在解绑它们后删除 ARQ。

每个 ARQ 需要在 ARQ 绑定之前与 Nova 选择的分配候选中的特定 RP 匹配。由于 Placement 不会将 RP 匹配到请求组,因此必须在 Nova 的 Cyborg 客户端模块中完成此操作 (cyborg-client-module)。匹配是使用 RequestGroup 对象中的 requester_id 字段 ([8]) 以如下方式完成的

  • 设备配置文件中的组的顺序不重要,但由 Cyborg 保持。因此,每个设备配置文件请求组都有一个唯一的索引。

  • 当将 Cyborg 返回的设备配置文件请求组添加到请求规范时,requester_id 字段设置为 ‘device_profile_’,其中 N 是第 N 个设备配置文件请求组(从零开始)。设备配置文件名称不需要包含在此处,因为每个请求规范只有一个设备配置文件。

  • 当 Cyborg 为设备配置文件创建 ARQ 时,它会在将 ARQ 返回给 Nova 之前将设备配置文件请求组索引嵌入到 ARQ 中。

  • 匹配分两个步骤完成

    • 每个 ARQ 都使用 requester_id 字段映射到请求规范中的特定请求组。

    • 每个请求组都使用与 Neutron 带宽提供程序相同的逻辑映射到特定的 RP ([9])。

Nova 分配流程变更

本节总结了第 1 阶段的工作流程细节。所需的 Nova 更改标有 NEW。

NEW:添加了一个 Cyborg 客户端模块到 nova (cyborg-client-module)。所有 Cyborg API 调用都通过它路由。

  1. Nova API 服务器接收带有包含设备配置文件名称的 flavor 的 POST /servers API 请求。

  2. NEW:Nova API 服务器调用 Cyborg API GET /v2/device_profiles?name=$device_profile_name 并获取设备配置文件请求组。这些被添加到请求规范中。

  3. Nova 调度程序调用 Placement 并获取分配候选列表。它选择其中一个候选对象并在 Placement 中进行声明。然后,Nova conductor 向 Nova compute manager 发送 RPC 消息 build_and_run_instances

  4. NEW:Nova 调用 Cyborg API POST /v2/accelerator_requests 并提供设备配置文件名称。Cyborg 为该设备配置文件创建一组未绑定的 ARQ,并将它们返回给 Nova。(调用可能来自 Nova conductor 或 compute manager;将在代码审查中确定。)

  5. NEW:Nova 中的 Cyborg 客户端将每个 ARQ 匹配到为该加速器选择的资源提供者。请参阅 match-rp

  6. NEW:Nova compute manager 调用 Cyborg API PATCH /v2/accelerator_requests 将 ARQ 与主机名、设备的 RP UUID 和实例 UUID 绑定。这是一个异步调用,它会在后台准备或重新配置设备。

  7. NEW:Cyborg 在完成绑定(成功或失败)后,调用 Nova 的 POST /os-server-external-events API,并提供

    {
       "events": [
          { "name": "arq_resolved",
            "tag": $arq_uuid,
            "server_uuid": $instane_uuid,
            "status": "ok" # or "failed"
          },
          ...
       ]
    }
    
  8. NEW:Nova virt 驱动程序等待第 其他部署者影响 节中提到的超时时间。然后,它调用 Cyborg REST API GET /v2/accelerator_requests?instance=<uuid>&bind_state=resolved

  9. NEW:Nova virt 驱动程序使用从 Cyborg 调用返回的附加句柄将 PCI 直通设备组合到 VM 的定义中。

  10. NEW:如果在绑定启动后发生任何错误,Nova 必须通过调用 Cyborg API 解绑相关的 ARQ。然后,它可以尝试在另一个主机上或删除实例的(未绑定的)ARQ。

此流程由以下序列图捕获,其中 Nova conductor 和 scheduler 组合表示为 Nova 控制器。ARQ 创建仅在 Nova compute manager 中显示,以供参考;它可能在控制器中。

../../../_images/nova-cyborg-interaction.svg

备选方案

有可能让外部代理通过调用 Cyborg 从设备配置文件创建 ARQ,然后将这些预创建的 ARQ 馈送到 Nova 实例创建 API,类似于 Neutron 端口。我们目前不采用这种方法,因为它需要更改 Nova 实例创建 API。

有可能让 Nova virt 驱动程序轮询 Cyborg ARQ 绑定完成情况。这不是首选方法,部分原因是它不是与其他服务(如 Neutron)交互的模式。

数据模型影响

REST API 影响

无。向配置中添加了一个新的 extra_spec 键 accel:device_profile_name

安全影响

通知影响

Nova 可能会选择为 Cyborg API 调用添加额外的通知。

其他最终用户影响

性能影响

对 Cyborg REST API 的额外调用可能会影响 Nova conductor/scheduler 的吞吐量。通过将一些关键的 Cyborg 操作作为异步任务来缓解了这种情况。

其他部署者影响

部署者需要设置 clouds.yaml 文件,以便 Nova 可以调用 Cyborg REST API。

部署者需要在 nova-cpu.conf 中配置一个新的可调参数

* arq_binding_timeout (integer): Time in seconds for Nova compute
  manager to wait for Cyborg to notify that ARQ binding is done.
  Timeout is fatal, i.e., VM startup is aborted with an exception.
  Default: 300.

开发人员影响

定义两个新的标准资源类:FPGA 和 PGPU。

我们已经定义了 VGPU 和 VGPU_DISPLAY_HEAD RC。但我们建议使用 PGPU 作为不同的 RC,原因如下

  • VGPU 和 VGPU_DISPLAY_HEAD RC 具体指的是虚拟 GPU。我们需要一个不同的 RC 用于物理 GPU。

  • 它将受到 Keystone 中单独的配额/限制。

  • 使用 PCI_DEVICE RC 太通用:我们想要针对 GPU RC 的特定配额。

升级影响

实现

负责人

Sundar Nadathur

工作项

请参阅第 Nova 分配工作流程的更改 节中标记为 NEW 的步骤。

依赖项

  • 设备配置文件规范 [2]

  • Cyborg API 规范 [10]

测试

需要对 Nova 更改进行单元测试和功能测试。具体来说,需要一个模拟 Cyborg API 调用的功能测试工具。

需要针对端到端流程(包括故障模式)进行 tempest 测试。tempest 测试应针对假驱动程序(除了任何真实硬件)进行,并与 Nova Zuul 网关关联。

文档影响

[2] 中所述,需要在 Cyborg 中记录设备配置文件的创建。

需要记录操作员将设备配置文件折叠到 flavor 中的需求。

参考资料

历史

修订

发布名称

描述

Train

引入