DeepStream Samples版的操作环境调试过程

描述

NVIDIA 的 DeepStream 是目前业界最好开发而且功能强大的 AI 视频分析工具,在 NGC 上 https://catalog.ngc.nvidia.com/orgs/nvidia/containers/deepstream-l4t 为 Jetson 提供 4 个可使用的版本,分别如下:

 

  • Base 版(deepstream-l4t:6.1-base):作为 DeepStream SDK 一部分的插件、库以及依赖项,如 CUDA、TensorRT、GStreamer 等,希望为自己创建 Docker 版的 DeepStream 应用程序用户,建议使用此映像。请注意,这个镜像不包含示例内容。

  • Samples 版(deepstream-l4t:6.1-samples):在 Base 版的基础上添加范例的内容,包括 C/C++ 开源代码、deepstream-app 范例配置文件、模型文件与测试视频等,适合体验与学习用途的初学者使用。

  • IoT 版(deepstream-l4t:6.1-iot):在 Base 版上扩充 IoT 应用所需的环境,包括 Kafka、Azure IoT、REDIS 和 MQTT 等协议、DeepStream test5 应用程序以及相关配置和模型,可启用多视频流应用程序,并将各种消息传递到服务器端进行统计分析。

  • Triton 部署版(deepstream-l4t:6.1-triton):这是配合 Triton 推理服务器使用的环境,开发者可以直接使用 TensorFlow、TensorFlow-TensorRT 与 ONNX-RT 等方式进行推理计算。

 

从上面的描述中可以看出 Samples 版本镜像适合绝大部分初学者的使用,现在就以这个镜像来做说明。

 

1、下载镜像:

 

这里使用 JetPack 5.0 版的 Jetson Orin 开发套件,可以使用 DeepStream-6.1 版的容器,可以从 https://catalog.ngc.nvidia.com/orgs/nvidia/containers/deepstream-l4t 网页右上角 “Pull Tag” 按钮中,选择 “6.1-samples” 选项,这时就已经将执行指令复制到缓冲区,然后粘贴在 Jetson 上的命令终端,指令内容如下:

 

  •  
docker  pull  nvcr.io/nvidia/deepstream-l4t:6.1-samples

 

这样就能从 NGC 服务器将 deepstream-l4t:6.1-samples 镜像文件下载到 Jetson 设备上。下载完毕之后,执行以下指令看看结果:

 

  •  
docker  images

 

如下图 TAG 栏中显示 “6.1-samples” 就表示镜像文件下载成功。

 

容器

 

到此只是将镜像文件下载到本地,但还不是可执行的容器状态,接着就要使用 Docker 指令来创建工作容器。

 

如果是使用 JetPack 4.6.x 版的其他 Jetson 设备时,目前只能使用 DeepStream-6.0.1 版本,请使用以下指令下载镜像文件到 Jetson 设备上:

 

  •  
docker  pull  nvcr.io/nvidia/deepstream-l4t:6.0.1-samples

 

2、创建临时容器的指令:

 

以下是 NVIDIA 官方所提供的创建容器指令,由于指令内容较长,建议写入 .sh 脚本中会比较方便执行:

 

  •  
  •  
  •  
  •  
# 允许外部应用程序连接到主机的X显示器:xhost +# 允许外部应用程序连接到主机的X显示器:docker  run  -it  --rm  --net=host --runtime nvidia  -e  DISPLAY=$DISPLAY        -w  /opt/nvidia/deepstream/deepstream-6.1  -v /tmp/.X11-unix/:/tmp/.X11-unix  nvcr.io/nvidia/deepstream-l4t:6.1-samples

 

以下对这段指令进行基本说明:

 

  • 使用 “docker run” 组合指令来创建容器;

 

  • 中间的参数可以用 “docker run --help” 查看,这里使用以下几个参数:

 

-it:启动互动式(-i)的终端(-t);

--rm:退出容器之后自动移除;

--net:让容器内网络使用指定网络,这里指定 “host” 表示共用 Jetson 设备网络;

--runtime:指定执行时的方式,这里指定为 “nvidia” 其实可以省略;

-e:配置环境变量,这里指定容器内 DISPLAY 变量为设备的 $DISPLAY 变量内容;

-w:指定容器内的工作目录,进入容器就会直接进入到这个工作目录下;

-v:将容器内的目录与容器外的目录形成映射;

 

  • 镜像的完整路径(nvcr.io/nvidia/deepstream-l4t:6.1-samples),放在最后面。

 

这样的指令有个最大的缺点,就是每次启动都只能是个临时用途的容器,一旦退出之后就会删除工作容器,表示过程中所有执行修改与步骤都将付之一炬,因此这样指令适合做简单的测试用途,但并不适合作为开发阶段的使用,必须做些调整。

 

3、将源代码与范例复制到容器外:

 

在容器中的 DeepStream 源代码有两个部分:

 

  • Sources:在容器内 /opt/nvidia/deepstream/deepstream/sources

  • Samples:在容器内 /opt/nvidia/deepstream/deepstream/samples

 

我们先将这两个部分的内容复制到容器外,然后启动容器的时候再用 “-v” 进行路径映射,这样过程中修改的内容就会保存在容器外,即便退出后销毁容器也没关系。不过这个复制的过程必须在 “容器启动” 的状态下执行,可以先执行下面最简单的容器启动指令:

 

  •  
  •  
# 在第一个命令终端docker  run  -it  --rm  nvcr.io/nvidia/deepstream-l4t:6.1-samples

 

现在进入容器之内,可能看到以下的显示信息:

 

  •  
root@1c03f4d7628a:/opt/nvidia/deepstream/deepstream-6.1#

 

“1c03f4d7628a” 是这个容器目前的编号,现在需要开启一个指令终端进行操作,这个过程是在容器外进行处理,请执行以下指令列出执行中的容器编号与状态:

 

  •  
  •  
# 在第二个命令终端docker  ps

 

下图显示目前有个正在执行的容器,其编号(CONTAINER ID)为 1c03f4d7628a,正好是上面看到容器内所显示的编号。

 

容器

 

现在执行以下指令,将容器内的 sources 与 samples 目录内容,复制到容器外的指定路径之下,例如 ~/deepstream/sources~/deepstream/samples

 

  •  
  •  
  •  
  •  
  •  
# 在第二个命令终端mkdir  -p  ~/deepstream export  CONTAINER_ID=’根据实际编号’docker  cp  $CONTAINER_ID:/opt/nvidia/deepstream/deepstream/sources ~/deepstream/sourcesdocker  cp  $CONTAINER_ID:/opt/nvidia/deepstream/deepstream/samples ~/deepstream/samples

 

现在看看在 Jetson 设备上 ~/deepstream 目录下是否多了 sources 与 samples 两个目录?比对一下里面的内容是否与容器内的一致。

 

接下来就可以调整一下执行的指令,让所有的代码与配置文件的修改部分,保留在容器外面,这样过程中的修改就不会白白浪费。请执行以下指令创建另一容器:

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
# 在第二个命令终端sudo  xhost +docker  run  -it  --rm  --net=host  --runtime  nvidia  -e  DISPLAY=$DISPLAY -w  /opt/nvidia/deepstream/deepstream  -v /tmp/.X11-unix/:/tmp/.X11-unix -v  ~/deepstream/sources:/opt/nvidia/deepstream/deepstream/sources -v  ~/deepstream/samples:/opt/nvidia/deepstream/deepstream/samples nvcr.io/nvidia/deepstream-l4t:6.1-samples

 

现在再开启一个指令窗口,执行以下指令检查以下容器的状态:

 

  •  
  •  
# 在第三个命令终端docker  ps

 

应该会看到类似下面截屏中的两个 “执行中容器” 的信息:

 

容器

 

在容器外试着在 ~/deepstream/sources 目录下添加个子目录:

 

  •  
  •  
# 在第三个命令终端mkdir  -p  ~/deepstream/sources/outsideContainer

 

然后到第二个终端里执行以下指令,看看是否也多了 “outsideContainer” 目录?

 

  •  
  •  
# 在第二个命令终端ls  /opt/nvidia/deepstream/deepstream/sources

 

如果能对应的上,就表示后面在容器内修改的代码文件,都存放在容器外面的指定路径下,这样就不用担心每次退出容器之后的问题。

 

4、在容器内执行范例

 

现在就在第二个终端里执行 DeepStream 的标准范例,请执行以下指令:

 

  •  
  •  
  •  
# 在第二个命令终端cd  /samples/configs/deepstream-appdeepstream-app  -c  source4_1080p_dec_infer-resnet_tracker_sgie_tiled_display_int8.txt

 

就能看到下面这个大家相当熟悉的执行结果。

 

 

 

以上就完成 DeepStream Samples 版的操作环境调试过程,开发人员可以在容器外用编辑器去修改配置文件或 C/C++ 源代码,然后在容器内执行编译或操作,这样就会非常方便。

  审核编辑:汤梓红


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分