mmdeploy之Jetson Xavier AGX/NX Jetpack4.6.1部署

1 mmdeploy在jetpack4.6.1上安装流程

本文没有按照官方的教程使用conda环境,本文直接使用系统自带的python3.6.9

1.1 安装pytorch和torch-version

可以在jest zoo下载预编译好的深度学习框架,如:torch、tensorflow、mxnet等。本文使用的是torch1.10.0,对应的torch-version为0.11.1。

安装pytorch-1.10.0

pip3 install torch-1.10.0-cp36-cp36m-linux_aarch64.whl

安装依赖包

sudo apt-get install libjpeg-dev zlib1g-dev libpython3-dev libavcodec-dev libavformat-dev libswscale-dev libopenblas-base libopenmpi-dev libssl-dev  -y
pip3 install pillow==8.4.0

安装torch version【pytorch和vision的对应关系

wget https://github.com/pytorch/vision/archive/refs/tags/v0.11.1.zip
unzip vision-0.11.1.zip
cd torchvision
export BUILD_VERSION=0.11.1
pip install -e .

1.2 升级cmake

sudo apt-get purge cmake -y  # 移除历史cmake
export CMAKE_VER=3.23.1
export ARCH=aarch64
wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VER}/cmake-${CMAKE_VER}-linux-${ARCH}.sh
chmod +x cmake-${CMAKE_VER}-linux-${ARCH}.sh
sudo ./cmake-${CMAKE_VER}-linux-${ARCH}.sh --prefix=/usr --skip-license
cmake --version  # 查看是否安装成功

1.3 设置环境变量

echo -e '\n# set environment variable for TensorRT' >> ~/.bashrc
echo 'export TENSORRT_DIR=/usr/include/aarch64-linux-gnu' >> ~/.bashrc
echo -e '\n# set environment variable for CUDA' >> ~/.bashrc
echo 'export PATH=$PATH:/usr/local/cuda/bin' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64' >> ~/.bashrc
source ~/.bashrc

1.4 编译安装mmcv【大约需要1.5小时】

git clone --branch v1.4.0 https://github.com/open-mmlab/mmcv.git
cd mmcv
MMCV_WITH_OPS=1 pip3 install -e .

1.5 安装onnx

生成的onnx是通过protobuf序列化的,所以需要安装protobuf
安装protobuf

【注意,3.20.0太新,编译时会报错,所以将版本见到3.19.4】
git clone -b v3.19.4 https://github.com/protocolbuffers/protobuf.git
cd protobuf
git submodule update --init --recursive
./autogen.sh
./configure
make -j$(nproc) && make install
ldconfig
protoc --version 

pip3 install protobuf==3.19.4

安装onnx

pip3 install cython onnx==1.11.0

1.6 安装必须的依赖

h5py

sudo apt-get install -y pkg-config libhdf5-100 libhdf5-dev
pip3 install pkgconfig
pip3 install versioned-hdf5

spdlog

sudo apt-get install -y libspdlog-dev

PPL

git clone https://github.com/openppl-public/ppl.cv.git
cd ppl.cv
export PPLCV_DIR=$(pwd)
echo -e '\n# set environment variable for ppl.cv' >> ~/.bashrc
echo "export PPLCV_DIR=$(pwd)" >> ~/.bashrc
./build.sh cuda

1.7 安装mmdeploy

安装mmdeploy


pip3 install pycuda

git clone --recursive https://github.com/open-mmlab/mmdeploy.git
cd mmdeploy
export MMDEPLOY_DIR=$(pwd)

mkdir -p build && cd build
cmake .. -DMMDEPLOY_TARGET_BACKENDS="trt"
make -j$(nproc) && make install

cd ${MMDEPLOY_DIR}
pip3 install -v -e . 或者 python3 -m pip install -v -e .

安装转换需要的C/C++推理SDK

mkdir -p build && cd build
cmake .. \
    -DMMDEPLOY_BUILD_SDK=ON \
    -DMMDEPLOY_BUILD_SDK_PYTHON_API=ON \
    -DMMDEPLOY_BUILD_EXAMPLES=ON \
    -DMMDEPLOY_TARGET_DEVICES="cuda;cpu" \
    -DMMDEPLOY_TARGET_BACKENDS="trt" \
    -DMMDEPLOY_CODEBASES=all \
    -Dpplcv_DIR=${PPLCV_DIR}/cuda-build/install/lib/cmake/ppl  \
    -DPYTHON_EXECUTABLE=/usr/bin/python3.6
make -j$(nproc) && make install

安装mmdetection

git clone https://github.com/open-mmlab/mmdetection.git
cd mmdetection
pip3 install -r requirements/build.txt
pip3 install -v -e .  # or "python3 setup.py develop"

1.8 转换并测试模型

测试转化模型

python3 tools/deploy.py /data/models/spaie_132_5997/132_5997/0/model_deploy_config.py \
    /data/models/spaie_132_5997/132_5997/0/mmdet_model_config.py \
    /data/models/spaie_132_5997/132_5997/0/latest.pth \
    /data/models/spaie_132_5997/132_5997/0/demo.jpg \
    --test-img /model/demo.jpg \
    --work-dir /model/convert \
    --device cuda:0 \
    --log-level INFO --dump-info

测试推理 C++ SDK

./object_detection cuda ${directory/to/the/converted/models} ${path/to/an/image}
  • cuda为设备
  • ${directory/to/the/converted/models} 转换后的模型路径【注意是路径不是文件】
  • ${path/to/an/image}推理的图片文件路径

测试推理 Python SDK

export PYTHONPATH=$PYTHONPATH:"/root/george/mmdeploy/build/lib"  # 设置环境变量
python3 -c  "import mmdeploy_python;print(dir(mmdeploy_python))"    # 测试是否可以引入mmdeploy_python

2 mmdeploy在jetson上安装时遇到的坑

问题1:安装过程中遇到的坑,我使用的是torch-1.7.0的版本,对应的torch版本可以直接到jetson zoo上下载,所有步骤都安装完成之后,编译mmdeploy时,出现下面的错误。

    ./csrc/mmdeploy/backend_ops/torchscript/optimizer/bind.cpp: In function ‘void mmdeploy::torch_jit::pybind11_init_ts_optimizer(pybind11::module&)’:
    ./csrc/mmdeploy/backend_ops/torchscript/optimizer/bind.cpp:36:13: error: ‘module_’ is not a member of ‘pybind11’
       pybind11::module_ onnx_module = m.def_submodule("onnx");
                 ^~~~~~~
    ./csrc/mmdeploy/backend_ops/torchscript/optimizer/bind.cpp:36:13: note: suggested alternative: ‘module’
       pybind11::module_ onnx_module = m.def_submodule("onnx");
                 ^~~~~~~
                 module
    ./csrc/mmdeploy/backend_ops/torchscript/optimizer/bind.cpp:37:3: error: ‘onnx_module’ was not declared in this scope
       onnx_module.def("_jit_pass_merge_shape_concate", MergeShapeConcate, pybind11::arg("graph"));

尝试了重装onnx、onnxruntime、pybind11等都无法解决上述问题,最终通过升级torh1.7.0(version0.8.2)到torch1.10.0(version0.11.1),完美解决上述问题。

问题2:CMake Error at third_party/pybind11/tools/FindPythonLibsNew.cmake:133

出现上面的错误,是因为我之前使用conda安装了python3.7,收到了干扰,把conda卸载,同时把pybind11卸载,然后重新安装pybind11即可。

mmdeploy转engine后,使用C++ SDK或者Python SDK

问题1:mmdeploy转换后,使用python和C++的SDK,mask_rcnn的预测精度都非常低。修正前后预测结果对比如下:

修正前1
修正后1
修正前2
修正后2

开始怀疑mmdeploy的SDK有问题,因为SDK没有直接说明如何进行前处理和后处理,后来发现SDK是根据生成模型的文件夹中pipline.json进行前处理的,如果没有这个文件启动会失败,同理,deploy.json这个文件也是必须。这里首先说明一下使用SDK时需要的几个文件(也就是模型文件夹中必须包含的文件)。

pipeline.json  # 包含了前处理和后处理,必须
deploy.json    # 包含了模型转换的相关信息,必须
latest.engine # 转换后的tensorrt engine,必须

尝试修改了pipline.json中的几个参数,也尝试了对比FP32和F16之后的精度(二者相差不大),都没有解决推理结果精度低的问题。

同一个模型,在服务器端的精度非常好,在Jetson精度非常差。对比了一下,和服务器端唯一的区别是服务器端的后处理是我自己手写的,而mmdeploy sdk的后处理是隐藏在sdk中的。于是突发奇想,我能不能直接把mmdeploy sdk的后处理关掉,我自己手写后处理。

想到这里,就尝试把转换模型时使用的转换参数文件model_deploy_config.py中,codebase_config节中的export_postprocess_mask设置为False,内容如下,再次重新尝试导出engine后,就出现了上述两组图片对比的效果。奇怪的是,我也并没有手写后处理,输出的结果和在服务器端的结果就一致了,难道本身就有后处理,在配置后处理相当于进行了两次后处理吗?暂时没搞明白

onnx_config = dict(
    type='onnx',
    export_params=True,
    keep_initializers_as_inputs=False,
    opset_version=11,
    save_file='latest.onnx',
    input_names=['input'],
    output_names=['dets', 'labels', 'masks'],
    input_shape=(1024, 1024))
codebase_config = dict(
    type='mmdet',
    task='ObjectDetection',
    model_type='end2end',
    post_processing=dict(
        score_threshold=0.05,
        confidence_threshold=0.005,
        iou_threshold=0.5,
        max_output_boxes_per_class=200,
        pre_top_k=5000,
        keep_top_k=100,
        export_postprocess_mask=False,  # 这里把预处理设置为False后,模型的推理速度和精度都提升了。
        background_label_id=-1))
backend_config = dict(
    type='tensorrt',
    common_config=dict(fp16_mode=True, max_workspace_size=4294967296),
    model_inputs=[
        dict(
            input_shapes=dict(
                input=dict(
                    min_shape=[1, 3, 1024, 1024],
                    opt_shape=[1, 3, 1024, 1024],
                    max_shape=[1, 3, 1024, 1024])))
    ])
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容