扩展开发工作流程#
图谱编辑器工具可用于使用 GXF 标准或公共扩展创建应用程序。然而,通常也可能需要根据特定需求开发自定义代码小组件。此工作流程适用于自定义扩展开发人员。它允许开发人员通过图谱实现新功能并将业务逻辑添加到应用程序。
开发扩展和应用程序图谱有两种选择
原生工作站
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 时,用户在文件浏览器中浏览“/”文件夹时可能会遇到问题,在这种情况下,他们可以直接键入文件路径或复制并粘贴它。

同步扩展#
在构建任何扩展或创建图谱之前,必须同步 NGC 公共仓库中的扩展。请按照以下步骤同步扩展
使用命令行#
使用以下命令从 NVIDIA 云存储库同步已发布的扩展
registry repo sync -n ngc-public
使用以下命令检查扩展
registry extn list
registry comp list
有关更多命令,请参阅注册表命令行界面。
使用 Composer UI#
从顶部菜单栏打开 Registry
菜单,然后单击 Sync Repo

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

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

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

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

开发新扩展#
使用命令行#
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
。

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

接下来,键入要为其生成相应扩展的 GStreamer 元素的逗号分隔列表。使用文件浏览器选择输出目录。
首先单击 Generate
以在选定目录中生成扩展源代码,然后单击 Build
以构建和注册扩展。进度将通过控制台窗口中的日志报告。

注意
如果由于来自 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中演示的方式保存和执行图谱