常见问题解答#

DeepStream 常规主题#

如何卸载 DeepStream?#

  • 对于 dGPU

    要删除所有之前的 DeepStream 3.0 或更早版本的安装,请输入命令

    $ sudo rm -rf /usr/local/deepstream /usr/lib/x86_64-linux-gnu/gstreamer-1.0/libgstnv* /usr/bin/deepstream* /usr/lib/x86_64-linux-gnu/gstreamer-1.0/libnvdsgst*
    /usr/lib/x86_64-linux-gnu/gstreamer-1.0/deepstream*
    /opt/nvidia/deepstream/deepstream*
    $ sudo rm -rf /usr/lib/x86_64-linux-gnu/libv41/plugins/libcuvidv4l2_plugin.so
    

    要删除 DeepStream 4.0 或更高版本的安装

    1. 打开 /opt/nvidia/deepstream/deepstream/ 中的 uninstall.sh 文件

    2. PREV_DS_VER 设置为 4.0

    3. 以 sudo 身份运行脚本:./uninstall.sh

  • 对于 Jetson:使用最新版本的 JetPack 刷写目标设备。

DeepStream 7.1 支持哪些类型的输入流?#

它支持 H.264、H.265、JPEG 和 MJPEG 流。

dGPU (Tesla) 上 H.264 和 H.265 解码的吞吐量是多少?#

有关信息,请参阅 https://developer.nvidia.com/nvidia-video-codec-sdk

如何在调试模式下运行 DeepStream 示例应用程序?#

输入此命令

$ deepstream-app -c <config> --gst-debug=<debug#>

其中

  • <config> 是配置文件的路径名

  • <debug#> 是一个数字,指定调试输出中的详细程度

有关调试工具的信息,请参阅:https://gstreamer.freedesktop.org/documentation/tutorials/basic/debugging-tools.html

注意

通过 SSH (via putty) 使用 X11 转发运行 Deepstream 应用程序不起作用。

在哪里可以找到 DeepStream 示例应用程序?#

DeepStream 示例应用程序位于

<DeepStream 安装目录>/sources/apps/sample_apps/

示例应用程序的配置文件位于

<DeepStream 安装目录>/samples/configs/deepstream-app

有关更多信息,请参阅《NVIDIA DeepStream 开发指南》。

如何验证 CUDA 是否已正确安装?#

检查 CUDA 版本

$ nvcc --version

如何解释控制台上显示的每秒帧数 (FPS) 信息?#

当 deepstream-app 运行时,控制台上显示的 FPS 数字是最近五秒的平均值。括号中的数字是整个运行过程中的平均 FPS。数字按流显示。性能测量间隔由配置文件中的 perf-measurement-interval-sec 设置。

我的 DeepStream 性能低于预期。如何确定原因?#

请参阅《NVIDIA DeepStream 开发指南》中的 故障排除 章节。

如何指定 DeepStream 输出的 RTSP 流?#

您可以通过在应用程序配置文件中添加 RTSP sink 来启用远程显示。示例配置文件 source30_1080p_dec_infer-resnet_tiled_display_int8.txt[sink2] 部分中对此进行了示例。您必须将 enable 标志设置为 1。启用远程显示后,应用程序会打印 RTSP URL,您可以在任何媒体播放器(如 VLC)中打开它。

注意:当使用 VLC 远程查看 DeepStream RTSP sink 输出时,请强制使用 TCP 以避免不必要的丢包。

强制 TCP 的示例命令

$ vlc --rtsp-tcp rtsp://path/to/stream

什么是官方 DeepStream Docker 镜像,我在哪里可以获得它?#

您可以从 DeepStream docker image 下载官方 DeepStream Docker 镜像。对于 dGPU,请参阅:https://ngc.nvidia.com/containers/nvidia:deepstream。对于 Jetson,请参阅:https://ngc.nvidia.com/containers/nvidia:deepstream-l4t

注意

docker 中不支持 nvdrmvideosink 插件。这是一个不受支持的用例,nvdrmvideosink 只有在后台没有 compositor 运行时才能良好工作,这在 docker 内部是不可能的。

创建我自己的 Docker 镜像的配方是什么?#

可以使用 DeepStream 容器作为基础镜像,并使用 Docker 中的标准技术在其上添加自定义层。

或者,如果您想在特定的 triton 基础镜像之上创建 DeepStream triton docker,请按照以下步骤操作。

1. 例如,要构建自定义 Triton 基础容器镜像,请按照 https://docs.nvda.net.cn/deeplearning/triton-inference-server/user-guide/docs/customization_guide/compose.html#use-the-compose-py-script 上提到的说明进行操作。克隆“server repository”后,使用以下命令创建基础 docker。

python3 compose.py --backend tensorrt --backend onnxruntime --repoagent  checksum

该命令将在本地创建一个名为“tritonserver:latest”的 tritonserver 容器。

2. 浏览 NVIDIA-AI-IOT/deepstream_dockers 上提到的 README。在所需的 Dockerfile 中,编辑 FROM 命令以使用步骤 1 中创建的基础 docker 名称,例如 FROM tritonserver:latest

更新 Dockerfile 后,按照 README 创建一个基于 DeepStream 的 docker,它位于拉取的 triton 基础 docker 之上。

如何通过 VNC 远程显示图形输出?如何确定 X11 是否正在运行?#

如果主机正在运行 X,则启动 VNC 非常简单。否则,您必须先启动 X,然后再启动 VNC。要确定 X 是否正在运行,请检查 DISPLAY 环境变量。如果 X 未运行,您必须先启动它,然后运行带有 GUI 的 DeepStream,或者在 sink groups 下将 type 设置为 1 或 3 以选择 fakesink 或保存到文件。如果您使用的是 NVIDIA® Tesla® GPU 加速器(仅计算卡,没有显示器),您可以将 type 设置为 4 以进行 DeepStream 输出 RTSP 流。有关 sink 设置,请参阅 NVIDIA DeepStream SDK 开发指南,或创建一个虚拟显示器以使用 VNC 可视化输出。有关更多详细信息,请参阅 快速入门指南 中的 如果显示器未连接到系统,如何可视化输出

为什么 deepstream-nvof-test 应用程序显示错误消息“设备不支持光流功能”?#

光流功能仅在 NVIDIA® Jetson AGX Orin、NVIDIA® Jetson Orin NX™ 和具有 Turing 架构的 GPU(NVIDIA® T4、NVIDIA® GeForce® RTX 2080 等)上受支持。

为什么 DeepStream 4.0+ 中需要 Gst-nvstreammux 插件?#

解码器、摄像头等多个源组件连接到 Gst-nvstreammux 插件以形成批处理。此插件负责创建批处理元数据,该元数据存储在结构 NvDsBatchMeta 中。这是 DeepStream 4.0.1 中的主要元数据形式。来自 Gst-nvstreammux 的所有下游插件都使用 NvDsBatchMeta 来访问元数据并填充它们生成的元数据。

如何分析 DeepStream pipeline?#

您可以使用 NVIDIA® Nsight Systems,这是一种系统范围的性能分析工具。有关更多详细信息,请参阅 https://developer.nvidia.com/nsight-systems

如何在 dGPU 系统上检查 GPU 和内存利用率?#

在控制台上输入 nvidia-sminvidia-settings

dGPU 上 1080p 流的近似内存利用率是多少?#

请使用下表作为此情况下的内存利用率指南。

注意

Gst-nvstreammux 中的宽度和高度设置为配置文件中指定的输入流分辨率。pipeline 为:decoder |rarr| nvstreammux |rarr| nvinfer |rarr| fakesink

1080p 流的内存利用率#

批处理大小(流的数量)

解码内存

Gst-nvinfer 内存

Gst-nvstreammux 内存

1

32 MB

333 MB

0 MB

2

64 MB

341 MB

0 MB

4

128 MB

359 MB

0 MB

8

256 MB

391 MB

0 MB

16

512 MB

457 MB

0 MB

如果输入流分辨率和 Gst-nvstreammux 分辨率(在配置文件中设置)相同,则 Gst-nvstreammux 中不会分配额外的 GPU 内存。如果输入流分辨率与 Gst-nvstreammux 分辨率不同,则 Gst-nvstreammux 分配大小为

buffers*(1.5*width*height)*mismatches 的内存

其中

  • buffers 是 Gst-nvstreammux 输出缓冲区数(设置为 4)。

  • widthheight 是 mux 输出宽度和高度。

  • mismatches 是分辨率不匹配的源的数量。

下表显示了一些示例

1080p 流的内存分配#

示例

Gst-nvstreammux width*height 设置

Gst-nvstreammux GPU 内存大小

16 个源,分辨率为 1920*1080

1280*720

4*(1.5*1280*720)*16 = 84 MB

15 个源,分辨率为 1280*720,1 个源,分辨率为 1920*1080

1280*720

4*(1.5*1280*720)*1 = 5.2 MB

DeepStream 应用程序在 Orin Nano 上编码时失败#

Orin 没有 HW 编码器。您应该修改应用程序代码以使用 SW 编码器。

当在 Jetson AGX Orin 上使用“while true; do deepstream-app -c <config_file>; done;”循环运行 deepstream-app 时,在几次迭代后,我看到某些迭代的 FPS 很低。这是为什么?#

当您以每秒 30 帧的速度运行三十个 1080p 流时,可能会发生这种情况。问题是由初始负载引起的。I/O 操作拖慢了 CPU,并且由于 [sink0] 组的默认属性为 qos=1decodebin 开始丢帧。为避免这种情况,请在配置文件中的 [sink0] 组中设置 qos=0

当我在 Jetson 上使用默认设置中的 source1_usb_dec_infer_resnet_int8.txt 配置文件编译 DeepStream 示例应用程序时,为什么会收到错误 incorrect camera parameters provided, please provide supported resolution and frame rate#

这是因为 nvdrmvideosink 不适用于 Xorg。请参阅 /opt/nvidia/deepstream/deepstream/README(注释部分,第 3 点)以解决该错误。

为什么在 Jetson 上,在容器内偶尔会发生引擎文件生成失败?#

这是由于 TensorRT-10.3 版本中的一个错误。该问题已在 TensorRT-10.5 版本中修复。因此,要克服此问题,您应该在 docker 内部安装 TensorRT-10.5,或者在裸机上的 docker 外部生成引擎文件,并将其复制到 docker 内部。

为什么应用程序在达到 EOS 时有时会因 RTSP 流而挂起?#

这是由于 rtpjitterbuffer 组件中的一个问题。为了解决此问题,/opt/nvidia/deepstream/deepstream/ 中提供了一个脚本“update_rtpmanager.sh”,其中包含更新 gstrtpmanager 库所需的详细信息。用户安装“安装依赖项”部分下提到的软件包后,应执行一次该脚本。

为什么我会收到错误 GLib (gthread-posix.c): Unexpected error from C library during 'pthread_setspecific': Invalid argument.  Aborting.#

该问题是由 glib 2.0-2.72 版本中的一个错误引起的,该版本默认随 ubuntu22.04 一起提供。该问题已在 glib2.76 中解决,需要安装 glib2.76 才能修复该问题 (GNOME/glib)。

当编译 DeepStream 示例应用程序时,为什么会收到错误 Makefile:13: *** "CUDA_VER is not set".  Stop#

导出此环境变量

  • 对于 Jetson 和 x86:CUDA_VER=12.6

然后使用 sudo -E make 再次编译。

如何构建 DeepStream GStreamer pipeline?#

以下是如何构建 pipeline 的一些示例。要按原样运行这些示例 pipeline,请从 samples 目录运行应用程序

  • V4l2 解码器 → nvinfer → nvtracker → nvinfer (辅助) → nvmultistreamtiler → nvdsosd → nveglglessink

    • 用于 dGPU 上的多流 (4x1080p) 操作

      $ gst-launch-1.0 filesrc location= streams/sample_1080p_h264.mp4 ! qtdemux ! h264parse ! nvv4l2decoder \
      ! m.sink_0 nvstreammux name=m batch-size=4 width=1920 height=1080 ! nvinfer config-file-path= configs/deepstream-app/config_infer_primary.txt \
      batch-size=4 unique-id=1 ! nvtracker ll-lib-file=/opt/nvidia/deepstream/deepstream/lib/libnvds_nvmultiobjecttracker.so \
      ! nvinfer config-file-path= configs/deepstream-app/config_infer_secondary_vehicletypes.txt batch-size=16 unique-id=2 infer-on-gie-id=1 infer-on-class-ids=0 \
      ! nvmultistreamtiler rows=2 columns=2 width=1280 height=720 ! nvvideoconvert ! nvdsosd ! nveglglessink filesrc location= streams/sample_1080p_h264.mp4 \
      ! qtdemux ! h264parse ! nvv4l2decoder ! m.sink_1 filesrc location= streams/sample_1080p_h264.mp4 ! qtdemux ! h264parse ! nvv4l2decoder \
      ! m.sink_2 filesrc location= streams/sample_1080p_h264.mp4 ! qtdemux ! h264parse ! nvv4l2decoder ! m.sink_3
      
    • 用于 Jetson 上的多流 (4x1080p) 操作

      $ gst-launch-1.0 filesrc location= streams/sample_1080p_h264.mp4 ! qtdemux ! h264parse ! nvv4l2decoder \
      ! m.sink_0 nvstreammux name=m batch-size=4 width=1920 height=1080 ! nvinfer config-file-path= configs/deepstream-app/config_infer_primary.txt \
      batch-size=4 unique-id=1 ! nvtracker ll-lib-file=/opt/nvidia/deepstream/deepstream/lib/libnvds_nvmultiobjecttracker.so \
      ! nvinfer config-file-path= configs/deepstream-app/config_infer_secondary_vehicletypes.txt batch-size=16 unique-id=2 infer-on-gie-id=1 infer-on-class-ids=0 \
      ! nvmultistreamtiler rows=2 columns=2 width=1280 height=720 ! nvvideoconvert ! nvdsosd ! nv3dsink \
      filesrc location= streams/sample_1080p_h264.mp4 ! qtdemux ! h264parse ! nvv4l2decoder \
      ! m.sink_1 filesrc location= streams/sample_1080p_h264.mp4 ! qtdemux ! h264parse ! nvv4l2decoder \
      ! m.sink_2 filesrc location= streams/sample_1080p_h264.mp4 ! qtdemux ! h264parse ! nvv4l2decoder ! m.sink_3
      
    • 用于 dGPU 上的单流 (1080p) 操作

      $ gst-launch-1.0 filesrc location= streams/sample_1080p_h264.mp4 ! qtdemux ! h264parse ! nvv4l2decoder \
      ! m.sink_0 nvstreammux name=m batch-size=1 width=1920 height=1080 ! nvinfer config-file-path= configs/deepstream-app/config_infer_primary.txt \
      batch-size=1 unique-id=1 ! nvtracker ll-lib-file=/opt/nvidia/deepstream/deepstream/lib/libnvds_nvmultiobjecttracker.so \
      ! nvinfer config-file-path= configs/deepstream-app/config_infer_secondary_vehicletypes.txt batch-size=16 unique-id=2 infer-on-gie-id=1 infer-on-class-ids=0 \
      ! nvmultistreamtiler rows=1 columns=1 width=1280 height=720 ! nvvideoconvert ! nvdsosd ! nveglglessink
      
    • 用于 Jetson 上的单流 (1080p) 操作

      $ gst-launch-1.0 filesrc location= streams/sample_1080p_h264.mp4 ! qtdemux ! h264parse ! nvv4l2decoder \
      ! m.sink_0 nvstreammux name=m batch-size=1 width=1920 height=1080 ! nvinfer config-file-path= configs/deepstream-app/config_infer_primary.txt \
      batch-size=1 unique-id=1 ! nvtracker ll-lib-file=/opt/nvidia/deepstream/deepstream
      /lib/libnvds_nvmultiobjecttracker.so \
      ! nvinfer config-file-path= configs/deepstream-app/config_infer_secondary_vehicletypes.txt batch-size=16 unique-id=2 infer-on-gie-id=1 infer-on-class-ids=0 \
      ! nvmultistreamtiler rows=1 columns=1 width=1280 height=720 ! nvvideoconvert ! nvdsosd ! nv3dsink
      
  • JPEG 解码

    • 在 Jetson 上使用 nvv4l2decoder

      $ gst-launch-1.0 filesrc location= ./streams/sample_720p.jpg ! jpegparse ! nvv4l2decoder ! nv3dsink

    • 在 dGPU 上使用 nvv4l2decoder

      $ gst-launch-1.0 filesrc location= ./streams/sample_720p.jpg ! jpegparse ! nvv4l2decoder ! nveglglessink

    • 在 Jetson 上使用 nvjpegdec

      $ gst-launch-1.0 filesrc location= ./streams/sample_720p.jpg ! nvjpegdec ! nv3dsink

    • 在 dGPU 上使用 nvjpegdec

      $ gst-launch-1.0 filesrc location= ./streams/sample_720p.jpg ! nvjpegdec !   nveglglessink

  • Dewarper

    • 在 dGPU 上

    $ gst-launch-1.0 uridecodebin uri= file://`pwd`/../../../../samples/streams/sample_cam6.mp4 ! nvvideoconvert \
    ! nvdewarper source-id=6 num-output-buffers=4 config-file=config_dewarper.txt ! m.sink_0 nvstreammux name=m width=1280 height=720 batch-size=4 \
    batched-push-timeout=100000 num-surfaces-per-frame=4 ! nvmultistreamtiler rows=1 columns=1 width=720 height=576 ! nvvideoconvert ! nveglglessink
    
    • 在 Jetson 上

    $ gst-launch-1.0 uridecodebin uri= file://`pwd`/../../../../samples/streams/sample_cam6.mp4 ! nvvideoconvert ! nvdewarper source-id=6 num-output-buffers=4 \
    config-file=config_dewarper.txt ! m.sink_0 nvstreammux name=m width=1280 height=720 batch-size=4 batched-push-timeout=100000 \
    num-surfaces-per-frame=4 ! nvmultistreamtiler rows=1 columns=1 width=720 height=576 ! nvvideoconvert ! nv3dsink
    

    注意

    此 Gst pipeline 必须从 dewarper 测试应用程序目录 sources/apps/sample_apps/deepstream-dewarper-test 运行。此 pipeline 仅适用于四个表面。要为一个、两个或三个表面运行,请使用 dewarper 测试应用程序。

  • Dsexample

    • 在 dGPU 上

    $ gst-launch-1.0 filesrc location = ./streams/sample_1080p_h264.mp4 ! qtdemux ! h264parse ! nvv4l2decoder \
    ! m.sink_0 nvstreammux name=m width=1280 height=720 batch-size=1  ! nvinfer config-file-path= ./configs/deepstream-app/config_infer_primary.txt \
    ! dsexample full-frame=1 ! nvvideoconvert ! nvdsosd ! nveglglessink sync=0
    
    • 在 Jetson 上

    $ gst-launch-1.0 filesrc location = ./streams/sample_1080p_h264.mp4 ! qtdemux ! h264parse ! nvv4l2decoder \
    ! m.sink_0 nvstreammux name=m width=1280 height=720 batch-size=1  ! nvinfer config-file-path= ./configs/deepstream-app/config_infer_primary.txt \
    ! dsexample full-frame=1 ! nvvideoconvert ! nvdsosd ! nv3dsink sync=0
    

如何在 Dewarper 插件配置文件中设置相机校准参数?#

  1. 焦距

可以使用 dewarper 配置文件中的属性 focal-length 设置源焦距。它的单位是“像素/弧度”。它可以指定为单个焦距,也可以为 X 和 Y 方向指定两个不同的焦距。

  1. 投影中心/光心/主点

可以使用属性 src-x0src-y0 设置主点。

  1. 畸变系数

最多可以在 Dewarper 插件中使用属性 distortion 配置 5 个(k0 到 k4)畸变系数。该插件根据输入/源摄像机的类型支持两种类型的畸变系数

  1. 透视相机输入:为了校正透视相机引起的畸变,支持 5 个畸变系数(k0 到 k4),其中包括

    3 个径向畸变系数:k0 到 k2

    2 个切向畸变系数:k3 和 k4

  2. 鱼眼相机输入:为了校正鱼眼畸变,需要指定 4 个畸变系数(k0 到 k3)。

  3. 畸变系数对于等距柱状输入源未使用。

如何获取相机校准参数以在 Dewarper 插件中使用?#

  1. 使用校准算法,例如 OpenCV 中的算法。有关更多详细信息,请参阅以下 OpenCV 链接

    对于透视输入:https://docs.opencv.ac.cn/2.4.13.7/doc/tutorials/calib3d/camera_calibration/camera_calibration.html

    对于鱼眼输入:https://docs.opencv.ac.cn/3.4/db/d58/group__calib3d__fisheye.html

    dewarper 配置参数到 OpenCV 参数的映射是

    “focal-length” => fx,fy
    “src-x0” => cx
    “src-y0” => cy
    

    畸变系数

    For perspective input : (k0,k1,k2,k3,k4) => (k1,k2,k3,p1,p2)
    For fisheye input : (k0,k1,k2,k3) => (k1,k2,k3,k4)
    
  2. EXIF 数据

焦距(以像素或像素/弧度为单位)也可以从图像 EXIF 数据中获取,方法是将以毫米为单位的焦距乘以以像素/毫米为单位的像素密度。

相关的 EXIF 标签如下

  1. FocalLength (37386)

  2. FocalPlaneXResolution (41486)

  3. FocalPlaneYResolution (41487)

  4. FocalPlaneResolutionUnit (41488)

在使用 RTSP 摄像机流时,如何最大限度地减少 DS 应用程序的 FPS 抖动?#

以下是一些可以帮助降低 FPS 抖动的 DeepStream 应用程序调优参数。

  1. 将内核接收最大窗口大小 rmem_max 设置为 52428800 或更高的值

    $ sudo sysctl -w net.core.rmem_max=52428800
    $ sudo sysctl -p
    

    还可以尝试将 DeepStream 配置文件源部分下的参数设置为 udp-buffer-size=2000000

  2. 在 DeepStream 配置文件源部分下设置 Latency=1000。

  3. 设置 rtsp-reconnect-interval-sec=3060,以便它可以等待摄像机重启和启动所需的足够时间。DS 应用程序会在等待此持续时间后尝试重新连接摄像机。

  4. 如果使用 deepstream-test5 应用程序,则尝试使用 –no-force-tcp 参数运行应用程序,这将使用基于 UDP 的 RTP 流而不是基于 TCP 的 RTP 流。

  5. 设置 perf-measurement-interval-sec=5,以便在 5 秒的持续时间内报告更好的平均 FPS,其中一些摄像机以突发方式传输数据包。

包含上述调优参数的 DeepStream 示例配置文件片段如下

[application]
enable-perf-measurement=1
mux-pool-size=8
perf-measurement-interval-sec=5

[source0]
enable=1
#Type - 1=CameraV4L2 2=URI 3=MultiURI
type=4
uri=rtsp://<Camera URL>
num-sources=1
gpu-id=0
nvbuf-memory-type=0
latency=1000
rtsp-reconnect-interval-sec=30
udp-buffer-size=2000000

为什么我在 Jetson AGX Orin 上运行 convert_to_uff.py 时收到“ImportError: No module named google.protobuf.internal”?#

如果您使用 https://elinux.org/Jetson_Zoo#TensorFlow 设置 Tensorflow,请使用 Python 3 运行 convert_to_uff.py

$ python3 /usr/lib/python3.6/dist-packages/uff/bin/convert_to_uff.py

DeepStream 是否支持 10 位视频流?#

解码器支持 10 位和 12 位 4:2:0 半平面解码 (P010_10LE/I420_12LE),尽管大多数组件都适用于 8 位输入。10 位和 12 位 4:4:4 平面解码 (Y444_10LE/Y444_12LE) 也受支持,但仅限于 x86/dGPU 平台。建议使用 nvvideoconvert 将流从 10 位转换为 8 位,然后添加相关组件(如果它们不支持 10/12 位流)。有时,远程观察不到来自 DeepStream 的 RTSP 输出。尝试运行以下 pipeline 以查看网络中是否存在问题。这样您就可以看到输出。

gst-launch-1.0 uridecodebin uri=rtsp://<rtsp link> ! nveglglessink sync=0 在远程机器上。

注意

  • 对于 12 位 NV12 格式,输出 caps 显示 I420_12LE。但数据被视为半平面 12 位数据处理。这是一个变通方法,因为 gstreamer v1.16 没有用于 12 位 NV12 的特定 caps。下游组件应将其视为仅 12 位 NV12 进行处理。

如何配置 pipeline 以获取 NTP 时间戳?#

要获取 NTP 时间戳,请在 nvstreammux 组件上将 attach-sys-ts 属性设置为 FALSE

为什么 NTP 时间戳值为 0?#

NTP 时间戳 0 表示您未从 RTCP 发送方报告接收 NTP 时间戳。您可以使用 Wireshark 等工具验证这一点。

为什么我看到的置信度值为 -0.1?#

如果选择“Group Rectangles”模式的聚类,则置信度值设置为 -0.1,因为该算法不保留置信度值。此外,对于跟踪器跟踪但未被推理组件检测到的对象,置信度值设置为 -0.1

如何在 DeepStream 中使用 TensorRT 插件的 OSS 版本?#

如果 TensorRT OSS 插件库尚不可用,请按照 NVIDIA/TensorRT 中的说明构建该库。要在 DeepStream 中使用该库,请在运行任何 DeepStream 应用程序之前 export LD_PRELOAD=/path/to/oss/libnvinfer_plugin.so

为什么在处理 H265 RTSP 流时会看到以下错误?#

Error: gstrtph265depay.c:1196:gst_rtp_h265_finish_fragmentation_unit: assertion failed:(outsize >= 4)

rtp payload 的大小小于 4 时,会从 h265depay gstreamer 插件组件中观察到此问题。该组件会抛出断言。这种无效的数据包大小可能是由于数据包损坏造成的。要克服此问题,您应该忽略断言并处理此类错误。代码中所需的修改位于 https://forums.developer.nvidia.com/t/deepstream-sdk-faq/80236。您需要编译代码并将库放置在适当的位置。

为什么我会观察到:大量缓冲区被丢弃。即使对于少量或单个流运行实时摄像头流时,输出看起来也很抖动?#

对于实时流,nvstreammux 元素的 live-source 属性应设置为 1。此外,sink/renderer 元素的 syncqos 属性应设置为 0FALSE

为什么通过 uridecodebin 在 gst-launch 管道中使用的 RTSP 源显示空白屏幕,然后出现错误 - WARNING: from element /GstPipeline:pipeline0/GstNvStreamMux:m: No Sources found at the input of muxer. Waiting for sources#

有时,当流可能同时包含视频和音频时,请求的 muxer pad 会在链接发生之前被删除。如果在 nvstreammux 和 uridecodebin 之间添加 queue 元素,则上述管道将正常工作。因为 uridecodebin 将链接到 queue pad 而不是 nvstreammux pad。程序化地不会观察到此问题,因为链接发生在视频流上解码器的新 pad 回调时。

如果我没有从管道中使用 v4l2src 插件的摄像头获得预期的 30 FPS,而是获得 15 FPS 或低于 30 FPS,该怎么办?#

这可能是由于摄像头周围的曝光或照明条件造成的,但是可以通过以下参考命令更改曝光设置来解决此问题。

v4l2-ctl -d /dev/video0 --list-ctrls
v4l2-ctl --set-ctrl=exposure_auto=1
v4l2-ctl --set-ctrl=exposure_absolute=300

在 Jetson 平台上,当将多个 Jpeg 图像馈送到使用 multifilesrc 插件的 nvv4l2decoder 时,我得到相同的输出。为什么会这样?#

例如

multifilesrc location = frame%d.jpeg ! jpegparse ! nvv4l2decoder ! nv3dsink

在 Jetson 平台上,nvv4l2decoder 需要设置属性 mjpeg=1 才能与 multifilesrc 一起使用。

在 Jetson 平台上,当屏幕进入空闲状态时,我观察到较低的 FPS 输出。#

  1. 如果您正在运行 Ubuntu UI,请运行以下命令

    $ export DISPLAY=:0
    $ gsettings set org.gnome.desktop.session idle-delay 0
    $ gsettings set org.gnome.desktop.lockdown disable-lock-screen 'true'
    

这将防止屏幕锁定和显示器关闭。完成此操作后,您不应看到低 fps

  1. 如果您在裸 X 服务器上运行此程序并且启动了 ubuntu UI,请使用以下命令将其杀死

    $ sudo service gdm stop
    $ sudo pkill -15 Xorg
    

然后使用以下 2 个命令之一启动裸 X 服务器

$ xinit &
$ X -noreset &

等待几秒钟,然后运行

$ export DISPLAY=:0
$ xset s off; xset s noblank; xset -dpms

如何在批量推理/处理后获取各个来源?nvstreamdemux 的示例管道是什么?#

一些示例 nvstreamdemux 管道

gst-launch-1.0 filesrc location = sample_1080p_h264.mp4 ! decodebin ! m.sink_0 \
filesrc location = sample_1080p_h264.mp4 ! decodebin ! m.sink_1 \
filesrc location = sample_1080p_h264.mp4 ! decodebin ! m.sink_2 \
filesrc location = sample_1080p_h264.mp4 ! decodebin ! m.sink_3 \
nvstreammux name=m width=1920 height=1080 batch-size=4 batched-push-timeout=40000 ! \
queue ! nvinfer config-file-path=<config> batch-size=4 ! \
queue ! nvtracker ll-lib-file=<lib-file> ! \
nvstreamdemux name=d \
d.src_0 ! queue ! nvvideoconvert ! nvdsosd ! nveglglessink \
d.src_1 ! queue ! nvvideoconvert ! nvdsosd ! nveglglessink \
d.src_2 ! queue ! nvvideoconvert ! nvdsosd ! nveglglessink \
d.src_3 ! queue ! nvvideoconvert ! nvdsosd ! nveglglessink

注意

queue 元素应插入到每个 nvstreamdemux src pad 之后。

不需要解复用所有源/创建所有 nvstreamdemux src pad。此外,每个源的下游管道可能不同。示例管道

gst-launch-1.0 filesrc location = sample_1080p_h264.mp4 ! decodebin ! m.sink_0 \
filesrc location = sample_1080p_h264.mp4 ! decodebin ! m.sink_1 \
filesrc location = sample_1080p_h264.mp4 ! decodebin ! m.sink_2 \
filesrc location = sample_1080p_h264.mp4 ! decodebin ! m.sink_3 \
nvstreammux name=m width=1920 height=1080 batch-size=4 batched-push-timeout=40000 ! \
queue ! nvinfer config-file-path=<config> batch-size=4 ! \
queue ! nvtracker ll-lib-file=<lib-file> ! \
vstreamdemux name=d \
d.src_1 ! queue ! nvvideoconvert ! nvdsosd ! nvvideoconvert ! nvv4l2h264enc ! h264parse ! qtmux ! filesink location=out.mp4 \
d.src_2 ! queue ! nvvideoconvert ! nvdsosd ! nveglglessink

为什么在运行 Deepstream 管道时会遇到此类错误:配置的内存类型和 i/p 缓冲区不匹配 ip_surf 0 muxer 3?#

NvStreamMux 配置为内存类型 3,即 NVBUF_MEM_CUDA_UNIFIED,并且 nvstreammux 的输入 surface 具有内存类型 0,即 NVBUF_MEM_CUDA_DEFAULT (dGPU 的 Cuda 设备) 时,会在 dGPU 上观察到此错误。输入 surface 的分辨率与 nvstreammux 配置的分辨率相同,在这种情况下,nvstreammux ``尝试 在其 sinkpad 上发送原始缓冲区到下游,与其他来源的缓冲区复用,但由于 ``nvstreammux 的不同配置的内存类型,它无法执行相同的操作。为了解决这个问题,请确保连接到 nvstreammux 的所有源都生成相同类型的内存,并将 nvstreammux 内存配置为相同的类型。或者,如果在 nvstreammux 中进行缩放,则不会遇到此错误。

二级 GIE 如何裁剪和调整对象大小?#

SGIE 将使用主 GIE 检测到的对象的 bbox,从 NvStreamMux 缓冲区中裁剪对象。然后将裁剪后的对象缩放/转换为网络分辨率/颜色格式。例如,如果 NvStreamMux 分辨率为 1920x1080,SGIE 将使用对象 bbox 坐标(例如 x=1000,y=20,w=400,y=500)从 1920x1080 图像中裁剪,然后将其缩放到 SGIE 网络分辨率(例如 224x224)。实际上,对象裁剪 + 缩放 + 颜色转换是一次性完成的。

如何从 GstBuffer 保存帧?#

要从 gst buffer 保存帧,您需要使用 gst_buffer_map () API 映射 gst buffer。

以下是伪代码

GstMapInfo in_map_info;
NvBufSurface *surface = NULL;

memset (&in_map_info, 0, sizeof (in_map_info));
if (!gst_buffer_map (inbuf, &in_map_info, GST_MAP_READ)) {
g_print ("Error: Failed to map gst buffer\n");
}
surface = (NvBufSurface *) in_map_info.data;

现在您可以访问 NvBufSurface 结构,您可以访问实际的帧内存并保存它。最后,您需要使用 gst_buffer_unmap (inbuf, &in_map_info) 取消映射 gst buffer。有关更多详细信息,请参阅 gst-dsexample plugin 源代码中的 gst_dsexample_transform_ip()

Jetson 和 dGPU 上支持哪些不同的内存类型?#

Jetson 和 dGPU 上支持的内存类型#

内存类型

Jetson

dGPU 或 X86_64

NVBUF_MEM_DEFAULT

Surface Array 类型的内存,默认情况下为 2D pitched 分配:平台上的所有硬件加速器都使用它。CPU 可以使用 NvBufSurfaceMapNvBufSurfaceSyncForCpuNvBufSurfaceSyncForDevice 基于读写使用情况来访问。GPU 使用 EGLImageCreate 和 Map API 进行访问

Cuda Device 类型的内存默认分配,只能由 GPU 访问。用户可能需要自定义 Cuda 内核来访问或修改内存。或者使用 NvBufSurfaceCopy 将内容复制到 CPU 可访问的内存中

NVBUF_MEM_CUDA_PINNED

使用 cudaMallocHost () 分配的页面锁定内存,CPU 和 GPU 均可访问

使用 cudaMallocHost () 分配的页面锁定内存,CPU 和 GPU 均可访问。

NVBUF_MEM_CUDA_DEVICE

Cuda Device 类型的内存已分配,只能由 GPU 访问。用户可能需要自定义 Cuda 内核来访问或修改内存。NvBufSurfaceCopy 不支持在 Jetson 上用于 Cuda 内存

Cuda Device 类型的内存已分配,只能由 GPU 访问。用户可能需要自定义 Cuda 内核来访问或修改内存。或者使用 NvBufSurfaceCopy 将内容复制到 CPU 可访问的内存中

NVBUF_MEM_CUDA_UNIFIED

不支持

使用 cudaMallocManaged () 分配的统一虚拟内存,CPU 和多个 GPU 均可访问

NVBUF_MEM_SURFACE_ARRAY

Surface Array 类型的内存,默认情况下为 2D pitched 分配;平台上的所有硬件加速器都使用它;CPU 可以使用 NvBufSurfaceMap ()NvBufSurfaceSyncForCpu ()NvBufSurfaceSyncForDevice () 基于使用情况读写使用情况来访问。GPU 使用 EGLImageCreate 和 Map API 进行访问

不支持

NVBUF_MEM_HANDLE

在 Jetson 内部使用

不支持

NVBUF_MEM_SYSTEM

使用 malloc 分配

使用 malloc () 分配

Jetson 和 dGPU 上支持哪些不同的内存转换?#

dGPU: 用户可以使用 NvBufSurfaceCopy() 从一种内存类型复制到另一种内存类型。如果需要转换,nvvideoconvert 插件支持 nvbuf-memory-type 属性以允许不同类型的内存。NvBufSurfTransform() 也可用于在各种 CUDA 类型的内存之间进行转换。CUDA 到 NVBUF_MEM_SYSTEM 的转换不受 NvBufSurfTransform 的直接支持,用户可以使用 NvBufSurfaceCopy() 复制到 CUDA 内存并在该内存上执行转换。

Jetson: 用户可以使用 NvBufSurfaceCopy() 从一种内存类型复制到另一种内存类型,尽管不支持直接 CUDA 内存复制。用户可以执行 NvBufSurfTransform() 以将 NVBUF_MEM_SURFACE_ARRAY/NVBUF_MEM_DEFAULT 转换为 Cuda 内存,但用户需要使用 GPU 作为计算设备进行转换,因为 VIC 不支持转换为 CUDA 内存或 NVBUF_MEM_SYTEM。有关更多信息,请参阅 NvBufSurfTransform API。

如果我将 cudaMalloc 分配的内存包装到 NvBufSurface 中并提供给 NvBufSurfTransform,为什么我的图像看起来会失真?#

如果您未使用 NvBufSurfaceCreate 进行分配,请确保分配的内存的 pitch 是 32 的倍数。还要确保输入的每个平面的起始地址是 128 字节对齐的。

为什么低于 16x16 尺寸的转换在 Jetson 上会失败?#

Jetson (VIC) 有硬件限制,仅允许最小尺寸为 16x16 的转换,因此 NvBufSurfTransform 在此平台上也有相同的限制。

如何找出给定平台上支持的最大流数?#

DeepStream 可以支持尽可能多的流,只要正在运行的应用程序不受内存/解码/计算能力的限制。

如何在 DeepStream 中找到性能瓶颈?#

在 dGPU (X86) 上:运行以下命令以检查 GPU、解码器、编码器、内存利用率

$nvidia-smi dmon

您还需要检查温度和功耗。性能受温度和功耗数字的限制,超出给定平台允许的限制。要检查 CPU 是否是瓶颈,请在控制台上运行 htop 命令,以查看是否有任何 CPU 核心利用率约为 100%

在 Jetson 上:运行以下命令以检查 CPU、GPU 和内存利用率

sudo./tegrastats

有关更多详细信息,请参阅链接:https://docs.nvda.net.cn/jetson/l4t/index.html#page/Tegra%2520Linux%2520Driver%2520Package%2520Development%2520Guide%2FAppendixTegraStats.html%23wwpID0E0SB0HA

如何修复“cannot allocate memory in static TLS block”错误?#

在 Jetson 上,有时可能会出现以下错误

(gst-plugin-scanner:21845): GStreamer-WARNING **: 04:34:02.887: Failed to load plugin '/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstlibav.so': /usr/lib/aarch64-linux-gnu/libgomp.so.1: cannot allocate memory in static TLS block

可以通过运行以下命令来修复此错误

export LD_PRELOAD=/usr/lib/aarch64-linux-gnu/libgomp.so.1

如果管道包含开源组件,如何测量管道延迟?#

如果无法修改开源组件以使用 https://docs.nvda.net.cn/metropolis/deepstream/dev-guide/sdk-api/group__ee__nvlatency__group.html 中提到的 API 测量延迟,则可以使用以下方法。

您可以在解码器的 sink pad 上插入一个 probe,测量输入缓冲区到达的时间。在 sink 组件的 sink pad 上插入另一个 probe,并测量与输入缓冲区对应的输出缓冲区到达的时间。这两个时间之间的差值将为您提供缓冲区的延迟。

迁移到较新版本的 gstreamer#

为了迁移到较新版本的 gstreamer(例如 gstreamer-1.22.6),请按照以下步骤操作

  1. 先决条件:安装以下软件包

    apt-get install python3-pip
    pip3 install meson
    pip3 install ninja
    apt-get install libmount-dev
    apt-get install flex
    apt-get install flex bison
    apt-get install libglib2.0-dev
    
  2. 编译和安装步骤

    #Remove older version
    apt-get remove *gstreamer*
    mkdir /tmp/gst-<gst-version>
    #e.g. mkdir /tmp/gst-1.22.6
    
    cd /tmp/gst-<gst-version>
    #e.g. cd /tmp/gst-1.22.6
    #Clone the repository
    git clone https://gitlab.freedesktop.org/gstreamer/gstreamer.git
    cd gstreamer
    
    #Switch to gst-version
    git checkout <gst-version-branch>
    #e.g. git checkout 1.22.6
    
    meson build --prefix=/usr
    ninja -C build/
    cd build/
    ninja install
    cd
    
    rm -rf <directory created in step 2>
    #e.g. rm -rf /tmp/gst-1.22.6
    
  3. 检查并确认新安装的 gstreamer 版本

gst-inspect-1.0 --version

注意

当提示权限时,使用 sudo 运行命令。

当我在 DS docker 容器上运行 deepstream-app 示例配置时,为什么会收到警告 WARNING from src_elem: No decoder available for type 'audio/mpeg, mpegversion=(int)4’#

在 DS 6.2+ 中,DeepStream docker 容器不打包某些多媒体操作(如音频数据解析、CPU 解码和 CPU 编码)所需的库。此更改可能会影响处理某些包含音轨的视频流/文件(如 mp4)。

请在 docker 镜像内运行以下脚本,以安装可能需要使用所有 DeepStreamSDK 功能的其他软件包

$ /opt/nvidia/deepstream/deepstream/user_additional_install.sh

注意

有关更多常见问题解答和故障排除信息,请参阅 https://forums.developer.nvidia.com/t/deepstream-sdk-faq/

为什么在使用 deepstream-app --version-all 时会收到警告:Failed to load plugin '/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstlibav.so': libavfilter.so.7: cannot open shared object file: No such file or directory#

在 DS 6.2+ 中,DeepStream 容器不打包 gstreamer1.0-libav,这是某些多媒体操作所需的库。

请在 docker 镜像内运行以下脚本,以安装可能需要使用所有 DeepStreamSDK 功能的其他软件包

$ /opt/nvidia/deepstream/deepstream/user_additional_install.sh

为什么在使用 nveglglesink 运行 deepstream 管道时会收到警告消息:libEGL warning: DRI3: Screen seems not DRI3 capablelibEGL warning: DRI2: failed to authenticate#

当管道与 nveglglessink 一起运行时,在 T4 dGPU 上会看到此警告。此警告无害,可以忽略。

如何在 Hopper、Ampere 和 ADA 上运行更高数量的流(200+)?#

要运行更高数量的流,请按照以下步骤操作

$sudo service display-manager stop
#Make sure no process is running on GPU i.e. Xorg or trition server etc
$ sudo pkill -9 Xorg
#Remove kernel modules
$ sudo rmmod nvidia_drm nvidia_modeset nvidia
#Load Modules with Regkeys
$ sudo modprobe nvidia NVreg_RegistryDwords="RMDebugOverridePerRunlistChannelRam = 1;RMIncreaseRsvdMemorySizeMB = 1024;RMDisableChIdIsolation = 0x1;RmGspFirmwareHeapSizeMB = 256"
$ sudo service display-manager start

请注意,这些步骤仅适用于测试环境,不适用于生产环境。这是驱动程序的已知问题。

为什么我会收到消息:ERROR: This container was built for NVIDIA Driver Release 560.28 or later, but version 540.4.0 was detected and compatibility mode is UNAVAILABLE#

在 Jetson 上运行 multiaarch triton docker 时,会观察到以上打印信息。这些打印信息是无害的,应忽略。

在 x86 上,为什么我在编译和运行 application/libs/plugins 时会收到以下错误:Cuda failure: the provided PTX was compiled with an unsupported toolchain NvDsInferConvert_C3ToP3Float: cuda err = the provided PTX was compiled with an unsupported toolchain.#

对于在编译期间包含“.cu”文件的源文件以及在运行应用程序之前,需要执行以下步骤

sudo apt-get install -y cuda-compat-12-x
export LD_LIBRARY_PATH=/usr/local/cuda/compat:$LD_LIBRARY_PATH

注意

将 x 替换为 快速入门指南 中提到的 CUDA 版本。

注意

这仅适用于数据中心 GPU。

为什么我在运行 deepstream 示例应用程序时收到错误 Could not get EGL display connection#

在运行应用程序之前,如果连接了显示设备,请使用命令:$export DISPLAY=:0

如果未连接显示设备,请使用命令:$unset DISPLAY

为什么我在 SBSA/GH100 上使用 EGLSink 运行 deepstream 示例应用程序时收到错误 cuGraphicsGLRegisterBuffer failed with error(219) gst_eglglessink_cuda_init texture = 1#

ARM 上的 SBSA/dGPU 不支持 nveglglessink。您应该在应用程序中使用 nv3dsink 代替。

为什么所有 deepstream 参考应用程序在 ARM 上的 dGPU 上使用 DS 7.1 失败并抛出段错误?#

这是 DS 7.1 arm sbsa docker 的已知限制。视频 sink 默认情况下在 ARM 系统上的 dGPU 上不起作用。请参阅 视频子系统的已知限制和解决方法 部分,了解有关如何使 nv3dsink 工作的详细信息和解决方法。

为什么在 Gst-nvtracker 低级别配置文件中设置 outputReidTensor: 1 时收到错误“GPUassert: invalid argument”?#

所有流中的实际对象数量超过了为跟踪器重新识别嵌入输出分配的内存。当启用输出重新识别张量时,建议用户将 maxTargetsPerStream 设置为大于管道中所有流中的对象总数。

使用 NVTX 进行性能分析#

NVIDIA® Tools Extension SDK (NVTX) 提供了用于注释应用程序中的事件、代码范围和资源的 API。DeepStreamSDK 中的核心 GStreamer 插件已集成 NVTX,可以使用 NVIDIA Nsight 工具、Tegra System Profiler 和 Visual Profiler 捕获和可视化事件和范围。有关 NVTX 的更多信息,请访问 https://docs.nvda.net.cn/gameworks/content/gameworkslibrary/nvtx/nvidia_tools_extension_library_nvtx.htm。以下是如何使用 NVIDIA Nsight 工具通过 deepstream-app 捕获和可视化这些事件的说明

  1. https://developer.nvidia.com/nsight-systems 下载并安装 Nsight 工具。可以使用任何文件(.deb、.run 或 .rpm)进行安装。

  2. 在终端上运行以下命令

    $ nsys-ui
    
  3. 单击文件 -> 新建项目

  4. 选择目标系统为“性能分析的目标”。

  5. 现在需要由 Nsight 工具启动 deepstream-app 进程以进行性能分析。为了做到这一点,请在“带有参数的命令行”中添加以下命令

    deepstream-app -c /opt/nvidia/deepstream/deepstream/samples/configs/deepstream-app/source30_1080p_dec_infer-resnet_tiled_display_int8.txt
    
  6. 在复选框选项中,启用“收集 NVTX 跟踪”。用户可以根据工具上的要求选择其他自定义选项。

  7. 要开始性能分析,请单击“开始”。

  8. 应用程序运行完成后,手动停止收集跟踪。

  9. 停止收集后,在分析视图中,将显示每个插件的逐帧分析,这使您可以了解每个插件花费的时间。

DeepStream Reference Application NVTX Analytics

有关性能设置的更多信息,请参阅故障排除页面的“性能”部分。

智能录制#

智能录制模块是否适用于本地视频流?#

是的。智能录制模块期望来自本地视频或 RTSP 流的编码帧。但是 deepstream-test5-app 仅支持 RTSP 源进行智能录制。

是否支持在同一源上进行多个并行录制?#

否。同一源上一次只支持单个录制。您需要停止正在进行的录制才能再次开始新的录制。

如果我忘记停止录制怎么办?#

有默认的持续时间设置,如果录制未被停止事件停止,它将根据默认持续时间值自动停止。

我以设定的持续时间开始了录制。我可以在该持续时间结束之前停止它吗?#

是的,可以随时停止正在运行的录制实例。

如果我不为智能录制设置默认持续时间怎么办?#

录制持续时间的默认值为 10 秒。

如果我不为智能录制设置视频缓存大小怎么办?#

视频缓存大小的默认值为 30 秒。

我可以缓存为智能录制历史记录的最大数据时长是多少?#

就此而言,缓存大小没有限制。它受可用系统内存的限制。

我可以录制带有边界框和其他信息叠加的视频吗?#

为了获得更好的性能和优化,智能录制避免了转码,并且仅缓存编码帧。在某种程度上,无法录制带有叠加边界框的视频。但是您可以通过两种方式实现该用例

  1. 在录制的视频上运行推理管道,并使用 sink (type = filesink) 将输出保存在文件中

  2. 在 OSD 之后在管道中添加编码组件,然后添加智能录制模块。

Triton#

对于 Triton 插件,Jetson 平台是否可以支持与 dGPU 相同的功能?#

不完全是。dGPU 可以支持大多数模型,例如 TensorRT、Tensorflow(和 TF-TRT)、ONNX(以及 TRT 优化)、Pytorch。Jetson 可以支持 TensorRT、Tensorflow(和 TF-TRT)。对其他模型的支持将在未来的版本中推出。有关更多详细信息,请参阅 Deepstream 插件指南部分。

如何为 Tensorflow 和 ONNX 模型启用 TensorRT 优化?#

要了解 Triton 模型中 TensorRT 优化设置的详细信息,请参阅:triton-inference-server/server TF-TRT 在 dGPU 和 Jetson 平台上均受支持。1. 打开模型的 Triton config.pbtxt 文件 2. 确保启用 GPU 实例 3. 附加 tensorrt 加速器。(例如 triton_model_repo/ssd_mobilenet_v1_coco_2018_01_28/config.pbtxt)

optimization { execution_accelerators {
gpu_execution_accelerator : [ {
name : "tensorrt"
parameters { key: "precision_mode" value: "FP16" }
}] }}

有关 TF-TRT 参数的更多信息,请参阅 Tensorflow 1.x 中的 TF-TRT API。is_dynamic_op 在 Triton 中原生设置为 True。此外,您可以使用自己的脚本在 Tensorflow 环境中运行来生成离线 TF-TRT 模型。请阅读 TF-TRT 用户指南以生成离线(静态)模型。一旦原始在线模型被离线模型替换,请移除 optimization 块,以防 TF-TRT 在线再次运行以覆盖离线 TF-TRT 缓存。dGPU 仅支持 ONNX。可以通过以下方式启用 TensorRT 优化

 optimization { execution_accelerators {
gpu_execution_accelerator : [ { name : "tensorrt" } ]
}}

TensorRT 引擎缓存将在运行时生成。它在初始化或第一帧到来时开始启动。这可能需要几秒甚至几分钟,具体取决于模型的复杂程度和平台的性能。

如何调整 Tensorflow 模型的 GPU 内存?#

当使用 Triton Inference Server 运行 TensorFlow 模型时,GPU 设备内存可能不足。可以使用 nvdsinferserver 配置文件(config_infer_*)中的 tf_gpu_memory_fraction 参数来调整 TensorFlow 模型允许的 GPU 设备内存分配。有关更多详细信息,请参阅 samples/configs/deepstream-app-triton/README。此参数与 Tensorflow 配置的 per_process_gpu_memory_fraction 相同。有关更多详细信息,请参阅

  • Tensorflow 1.x gpu 指南

  • TF-TRT 用户指南

为什么在首次运行 deepstream 应用程序时收到以下警告?#

"GStreamer-WARNING: Failed to load plugin '...libnvdsgst_inferserver.so': libtrtserver.so: cannot open shared object file: No such file or directory"

这是一个无害的警告,表明 DeepStream 的 nvinferserver 插件无法使用,因为未安装“Triton Inference Server”。如果需要 DeepStream-Triton,请尝试按照 https://ngc.nvidia.com/catalog/containers/nvidia:deepstream 上的说明在 dGPU 上拉取 DeepStream 的 Triton docker 镜像,并在容器内运行测试应用程序。Triton Inference Server 与 DeepStream 软件包一起自动安装在 Jetson 上。无需额外的说明。

为什么收到警告“Failed to query video capabilities: Invalid argument”?#

这是一个无害的警告。这是由于 nvv4l2decoder 中的一个错误造成的,可以安全地忽略。

如何处理 Triton Inference Server 不支持的操作?#

有关处理不支持操作的详细信息,请参阅:https://docs.nvda.net.cn/deeplearning/sdk/triton-inference-server-guide/docs/user_guide/custom_operations.html

文档中提到的自定义库可以通过以下方法之一加载到 DeepStream 应用程序中

  • 以以下方式运行应用程序

    LD_PRELOAD=./libcustomOp.so deepstream-app -c <app-config>
    
  • 在 “nvinferserver” 配置文件中添加 custom-lib 路径,如下所示

    infer_config {
     ...
    custom_lib { path: "./libcustomOp.so" }
    }
    

Gst-nvinferserver 是否可以跨进程或容器支持模型?#

该插件可以配置为使用 gRPC API,通过 Triton Client 库访问 Triton Inference server。在这种模式下,Triton 服务器作为单独的进程运行,可以在同一台或不同的机器/容器上。

当插件配置为 Triton Server C-API 时,它不支持客户端/服务器架构。但是,单个进程可以运行独立的 Triton 模型仓库,无论有多少模型同时运行。

当在单个进程中运行多个 Triton 模型时,用户是否可以设置不同的模型仓库?#

否。同一 deepstream-app 进程的所有配置文件必须具有相同的 model_repo。否则,GSt-nvinferserver 可能会报告错误,或者在 model_repo 上使用随机配置。

infer_config { triton { model_repo {
    root: “path/to/model_repo”
    strict_model_config: true
    tf_gpu_memory_fraction: 0.35
    ...
} } }

为什么脚本 prepare_classification_test_video.sh 在 Triton docker 中失败?#

位于 /opt/nvidia/deepstream/deepstream/samples 的脚本 prepare_classification_test_video.sh 需要安装 ffmpeg。一些底层编解码器库需要与 ffmpeg 一起重新安装。使用以下命令安装/重新安装 ffmpeg:apt-get install --reinstall libflac8 libmp3lame0 libxvidcore4 ffmpeg

DeepStream 分类和 Triton 分类之间有什么区别?#

Gst-nvinferserver 插件支持 2 种分类方法

  1. 使用 DeepStream 插件解析分类输出并选择标签。使用 labelfile_path 和分类选项配置插件的 postprocess 块。

infer_config { postprocess {
   labelfile_path: “path/to/classification_labels.txt”
   classification { threshold: 0.5 }
} }

示例:samples/ configs/deepstream-app-triton/config_infer_primary_classifier_inception_graphdef_postprocessInDS.txt

  1. 使用 Triton 原生分类方法。在 Triton 模型的 config.pbtxt 中配置标签文件(例如 samples/triton_model_repo/inception_graphdef/config.pbtxt

output [ {
name: "InceptionV3/Predictions/Softmax"
data_type: TYPE_FP32
dims: [ 1001 ]
label_filename: "inception_labels.txt"
} ]

要启用它,需要在 Gst-nvinferserver 的配置文件中更新

infer_config { postprocess {
    triton_classification { topk:1 threshold: 0.5 }
} }

示例:samples/configs/deepstream-app-triton/config_infer_primary_classifier_inception_graphdef_postprocessIntriton.txt

为什么在某些 Triton 模型配置文件(samples/triton_model_repo/*/config.pbtxt)中使用 max_batch_size: 0#

这是 Triton 运行时的参数设置。根据 Triton 文档(https://docs.nvda.net.cn/deeplearning/triton-inference-server/user-guide/docs/user_guide/model_configuration.html#maximum-batch-size),某些模型不支持批处理。Gst-nvinferserver 插件在非批处理模式下支持这些模型,张量输入/输出形状通常以完整维度存在(第一个维度是批大小)。例如,在 triton_model_repo/densenet_onnx/config.pbtxt 中,具有

max_batch_size : 0
input {
 ...
 dims: [1, 3, 224, 224 ]
}

第一个维度 1 是完整维度中的批大小。

除了某些特定情况外,如果模型可以支持动态形状,则

max_batch_size : 0
input {
 ...
 dims: [-1, 3, 224, 224 ]
}

第一个维度 -1 表示动态批处理大小。在这种情况下,为了控制预分配缓冲区池的最大批处理大小,用户需要在 Gst-nvinferserver 插件 configs/deepstream-app-triton/config_infer_**.txt 中配置有效的最大批处理大小

infer_config {
unique_id: 1
gpu_ids: [0]
max_batch_size: 30
...
}

上面的示例将最终输入批处理大小限制为 <= 30。

Gst-nvinferserver 还可以在配置文件中支持 Triton 模型 reshape。在此处阅读更多详细信息:https://docs.nvda.net.cn/deeplearning/triton-inference-server/user-guide/docs/user_guide/model_configuration.html#reshape

如何支持 Triton 集成模型?#

有关详细信息,请参阅 :doc: DS_plugin_gst_nvinferserver 部分中的 Triton 集成模型

Gst-nvinferserver 是否支持 Triton 多实例组?#

是的,您可以配置 Triton 模型 config.pbtxt,在单个 GPU 或 CPU 上使用多个实例,使它们并行运行。如果在不同的设置上配置了多个实例(例如,在一个 GPU 上运行一个实例,在另一个 GPU 上运行另一个实例),建议对实例进行预热。这是为了避免在特定实例在第一帧上初始化时间过长时出现超时或其他实时流错误。要启用多实例,请参阅:https://docs.nvda.net.cn/deeplearning/triton-inference-server/user-guide/docs/user_guide/model_configuration.html#instance-groups 要启用预热,请参阅:https://docs.nvda.net.cn/deeplearning/triton-inference-server/user-guide/docs/user_guide/model_configuration.html#model-warmup

Gst-nvinferserver 是否可以支持在多个 GPU 上进行推理?#

暂不支持。在多 GPU 平台上运行时,您需要为 GPU 实例指定特定的单个 gpu-id。如果未指定 gpu-id,则默认情况下所有 GPU 实例将一起运行。这可能会导致意外行为。更新 config.pbtxt 并显式指定单个 gpu-id

instance_group {
count: 1
gpus: 0
kind: KIND_GPU
}

或者在 docker 命令行中指定单个 GPU

docker run -it --rm --gpus '"'device=0'"' ...

单个模型在不同配置文件(gie group in sourceconfig_inferserver.. 和 Triton 模型的 config.pbtxt)中的批处理大小差异是什么?#

以 TensorRT Primary_Detector 为例

  1. Gst-nvinferserver 插件的配置文件 configs/deepstream-app-triton/config_infer_plan_engine_primary.txt,定义了

    infer_config { max_batch_size: 30 }
    

这表明 Gst 插件将预先分配 30 个输入缓冲区用于预处理,并且每次最多将 30 个批处理预处理缓冲区传递到 Triton Runtime 中。此值必须 > 0

  1. Deepstream-app 的配置文件 configs/deepstream-app-triton/source4_1080p_dec_infer-resnet_tracker_sgie_tiled_display_int8.txt,定义了

    [primary-gie]
    batch-size=4
    config-file=config_infer_plan_engine_primary.txt
    

此配置文件具有最高优先级,将在运行时将 configs/deepstream-app-triton/config_infer_plan_engine_primary.txt 中的 max_batch_size 覆盖为 4

  1. Triton Runtime 具有自己的配置文件格式,遵循 https://docs.nvda.net.cn/deeplearning/triton-inference-server/user-guide/docs/user_guide/model_configuration.html#model-configuration。在 triton_model_repo/Primary_Detector/config.pbtxt 中,它定义了

    name: "Primary_Detector"
    platform: "tensorrt_plan"
    max_batch_size: 30
    

这表明 Triton Runtime 最多可以为模型推理批处理 30 个输入缓冲区。在此示例中,Triton 后端中的 plan engine 模型 resnet18_trafficcamnet_pruned.onnx_b30_gpu0_int8.engine 可以支持最大 batch-size: 30。如果 Triton 模型不是使用 max_batch_size: >0 配置的非批处理模型,则需要确保 Gst-nvinferserver 和 deepstream-app 的配置文件中的批处理大小必须小于或等于 Triton 模型 triton_model_repo/${model}/config.pbtxt 中的 max_batch_size。如果 Triton 模型是使用 max_batch_size: 0 配置的非批处理模型,请参阅上面的非批处理支持问题。

#TODO 提及 EGLSink 错误,建议使用 nv3dsink 而不是 EGL