图规范
图规范是一种以模块化和可扩展的方式描述高性能 AI 应用程序的格式。它允许以标准格式编写应用程序,并在多个应用程序之间共享组件,而无需修改代码。图规范基于实体-组件模式。图中的每个对象都用实体(也称为节点)和组件表示。您可以实现自定义组件,这些组件可以添加到实体以实现所需的功能。
图包含遵循实体-组件设计模式的节点,该模式实现了“组合优于继承”范例。节点本身只是一个轻量级对象,它拥有组件。组件定义了节点如何与应用程序的其余部分交互。例如,节点可以连接以在彼此之间传递数据。一个特殊的组件,称为计算组件,用于根据某些规则执行代码。通常,计算组件会接收数据、执行一些计算并发布数据。
图
图是 AI 应用程序的数据驱动表示。通过使用编程代码创建和链接对象来实现应用程序会导致程序变得庞大且难以维护。相反,图对象用于构建应用程序。可以使用专用工具创建图,并且可以对其进行分析以识别潜在问题或性能瓶颈。图由图运行时加载以执行。
图的功能块由图拥有的节点集定义。可以使用某些查询函数通过图查询节点。例如,可以按名称搜索节点。
子图
子图是一个带有附加节点用于接口的图。它指向可以从该图外部访问的组件。为了在现有图或子图中使用子图,您需要创建一个实体,其中包含类型为 nvidia::gxf::Subgraph
的组件。在 Subgraph 组件内部,可以从 yaml
文件加载相应的子图,该文件由 location 属性指示,并在父图中实例化。
当子图加载到父图时,系统使接口中的组件可用于父图。它允许用户在父图中链接具有已定义接口的子图。
子图接口可以定义如下
---
interfaces:
- name: iname # the name of the interface for the access from the parent graph
target: n_entity/n_component # the true component in the subgraph that is represented by the interface
节点
图规范对节点使用实体-组件设计原则。这意味着节点是一个轻量级对象,其主要目的是拥有组件。节点是组件的组合。每个组件都恰好在一个节点中。为了自定义节点,您不从节点作为基类派生,而是从组件中组合对象。组件可用于为节点以及应用程序提供丰富的功能集。
组件
组件是应用程序的主要功能块。图运行时提供了一些组件,这些组件实现了属性、代码执行、规则和消息传递等功能。它还允许您通过注入具有自定义功能的自定义组件来扩展运行时,以适应特定的用例。
最常见的组件是 codelet 或计算组件,它用于数据处理和代码执行。要实现自定义 codelet,您需要实现一组特定的函数,例如 start 和 stop。scheduler – 特殊系统 – 将在指定时间调用这些函数。触发代码执行的典型示例包括:从另一个节点接收新消息,或根据时间触发器按计划执行工作。
边
节点可以通过边连接从其他节点接收数据。这项基本功能使图能够表示计算管道或复杂的 AI 应用程序。节点的输入称为接收器,而输出称为源。可以有零个、一个或多个输入和输出。一个源可以连接到多个接收器,一个接收器可以连接到多个源。
扩展
扩展是组件类型定义及其实现以及组件执行所需的任何其他资产文件的逻辑组的编译共享库。资产文件的一些示例是模型文件、扩展库链接到的共享库(因此运行所需)、支持开发附加组件的头文件和开发文件,以及使用扩展中组件的扩展。
扩展库是运行时可加载模块,其中编译了标准格式的组件信息,允许图运行时加载扩展并从中检索更多信息,以便
允许运行时使用扩展中的组件类型创建组件。
查询有关扩展中组件类型的信息
组件类型名称
组件的基类型
组件的字符串描述
组件参数的信息 – 参数名称、类型、描述等。
查询有关扩展本身的信息 – 扩展的名称、版本、许可证、作者以及扩展的字符串描述。
章节 :doc: GraphComposer_Dev_Workflow 更详细地讨论了这一点,重点是开发扩展和组件。
图文件存储实体列表。每个实体都有唯一的名称和组件列表。每个组件都有名称、类型和属性。属性以键值对的形式存储。
%YAML 1.2
---
name: source
components:
- name: signal
type: sample::test::ping
- type: nvidia::gxf::CountSchedulingTerm
parameters:
count: 10
---
components:
- type: nvidia::gxf::GreedyScheduler
parameters:
realtime: false
max_duration_ms: 1000000