【人工智能学习之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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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 电源模块…