【人工智能學習之MMdeploy部署踩坑總結】

【人工智能學習之MMdeploy部署踩坑總結】

  • 報錯1:TRTNet: device must be a GPU!
  • 報錯2:Failed to create Net backend: tensorrt
  • 報錯3:Failed to load library libonnxruntime_providers_shared.so
      • 1. 確認庫文件是否存在
      • 2. 重新安裝 ONNX Runtime
      • 3. 檢查系統依賴
      • 4. 驗證安裝
  • 報錯4:libcudnn.so.9: cannot open shared object file: No such file or directory
      • 1. 確認 Conda 環境內的 CuDNN 路徑
      • 2. 設置環境變量(臨時生效)
      • 3. 永久配置環境變量(虛擬環境內)
      • 4. 檢查 CuDNN 版本兼容性(關鍵!)
      • 5. 驗證環境
  • 報錯5:Inconsistency detected by ld.so: dl-version.c: 205: _dl_check_map_versions: Assertion `needed != NULL' failed!
  • 報錯6:mismatched data type FLOAT vs HALF
  • 版本對應表

以下是我在使用mmdeploy部署時踩過的坑,在此分享幫助大家,歡迎補充和指正。

報錯1:TRTNet: device must be a GPU!

是說用tenserRT推理必須使用gpu,你應該在代碼中選擇的是cpu,需要改成cuda。注意!是:“cuda”,不是"gpu"寫gpu是無效的。

列如:

self.recognizer = VideoRecognizer(model_path=onnx_path, device_name='cuda', device_id=int(gpu_id))

報錯2:Failed to create Net backend: tensorrt

是因為沒設置tensorrt環境變量,需要將trt路徑寫入到.bashrc中:

echo "export LD_LIBRARY_PATH=/root/TensorRT-8.6.1.6/lib:/root/cudnn/lib:$LD_LIBRARY_PATH" >> ~/.bashrc && \
source ~/.bashrc

報錯3:Failed to load library libonnxruntime_providers_shared.so

完整的詳細報錯為:
[mmdeploy] [error] [ort_net.cpp:205] unhandled exception when creating ORTNet: /onnxruntime_src/onnxruntime/core/session/provider_bridge_ort.cc:1080 void onnxruntime::ProviderSharedLibrary::Ensure() [ONNXRuntimeError] : 1 : FAIL : Failed to load library libonnxruntime_providers_shared.so with error: libonnxruntime_providers_shared.so: cannot open shared object file: No such file or directory

是系統找不到 libonnxruntime_providers_shared.so 這個共享庫文件,這通常與 ONNX Runtime 的安裝不完整或環境配置問題有關。

1. 確認庫文件是否存在

首先檢查系統中是否實際存在 libonnxruntime_providers_shared.so

# 在系統中搜索該文件
sudo find / -name "libonnxruntime_providers_shared.so" 2>/dev/null
  • 如果找到該文件(例如路徑為 /path/to/libonnxruntime_providers_shared.so),需要將其所在目錄添加到系統庫路徑:
    # 臨時生效(當前終端)
    export LD_LIBRARY_PATH=/path/to/directory-containing-the-file:$LD_LIBRARY_PATH# 永久生效(添加到 ~/.bashrc 或 ~/.zshrc)
    echo "export LD_LIBRARY_PATH=/path/to/directory-containing-the-file:\$LD_LIBRARY_PATH" >> ~/.bashrc
    source ~/.bashrc
    

2. 重新安裝 ONNX Runtime

如果未找到該文件,說明 onnxruntime-gpu 安裝不完整,重新安裝:

# 先卸載現有版本
pip uninstall -y onnxruntime-gpu# 安裝與 mmdeploy 兼容的版本 
pip install onnxruntime-gpu

注意:mmdeploy 對 ONNX Runtime 版本有一定兼容性要求,過新的版本(如 1.18.0)可能存在適配問題,降低版本通常能解決此類庫缺失問題。

3. 檢查系統依賴

libonnxruntime_providers_shared.so 可能依賴系統級的 CUDA 或 CUDNN 庫,確保:

  • 系統已安裝與 onnxruntime-gpu 1.16.0 兼容的 CUDA(推薦 11.6+)和 CUDNN(推薦 8.4+)
  • CUDA 和 CUDNN 的路徑已正確添加到環境變量(如 LD_LIBRARY_PATH 包含 /usr/local/cuda/lib64 等)

4. 驗證安裝

重新安裝后,通過以下命令驗證 ONNX Runtime 是否正常工作:

import onnxruntime as ort
print("ONNX Runtime 版本:", ort.__version__)
print("可用執行 providers:", ort.get_available_providers())

如果輸出包含 ['CUDAExecutionProvider', 'CPUExecutionProvider'],說明安裝成功,此時再嘗試運行 mmdeploy 相關代碼即可。

如果以上步驟仍未解決,可能需要檢查 mmdeploy 與 ONNX Runtime 的編譯/安裝匹配性(例如是否使用源碼編譯 mmdeploy 時指定了正確的 ONNX Runtime 路徑)。

報錯4:libcudnn.so.9: cannot open shared object file: No such file or directory

完整的詳細報錯為:
[mmdeploy] [error] [ort_net.cpp:205] unhandled exception when creating ORTNet: /onnxruntime_src/onnxruntime/core/session/provider_bridge_ort.cc:1131 onnxruntime::Provider& onnxruntime::ProviderLibrary::Get() [ONNXRuntimeError] : 1 : FAIL : Failed to load library libonnxruntime_providers_cuda.so with error: libcudnn.so.9: cannot open shared object file: No such file or directory [mmdeploy] [error] [net_module.cpp:54] Failed to create Net backend: onnxruntime
報錯核心是系統找不到 libcudnn.so.9,這是 CuDNN 庫的問題,結合你用 Conda 虛擬環境(mmdeploy_zhr),按以下步驟解決:

1. 確認 Conda 環境內的 CuDNN 路徑

先找到虛擬環境中 CuDNN 庫的位置:

# 激活環境(確保已激活 mmdeploy_zhr)
conda activate mmdeploy# 查找 libcudnn.so.9 所在目錄
find $CONDA_PREFIX -name "libcudnn.so.9"

正常情況下,會輸出類似:
/root/miniconda3/envs/mmdeploy_zhr/lib/libcudnn.so.9
記住這個路徑的父目錄(比如上面的路徑,父目錄是 /root/miniconda3/envs/mmdeploy_zhr/lib )。

2. 設置環境變量(臨時生效)

在運行腳本前,手動設置 LD_LIBRARY_PATH 包含 CuDNN 庫路徑:

# 替換成你實際的 CuDNN 庫父目錄
export LD_LIBRARY_PATH=/root/miniconda3/envs/mmdeploy/lib:$LD_LIBRARY_PATH# 再次運行腳本
python onnx_run.py

如果臨時設置后不報錯,說明環境變量配置有效,繼續看步驟 3 永久配置。

3. 永久配置環境變量(虛擬環境內)

為了讓虛擬環境每次激活時自動加載 CuDNN 路徑,在 Conda 環境中配置:

# 激活環境
conda activate mmdeploy_zhr# 添加環境變量到虛擬環境的 activate.d 目錄
echo "export LD_LIBRARY_PATH=$CONDA_PREFIX/lib:\$LD_LIBRARY_PATH" >> $CONDA_PREFIX/etc/conda/activate.d/cudnn.sh# 添加取消環境變量到 deactivate.d 目錄(可選,退出環境時清理)
echo "unset LD_LIBRARY_PATH" >> $CONDA_PREFIX/etc/conda/deactivate.d/cudnn.sh# 重新激活環境使配置生效
conda deactivate
conda activate mmdeploy_zhr

這樣每次激活 mmdeploy_zhr 環境時,LD_LIBRARY_PATH 會自動包含 CuDNN 庫路徑,無需每次手動設置。

4. 檢查 CuDNN 版本兼容性(關鍵!)

你的報錯里是 libcudnn.so.9,說明當前環境用的是 CuDNN 9.x,但要注意:

  • ONNX Runtime GPU 版本(尤其是舊版,如你之前用的 1.15.1)對 CuDNN 9.x 兼容性可能不佳,容易出現段錯誤。
  • 建議降級 CuDNN 到 8.x 版本(更穩定,適配大多數框架):
    # 先卸載當前 CuDNN
    conda uninstall -y cudnn# 安裝 CuDNN 8.9(適配 CUDA 11/12,兼容性好)
    conda install -y -c nvidia cudnn=8.9.2
    
    安裝后重新運行 find $CONDA_PREFIX -name "libcudnn.so.8" 確認路徑,再回到步驟 2/3 配置環境變量。

5. 驗證環境

完成上述步驟后,通過以下命令驗證:

# 激活環境
conda activate mmdeploy_zhr# 檢查 CuDNN 庫是否能被找到
ldd $CONDA_PREFIX/lib/libonnxruntime_providers_cuda.so | grep cudnn

如果輸出類似:
libcudnn.so.8 => /root/miniconda3/envs/mmdeploy_zhr/lib/libcudnn.so.8 (0x00007f...)
說明 CuDNN 路徑已正確配置,再運行 onnx_run.py 應該能解決 libcudnn.so.9 找不到的問題。

總結:核心是讓系統找到 CuDNN 庫文件,優先通過 Conda 環境配置 LD_LIBRARY_PATH,并檢查 CuDNN 版本(推薦 8.x)與 ONNX Runtime、mmdeploy 的兼容性,避免因版本過高導致段錯誤。

報錯5:Inconsistency detected by ld.so: dl-version.c: 205: _dl_check_map_versions: Assertion `needed != NULL’ failed!

是動態鏈接器(ld.so)檢測到庫版本不兼容 的錯誤,通常是因為不同庫對系統底層依賴(如 glibc、CUDA 庫)的版本要求沖突,或虛擬環境內的庫與系統全局庫混用導致。
一般重裝就可以解決。最可能的原因是 CUDA 版本 與 ONNX Runtime 版本 不兼容導致的。

報錯6:mismatched data type FLOAT vs HALF

是模型的數據類型和輸入的數據類型不匹配,要么增加前處理,要么重新導出所需數據類型的模型。

版本對應表

以下是官網的版本對應表:
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/95634.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/95634.shtml
英文地址,請注明出處:http://en.pswp.cn/web/95634.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

力扣516 代碼隨想錄Day16 第一題

找二叉樹左下角的值class Solution { public:int maxd0;int result;void traversal(TreeNode* root,int depth){if(root->leftNULL&&root->rightNULL){if(depth>maxd){maxddepth;resultroot->val;}}if(root->left){depth;traversal(root->left,depth…

網格圖--Day07--網格圖DFS--LCP 63. 彈珠游戲,305. 島嶼數量 II,2061. 掃地機器人清掃過的空間個數,489. 掃地機器人,2852. 所有單元格的遠離程度之和

網格圖–Day07–網格圖DFS–LCP 63. 彈珠游戲,305. 島嶼數量 II,2061. 掃地機器人清掃過的空間個數,489. 掃地機器人,2852. 所有單元格的遠離程度之和 今天要訓練的題目類型是:【網格圖DFS】,題單來自靈茶山…

多功能修改電腦機器碼序列號工具 綠色版

多功能修改電腦機器碼序列號工具 綠色版電腦機器碼序列號修改軟件是一款非常使用的數據化虛擬修改工具。機器碼修改軟件可以虛擬的定制您電腦上的硬件信息,軟件不會對您的電腦造成傷害。軟件不需要您有專業的知識,就可以模擬一份硬件信息。機器碼修改軟…

React Hooks深度解析:useState、useEffect及自定義Hook最佳實踐

React Hooks自16.8版本引入以來,徹底改變了我們編寫React組件的方式。它們讓函數組件擁有了狀態管理和生命周期方法的能力,使代碼更加簡潔、可復用且易于測試。本文將深入探討三個最重要的Hooks:useState、useEffect,以及如何創建…

期權平倉后權利金去哪了?

本文主要介紹期權平倉后權利金去哪了?期權平倉后權利金的去向需結合交易角色(買方/賣方)、平倉方式及市場價格變動綜合分析,具體可拆解為以下邏輯鏈條。期權平倉后權利金去哪了?1. 買方平倉:權利金的“差價…

2025國賽C題題目及最新思路公布!

C 題 NIPT 的時點選擇與胎兒的異常判 問題 1 試分析胎兒 Y 染色體濃度與孕婦的孕周數和 BMI 等指標的相關特性,給出相應的關系模 型,并檢驗其顯著性。 思路1:針對附件中孕婦的 NIPT 數據,首先對數據進行預處理,并對多…

NLP技術爬取

“NLP技術爬取”這個詞組并不指代一種單獨的爬蟲技術,而是指將自然語言處理(NLP)技術應用于網絡爬蟲的各個環節,以解決傳統爬蟲難以處理的問題,并從中挖掘出更深層次的價值。簡單來說,它不是指“用NLP去爬”…

讓錄音變得清晰的軟件:語音降噪AI模型與工具推薦

在數字內容創作日益普及的今天,無論是播客、線上課程、視頻口播,還是遠程會議,清晰的錄音質量都是提升內容專業度和觀眾體驗的關鍵因素之一。然而,由于環境噪音、設備限制等因素,錄音中常常夾雜各種干擾聲音。本文將介…

大話 IOT 技術(1) -- 架構篇

文章目錄前言拋出問題現有條件初步設想HTTP 與 MQTT中間的服務端完整的鏈路測試的虛擬設備實現后話當你迷茫的時候,請點擊 物聯網目錄大綱 快速查看前面的技術文章,相信你總能找到前行的方向 前言 Internet of Things (IoT) 就是物聯網,萬物…

【wpf】WPF 自定義控件綁定數據對象的最佳實踐

WPF 自定義控件綁定數據對象的最佳實踐:以 ImageView 為例 在 WPF 中開發自定義控件時,如何優雅地綁定數據對象,是一個經常遇到的問題。最近在實現一個自定義的 ImageView 控件時,我遇到了一個典型場景: 控件內部需要使…

[Dify 專欄] 如何通過 Prompt 在 Dify 中模擬 Persona:即便沒有專屬配置,也能讓 AI 扮演角色

在 AI 應用開發中,“Persona(角色扮演)”常被視為塑造 AI 個性與專業邊界的重要手段。然而,許多開發者在使用 Dify 時會疑惑:為什么我在 Chat 應用 / Agent 應用 / Workflow 里都找不到所謂的 Persona 配置項? 答案是:Dify 平臺目前并沒有內建的 Persona 配置入口。角色…

解決雙向循環鏈表中對存儲數據進行奇偶重排輸出問題

1. 概念 對鏈表而言,雙向均可遍歷是最方便的,另外首尾相連循環遍歷也可大大增加鏈表操作的便捷性。因此,雙向循環鏈表,是在實際運用中是最常見的鏈表形態。 2. 基本操作 與普通的鏈表完全一致,雙向循環鏈表雖然指針較多,但邏輯是完全一樣。基本的操作包括: 節點設計 初…

Kubernetes集群升級與etcd備份恢復指南

目錄 Kubernetes etcd備份恢復 集群管理命令 環境變量 查看etcd版本 查看etcd集群節點信息 查看集群健康狀態 查看告警事件 添加成員(單節點部署的etcd無法直接擴容)(不用做) 更新成員 刪除成員 數據庫操作命令 增加(put) 查詢(get) 刪除(…

【LeetCode熱題100道筆記】旋轉圖像

題目描述 給定一個 n n 的二維矩陣 matrix 表示一個圖像。請你將圖像順時針旋轉 90 度。 你必須在 原地 旋轉圖像,這意味著你需要直接修改輸入的二維矩陣。請不要 使用另一個矩陣來旋轉圖像。 示例 1:輸入:matrix [[1,2,3],[4,5,6],[7,8,9]…

SpringBoot【集成p6spy】使用p6spy-spring-boot-starter集成p6spy監控數據庫(配置方法舉例)

使用p6spy-spring-boot-starter集成p6spy監控數據庫1.簡單說明2.核心依賴3.主要配置4.簡單測試5.其他配置1.簡單說明 p6spy 類似于 druid 可以攔截 SQL 可以用于項目調試,直接引入 p6spy 的博文已經很多了,這里主要是介紹一下 springboot 使用 p6spy-sp…

擴散模型的優化過程,主要的公式推導,主要是熟悉一下整體的理論框架

核心思想與定義 擴散模型的核心思想是:學習一個去噪過程,以逆轉一個固定的加噪過程。前向過程(固定): 定義一個馬爾可夫鏈,逐步向數據 x0~q(x0)\mathbf{x}_0 \sim q(\mathbf{x}_0)x0?~q(x0?) 添加高斯噪…

數字簽名、數字證書、數字信封的概念與區別

要理解數字簽名、數字證書、數字信封,核心是抓住它們各自的核心目標 —— 分別解決 “身份真實性與內容完整性”“公鑰可信度”“數據機密性” 問題,且三者都基于 “非對稱加密”(一對公鑰、私鑰,公鑰公開、私鑰保密,用…

Day35 網絡協議與數據封裝

day35 網絡協議與數據封裝 數據封裝與協議結構 以太網MAC幀格式數據封裝與傳輸流程 數據在傳輸過程中,從上層逐層封裝到底層,最終通過物理介質發送。封裝與傳輸的具體流程如下: 封裝過程(從IP層到物理層) IP層&#xf…

Deeplizard深度學習課程(七)—— 神經網絡實驗

前言我們正在利用pytorch實現CNN。主要分為四個小部分:數據預處理、神經網絡pytorch設計、訓練神經網絡 和 神經網絡實驗。在之前的章節中,我們已經完成了整個CNN框架的設計、訓練與簡單分析,本節將更進一步討論神經網絡處理過程中的細節問題…

STM32實踐項目(激光炮臺)

剛開始設想做一個上半部分可以上下180移動,下半部分底座360移動的激光炮臺。于是便開始了實踐。 所需材料清單: 序號 名稱 數量 備注說明 1 面包板(Breadboard) 2 用于電路搭建和模塊連接 2 杜邦線(公對公、公對母等) 若干 建議準備 30~50 根,方便連接 3 MB-102 電源模塊…