扩展开发工作流程#

图谱编辑器工具可用于使用 GXF 标准或公共扩展创建应用程序。然而,通常也可能需要根据特定需求开发自定义代码小组件。此工作流程适用于自定义扩展开发人员。它允许开发人员通过图谱实现新功能并将业务逻辑添加到应用程序。

Graph Composer Development Workflow

开发扩展和应用程序图谱有两种选择

  1. 原生工作站

  2. DeepStream SDK devel 容器镜像

在原生工作站上开发时,请安装扩展生成和构建的先决条件

/opt/nvidia/graph-composer/extension-dev/install_dependencies.sh

sudo apt-get update && sudo apt-get -y install libtool autoconf gtk-doc-tools

使用 DeepStreamSDK 开发容器镜像。该镜像已安装所有依赖项

docker pull nvcr.io/nvidia/deepstream:7.1-gc-triton-devel
xhost +
docker run -it --entrypoint /bin/bash --gpus all --rm --network=host -e DISPLAY=${DISPLAY} -v /tmp/.X11-unix/:/tmp/.X11-unix --privileged -v /var/run/docker.sock:/var/run/docker.sock nvcr.io/nvidia/deepstream:7.1-gc-triton-devel

在这两种情况下,都可以使用命令行或 Composer UI。要启动 Composer,请运行

composer

注意

从 devel 容器镜像中使用 Composer 时,用户在文件浏览器中浏览“/”文件夹时可能会遇到问题,在这种情况下,他们可以直接键入文件路径或复制并粘贴它。

Graph Composer Default Window

同步扩展#

在构建任何扩展或创建图谱之前,必须同步 NGC 公共仓库中的扩展。请按照以下步骤同步扩展

使用命令行#

使用以下命令从 NVIDIA 云存储库同步已发布的扩展

registry repo sync -n ngc-public

使用以下命令检查扩展

registry extn list
registry comp list

有关更多命令,请参阅注册表命令行界面

使用 Composer UI#

从顶部菜单栏打开 Registry 菜单,然后单击 Sync Repo

Graph Composer Registry Menu

从下拉列表中选择 ngc-public,然后单击 Sync

Graph Composer Select Repo

Composer 将使用进度条报告当前状态

Graph Composer Sync Progress

扩展同步完成后,composer 将显示一条成功消息。

Graph Composer Sync Success

单击关闭后,composer 将自动刷新组件列表,刷新后的列表可以在右侧的组件列表窗口中看到

Graph Composer Default View

开发新扩展#

使用命令行#

GXF 示例扩展#

Graph Composer 包提供了一个有用的工具来帮助创建新的扩展和组件。位于 /opt/nvidia/graph-composer/extension-dev/ 的 extension-dev 项目有助于创建创建自定义扩展所需的样板代码。查看 LICENSE.txt 以获取相应的许可证。

脚本已提供,用于生成带有代码小组件和图谱的示例扩展,以在应用程序中测试该扩展。生成的扩展包含一个代码小组件组件,该组件在 start() 和 tick() 方法中记录一条消息一次,并且图谱完成执行。要使用该脚本,请运行以下命令。

生成名为 test 的 示例 扩展,其中代码小组件名为 HelloWorld

$ python3 /opt/nvidia/graph-composer/extension-dev/generate_codelet.py \
      --output_dir /tmp/  --extn_name test --codelet_name HelloWorld
$ cd /tmp/test

在目标目录中,将自动生成以下文件:代码小组件(组件)、扩展和应用程序。生成使用 bazel 构建系统生成扩展库所需的 BUILD 文件也会生成。

 1.
 2|____WORKSPACE
 3|____.bazelrc
 4|____apps
 5| |____app.yaml
 6|____extensions
 7| |____test
 8| | |____BUILD
 9| | |____HelloWorld.hpp
10| | |____test.cpp
11| | |____HelloWorld.cpp

头文件 - hello_world.hpp

#pragma once

#include "gxf/std/codelet.hpp"

namespace sample {
namespace test {

// Logs a message in start() and tick()
class HelloWorld : public nvidia::gxf::Codelet {
 public:
  gxf_result_t start() override;
  gxf_result_t tick() override;
  gxf_result_t stop() override { return GXF_SUCCESS; }
};

}  // namespace test
}  // namespace sample

cpp 文件 - hello_world.cpp

#include "HelloWorld.hpp"  // NOLINT

namespace sample {
namespace test {

gxf_result_t HelloWorld::start() {

  GXF_LOG_INFO("HelloWorld::start");
  return GXF_SUCCESS;
}

gxf_result_t HelloWorld::tick() {
  GXF_LOG_INFO("HelloWorld::tick");
  return GXF_SUCCESS;
}

}  // namespace test
}  // namespace sample

扩展 cpp 文件 - test.cpp

#include "HelloWorld.hpp"

#include "gxf/std/extension_factory_helper.hpp"

GXF_EXT_FACTORY_BEGIN()
GXF_EXT_FACTORY_SET_INFO(0xd8629d822909316d, 0xa9ee7410c8c1a7b6, "test",
                       "A Dummy Example", "", "1.0.0", "NVIDIA");
GXF_EXT_FACTORY_ADD(0xd39d70014cab3ecf, 0xb397c9d200cf9e8d, sample::test::HelloWorld,
                  nvidia::gxf::Codelet, "Dummy example source codelet.");
GXF_EXT_FACTORY_END()

为 x86(默认)和 aarch64 (jetson) 平台构建扩展。该工具还生成一个 workspace 文件,该文件创建一个 bazel 工作区来编译和执行扩展。它还包括一个用于将扩展注册到本地工作区的目标。然后,可以从 Composer 使用该扩展来创建图谱,或者由容器构建器来部署图谱。

` $ cd <extension_path> $ bazel build ...                        # 用于构建 x86 变体 $ bazel build ... --config=jetson        # 用于构建 jetson(aarch64) 变体 `

GXF 示例应用#

该工具还生成一个示例应用程序,该应用程序执行 HelloWorld 代码小组件 10 次并退出。

应用 yaml 文件 - apps/app.yaml

%YAML 1.2
---
dependencies:
- extension: test
  uuid: d8629d82-2909-316d-a9ee-7410c8c1a7b6
  version: 1.0.0
---
name: source
components:
- name: signal
  type: sample::test::HelloWorld
- type: nvidia::gxf::CountSchedulingTerm
  parameters:
    count: 10
---
components:
- type: nvidia::gxf::GreedyScheduler
  parameters:
    realtime: false
    max_duration_ms: 1000000

实体在 yaml 文件中定义。每个实体将有一个或多个与之关联的组件。yaml 文件中定义的任何实体都需要由调度器调度。该示例使用了贪婪调度器。所有调度器都与时钟相关联,并且选择了 RealtimeClock。

运行示例应用#

Graph Composer 包提供了执行应用程序的工具。位于 /opt/nvidia/graph-composer/execute_graph.sh 的 execute_graph.sh 脚本有助于使用注册表安装图谱,然后执行它。

$ /opt/nvidia/graph-composer/execute_graph.sh --help
$ /opt/nvidia/graph-composer/execute_graph.sh -d /opt/nvidia/graph-composer/config/target_x86_64.yaml apps/app.yaml

这将打印测试组件生成的以下日志以及其他日志

1 INFO  extensions/test/HelloWorld.cpp@9: HelloWorld::start
2 INFO  extensions/test/HelloWorld.cpp@14: HelloWorld::tick

将 tick() 和 start() 中的实现替换为自定义实现。

为 GstElement 的 GXF 封装器生成扩展#

这需要安装 DeepStream 7.1 SDK 和参考图谱包,或者使用 DeepStream 7.1 devel 容器镜像。

  • 创建一个文本文件,其中包含要为其生成扩展的 GStreamer 元素列表,每行一个元素名称。列出的元素必须安装在系统上。以下是一个示例

    timeoverlay
    filesrc
    filesink
    
  • 要列出系统上安装的所有 GStreamer 元素,请运行

    gst-inspect-1.0
    
  • 接下来,要生成扩展源代码,请运行

    python3 /opt/nvidia/deepstream/deepstream/tools/graph_extension_generator/generate_extensions.py <element_list.txt> <output-directory>
    
  • 导航到输出目录

    cd <output-directory>
    
  • 运行以下命令以构建和注册 x86_64 的扩展

    bazel build ...
    
  • 运行以下命令以构建和注册 Jetson 的扩展

    bazel build ... --config=jetson
    

注意

如果由于来自 freedesktop gitlab 仓库的 git 克隆错误(错误类似于 fatal: unable to access 'https://gitlab.freedesktop.org/gstreamer/common.git/': server certificate verification failed. CAfile: none CRLfile: none)而导致扩展构建失败,请在运行 bazel build 命令之前,通过运行 export GIT_SSL_NO_VERIFY=true 暂时禁用 git SSL 验证

使用 Composer UI#

Composer UI 当前仅支持生成基于 DeepStream (GStreamer) 的扩展。

注意

如果未安装 Deepstream SDK 包,则“生成扩展”按钮将被禁用。

要开始,请从顶部菜单栏打开 Tools 菜单,然后选择 Generate Extension

Graph Composer Tools Menu

这将启动 Extension Generator 对话框。扩展生成器需要安装一些依赖项。这可以通过单击 Install Dependencies 按钮来完成。这只需要在一台机器上完成一次。从 DeepStreamSDK 开发 docker 运行时,由于依赖项已预先安装,因此不需要这样做。

Graph Composer Extension Generator Dialog - Install Dependencies

接下来,键入要为其生成相应扩展的 GStreamer 元素的逗号分隔列表。使用文件浏览器选择输出目录。

首先单击 Generate 以在选定目录中生成扩展源代码,然后单击 Build 以构建和注册扩展。进度将通过控制台窗口中的日志报告。

Graph Composer Extension Generator Dialog

注意

如果由于来自 freedesktop gitlab 仓库的 git 克隆错误(错误类似于 fatal: unable to access 'https://gitlab.freedesktop.org/gstreamer/common.git/': server certificate verification failed. CAfile: none CRLfile: none)而导致扩展构建失败,请暂时禁用 git SSL 验证

  • 关闭 composer,然后在同一 shell 会话中启动 composer 之前 export GIT_SSL_NO_VERIFY=true

  • git config --global http.sslVerify false 以在机器范围内禁用 git SSL 验证,然后重试 Build。这不需要重新启动 composer。要重新启用,请运行 git config --global http.sslVerify true

扩展构建完成后,新添加的扩展将出现在组件列表中

创建和测试图谱#

将新创建的组件从组件列表拖放到图谱窗口,并链接到其他组件以创建完整的应用程序。

Graph Composer Development Workflow Graph Creation

按照Graph Composer中演示的方式保存和执行图谱