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

1 mmdeploy在jetpack4.6.1上安裝流程

本文沒有按照官方的教程使用conda環(huán)境盛龄,本文直接使用系統(tǒng)自帶的python3.6.9

1.1 安裝pytorch和torch-version

可以在jest zoo下載預(yù)編譯好的深度學(xué)習(xí)框架,如:torch、tensorflow、mxnet等。本文使用的是torch1.10.0桦卒,對應(yīng)的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的對應(yīng)關(guān)系

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 設(shè)置環(huán)境變量

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 .

安裝轉(zhuǎn)換需要的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 轉(zhuǎn)換并測試模型

測試轉(zhuǎn)化模型

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為設(shè)備
  • ${directory/to/the/converted/models} 轉(zhuǎn)換后的模型路徑【注意是路徑不是文件】
  • ${path/to/an/image}推理的圖片文件路徑

測試推理 Python SDK

export PYTHONPATH=$PYTHONPATH:"/root/george/mmdeploy/build/lib"  # 設(shè)置環(huán)境變量
python3 -c  "import mmdeploy_python;print(dir(mmdeploy_python))"    # 測試是否可以引入mmdeploy_python

2 mmdeploy在jetson上安裝時遇到的坑

問題1:安裝過程中遇到的坑迫筑,我使用的是torch-1.7.0的版本,對應(yīng)的torch版本可以直接到j(luò)etson zoo上下載宗弯,所有步驟都安裝完成之后脯燃,編譯mmdeploy時,出現(xiàn)下面的錯誤蒙保。

    ./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

出現(xiàn)上面的錯誤详恼,是因為我之前使用conda安裝了python3.7补君,收到了干擾,把conda卸載昧互,同時把pybind11卸載挽铁,然后重新安裝pybind11即可。

mmdeploy轉(zhuǎn)engine后硅堆,使用C++ SDK或者Python SDK

問題1:mmdeploy轉(zhuǎn)換后屿储,使用python和C++的SDK,mask_rcnn的預(yù)測精度都非常低渐逃。修正前后預(yù)測結(jié)果對比如下:

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

開始懷疑mmdeploy的SDK有問題够掠,因為SDK沒有直接說明如何進行前處理和后處理,后來發(fā)現(xiàn)SDK是根據(jù)生成模型的文件夾中pipline.json進行前處理的茄菊,如果沒有這個文件啟動會失敗疯潭,同理,deploy.json這個文件也是必須面殖。這里首先說明一下使用SDK時需要的幾個文件(也就是模型文件夾中必須包含的文件)竖哩。

pipeline.json  # 包含了前處理和后處理,必須
deploy.json    # 包含了模型轉(zhuǎn)換的相關(guān)信息脊僚,必須
latest.engine # 轉(zhuǎn)換后的tensorrt engine相叁,必須

嘗試修改了pipline.json中的幾個參數(shù),也嘗試了對比FP32和F16之后的精度(二者相差不大)辽幌,都沒有解決推理結(jié)果精度低的問題增淹。

同一個模型,在服務(wù)器端的精度非常好乌企,在Jetson精度非常差虑润。對比了一下,和服務(wù)器端唯一的區(qū)別是服務(wù)器端的后處理是我自己手寫的加酵,而mmdeploy sdk的后處理是隱藏在sdk中的拳喻。于是突發(fā)奇想哭当,我能不能直接把mmdeploy sdk的后處理關(guān)掉,我自己手寫后處理冗澈。

想到這里钦勘,就嘗試把轉(zhuǎn)換模型時使用的轉(zhuǎn)換參數(shù)文件model_deploy_config.py中,codebase_config節(jié)中的export_postprocess_mask設(shè)置為False渗柿,內(nèi)容如下个盆,再次重新嘗試導(dǎo)出engine后,就出現(xiàn)了上述兩組圖片對比的效果朵栖。奇怪的是,我也并沒有手寫后處理柴梆,輸出的結(jié)果和在服務(wù)器端的結(jié)果就一致了陨溅,難道本身就有后處理,在配置后處理相當(dāng)于進行了兩次后處理嗎绍在?暫時沒搞明白门扇。

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,  # 這里把預(yù)處理設(shè)置為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])))
    ])
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末臼寄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子溜宽,更是在濱河造成了極大的恐慌吉拳,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件适揉,死亡現(xiàn)場離奇詭異留攒,居然都是意外死亡,警方通過查閱死者的電腦和手機嫉嘀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門炼邀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人剪侮,你說我怎么就攤上這事拭宁。” “怎么了瓣俯?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵杰标,是天一觀的道長。 經(jīng)常有香客問我降铸,道長在旱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任推掸,我火速辦了婚禮桶蝎,結(jié)果婚禮上驻仅,老公的妹妹穿的比我還像新娘。我一直安慰自己登渣,他們只是感情好噪服,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著胜茧,像睡著了一般粘优。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上呻顽,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天雹顺,我揣著相機與錄音,去河邊找鬼廊遍。 笑死嬉愧,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的喉前。 我是一名探鬼主播没酣,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼卵迂!你這毒婦竟也來了裕便?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤见咒,失蹤者是張志新(化名)和其女友劉穎偿衰,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體论颅,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡哎垦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了恃疯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漏设。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖今妄,靈堂內(nèi)的尸體忽然破棺而出郑口,到底是詐尸還是另有隱情,我是刑警寧澤盾鳞,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布犬性,位于F島的核電站,受9級特大地震影響腾仅,放射性物質(zhì)發(fā)生泄漏乒裆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一推励、第九天 我趴在偏房一處隱蔽的房頂上張望鹤耍。 院中可真熱鬧肉迫,春花似錦、人聲如沸稿黄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杆怕。三九已至族购,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間陵珍,已是汗流浹背寝杖。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留撑教,地道東北人朝墩。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像伟姐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子亿卤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容