使用TVM在树莓派部署yolov8模型(二)

这部分主要记录部署环境的搭建。
在电脑或服务器上编译,需要搭建完整的TVM工具链;树莓派上仅负责运行,因此只编译runtime即可。
先从简单的开始

一 在树莓派上编译runtime

我的树莓派是新装的系统,那就从头搭建环境吧。
我用的树莓派最新系统,自带python3.11,但tvm官网表示不支持python3.9以上版本!不想看到版本不兼容导致的各种bug,使用miniconda3再装一个python3.8版本。

root@raspberrypi:/home/yblir_pi/tvm/build#
root@raspberrypi:/home/yblir_pi/tvm/build#
root@raspberrypi:/home/yblir_pi/tvm/build# python
Python 3.11.2 (main, Mar 13 2023, 12:18:29) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
  1. 搭建python环境
# 记得选择aarch64格式
# 当前设备,miniconda3最高只能到4.9.2,
# 更新的版本会抛出 "$CONDA_EXEC" constructor --prefix "$PREFIX" --extract-conda-pkgs问题。
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-py38_4.9.2-Linux-aarch64.sh
bash Miniconda3-py38_4.9.2-Linux-aarch64.sh

# 这里,选择安装路径,默认root下,我改到了/usr/local目录下
  - Press ENTER to confirm the location
  - Press CTRL-C to abort the installation
  - Or specify a different location below

[/root/miniconda3] >>> /usr/local/miniconda3

  1. 树莓派自带了gcc,g++, 但没有cmake,需要另外安装
apt-get install cmake
cmake --version
# 需要安装llvm, 高版本的会有安装问题,用13版本
wget https://github.com/llvm/llvm-project/releases/download/llvmorg-13.0.1/llvm-project-13.0.1.src.tar.xz
tar xvf llvm-project-13.0.1.src.tar.xz
mkdir /usr/local/llvm
mkdir llvm-project-13.0.1.src/build
cd llvm-project-13.0.1.src/build
cmake -G "Unix Makefiles" -DLLVM_ENABLE_PROJECTS="clang" -DLLVM_TARGETS_TO_BUILD=X86 -DCMAKE_BUILD_TYPE="Release" -DLLVM_INCLUDE_TESTS=OFF -DCMAKE_INSTALL_PREFIX="/usr/local/llvm" ../llvm
# 使用cmake --build而不用make,是为了跨平台。这步要耗时很久,编译了6个小时~
cmake --build . -j3
cmake --build . --target install

# 查看llvm版本
llvm-as --version

# 若显示no command,需要再配置bashrc
vim ~/.bashrc
# 添加自己的llvm路径
export LLVM_HOME=/usr/local/llvm/bin
export PATH=$LLVM_HOME:$PATH

# 再执行llvm-as --version就能看到安装的版本号了
LLVM (http://llvm.org/):
  LLVM version 13.0.1
  Optimized build.
  Default target: aarch64-unknown-linux-gnu
  Host CPU: cortex-a72

# 再写入python路径
export PYTHONPATH=$PYTHONPATH:/home/yblir_pi/tvm/python
  1. 编译安装opencv
# 先安装必要的依赖包,应该有些包不是必要的,装不成功就跳过
apt-get install build-essential -y
apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev -y 
apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev -y

依次执行以下命令,cmake 指定的opencv路径换成自己的

cmake   -DCMAKE_BUILD=Release \
		-DCMAKE_INSTALL_PREFIX=/usr/local \
		-DBUILD_ZLIB=ON \
		-DBUILD_JPEG=ON \
		-DBUILD_JASPER=ON \
		-DBUILD_WEBP=ON \
		-DBUILD_PNG=ON \
		-DBUILD_TIFF=ON \
		-DBUILD_OPENEXR=ON \
		-DBUILD_TBB=ON \
		-DBUILD_opencv_python2=OFF \
		-DBUILD_opencv_python3=ON \
		-DBUILD_JAVA=OFF \
		-DWITH_TBB=ON \
		-DWITH_CUDA=ON \
		-D OPENCV_ENABLE_NONFREE=ON \
        		-D CUDA_nppicom_LIBRARY=stdc++ \
		-DWITH_NVCUVID=ON \
		-DWITH_CUBLAS=ON \
		-DWITH_CUFFT=ON \
		-DWITH_CUDNN=ON \
		-DCUDA_FAST_MATH=ON \
		-DWITH_FREETYPE=ON \
		-DWITH_FFMPEG=ON \
		-DWITH_V4L=ON \
		-DOPENCV_GENERATE_PKGCONFIG=YES \
		/home/yblir_pi/opencv_install/opencv-4.7.0
# 树莓派4b只有4个线程,开太多有卡死
make -j3
make install
# ldconfig命令的作用主要是在默认搜寻目录/lib和/usr/lib以
# 及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库
ldconfig
  1. 编译安装tvm runtime, 这部分官网写的最详细
git clone --recursive https://github.com/apache/tvm tvm
cd tvm
mkdir build
cp cmake/config.cmake build
cd build
# 必须把 set(USE_LLVM OFF) -> set(USE_LLVM ON)
vim config.cmake
cmake ..
make runtime -j3

二 本地电脑安装交叉编译器

2.1 本地电脑需要是Linux或wsl系统,win系统会有各种bug
本地电脑也需要llvm,安装步骤通上
需要完整版的tvm,安装步骤也同上,需要改变一点,make runtime -j3 -> make -j3,目标是生成libtvm.so,libtvm_runtime.so两个文件。这里步骤不再重复描述了。

2.2 安装交叉编译器

# 在本地电脑上安装
apt-get install g++-arm-linux-gnueabihf
# 查看安装后的版本信息
arm-linux-gnueabihf-g++ -v

在这里插入图片描述

三 总结

流程写到有点乱, 只写了主要搭建过程,因为官方文档写的比我清楚https://tvm.hyper.ai/docs/install/from_source
这里就不再写重复的流程了.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

发布!DolphinDB 白皮书正式上线官网!

对广大数据库用户而言,白皮书是极具参考价值的使用指南和学习手册。白皮书不但能深入剖析数据库的基础概念与架构,协助用户了解数据库的工作原理和应用技巧,更提供了丰富的实践案例,帮助用户从中汲取经验,避免在实际应…

在微信上怎么实现预约功能

在快节奏的现代生活中,时间成为了我们最宝贵的财富。无论是看病、理发、还是参加各类培训,等待往往成为了一个难以避免的“拦路虎”。为了解决这一痛点,微信预约功能应运而生,它不仅为我们的生活带来了极大的便利,更成…

文章解读与程序——资源回顾

综合能源是指利用多种能源形式,如化石能源、可再生能源和核能等,通过综合、灵活的方式满足能源需求。这种综合利用能源的方式旨在提高能源利用效率,减少能源消耗对环境的影响,并促进能源系统的可持续发展。 电力系统规划是指对电…

Android,AMS、WMS、PKMS添加动态控制debug开关功能

问题背景 在framework源码中有很多debug开关,通常我们想要看某个模块的日志,比如说广播,就需要去修改源码,把对应的debug值改为true,但是这种方法耗时耗力,比如说我想看sendBroadcast的流程,但是BroadcastQueue中有很多debug开关,如下: 这种就需要去修改对应的源码才…

PFA移液枪头为什么比普通塑料枪头贵这么多?

移液枪头是用于移液器的一次性适配枪头,可在各种研究应用中准确、精确、一致地转移少量液体。 PFA移液枪头,金属元素空白值低(铅、铀含量小于0.01ppb),化学性能好,可重复使用。 目前市场上的规格:0.01ml、…

C语言-字符函数与字符串函数

在C语言中,我们经常要对字符或是字符串进行各种操作。那C语言究竟给了我们哪些方法呢,本篇文章就是让大家了解对字符和字符串处理相关的知识。 目录 1.字符函数 1.1字符分类函数 1.2字符转换函数 2.字符串函数 2.1strlen函数的使用和模拟实现 2.2…

腾讯云幻兽帕鲁一键开服教程

腾讯云作为领先的云计算服务提供商,为广大用户提供了便捷、高效的游戏服务器搭建解决方案。其中,幻兽帕鲁一键开服功能,更是让游戏开服变得简单易懂。本文将为大家详细介绍腾讯云幻兽帕鲁一键开服的步骤,帮助大家轻松搭建自己的游…

cesium 指定点旋转rectangle Primitive方式 矩阵篇

cesium中rectangle是水平垂直于正北方向的,rectangle的属性中有rotation,但是rotation是以矩形的中心点进行旋转的,旋转过程中矩形的形状可能会变形,如果需要以矩形的顶点为原点进行旋转,可以采用primitive的方式添加p…

详解playwright 官方Javascript demo(适合小白)

如果大家刚上手playwright,并看到了Javascript脚本的官方demo,代码如下: const { webkit } require(playwright);(async () > {const browser await webkit.launch();const page await browser.newPage();await page.goto(http://what…

uni-starter的微信登录拿不到登录者的昵称,头像,手机号问题记录

uni-starter的微信登录竟然拿不到登录者的昵称,头像,手机号 获取手机号的方法在另外一篇文章中,需要认证,需要有营业执照 uni.login({"provider": type,"onlyAuthorize": true,// #ifdef APP"univerif…

嵌入式工程师如何利用周末提升自己?

提升自己一定要趁早,这是作为中年人的我,对年轻人的忠告。 以前年轻,觉得时间多,总是幻想着,很多人也大器晚成啊,晚点努力也不晚。 前阵子小米汽车火了,雷总说这是他最后一次重大创业&#xff0…

GEE APP——土壤水分资源管理器

摘要 由于土壤水分含量与地球气候和天气以及干旱、洪水或山体滑坡等现象有关,因此对许多科学和专业用户来说都非常宝贵。遥感技术为连续测量这一变量提供了独特的可能性。特别是在农业领域,对高空间分辨率绘图的需求非常强烈。然而,目前可操作的土壤水分产品只有中粗空间分…

RS232、RS485、RS422、TTL、CAN各自的区别

目录 一:工业串口通信标准RS232、RS485、RS422的区别 第一个区别、硬件管脚接口定义不同 第二个区别、工作方式不同 第三个区别、通信方式不同 第四个区别,逻辑特性不同 第五个区别、抗干扰性、传输距离和传输速率也不同 二:RS232、RS…

判断字符串为空的几种方法

1,关于null和""的区别: (1) null表示不指向任何东西,调用的话会报空指针异常; 空字符串""表示一个长度为0的字符串,调用是安全的; (2) null 不是对象…

LLM推理中的参数:beam_search、num_sequences、do_sample、temperature、top_k、top_p

原文&#xff1a; https://huggingface.co/blog/how-to-generate beam_search&#xff1a;动态规划每个step保留几个top解&#xff1b; num_sequences: generate输出几个top序列。num_sequences<beam_search。 do_sample: 设为True&#xff0c;则每个输出都进行采样&#…

【项目实战】记录一次PG数据库迁移至GaussDB测试(下)

上一篇分享了安装、迁移&#xff0c;本篇将继续分享迁移前操作、 DRS迁移数据、迁移后一致性检查、问题总结及解决方法。 目录 四、迁移前操作 4.1 源端(PG) 4.2 目标端(GaussDB库) 五、DRS迁移数据 5.1 创建复制用户 5.2创建迁移任务。 六、迁移后一致性检查 6.1使用…

GLIB: The Main Event Loop

主事件循环机制&#xff08;MEL&#xff1a;the Main Event Loop)在GLib和GTK应用中管理可用的事件源。事件源的类型包括&#xff1a;文件描述符&#xff08;管道、套接字和常规文件&#xff09;和定时器超时。 guint g_source_attach (GSource* source, GMainContext* contex…

无线网络安全之WiFi Pineapple初探

背景 WiFi Pineapple&#xff08;大菠萝&#xff09;是由国外无线安全审计公司Hak5开发并售卖的一款无线安全测试神器。集合了一些功能强大的模块&#xff0c;基本可以还原钓鱼攻击的全过程。在学习无线安全时也是一个不错的工具&#xff0c;本文主要讲WiFi Pineapple基础配置…

「GO基础」文件名规范、关键字与标识符

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

WebShell简介

WebShell简介 1、WebShell分类 • JSP类型 • ASP类型 • PHP类型 2、WebShell用途 • 站长工具 • 持续远程控制 • 权限提升 • 极强隐蔽性 3、WebShell检测方法 • 基于流量的 WebShell 检测 • 基于文件的 WebShell 检测 • 基于日志的 WebShell 检测 WebShe…