(1)操作系统:Ubuntu 18.04;
(2)处理器:I7-10750H;
(3)GPU:GTX 1650Ti Mobile
(4)GPU支持:CUDA10.2,cudnn7.6.5,tensorrt6.0.1;
(5)PaddlePaddle源码版本:2.3;
(6)GCC版本:8.4.0;
(7)cmake版本:3.25.0。
参考PaddlePaddle官方编译指南。
(1)从gitee获取PaadlePaddle源码。
(2)使用apt安装libopenblas
apt install libopenblas
由于github访问问题,需要修改PaddlePaddle编译脚本,替换git地址为gitee的paddlemirror源。
https://gitee.com/paddle-mirror/
修改源码目录/cmake/external下面的脚本文件中的git源地址。
cryptopp;ctyptopp-cmake(包含在cryptopp的脚本文件);gflags;glog;gloo;lapack;protobuf;utf8proc;warpctc;xbyak;xxhash;zlib
(1)配置
1)GPU不使用TensorRT
cmake .. -DPY_VERSION=3 \
-DWITH_TESTING=OFF \
-DWITH_GPU=ON \
-DWITH_NCCL=OFF \
-DON_INFER=ON \
-DWITH_MKL=OFF \
-DWITH_PYTHON=OFF \
-DCUDA_CUDART_LIBRARY=/usr/local/cuda/lib64/libcudart.so \
-DCUDA_ARCHITECTURES=7.5 \
..
2)GPU使用TensorRT
cmake .. -DPY_VERSION=3 \
-DWITH_TESTING=OFF \
-DWITH_GPU=ON \
-DWITH_NCCL=OFF \
-DON_INFER=ON \
-DWITH_MKL=OFF \
-DWITH_PYTHON=OFF \
-DCUDA_CUDART_LIBRARY=/usr/local/cuda/lib64/libcudart.so \
-DCUDA_ARCHITECTURES=7.5 \
-DWITH_TENSORRT=ON \
-DTENSORRT_ROOT=/usr \
..
(2)设置ulimit
sudo sh -c "ulimit -n 102400 && exec su $LOGNAME"
(3)编译
编译openblas需要进行如下配置:
export OPENBLAS_NUM_THREADS=4
export GOTO_NUM_THREADS=4
export OMP_NUM_THREADS=4
正式编译PaddlePaddle
make -j4 TARGET=SKYLAKEX DYNAMIC_ARCH=1
编译PaddleInference
make inference_lib_dist -j4
使用PaddleDetection/deploy/cpp下的例程源码。复制出来一份。
(1)修改script/build.sh
# 是否使用GPU(即是否使用 CUDA)
WITH_GPU=ON
# 是否使用MKL or openblas,TX2需要设置为OFF
WITH_MKL=OFF
# TensorRT 的include路径
TENSORRT_INC_DIR=/usr/include/x86_64-linux-gnu
# TensorRT 的lib路径
TENSORRT_LIB_DIR=/usr/lib/x86_64-linux-gnu
# Paddle 预测库路径
PADDLE_DIR=~/Paddle-release-2.3/build_cuda/paddle_inference_install_dir
# CUDA 的 lib 路径
CUDA_LIB=/usr/local/cuda/lib64
# CUDNN 的 lib 路径
CUDNN_LIB=/usr/lib/x86_64-linux-gnu
#opencv路径
OPENCV_DIR=/usr/local/lib/cmake/opencv4
注意:由于我已经安装opencv4,PaddlePaddle官方默认下载使用opencv3,所以我把自动下载代码注释掉,直接设置OPENCV_DIR。
修改CMakeLists.txt
if (WIN32)
include_directories("${PADDLE_DIR}/paddle/fluid/inference")
include_directories("${PADDLE_DIR}/paddle/include")
link_directories("${PADDLE_DIR}/paddle/fluid/inference")
find_package(OpenCV REQUIRED PATHS ${OPENCV_DIR} NO_DEFAULT_PATH)
else ()
find_package(OpenCV REQUIRED PATHS ${OPENCV_DIR} NO_DEFAULT_PATH)
# find_package(OpenCV REQUIRED PATHS ${OPENCV_DIR}/share/OpenCV NO_DEFAULT_PATH)
include_directories("${PADDLE_DIR}/paddle/include")
link_directories("${PADDLE_DIR}/paddle/lib")
endif ()
include_directories(${OpenCV_INCLUDE_DIRS})
另一处是:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O2 -fopenmp -std=c++11")
优化编译应使用大写字母“O”。
然后运行./scripts/build.sh进行编译。
编译报错,提示opencv3的一些宏未定义,引入opencv头文件,使用opencv4的宏。
预测video时,提示VideoWriter指定的视频编码类型有误。修改main.cc文件,将编码类型改为-1,运行时将打印支持的视频编码类型。使用支持的视频编码类型的ID即可。
如果需要使用摄像头,需要修改:
if (FLAGS_model_dir.empty() ||
(FLAGS_image_file.empty() && FLAGS_image_dir.empty() &&
(FLAGS_camera_id == -1) &&
FLAGS_video_file.empty()))
测试命令(摄像头)
./build/main --model_dir=/home/user/PaddleDetection/inference_model/yolov3_darknet53_270e_coco --camera_id=0 --device=GPU --run_mode=trt_int8
测试命令(视频文件)
./build/main --model_dir=/home/user/PaddleDetection/inference_model/yolov3_darknet53_270e_coco --video_file=/home/user/zhangchen/test_media/videos/VID_20220612_085102.mp4 --device=GPU --run_mode=trt_int8
测试命令(图片)
./build/main --model_dir=/home/user/PaddleDetection/inference_model/yolov3_darknet53_270e_coco --image_file=/home/user/zhangchen/test_media/images/heying.jpeg --device=GPU
经测试,使用trt_int8模式比默认的paddle模式(GPU)快50%左右。
识别1920×1080分辨率视频:
trt_int8模式推理每帧70±5ms,整体每帧90±5ms;
paddle(GPU)模式推理每帧110±5ms,整体每帧130±5ms。
trt缺点:启动慢,约1分钟。