Skip to main content
qtimlqnn 仅在 qcom-multimedia-proprietary-image 中可用
有关 QLI 镜像的更多信息,请参阅 Qualcomm Linux 发行版

概述

qtimlqnn 是一个 GStreamer 推理元素,使用 Qualcomm AI Engine Direct(QNN)运行时执行神经网络模型。该元素完全以张量模式运行:它在 sink pad 上接收输入张量,并根据模型声明的输入和输出规范在 source pad 上生成输出张量。 qtimlqnn 设计用于运行为 QNN 运行时准备的模型,通常为 **QNN 上下文二进制文件(context binary)**形式。要使用此元素,必须先使用 Qualcomm AI Runtime(QAIRT)SDK 将模型导出为与 QNN 兼容的格式。更多详细信息,请参阅 QAIRT 文档 该元素仅限于模型执行。它不执行预处理、张量重塑、批处理、布局转换或特定于模型的后处理。这些功能应由流水线中的相邻元素处理。 qtimlqnn 支持多种 QNN 执行后端,包括 CPUGPUNPU 目标。这使得相同的流水线结构可以部署到不同的硬件配置,并针对不同的性能、延迟和功耗需求进行调优。该元素面向实时和嵌入式 AI 流水线,其中推理是更大的模块化处理流程中的一个阶段。

主要职责

qtimlqnn 负责:
  • 加载并执行 QNN 模型构件,例如模型库(.so)或缓存的二进制文件(.bin
  • 接收来自上游元素的预格式化输入张量
  • 生成与模型输出签名匹配的输出张量
  • 与相邻流水线元素协商张量数据类型和维度
  • 传播下游元素所需的张量元数据
  • 通过 GstMLBufferPool 管理 DMA 后备缓冲区,以减少不必要的内存复制
在实际使用中,qtimlqnn 充当流水线中的推理阶段,而张量准备和结果解释则由外部处理。

示例流水线

1

下载所需文件

2

将文件复制到设备

3

连接到设备

4

设置环境变量

在设备上运行以下命令
5

运行流水线

层次结构

GObject
   GstObject
      GstElement
         GstBaseTransform
            qtimlqnn

Pad 模板

sink

src

元素属性

输入与输出行为

输入张量

qtimlqnn 暴露单个 sink pad,但同时支持单输入和多输入模型。对于多输入模型,所有所需张量以张量集的形式通过同一个 sink pad 传递。 输入张量必须在到达 qtimlqnn 之前完全准备好。预期的张量布局、形状、数据类型和批量大小由以下因素决定:
  • QNN 模型输入签名
  • 与上游元素的 caps 协商
典型的上游元素包括:
  • qtimlvconverter — 用于缩放、颜色转换、归一化和量化(如需要)
qtimlqnn 不会修改、重塑、批处理或重新解释传入的张量。它按接收到的原样将其传递给 QNN 运行时。

输出张量

qtimlqnn 暴露单个 source pad,并生成符合模型声明的输出签名的输出张量。完全支持具有多个输出张量的模型,所有输出会在 source pad 上一起发出。 支持的输出行为包括:
  • 单张量和多张量输出
  • 任意张量形状和秩,包括批量维度和深度维度
  • 量化和浮点张量类型
  • 使用 tensors 属性选择性地发出输出张量
生成的输出张量供下游后处理阶段使用,后者负责解码特定于模型的结果,例如分类输出、检测结果、分割掩码、关键点数据以及其他结构化推理输出。

支持的数据类型

qtimlqnn 支持 QNN 运行时和所选执行后端提供的张量数据类型,具体取决于与相邻元素的 caps 协商。 支持的数据类型包括:
  • INT8
  • UINT8
  • INT16
  • UINT16
  • INT32
  • UINT32
  • FLOAT16
  • FLOAT32
除了运行时、所选后端以及协商的流水线 caps 所要求的限制之外,该元素不会施加额外的数据类型限制。

后端

QNN 后端定义了运行模型所使用的硬件目标。后端使 qtimlqnn 能够将推理从默认的 CPU 解释器卸载到经过优化的硬件加速器。通过 backend 属性选择后端,它控制 QNN 运行时在推理期间如何分派模型操作。

NPU — libQnnHtp.so

在 AI 加速器(NPU)上运行模型。
  • 后端:Qualcomm AI 加速器 / NPU
  • 使用场景:如果可用则为首选后端。对量化模型具有最佳的性能和能效。
  • 附加配置:设置 backend=libQnnHtp.so;对于多设备平台,可选设置 backend-device-id

GPU — libQnnGpu.so

通过 QNN GPU 后端运行受支持的操作。
  • 后端:GPU
  • 使用场景:浮点模型以及受益于 GPU 并行性的工作负载。
  • 附加配置:设置 backend=/usr/lib/libQnnGpu.so

CPU — libQnnCpu.so

在默认的 QNN CPU 后端上运行模型。
  • 后端:CPU
  • 使用场景:参考执行、调试、启动验证(bring-up)或没有硬件加速的系统。
  • 附加配置:无需

运行时内存行为与 GAP 处理

QNN 内存模型

qtimlqnn 在 QNN 运行时的内存模型内运行。该元素通过 GstMLBufferPool 使用 DMA 缓冲区,以最大限度地减少内存复制,并尽可能保持零拷贝传输。 QNN 使用运行时管理的内存来分配:
  • 输入张量
  • 中间激活张量
  • 输出张量
元素在模型加载时发现输入/输出张量元数据(数量、形状、类型),并相应地配置缓冲池。

GAP 缓冲区处理

qtimlqnn 支持 GAP 感知,能够正确处理标记了 GST_BUFFER_FLAG_GAP 的输入缓冲区。 当收到 GAP 缓冲区时,元素跳过推理并将缓冲区向下游转发。这在保持时序和同步的同时,明确表明该时间戳没有可用的有效推理输入。 GAP 缓冲区常见于条件式 AI 流水线,例如级联工作流,其中只有当前面的阶段产生有效的感兴趣区域时,后续推理阶段才会运行。

用法

实时摄像头流上的单阶段 AI 推理(HTP)

本示例演示了使用带 HTP 后端的单个 qtimlqnn 实例,在实时摄像头流上进行实时推理。推理结果作为 MLMeta 附加到每个 GstBuffer,使下游元素可以直接从帧中访问同步的元数据。叠加阶段随后使用此元数据在显示或进一步处理之前渲染边界框、标签或关键点等注释。
1

下载所需文件

2

将文件复制到设备

3

连接到设备

4

设置环境变量

在设备上运行以下命令
5

运行流水线

Run the pipeline

实时摄像头流上的单阶段 AI 推理(GPU)

本示例演示了相同的单阶段推理工作流,但使用 GPU 后端而非 HTP。适用于浮点模型或受益于 GPU 并行性的工作负载。
1

下载所需文件

2

将文件复制到设备

3

连接到设备

4

设置环境变量

在设备上运行以下命令
5

运行流水线

Run the pipeline