设备配置

https://blueprints.launchpad.net/openstack-cyborg/+spec/device-profiles

本文档介绍了设备配置的概念,解释了为什么需要它们以及如何使用它们。

问题描述

创建或更新实例的请求可以指定各种资源,涵盖计算、网络、存储和加速器。虽然可以使用 flavor 语法(包括额外的规格)来指定所有这些资源,但这会导致两个主要问题:缺乏关注点分离和 flavor 爆炸。

将不同资源的请求分离成模块化的部分,然后将它们组合到 flavor 中是可取的。这对于网络端口绑定配置来说已经实现。希望为加速器和硬件资源提出类似的模式。

设备请求在请求的设备类型、数量和组合方面可能差异巨大。例如,一个 Web 服务器工作负载可能需要视频转码、SSL 和日志文件压缩的卸载。卸载可能涉及不同类型的设备,包括可编程硬件(GPU、FPGA 等)、固定功能硬件(QuickAssist、TPU 等)以及诸如高精度时间同步卡之类的专用硬件。如果将硬件资源的每种组合都表示为 flavor 的一部分,flavor 的数量将迅速增加。这是一个问题,因为操作员通常使用 flavor 进行使用情况和计费。

因此,我们希望将实例请求中的加速器资源规范分离到一个名为设备配置的新实体中。

用例

  • 操作员应该能够创建、发布、更新和删除设备配置。

  • 操作员应该能够将设备配置组合到 flavor 中,以便最终用户可以使用 flavor 单独请求实例。

  • 最终用户应该能够请求创建或更新实例,使用 flavor 和设备配置单独指定。

  • 操作员应该能够启用或禁用特定的设备配置。

  • 在升级时,来自一定数量过去版本的设备配置应该继续可供操作员使用。

在获得操作员反馈后,将来可能会解决更新或启用/禁用设备配置的功能。

操作员可以使用设备配置的使用情况来向最终用户计费。这不在本文档的范围之内。

提议的变更

概述

设备配置是针对一个或多个加速器的一组用户需求的命名集合。它可以被视为设备的 flavor。广义上讲,它包括两件事:所需特定资源类别的数量以及资源提供者必须满足的要求。虽然资源类别与 Placement 已知的类别相同,但有些要求对应于 Placement traits,而另一些则对应于 Cyborg 独有的属性。

设备配置格式是一个 Python 字典,其语法类似于 Nova flavor 的细粒度资源请求。这是一个例子

{
  'name': 'my_device_profile',
  'description': 'Image classification',
  'groups': [
    { 'resources:CUSTOM_ACCELERATOR_FPGA':'1',
      'trait:CUSTOM_FPGA_INTEL_ARRIA10':'required',
      'accel:function_id':'3AFB'
    },
    { 'resources:CUSTOM_ACCELERATOR_GPU':'2',
      'trait:CUSTOM_GPU_MODEL_NAME':'required',
      'accel:video_ram':'2GB'
    },
  ]
  'uuid': '8411555e-3cbf-47de-988c-b5e30bbfa035' # auto-generated
}

字段和语法在 设备配置结构 部分中进行了说明。

可以通过 Cyborg API(参见 REST API 影响 部分)和命令行(参见 Cyborg 客户端命令行 部分)查询、创建和删除设备配置。在获得操作员反馈后,将来可能会解决更新或启用/禁用它们的功能。

只有管理员可以创建、更新和删除设备配置。将来,管理员可能能够在 Horizon 中发布它们。操作员和最终用户都可以从命令行列出设备配置,并且将来可能能够在 Horizon 中查看它们。

设备配置结构

本节重点介绍了设备配置结构的要点。

每个字段使用类似于 extra specs 的格式;它指定资源、trait 或 Cyborg 特定的属性。属性使用 accel: 前缀指定,格式为 'accel:<key>':'<value>'。键和值都是字符串,可以包含字母(大小写均可)、数字、连字符和下划线。不允许其他字符。将来,可以在 accel: 前缀后引入修饰符。例如,要指示某些资源是首选的,但不是必需的,可以使用语法 'accel:preferred:resource_name':'amount'。本版本中有效的键在 有效 accel 键 部分中列出。

请求的组织方式与细粒度资源语法相同。组之间的顺序无关紧要。但是,这里不允许组策略,因为 flavor 中可能存在组策略。

与细粒度请求语法不同,操作员不需要对组进行编号。Cyborg 将进行编号。

设备配置中请求组的顺序对调度或任何系统行为没有意义。但是,Cyborg 会保留它。因此,如果客户端两次获取相同的设备配置(设备配置之间没有更改),则组的顺序将保持不变。这对于 Nova Cyborg 交互 1 非常重要。

允许使用小写字母和连字符:自定义 RC 和 traits 的名称只能包含大写字母、数字和下划线。Cyborg 将小写字母转换为大写字母,并将连字符转换为下划线。

用法

实例启动请求需要包含 flavor 和设备配置。但是,这需要更改 Nova API 中的实例创建以包含设备配置名称。为了避免这种更改,最初,操作员应将设备配置显式地折叠到 flavor 中,如下所示

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

因此,最终用户可以使用 flavor 启动请求,就像今天一样。

稍后,Nova API 将被增强为显式地接受设备配置名称,从而消除了操作员折叠的需要,并允许最终用户使用单独的 flavor 和设备配置名称启动请求。设备配置在 flavor 中的形式即使在此更改之后也将继续受支持。

在任何情况下,每个用户请求都只允许一个设备配置。

在实例创建流程中,Nova 使用设备配置名称查询 Cyborg,并获取设备配置请求组,然后将这些组与来自 flavor 和其他来源的请求组一起呈现给 Placement。无论设备配置是折叠到 flavor 中还是没有,情况都是如此。

Cyborg 客户端命令行

本节提出了设备配置的命令行语法。

openstack accelerator device profile create <name> <json>
openstack accelerator device profile delete <name>
openstack accelerator device profile list
openstack accelerator device profile show <uuid>

其他命令可以在获得操作员反馈后稍后提出。

将在未来的文档中详细说明。

版本控制和升级

用于创建/更新设备配置的 Cyborg API 的微版本也控制设备配置的版本。设备配置本身没有单独的版本字段。

一个版本中的自定义 trait 可能会在下一个版本中成为标准 trait。一个版本中的 Cyborg 特定属性可能会在下一个版本中成为自定义 trait 或标准 trait。这将使升级后设备配置失效。

必须通过在升级期间将设备配置迁移到新格式来处理此问题。

有效 accel 键

设备配置中使用的 Cyborg 特定属性采用 'accel:<key>':'<value> 的形式,如前所述。本版本中有效的键值对如下所示

Cyborg 属性

值类型

语义

bitstream_id

UUID

必须编程的 bitstream 的 Glance UUID。bitstream 的类型,这可能会影响用于编程的工具,然后假定为镜像属性。

bitstream_name

字符串

Glance 中 bitstream 的名称,包括指示 bitstream 类型的后缀。

function_id

UUID

所需功能的 UUID。

function_name

字符串

所需功能的名称。

attach_target

字符串枚举:‘VM’、‘host’ 或 ‘none’

指示加速器是否应附加到 VM(默认)、主机(基础设施卸载用例)或不附加到任何内容(间接访问用例)。请参阅“用例”和 1 中的“间接加速器访问”。

备选方案

可以通过将元数据添加到实例镜像来部分解决 flavor 爆炸问题,该元数据表达了该镜像正常或良好工作所需的硬件资源。但是,这并不是一个完整的解决方案。

数据模型影响

需要在 Cyborg 数据库中持久化设备配置。由于设备配置可能会被重命名,因此每个设备配置都应该有一个 UUID。

REST API 影响

URL: /v2/device_profiles
METHOD: GET
Query Parameters: name=name1,name2,...
Normal response code and body:
   200
   { 'device_profiles': [ <dev-prof>, ... ] }
Error response code and body:
   401 (Unauthorized): RBAC check failed
   422 (Unprocessable): No device profiles exist
   No response body
Note:
   List all device profiles or the set of named device profiles.

URL: /v2/device_profiles/{uuid}
METHOD: GET
Query Parameters: None
Normal response code and body:
   200
   { 'device_profile': <dev-prof> }
Error response code and body:
   401 (Unauthorized): RBAC check failed
   422 (Unprocessable): No device profile of that UUID exists
   No response body
Note:
   Get the device profile with the specified uuid.

URL: /v2/device_profiles
METHOD: POST
Request body: A device profile
   [
       { 'name': <string>,
         'description': <string> # optional
         'groups': [
              {
                  "accel:function_id": "3AFB",
                  "resources:CUSTOM_ACCELERATOR_FPGA": "1",
                  "trait:CUSTOM_FPGA_INTEL_PAC_ARRIA10": "required"
          }
          ],
       },
   ]
Normal response code and body:
   204 (No content)
   No response body
Error response code and body:
   401 (Unauthorized): RBAC check failed
   422 (Unprocessable): Bad input or name is not unique
   { 'error': <error-string> }
Note:
   Create one or more new device profiles. May implement just one in Train.

URL: /v2/device_profiles?name=string1,...,stringN
METHOD: DELETE
Query Parameters: required
Normal response code and body:
   204 (No content)
   No response body
Error response code and body:
   401 (Unauthorized): RBAC check failed
   422 (Unprocessable): Bad input
   { 'error': <error-string> }
Note:
   Delete one or more existing device profiles.

在支持设备配置更新之前,不需要 PUT 或 PATCH。

安全影响

这里提出的 API 和命令接受并解析用户提供的数据。为了减轻风险,应采取以下措施

  • 只有管理员可以创建、更新或删除设备配置。最终用户只能列出它们或可能在 Horizon 中查看它们。

  • 设备配置名称和字段限制为字母(大小写均可)、数字、下划线、连字符以及字符 ‘:’ 和 ‘=’。

设备配置默认情况下对所有租户可见。将来,我们可能会提供仅对某些租户可见的设备配置。

通知影响

其他最终用户影响

最终用户可以使用 python-cyborgclient 列出设备配置。将来,她可能能够在 Horizon 中查看它们。

性能影响

其他部署者影响

将来可能会添加启用或禁用设备配置的旋钮。

开发者影响

版本控制和升级 中所述,如果资源类或 traits 的名称发生更改,请提供设备配置的升级脚本。

实现

负责人

待定

工作项

  • 在 Cyborg 数据库中创建设备配置表。

  • 在 API 服务器和 conductor 中实现 REST API,并进行验证和单元测试。

  • 实现 python-cyborgclient CLI。

依赖项

测试

需要编写单元测试和功能测试。

文档影响

应在用户文档和操作员文档中解释设备配置。

参考资料

1(1,2)

Nova Cyborg 交互规范

历史记录

修订

发布名称

描述

Stein

引入

Train

更新