一、nvidia驱动安装:nvidia-smi
bug: could not communicate to nvidia driver 无法链接到驱动
原因:
- linux内核升级了,导致nvidia-drivier安装时的内核和当前内核版本不一致;需要重新安装驱动; uname -r 查看当前内核;
- ubuntu需要关闭内核更新 apt-mark hold linux-headers-xxx-gerneric linux-image-xxx-generic 这两个模块是内核相关的 再 /usr/src文件夹下
- 主机的secure boot没有disable,务必确保关闭。
二、opencv+contrib+cuda源码编译:
- gstreamer环境安装: apt install 一串串 参考videopipe的env.md
- linux opencv>4.6 需要安装4.6的版本,且要findpackage可以识别
教程:https://blog.csdn.net/weixin_54435584/article/details/126981559
2.1 opencv源码编译安装
要求:opencv>4.6 带cuda
因为网络推理使用的是opencv dnn的接口
- cache文件,直接放在opencv-4.6.0文件下即可,名称为.cache,解压之后,就直接编译就可以了。 我已经上传到资源了,需要自取https://download.csdn.net/download/weixin_64735714/89530489
- 百度网盘链接:链接:https://pan.baidu.com/s/1T5-zU7TQyaVpRWHonRP9rg?pwd=zebx 提取码:zebx
- 太省事了;opencv根据不同的显卡架构,选择编译选项;这里面是要有gstreamer的。
- 之后会将nvcc(cuda)、opencv460、videopipe的环境,打包为一个docker image镜像和一个docker container直接使用的,上传到百度云盘。TODO
# 先安装依赖
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff5.dev libswscale-dev libjasper-dev
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D WITH_TBB=ON \
-D ENABLE_FAST_MATH=1 \
-D CUDA_FAST_MATH=1 \
-D WITH_CUBLAS=1 \
-D WITH_CUDA=ON \
-D BUILD_opencv_cudacodec=OFF \
-D WITH_CUDNN=ON \
-D OPENCV_DNN_CUDA=ON \
-D CUDA_ARCH_BIN=6.1 \ # cuda显卡算力,这里需要修改,7.0 7.5 8.6 算力需要针对性修改
-D WITH_V4L=ON \
-D WITH_QT=OFF \
-D WITH_OPENGL=ON \
-D WITH_GSTREAMER=ON \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D OPENCV_PC_FILE_NAME=opencv.pc \
-D OPENCV_ENABLE_NONFREE=ON \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.6.0/modules \
-D INSTALL_PYTHON_EXAMPLES=OFF \
-D INSTALL_C_EXAMPLES=OFF \
-D WITH_FREETYPE=ON \
-D BUILD_EXAMPLES=OFF ..
最后要在环境中找到:需要make install
2.2 超级大坑:无freetype.hpp的解决办法,apt install libfreetype6-dev libharfbuzz-dev
- 最重要的是:要让opencv的CMake模块,也就是opencv_contrib/modules/freetype/CMakeLists.txt中FIND freetype harfbuzz,只有在found的情况下,才会编译libopencv_freetype.so库,所以这里要确保found很重要;最简单的就是apt的install安装,直接安装到环境中,pkg-config可以直接找到。所以关键的是要找到apt install的具体的包名是啥。
- opencv4.6.0编译成功之后,就可以去cmake videopipe工程了。
apt install libfreetype6-devBuilding HarfBuzz: HarfBuzz Manual
git clonehttps://github.com/harfbuzz/harfbuzz.git
有用的就只有这两条,然后opencv下面重新CMake,直到确认有了freetype found harfbuzz found就算OK了,才有可能去编译freetype的contrib module模块,才有可能生成linbopencv_freetype.so库,我靠,太烦了。
sudo apt install gcc g++ libfreetype6-dev libglib2.0-dev libcairo2-dev
apt install libharfbuzz-dev
sudo apt install gcc g++ libfreetype6-dev libglib2.0-dev libcairo2-devsudo apt-get install meson pkg-config gtk-doc-tools meson build meson compile -C build
三、其他环境依赖解决办法
3.1 cuda_runtime_api.h no such file 解决办法:cuda的环境变量,头文件/库文件/可执行文件,路径要加入到环境变量中去;但这里都是临时加入
永久加入,需要vim /etc/profile 是所有的用户;vim ~/.bashrc是当前用户;将export命令写入到这两个文件中,是永久生效的。
ERROR: cuda_runtime_api.h: No such file or directory_cuda-runtime-api.h error-CSDN博客
export CUDA_HOME = /usr/local/cuda-10.1
export CPATH=/usr/local/cuda-10.1/targets/x86_64-linux/include:$CPATH
export LD_LIBRARY_PATH=/usr/local/cuda-10.1/targets/x86_64-linux/lib:$LD_LIBRARY_PATH
export PATH=/usr/local/cuda-10.1/bin:$PATH
3.2 找不到NvInfer.h 解决办法:Tensorrt的头文件加入到库中
echo CPATH=/.../TensorRT/include:$CPATH
export CPATH=/usr/local/include/opencv4:$CPATH # opencv老是识别不了,吐血
加入到环境变量中就可以了
3.3 vscode debug:要修改launch.json里面的program名称为自己的bin下面的可执行文件
需要gdb有,才可以debug
apt-get install gdb
3.4 CMake warning no CUDA_ARCHITECTURES
cmake -DCMAKE_CUDA_ARCHITECTURES=86 -DCMAKE_CUDA_COMPILER=“/usr/local/cuda/bin/nvcc” 添加一个编译选项
3.5 no libnvinfer.so.8
库里面是Libnvinfer.so 所以创建软连接
ln -s libnvinfer.so libnvinfer.so.8
3.6 编译报错Could NOT find TBB (missing: TBB_INCLUDE_DIRS TBB_LIBRARIES)
在camke 里面添加:-D BUILD_TBB=ON 就会从github下载Tbb源码来编译,就OK了;要科学上网才能下在成功 2.6M左右。
用下面的没成功
编译一个工程的时候报错Could NOT find TBB (missing: TBB_INCLUDE_DIRS TBB_LIBRARIES)如下图: 解决办法: sudo apt-get update sudo apt-get install libtbb-dev
四、终极解决办法:docker images docekr container
将好不容易配好的环境打包为docker镜像和容器,下次直接使用。
- 2024年7月17日17:03:51 更新
- docker建立失败,感觉是tensorrt不能使用doceker的方式。——docker里面使用tensorrt,我有C++项目是成功推理实现了的。感觉路径是可行的。
- 这个videopipe的项目在docker中确实是失败了,同样的编译过程,同样的代码。拿到linux物理机中,就可以跑通。
- 但在docker中,就一直出现segmentation fault, tensorrt老挂在REGISTER_TENSORT_PLUGIN这里,老是段错误。跟tensorrt有关,不知道为啥。所以这个docker基本无法运行,只有放弃。
- 不知道编译好的opencv之后能否直接拿来make install。未知,这样可以少一个步骤。
- 打包容器和镜像的办法
docker save -o xxx.tar 镜像ID # docker镜像导出
# 不要使用docker save > xxx.tar 不好使,load的时候导入不了,会失败,亲测
docker load -i xxx.tar # docekr从tar包导入镜像
# docker将容器打包为镜像,最好将容器的建立命令也一起说明
docker export > xxx.tar
docker import < xxx.tar
# 容器中需要使用显卡时,需要使用nvidia-docker表面里面有显卡服务
NV_GPU=0 nvidia-docker run -it --name=zzz -v /local_data:/workspace -p 8000:22 --shm-size 8G --privileged=true image_name /bin/bash
# 容器打包为惊喜那个
docker commit 容器ID bevlane:v1.o # 容器ID bevlane是镜像名称 可能需要几分钟时间
apt配置环境
sudo apt-get install cuda-toolkit-11-8 libcudnn8=8.8.0.121-1+cuda11.8 libnvinfer8=8.5.3-1+cuda11.8 libnvinfer-plugin8=8.5.3-1+cuda11.8 libnvonnxparsers8=8.5.3-1+cuda11.8libnvparsers8=8.5.3-1+cuda11.8
4.1 Tensorrt版本要8.5,否则trt_yolo8不支持,一加载就挂
ubuntu下使用TensorRT,deb包本地安装,会安装到操作系统中,但这样只能安装一个版本的TensorRT,不可以多版本共存,想要同时使用不同的版本的话,需要tar包的方式安装。
NVIDIA TensorRT 8.x 下载 |NVIDIA 开发人员
4.1.1 查看cuda tensorrt cudnn的版本之间的依赖关系/支持关系
Support Matrix :: NVIDIA Deep Learning TensorRT Documentation
4.1.2 TensorRT8.5.3环境依赖
Support Matrix :: NVIDIA Deep Learning TensorRT 文档
- cuda: 10.2, 11.0~11.8
- cudnn:cudnn 8.6.0
- cuBLAS