【小白向】MMDeploy安装部署|暗坑标注版

文章目录

  • 序言
  • 正文
    • 1 安装PPLCV
    • 2 TensorRT环境相关
    • 3 编译MMDeploy
    • 4 编译SDK
    • 结束

序言

本文主要针对在编译安装OpenMMLab团队的MMDeploy模型部署工具时遇到的“难以下手”的问题。
由于OpenMMLab的用户中很大一部分都是具有快速开发需求的人,或者说其实相当部分OpenMMlab开源算法体系的用户都没有特别扎实的代码基础或者理论基础,比如说我,在面对MMDeploy这个相对于OpenMMLab其他算法库而言复杂了许多的代码库时会有一些畏难情绪。
此外由于很多时候接触Cpp比较少,对于其中的编译安装有很多不理解的地方,环境变量稍稍一变动就高不明白了,本文主要对于一些我之前作不来但是现在能做的地方进行分享与展示。

正文

首先参考教程:(https://github.com/open-mmlab/mmdeploy/blob/main/docs/zh_cn/01-how-to-build/linux-x86_64.md)

如果教程由于在GitHub上你访问起来有困难,那么请移步官方中文文档

现摘取其中容易出问题的地方进行讲解。

跟着教程走一般都不会有问题,关键点在于==“不换终端”==,当然,如果你看了下面的文字知道发生了什么之后,你换终端也没有什么事。

1 安装PPLCV

教程中所给代码

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

这里首先需要注意的是export PPLCV_DIR=$(pwd)这一步,这是为了添加ppl.cv这个包的环境变量。
linux的环境变量,如果直接这样运行命令的话就是临时添加,如果你另起一个终端或者是使用source ~/.bashrc之类的命令刷新了环境变量,那么这一步就需要重做了。

其余在这个教程中涉及到这种什么什么“DIR”的也是一样的道理。

2 TensorRT环境相关

因为我是在Nvidia显卡上进行模型部署,所以下面也主要依托这个来讲。

cd /the/path/of/tensorrt/tar/gz/file
tar -zxvf TensorRT-8.2.3.0.Linux.x86_64-gnu.cuda-11.4.cudnn8.2.tar.gz
pip install TensorRT-8.2.3.0/python/tensorrt-8.2.3.0-cp37-none-linux_x86_64.whl
export TENSORRT_DIR=$(pwd)/TensorRT-8.2.3.0
export LD_LIBRARY_PATH=$TENSORRT_DIR/lib:$LD_LIBRARY_PATH
pip install pycuda

这是教程中用于安装TensorRT包的命令。
只要选择和自己的cuda版本相应的就可以了。
如果你已经在做模型部署却连cuda都没有下载的话,那么请浏览器搜索引擎搜索Nvidia Cuda进入下载页面,根据你的环境进行选择,然后选择run脚本安装的方式安装cuda。
不要装deb包!不要装deb包!不要装deb包!
装deb包会连同你的驱动一起重装,一般而言是不合适的;而且这种库用APT或者YUM装,心里有点不踏实。
确认cuda装好了,就是我刚刚说的选择合适版本的TensorRT包就可以了,选择Tar包,安装没你以为的比Deb包麻烦,知道文件都放在哪里的感觉令人安心。

截至1月20日,该文编辑时间,已经有cuda12.2了,但是没有与该版本对应的TensorRT版本,别担心,实测12.1能用的就行,换句话说,最新的能用。

下面的两步中,一个又是设置TENSORRT_DIR环境变量的,后面的cudnn安装也要设置这个。这是为了编译MMDeploy的内容才这么做的,一般来说项目里面不会这么做,可能只是会在CMakeLists中通过set方法在文件内定义一下。这里用这个方式传入库的信息其实已经非常简化了流程了;而下面的第二条环境变量指令是将库文件所在引入环境变量,是常见的配置TensorRT环境的步骤。

我之前就装过,所以仅仅进行export TENSORRT_DIR=/opt/TensorRT-8.9.1.6,这是我安装TensorRT的位置,另一条指令则写入了.bashrc文件。

注意不要忘记装pycuda。

然后是安装Cudnn这个深度学习加速库。命令上也是差不多的。
对于之前装过Cudnn的人来说,一般来说就和cuda的库文件放在一起的。也就是/usr/local/cuda中,准确的应该要加版本号,不过一般都有软链接,应该是运行装cuda的时候自带的设置软链接。从而我们也可以粗略得出一种管理多版本cuda的方法——应该可以通过临时改换软链接的指向来确定当前使用的cuda环境。当然,这样做在写CMake的时候还不如直接接上版本号来得方便。

后面接着说了如果想永久有效的话就写入当前所用shell的配置文件,不一定就是.bashrc哦,也许你是别的shell。不过如果你不知道这个的话你多半就是.bashrc了。

3 编译MMDeploy

也是有一个设置环境变量的过程。没啥难度。

不过另一个需要注意的地方是,MMDeploy中是有子模块的,不过因为是放在一个文件夹“ThirdPart”还是什么名字之下的,你克隆的时候可能没有看见。

在克隆仓库时克隆子模块则加上--recursive参数;如果已经克隆了仓库但没有克隆子模块,则运行:

git submodule update

来更新子模块。

4 编译SDK

如果你前面都没什么问题,最后模型也转换出来了,但是最后你没办法完成推理,那么多半是SDK编译不对,

cd ${MMDEPLOY_DIR}
mkdir -p build && cd build
cmake .. \-DCMAKE_CXX_COMPILER=g++-7 \-DMMDEPLOY_BUILD_SDK=ON \-DMMDEPLOY_BUILD_EXAMPLES=ON \-DMMDEPLOY_BUILD_SDK_PYTHON_API=ON \-DMMDEPLOY_TARGET_DEVICES="cuda;cpu" \-DMMDEPLOY_TARGET_BACKENDS=trt \-Dpplcv_DIR=${PPLCV_DIR}/cuda-build/install/lib/cmake/ppl \-DTENSORRT_DIR=${TENSORRT_DIR} \-DCUDNN_DIR=${CUDNN_DIR}make -j$(nproc) && make install

以TensorRT的推理的SDK的编译为例,需要注意的地方就是这几个主目录,另外是-DCMAKE_CXX_COMPILER=g++-7 \这个参数里面的7需要根据你自己的版本进行修改,比如我是9。
如果出现什么找不到库之类的情况,那么应该就是你的哪个环境变量掉了。你可以使用echo命令来看它到底指向哪里或者并不存在,例如

echo ${PPLCV_DIR}

应该返回该变量的路径。

也就是说其实如果你没有设置这些环境变量但是你记得这些库的路径的话,这几个编译选项就直接传入你的库路径也是一样的,使用设置环境变量的方式是为了简化流程与降低环境的安装难度,但是如果你觉得这样更加麻烦的话当然就不需要这么做了。

结束

如果出现其他问题欢迎留言讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/637106.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言算法——大数相加

C数据类型 类型与描述1基本数据类型 它们是算术类型,包括整型(int)、字符型(char)、浮点型(float)和双精度浮点型(double)。2枚举类型: 它们也是算术类型&am…

【docker】之基础篇二

目录 一、docker的数据管理1、数据卷2、数据卷容器: 二、端口映射与容器互联容器之间的通信 三、Docker查看日志四、Dockerfile定制镜像1、DockerFile常用的命令2、DockerFile实操 一、docker的数据管理 在生产环境中使用docker,需要对数据进行持久化&a…

R语言的ggplot2绘制分组折线图?

R绘制分组折线图.R 首先看数据情况:group有3组。Time有3组,数据意思是在3组3个时间点测量了某指标,现在要绘制组1、组2、组3某指标y按时间的变化趋势 数据情况: 看看最终的效果图如下: 下面是本次使用的代码 .libPat…

OpenHarmony 应用开发入门 (二、应用程序包结构理解及Ability的跳转,与Android的对比)

在进行应用开发前,对程序的目录及包结构的理解是有必要的。如果之前有过android开发经验的,会发现OpenHarmony的应用开发也很简单,有很多概念是相似的。下面对比android分析总结下鸿蒙的应用程序包结构,以及鸿蒙对比android的诸多…

Spring第七天(AOP)

简介 AOP(Aspect Oriented Programing)面向切面编程,一种编程范式,指导开发者如何组织程序结构 作用 在不惊动原始设计的基础上为其进行功能增强 Spring理念:无入侵式/无侵入式 基本概念 连接点(JoinPoint) : 程序执行过程中的任意位置&a…

ros2学习笔记-CLI工具,记录命令对应操作。

目录 环境变量turtlesim和rqt以初始状态打开rqt node启动节点查看节点列表查看节点更多信息命令行参数 --ros-args topic话题列表话题类型话题列表,附加话题类型根据类型查找话题名查看话题发布的数据查看话题的详细信息查看类型的详细信息给话题发布消息&#xff0…

html Canvas粒子文字特效

代码有点长&#xff0c;下面是代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>HTML5 Canvas粒子效果文字动画特效DEMO演示</title><link rel"stylesheet" href"css/normalize.c…

Bit.Store 加密卡集成主流 BRC20通证,助力 BTC 生态流动性

“Bit.Store 首创性的将包括 ORDI、SATS、以及 RATS 在内的主流 BRC20 资产集成到其加密卡支付中&#xff0c;通过以其推出的加密银行卡为媒介&#xff0c;助力 BTC 生态 Token 的流动性与消费。” 比特币网络在被设计之初&#xff0c;就是以一种去中心化、点对点的现金系统为定…

shardingsphere 出现 Cannot support database type ‘MySQL‘

场景 近日一个项目使用了shardingsphere后出现 java.lang.UnsupportedOperationException: Cannot support database type MySQL , 重点是在dev-pre环境中无法出现这个问题&#xff0c;而是在prod环境中会发生&#xff0c;且prod也不是100%发生&#xff0c; 当流量过大时会发…

js-cookie的使用--token的数据实现持久化

1.下载 npm install js-cookie 2.引入 import Cookies from "js-cookie"; 3.使用 // 写入cookie Cookies.set(name, value) // 读取 Cookies.get(name) // > value Cookies.get(nothing) // > undefined // 读取所有可见的cookie Cookies.get() // 删除某项co…

Vue2:全局事件总线

一、场景描述 之前我们学习了&#xff0c;通过props实现父子组件之间的通信。通过自定义组件&#xff0c;实现了子给父传递数据。 那么&#xff0c;兄弟关系的组件&#xff0c;如何通信了&#xff1f;任意组件间如何通信了&#xff1f; 这个时候&#xff0c;就要学习全局事件总…

JavaScript快速入门一

概述 JavaScript ECMAScript JavaScript特有的东西(BOM DOM) ECMAScript&#xff1a;客户端脚本语言&#xff0c;是欧洲计算机制造商协会ECMA&#xff0c;制定的标准&#xff0c;统一了所有客户端脚本语言的编码方式BOM&#xff1a;Browser Object Model&#xff0c;浏览器…

C#调用C动态链接库

前言 已经没写过博客好久了&#xff0c;上一篇还是1年半前写的LTE Gold序列学习笔记&#xff0c;因为工作是做通信协议的&#xff0c;然后因为大学时没好好学习专业课&#xff0c;现在理论还不扎实&#xff0c;不敢瞎写&#xff1b; 因为工作原因&#xff0c;经常需要分析一些字…

Gin之gin介绍和安装

1、gin介绍 1.1 gin 是什么&#xff1f; Gin 是一个用 Go (Golang) 编写的 HTTP web 框架。 它是一个类似于 martini 但拥有更好性能的 API 框架&#xff0c;由于 httprouter&#xff0c;速度提高了近 40 倍。如果你需要极好的性能&#xff0c;使用 Gin 吧。 https://githu…

Unity-Arduino Bluetooth Plugin蓝牙插件使用时需要注意的一些事项(附插件下载链接)

一些参考链接 1.Android 无法扫描蓝牙设备踩坑 2.权限相关 1-首先要明确你的蓝牙设备是经典蓝牙还是低功耗&#xff08;BLE)蓝牙&#xff1a; 转载&#xff1a;Android蓝牙开发—经典蓝牙和BLE&#xff08;低功耗&#xff09;蓝牙的区别 2.如果是BLE蓝牙&#xff0c;需要打勾…

display布局实现一侧的盒子高度与另一侧盒子的高度等高

实现两边容器的高度等高主要是用 align-items: stretch 这个属性 stretch 拉伸: 子元素没有高度或高度为auto&#xff0c;将占满整个容器的高度 <template><div><h3>我是测试页面</h3><div class"container"><div class"left-…

原码,补码的除法

目录 一.原码的除法 &#xff08;1&#xff09;恢复余数法 重点看这 &#xff08;2&#xff09;不恢复余数法&#xff08;加减交替法&#xff09; 重点看这 二. 补码除法运算 重点看这 我们已经学习了如何进行原码&#xff0c;补码的乘法&#xff1a; http://t.csdnimg…

RibbonGroup 添加QAction下拉带Menu

实现代码如下所示&#xff1a; { QMenu* pMenu new QMenu(this); pMenu->addAction(QIcon(":/QRibbonDemo/res/smallpaste.png"), tr("Menu1")); pMenu->addAction(QIcon(":/QRibbonDemo/res…

Django随笔

关于Django的admin 1. 在url中把 from django.contrib import admin 重新解开 把path(admin/,admin.site.urls), 解开 2. 注册app&#xff0c;在配置文件中写 django.contrib.admin, 3.输入命令进行数据库迁移 Django国际化 配置文件中&#xff08;改成中文&#xff09; LA…

NLP自然语言处理介绍

自然语言处理&#xff08;NLP&#xff0c;Natural Language Processing&#xff09;是一门涉及计算机与人类语言之间交互的学科。它的目标是使计算机能够理解和生成人类语言&#xff0c;从而更好地处理和解析大量的文本数据。NLP不仅是人工智能领域中一个重要的分支&#xff0c…