Orin开发套件06-使用容器版DeepStream

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

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

  • Basedeepstream-l4t:6.1-base):作为DeepStream SDK一部分的插件、库以及依赖项,如CUDATensorRTGStreamer等,希望为自己创建Docker版的DeepStream应用程序用户,建议使用此映像。请注意,这个镜像不包含示例内容。
  • Samplesdeepstream-l4t:6.1-samples):在Base版的基础上添加范例的内容,包括C/C++开源代码、deepstream-app范例配置文件、模型文件与测试视频等,适合体验与学习用途的初学者使用。
  • IoTdeepstream-l4t:6.1-iot):在Base版上扩充IoT应用所需的环境,包括KafkaAzure IoTREDISMQTT等协议、DeepStream test5应用程序以及相关配置和模型,可启用多视频流应用程序,并将各种消息传递到服务器端进行统计分析。
  • Triton部署版deepstream-l4t:6.1-triton):这是配合Triton推理服务器使用的环境,开发者可以直接使用TensorFlowTensorFlow-TensorRTONNX-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”就表示镜像文件下载成功。

Orin开发套件06-使用容器版DeepStream

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

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

$

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

 

  1. 创建临时容器的指令

以下是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,放在最后面。

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

  1. 将源代码与范例复制到容器外

在容器中的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,正好是上面看到容器内所显示的编号。

Orin开发套件06-使用容器版DeepStream

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

 

$

$

$

 

$

# 在第二个命令终端

mkdir  -p  ~/deepstream

export  CONTAINER_ID=’根据实际编号

docker  cp  $CONTAINER_ID:/opt/nvidia/deepstream/deepstream/sources ~/deepstream/sources

docker  cp  $CONTAINER_ID:/opt/nvidia/deepstream/deepstream/samples ~/deepstream/samples

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

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

 

$

$

# 在第二个命令终端

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

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

Orin开发套件06-使用容器版DeepStream

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

 

$

# 在第三个命令终端

mkdir  -p  ~/deepstream/sources/outsideContainer

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

 

$

# 在第二个命令终端

ls  /opt/nvidia/deepstream/deepstream/sources

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

  1. 在容器内执行范例

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

 

$

# 在第二个命令终端

cd  /samples/configs/deepstream-app

deepstream-app  -c  source4_1080p_dec_infer-resnet_tracker_sgie_tiled_display_int8.txt

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

Orin开发套件06-使用容器版DeepStream

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

来源:业界供稿

0赞

好文章,需要你的鼓励

2022

08/12

15:40

分享

点赞

邮件订阅