参考链接:

MMDeploy安装、python API测试及C++推理_mmdeploy c++-CSDN博客

记录--MMDeploy安装、python API测试及C++推理_mmdeploy c++-CSDN博客

https://mmdeploy.readthedocs.io/zh-cn/stable/01-how-to-build/linux-x86_64.html

一、环境配置

1.基础环境配置

CUDA=11.8,

TensorRT=8.6.1

cmake = 3.25.0

GCC = 9

ubuntu = 20.04

python=3.8.20 :conda create -name mmdeploy2 python=3.8

pytorch:  pip install torch==2.0.0 torchvision==0.15.1 torchaudio==2.0.1 --index-url https://download.pytorch.org/whl/cu118

2.MMdepoloy版本的选择,主要分为两个版本第一个版本为0.x和1.x,两个方式的git的方式不同

0.x:

git clone -b master https://github.com/open-mmlab/mmdeploy.git MMDeploy

1.x:

git clone -b main https://github.com/open-mmlab/mmdeploy.git MMDeploy

其中个各个版本存在一定的对应关系:https://github.com/open-mmlab/mmdeploy/blob/main/README_zh-CN.md

本文版本:

mmdeploy:1.3.1

mmcv:2.0.0rc4

mmengine:0.10.7

mmdet:3.1.0

mmocr:1.0.1

3.创建conda环境

conda create -n mmdeploy python=3.8.20

conda activate mmdeploy

pip install torch==2.0.0 torchvision==0.15.1 torchaudio==2.0.1 --index-url https://download.pytorch.org/whl/cu118

进入git下来的MMdeploy文件当中,输入:

pip install -e .

pip install mmcv==2.0.0rc4

pip install mmengine==0.10.7

pip install mmdet==3.1.0

pip install mmocr==1.0.1

4.安装系统基础支持包

(根据系统报错,缺什么安装什么)

sudo apt-get update
sudo apt-get install libspdlog-dev libopencv-dev

安装ppl.cv

git clone https://github.com/openppl-public/ppl.cv.git
cd ppl.cv
export PPLCV_DIR=$(pwd)
git checkout tags/v0.7.0 -b v0.7.0
./build.sh cuda

安装ONNXRuntime (必须为1.8.1) (加上-gpu都会报错)

安装ONNXRuntime的python包:

pip install onnxruntime==1.8.1



安装ONNXRuntime的预编译包:(cd xxxx # xxxx表示存放ONNXRuntime编译包的地址)
 
 

wget https://github.com/microsoft/onnxruntime/releases/download/v1.8.1/onnxruntime-linux-x64-1.8.1.tgz
tar -zxvf onnxruntime-linux-x64-1.8.1.tgz

二、推理测试

1.mmdet

1.1 mmdet-sdk建立

1.激活mmdeploy环境

2.设置环境变量的地址 根据实际安装地址设置
# 设置PATH和库目录 (在~/.bashrc中设置就不需要每次导入)

export ONNXRUNTIME_DIR=/root/onnxruntime-linux-x64-1.8.1
export LD_LIBRARY_PATH=$ONNXRUNTIME_DIR/lib:$LD_LIBRARY_PATH
export DTENSORRT_DIR=/root/Downloads/TensorRT-8.2.3.0
export LD_LIBRARY_PATH=$DTENSORRT_DIR/lib:$LD_LIBRARY_PATH

export PATH=/usr/local/cuda-11.1/bin:${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.1/lib64:${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

3.编译自定义算子 (报错的话缺什么补什么)

# 进入MMDeploy根目录下
cd ${MMDEPLOY_DIR}

# 新建并进入build文件夹 
mkdir -p build && cd build

# 编译自定义算子

cmake \
-DMMDEPLOY_TARGET_BACKENDS="ort;trt" \
-DTENSORRT_DIR=/home/ljj/ljj/nvidia/TensorRT-8.6.1.6 \
-DCUDNN_DIR=${CUDNN_DIR} \
-DONNXRUNTIME_DIR=/home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/onnxruntime-linux-x64-1.8.1 ..

make -j$(nproc)

4.编译SDK

# 编译MMDeploy SDK (cmake这步有时容易出bug,可能需要再执行一遍cmake操作,再执行make操作)
cmake .. \ -DMMDEPLOY_BUILD_SDK=ON \ -DCMAKE_CXX_COMPILER=g++-9 \
-DTENSORRT_DIR=/home/ljj/ljj/nvidia/TensorRT-8.6.1.6 \
-DMMDEPLOY_TARGET_BACKENDS="ort;trt" \
-DMMDEPLOY_CODEBASES=mmdet \ -DCUDNN_DIR=${CUDNN_DIR} \
-DMMDEPLOY_TARGET_DEVICES="cuda;cpu" \
-DONNXRUNTIME_DIR=/home/ljj/ljj-project/Pycharm/mmlabel/MMDeploy/onnxruntime-linux-x64-1.8.1 \
-Dpplcv_DIR=/home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/ppl.cv/cuda-build/install/lib/cmake/ppl
 
make -j$(nproc) 
make install

1.2.获取.engine文件

# 调用pythonAPI 转换模型: pytorch→onnx→engine

python tools/deploy.py \
configs/mmdet/detection/detection_tensorrt_dynamic-320x320-1344x1344.py \
/home/ljj/ljj-project/Pycharm/mmlabel2/mmdetection-3.3.0/configs/faster_rcnn/faster-rcnn_r50_fpn_1x_coco.py \ 
/home/ljj/ljj-project/Pycharm/mmlabel2/mmdetection-3.3.0/weight/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth \ 
/home/ljj/ljj-project/Pycharm/mmlabel2/mmdetection-3.3.0/demo/demo.jpg \ 
--work-dir work_dirs/faster_rcnn/ --device cuda --show --dump-info

1.3.使用C++程序进行推理

手动在github上面下载 mmdetection 3.3.0压缩包与模型权重文件
 

# 进入MMDeploy根目录
cd ${MMDEPLOY_DIR} 
 
## 以后可以从这部分开始运行
# 进入example文件夹
cd build/install/example/cpp

# 编译object_detection.cpp
mkdir -p build && cd build
cmake -DMMDeploy_DIR=/home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/build/install/lib/cmake/MMDeploy ..
make object_detection

2.mmocr

2.1 MMOCR-SDK建立

2.1.1.激活mmdeploy环境
2.1.2 设置环境变量的地址
# 根据实际安装地址设置
# 设置PATH和库目录 (在~/.bashrc中设置就不需要每次导入)
export ONNXRUNTIME_DIR=/root/onnxruntime-linux-x64-1.8.1
export LD_LIBRARY_PATH=$ONNXRUNTIME_DIR/lib:$LD_LIBRARY_PATH
export DTENSORRT_DIR=/root/Downloads/TensorRT-8.2.3.0
export LD_LIBRARY_PATH=$DTENSORRT_DIR/lib:$LD_LIBRARY_PATH
export PATH=/usr/local/cuda-11.1/bin:${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.1/lib64:${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
2.1.3.编译自定义算子 (报错的话缺什么补什么)


 

# 进入MMDeploy根目录下
cd ${MMDEPLOY_DIR}

# 新建并进入build文件夹 
mkdir -p build && cd build

# 编译自定义算子
cmake \
-DMMDEPLOY_TARGET_BACKENDS="ort;trt" \
-DTENSORRT_DIR=/home/ljj/ljj/nvidia/TensorRT-8.6.1.6 \
-DCUDNN_DIR=${CUDNN_DIR} \
-DONNXRUNTIME_DIR=/home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/onnxruntime-linux-x64-1.8.1 ..

make -j$(nproc)

2.1.4 MMDeploy SDK
# 编译MMDeploy SDK (cmake这步有时容易出bug,可能需要再执行一遍cmake操作,再执行make操作)
cmake .. \
-DMMDEPLOY_BUILD_SDK=ON \
-DCMAKE_CXX_COMPILER=g++-9 \
-DTENSORRT_DIR=/home/ljj/ljj/nvidia/TensorRT-8.6.1.6 \
-DMMDEPLOY_TARGET_BACKENDS="ort;trt" \
-DMMDEPLOY_CODEBASES=mmocr \
-DCUDNN_DIR=${CUDNN_DIR} \
-DMMDEPLOY_TARGET_DEVICES="cuda;cpu" \
-DONNXRUNTIME_DIR=/home/ljj/ljj-project/Pycharm/mmlabel/MMDeploy/onnxruntime-linux-x64-1.8.1 \
-Dpplcv_DIR=/home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/ppl.cv/cuda-build/install/lib/cmake/ppl  

make -j$(nproc) 

make install

2.2 获取.engine文件

# 进入MMDeploy根目录
cd ${MMDEPLOY_DIR}

cd mmdeploy

# 下载模型权重与模型转换文件
pip install openmim
mim download mmocr --config dbnet_resnet18_fpnc_1200e_icdar2015 --dest .

# convert mmocr model to onnxruntime model with dynamic shape
python tools/deploy.py \
    configs/mmocr/text-detection/text-detection_onnxruntime_dynamic.py \
    /home/ljj/ljj-project/Pycharm/mmlabel2/mmocr-1.0.1/weight2/dbnet_resnet18_fpnc_1200e_icdar2015.py \
    /home/ljj/ljj-project/Pycharm/mmlabel2/mmocr-1.0.1/weight2/dbnet_resnet18_fpnc_1200e_icdar2015_20220825_221614-7c0e94f2.pth \
    demo/resources/text_det.jpg \
    --work-dir mmdeploy_models/mmocr/dbnet/ort \
    --device cpu \
    --show \
    --dump-info


cd mmdeploy

# download crnn model from mmocr model zoo
mim download mmocr --config crnn_mini-vgg_5e_mj --dest .

# convert mmocr model to onnxruntime model with dynamic shape
python tools/deploy.py \
    configs/mmocr/text-recognition/text-recognition_onnxruntime_dynamic.py \
    /home/ljj/ljj-project/Pycharm/mmlabel2/mmocr-1.0.1/weight2/crnn_mini-vgg_5e_mj.py \
    /home/ljj/ljj-project/Pycharm/mmlabel2/mmocr-1.0.1/weight2/crnn_mini-vgg_5e_mj_20220826_224120-8afbedbb.pth \
    demo/resources/text_recog.jpg \
    --work-dir mmdeploy_models/mmocr/crnn/ort \
    --device cpu \
    --show \
    --dump-info

2.3 使用C++程序进行推理

# 进入example文件夹
cd build/install/example/cpp

# 编译object_detection.cpp
mkdir -p build && cd build
cmake \
-DMMDeploy_DIR=/home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/build/install/lib/cmake/MMDeploy \
-DTENSORRT_DIR=/home/ljj/ljj/nvidia/TensorRT-8.6.1.6 \
-DCUDNN_DIR=/usr/local/cuda \
-DCUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda \
-DONNXRUNTIME_DIR=/home/ljj/ljj-project/Pycharm/mmlabel/MMDeploy/onnxruntime-linux-x64-1.8.1 \
-Dpplcv_DIR=/home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/ppl.cv/cuda-build/install/lib/cmake/ppl \
..

make ocr

export LD_LIBRARY_PATH=/home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/onnxruntime-linux-x64-1.8.1/lib:$LD_LIBRARY_PATH

./ocr cpu /home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/mmdeploy_models/mmocr/dbnet/ort/ /home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/mmdeploy_models/mmocr/crnn/ort/ /home/ljj/ljj-project/Pycharm/mmlabel2/mmocr-1.0.1/demo/demo_text_ocr.jpg

错误记录:

1. ONNXRUNTIME

(base) ljj@Legion:~/ljj-project/Pycharm/mmlabel/MMDeploy/build/install/example/cpp/build$ ./object_detection cuda /home/ljj/ljj-project/Pycharm/mmlabel/MMDeploy/work_dirs/faster_rcnn/ /home/ljj/ljj-project/Pycharm/mmlabel/MMDet/demo/demo.jpg
./object_detection: error while loading shared libraries: libonnxruntime.so.1.8.1: cannot open shared object file: No such file or directory

解决方法:
添加ONNXRUNTIME的安装路径:

export LD_LIBRARY_PATH=/home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/onnxruntime-linux-x64-1.8.1/lib:$LD_LIBRARY_PATH

2. CMake

CMake Error at csrc/mmdeploy/core/CMakeLists.txt:15 (add_subdirectory):
  The source directory

    /home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/third_party/spdlog

  does not contain a CMakeLists.txt file.

CMake Error at csrc/mmdeploy/core/CMakeLists.txt:16 (set_target_properties):
  set_target_properties Can not find target to add properties to: spdlog

CMake Error at csrc/mmdeploy/core/CMakeLists.txt:18 (target_compile_options):
  Cannot specify compile options for target "spdlog" which is not built by
  this project.

CMake Error at csrc/mmdeploy/core/CMakeLists.txt:72 (target_include_directories):
  Cannot specify include directories for target "spdlog" which is not built
  by this project.
 

解决方法:
 

sudo apt update
sudo apt install libspdlog-dev

3.CMake

CMake Error at csrc/mmdeploy/core/CMakeLists.txt:76 (target_link_libraries):
  Target "mmdeploy_core" links to:

    spdlog::spdlog

  but the target was not found.  Possible reasons include:

    * There is a typo in the target name.
    * A find_package call is missing for an IMPORTED target.
    * An ALIAS target is missing.
解决方法:

git submodule update --init --recursive

4.在导出模型时报错

    assert is_available(), (
AssertionError: TensorRT is not available, please install TensorRT and build TensorRT custom ops first.
07/28 13:26:10 - mmengine - ERROR - /home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/mmdeploy/apis/core/pipeline_manager.py - pop_mp_output - 80 - `mmdeploy.apis.utils.utils.to_backend` with Call id: 1 failed. exit.

解决方案:
要安装python_tensort,直接找到安装好的TensorRT的安装包中找到对应python版本的TensorRT即可,
 

cd TensorRT-8.6.1.6/python

pip install tensorrt-8.6.1-cp38-none-linux_x86_64.whl 

5.cmake

CMake Error at /home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/build/install/lib/cmake/MMDeploy/modules/FindTENSORRT.cmake:7 (message):
  Please set TENSORRT_DIR with cmake -D option.
Call Stack (most recent call first):
  /home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/build/install/lib/cmake/MMDeploy/MMDeployConfig.cmake:42 (find_package)
  CMakeLists.txt:6 (find_package)

解决方案:
在指令处添加TensorRT路径

-DTENSORRT_DIR=/home/ljj/ljj/nvidia/TensorRT-8.6.1.6 

6.cmake

CMake Error at /home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/build/install/lib/cmake/MMDeploy/modules/FindCUDNN.cmake:18 (message):
  Couldn't find cuDNN in CUDNN_DIR: , or in CUDA_TOOLKIT_ROOT_DIR: , please
  check if the path is correct.
Call Stack (most recent call first):
  /home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/build/install/lib/cmake/MMDeploy/MMDeployConfig.cmake:43 (find_package)
  CMakeLists.txt:6 (find_package)
解决方案:

添加CUDA路径

-DCUDNN_DIR=/usr/local/cuda 

7.make错误

/usr/bin/ld: warning: libonnxruntime.so.1.8.1, needed by /home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/build/install/lib/libmmdeploy.so.1.3.1, not found (try using -rpath or -rpath-link)
/usr/bin/ld: /home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/build/install/lib/libmmdeploy.so.1.3.1: undefined reference to `OrtGetApiBase@VERS_1.8.1'
collect2: error: ld returned 1 exit status
make[3]: *** [CMakeFiles/object_detection.dir/build.make:152:object_detection] 错误 1
make[2]: *** [CMakeFiles/Makefile2:87:CMakeFiles/object_detection.dir/all] 错误 2
make[1]: *** [CMakeFiles/Makefile2:94:CMakeFiles/object_detection.dir/rule] 错误 2
make: *** [Makefile:169:object_detection] 错误 2

解决方案:

pip install onnxruntime==1.8.1

导入libonnxruntime.so.1.8.1所在的文件目录即可

export LD_LIBRARY_PATH=/home/ljj/ljj-project/Pycharm/mmlabel2/MMDeploy/onnxruntime-linux-x64-1.8.1/lib:$LD_LIBRARY_PATH


 

更多推荐