• PaadleInference源码编译操作流程


    1  编译环境

    (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。

    2  编译准备

    参考PaddlePaddle官方编译指南。

    (1)从gitee获取PaadlePaddle源码。

    (2)使用apt安装libopenblas

    apt install libopenblas

    3  修改PaddlePaddle编译脚本

    由于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

    4  编译

    (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

    5  编译PaddleInference例程

    使用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分钟。

  • 相关阅读:
    [HDLBits] Fsm serialdp
    Linux主机间的相互免秘钥
    Spring AOP的介绍与实现
    CSS 解决单词之间空隙很大的问题
    LeetCode每日一题——754. 到达终点数字
    mysql5.7安装配置教程(一看就会)
    数据结构与算法之Python实现——单链表
    java构建树
    关于进程、线程、协程、同步、异步、阻塞、非阻塞、并发、并行、串行的理解
    X86函数调用模型分析
  • 原文地址:https://blog.csdn.net/Zhangchen9091/article/details/127982945