DST-dGPU:6.1镜像从拉取到使用

简述

由于任务需要在GPU服务上使用deepstream-sdk来运行视频分析业务, 由于之前已经走通了Deepstream-6.1在Orin盒子上的环境, 所以这次就直接选择6.1版本的镜像。但当拉取了镜像后,启动后发现了dGpu版本的镜像相较于Jetson平台下的补全了依赖库头文件缺失的问题, 但是同时也出现了一个cuda版本混乱的环境, 这里可以看下在/usr/local目录下cuda版本分布:
deepstream-6.1镜像内/usr/local目录详情
我这边也拉取了dst-6.1.1版本的环境确认了下,这个也是如此。 这个具体造成的问题就是会影响deepstream一些nvinfer-plugin的编译工作, 我这边经过一些尝试后找到的对应的解决方法, 且最终编译生成的各种库对最终pipeline的运行是没有影响的,所以这里把自己遇到的问题和解决方案都记录下,主要也是为了备忘;
整个文章的脉络将从镜像拉取,启动以及pyds的安装, 最后以解决objectDetector_Yolo编译遇到的问题结束;

开始折腾

拉取deepstream-6.1镜像

这里可以直接在nvidia的NGC网站搜索关键字:deepstream
在这里插入图片描述
这里要选择的是第一个, 末尾带l4t的是针对Jetson环境的, 对于该环境下的docker容器使用, 后续在本系列同样会推出。点击第一个进入对应页面, 选择上述的Tags就可以选择自己需要版本的deepstream镜像了:在这里插入图片描述
这里我们拉取的是6.1-samples, 这个镜像内包含了所需的各种依赖库环境, 包括基本的GStreamer环境,tensorrt环境等:

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

启动镜像

如果你这边启动容器是服务器,也就是终端控制台的方式非x11可视化显示的方法,下面xhost +这个可加可不加,如果是没有安装相关的显示依赖库, 这个命令是没有任何作用的:

xhost +
docker run --gpus all --restart=always -itd --net=host --log-opt max-file=3 --name dst-foo --runtime nvidia  --shm-size=25g  -e DISPLAY=$DISPLAY -w /opt/nvidia/deepstream/deepstream-6.1 -v /tmp/.X11-unix/:/tmp/.X11-unix  nvcr.io/nvidia/deepstream:6.1-samples /bin/bash

上面这个启动命令中一些选项我是沿用了在Jetson中启动的方式, 避免踩新的坑, 其中xhost +选项和–net=host配置在jetson环境下如果不加,就无法正常调用eglsink进行显示检测结果, 整个pipeline无法正常启动, 但如果你启动pipeline是通过ssh,并且流水线中没有调用egl显示的节点, 那么流水线是可以正常启动的, 比如,你的流水线的结尾是fpsdisplay,即fps统计element,这个是不影响。但当你是在主机接了显示器可显示系统桌面,运行镜像没有使用xhost+和–net=host,在流水线中不管是否使用到了eglsink,都会出现以下错误:在这里插入图片描述

安装pyds

deepstream-6.1这个版本的一个好处就是官方提供了一个现成的whl安装包, 可通过Nvidia-github的release页面进行下载, 这里我们选择的是v1.1.2, 即适配deepstream6.1版本的x86_64的pyds安装包:
在这里插入图片描述
可使用wget命令进行下载, 然后使用pip进行安装, 如果提示没有对应的工具,可使用以下命令进行安装:

apt-get update
apt-get install wget
apt-get install python3-pip

在使用pip安装pyds的时候会出现以下错误:
在这里插入图片描述
在网上搜索的解决方法无非就是apt-get update, install build-essential等方法, 这些都没有用, 最后发现需要安装cairo的开发库, 使用以下命令即可:

apt-get update
apt-get install libcairo-dev

安装成功后,再执行pip安装命令,即可完成pyds的安装:
在这里插入图片描述

gi.require_version(‘Gst’, ‘1.0’)错误

deepstream本身是基于GStreamer框架扩展开发的一个流媒体AI分析框架, 所以再使用过程中整体还是要使用GStreamer本身的框架来进行构建应用,一般使用GStreamer-python的接口的一般步骤如下:

import gi
gi.require_version('Gst', '1.0')
from gi.repository import GObject, Gst

但在Deepstream-6.1镜像中将会产生以下错误:在这里插入图片描述
解决该问题只需要安装对应的gstreamer-1.0相关的依赖库即可:

apt-get install gstreamer-1.0

编译sources/objectDetector_SSD/nvdsinfer_custom_impl_ssd错误

Makefile:25: *** “CUDA_VER is not set”. Stop.

需要设置CUDA的版本, 该版本好主要是在Makefile中查找对应的头文件和库文件路径使用, 一般Deepstream镜像中cuda相关的库位于/usr/local/下cuda-*的目录下:
在这里插入图片描述

这里经过尝试发现只有cuda-11.1的头文件是完整的, 但是lib库文件则是使用非cuda-11.1之外的都可使用, 另外, 如果使用的CMakeList进行构建cuda相关程序时使用了:

find_package(CUDA REQUIRED)

会出现以下错误:
在这里插入图片描述
此时只需要执行下述构建方法即可:

cmake -D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-11.1

这里需要用到cuda-11.1目录下bin文件夹下的nvcc相关的可执行文件, 所以需要指定, 而其他的cuda-*目录下没有相关的文件, 所以在编译时需要将/opt/nvidia/deepstream/deepstream-6.1/sources/objectDetector_Yolo/nvdsinfer_custom_impl_Yolo/Makefile进行修改, 首先这边指定的头文件和库文件出现了版本混用的情况,所以就需要先把Makefile中CUDA_VER变量的相关信息修改为cuda-11.1:
在这里插入图片描述
此时按照之前所说,将头文件路径设置为cuda-11.1, 库文件这里设置为cuda:

CC:= g++
NVCC:=/usr/local/cuda-11.1/bin/nvcc

CFLAGS:= -Wall -std=c++11 -shared -fPIC -Wno-error=deprecated-declarations
CFLAGS+= -I../../includes -I/usr/local/cuda-11.1/include

LIBS:= -lnvinfer_plugin -lnvinfer -lnvparsers -L/usr/local/cuda/lib64 -lcudart -lcublas -lstdc++fs
LFLAGS:= -shared -Wl,--start-group $(LIBS) -Wl,--end-group

INCS:= $(wildcard *.h)
SRCFILES:= nvdsinfer_yolo_engine.cpp \
           nvdsparsebbox_Yolo.cpp   \
           yoloPlugins.cpp    \
           trt_utils.cpp              \
           yolo.cpp              \
           kernels.cu
TARGET_LIB:= libnvdsinfer_custom_impl_Yolo.so

TARGET_OBJS:= $(SRCFILES:.cpp=.o)
TARGET_OBJS:= $(TARGET_OBJS:.cu=.o)

all: $(TARGET_LIB)

%.o: %.cpp $(INCS) Makefile
        $(CC) -c -o $@ $(CFLAGS) $<

%.o: %.cu $(INCS) Makefile
        $(NVCC) -c -o $@ --compiler-options '-fPIC' $<

$(TARGET_LIB) : $(TARGET_OBJS)
        $(CC) -o $@  $(TARGET_OBJS) $(LFLAGS)

clean:
        rm -rf $(TARGET_LIB)

此时使用make将会触发一个库文件丢失的错误:
在这里插入图片描述
解决该文件只需要在/usr/local/cuda/lib64下创建一个对应的软件链接即可:

ln -s libcublas.so.11 libcublas.so

此时运行make, 即可完成编译生成对应的库文件:
在这里插入图片描述

总结

在解决这些编译相关的问题过程中,尝试了很多的方法, 最大的感触就是国内的某度引擎基本搜不到相关的解决方案。 另外, 一定要多看下Deepstream的官方论坛上的一些回复, 基本90%的问题都可以得到很好的解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值