Orange Pi安装MNN库 编译whl文件安装Python MNN包

news/2024/4/23 20:43:58/文章来源:https://blog.csdn.net/baidu_36499789/article/details/128428073

总述

本文使用的板子是 Orange Pi Zero2,这款板子的处理器是 Allwinner H616(Cortex-A53),是 armv8 架构,因此 MNN 的官方代码是直接支持编译的。由于 Zero2 只有 1GB 的内存,编译过程中遇到了内存不足的问题,本文也给出了解决方法。

目录

  • 总述
  • 阅前参考
  • 安装步骤
    • 一、配置交换空间
      • 1) 创建并设置 swap 文件
      • 2) 添加开机启动
      • 3) 重启并查看内存
    • 二、克隆仓库并编译
      • 1) 安装编译依赖
      • 2) 克隆 github 仓库
      • 3) 编译 whl 并安装
  • 参考资料

阅前参考

  1. Orange Pi 开发板型号查询
    开发板(Orange Pi)-Orange Pi官网-香橙派开发板,开源硬件,开源软件,开源芯片,电脑键盘
  2. arm 常见架构区别速览
    arm64,aarch64,armv8,armel,armhf以及x86,arm,mips杂谈 - 江州司马
  3. MNN 官方仓库
    alibaba_MNN: MNN is a blazing fast, lightweight deep learning framework, battle-tested by business-critical use cases in Alibaba

安装步骤

一、配置交换空间

由于 Orange Pi Zero2 只有 1GB 的内存,如果没有配置交换空间(虚拟内存),编译过程中会遇到内存不足的问题。因此,在编译前首先需要配置交换空间。具体命令如下:

1) 创建并设置 swap 文件

首先创建一个 4GB 的 swapfile 文件,然后启用该文件:

cd usr
sudo mkdir swap
sudo dd if=/dev/zero of=/usr/swap/swapfile bs=1M count=4096
sudo mkswap /usr/swap/swapfile
sudo swapon /usr/swap/swapfile

2) 添加开机启动

打开 /etc/fstab 文件:

sudo vim /etc/fstab

在文件末尾添加以下内容并保存:

/usr/swap/swapfile swap swap defaults 0 0

3) 重启并查看内存

运行 reboot 命令重启,运行 free -m 命令查看内存:

reboot
free -h

此时已经出现了 4GB 的名为 swap 的交换空间内存。

二、克隆仓库并编译

1) 安装编译依赖

sudo apt-get install cmake libprotobuf-dev protobuf-compiler

2) 克隆 github 仓库

git clone https://github.com/alibaba/MNN

3) 编译 whl 并安装

进入克隆下来的 MNN 目录,运行 ./schema/generate.sh。接着进入 pymnn/pip_package 目录,先运行 build_deps.py 文件编译所有依赖,再运行 build_wheel.py 编译 whl 文件。

这两个编译步骤可能要好几个小时,提前做好准备。

注意在运行 build_wheel.py 时需要指定版本号,这个可以根据在 release 里最新的版本号来填。

cd MNN
./schema/generate.sh
cd pymnn/pip_package
python build_deps.py
python build_wheel.py --version 2.2.0

编译完成后,编译好的 whl 文件在 pymnn/pip_package/dist 文件夹下。切换到该目录,ls 查看文件名,将该文件的后缀改为 manylinux2014_aarch64.whl 然后用 pip 安装该文件。

cd dist
ls
pip install MNN-2.2.0-cp39-cp39-manylinux2014_aarch64.whl

参考资料

[1] 在树莓派4B上手动编译whl文件安装python的MNN包_叼辣条闯天涯的博客-CSDN博客

[2] Linux系统设置虚拟内存_谁是笨小孩_的博客-CSDN博客

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

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

相关文章

RabbitMQ 第一天 基础 6 SpringBoot 整合RabbitMQ

RabbitMQ 【黑马程序员RabbitMQ全套教程,rabbitmq消息中间件到实战】 文章目录RabbitMQ第一天 基础6 SpringBoot 整合RabbitMQ6.1 SpringBoot 整合 RabbitMQ【生产者】6.1.1 生产者6.2 SpringBoot 整合 RabbitMQ【消费者】6.2.1 消费者6.3 小结第一天 基础 6 Spri…

day3-javascript

HTML的注释 CSS的注释 Javascript的注释是不一样的 JQuery JQuery是一个JavaScript的第三方模块 基于JQuery,自己开发一个功能。 现成的工具 依赖jQuery,例如BootStrap动态效果

Vue事件处理的基本使用

前言 事件处理在vue中也是非常重要的一项技术,它类似于js的事件处理,但是也有不同,下面就简单介绍一下在vue中如何进行事件使用以及一些要点 1 事件基本使用 在这里我们使用单击事件为例,简单讲讲在vue中单击事件的编写以及细节…

Spring Bean作用域

目录 什么是作用域呢 ? 那什么又是Spring Bean的作用域呢 ? Spring框架默认Bean作用域是什么呢 ? Spring Bean的作用域都有哪些呢 ? 如何设置Bean作用域 什么是作用域呢 ? 在JavaSE中,作用域就是指一个变量可生效的范围. 就比如一个变量的作用域是方法的代码块的范围…

将单向链表按照目标值value 划分成左边小,中间等,右边大的形式,给定一个单链表,判断单链表的值是否是回文结构【图文解释包你看懂】

将单向链表按照目标值value 划分成左边小,中间等,右边大的形式 例如 1 -> 3 -> 5-> 3 -> 7 按照value 3划分 1-> 3-> 3 -> 5 -> 7 解题思路:给定值为 value 用6个变量,分别表示 小于value 的Head sH &…

第11章_数据库的设计规范(理论了解)

第11章_数据库的设计规范 范式 2.3键和相关属性的概念 范式的定义会使用到主键和候选键,数据库中的键(Key)由一个或者多个属性组成。数据表中常用的几种键和属性的定义: 超键︰能唯─标识元组的属性集叫做超键。候选键︰如果超键不包括多余的属性,那…

WEB1.0起源:全球首个网站info.cern.ch

伯纳斯李(图)1990年创立第一个网站。 info.cern.ch是世上第一个网站,提供有关万维网的资料。 info.cern.ch这个网站依然运作如常。 英国科学家蒂姆伯纳斯-李 (Tim Berners-Lee) 于 1989 年在 CERN 工作期间发明了万维网 (WWW)。Web 最初的构思…

mqtt的使用与二次封装

前提:先安装Mosquitto并启动服务,可使用mqttx进行接收发送的测试。 Mosquitto以配置启动命令 mosquitto -c mosquitto.conf -v原文链接:mqtt的使用 本文为测试使用固无账号密码,可在原文查看 封装后实现效果,加入一个…

耗时二周,万字总结Maven简明教程,与君共勉!

什么是Mavne Maven 是一个项目管理工具,它包含了一个项目对象模型 (POM:Project Object Model),一组标准集合。由于 Maven 使用标准目录布局和默认构建生命周期,开发团队几乎可以立即自动化项目的构建基础设施。在多个开发团队环…

消息队列RabbitMQ学习笔记(四)死信队列和延迟队列

1. 死信的概念 先从概念解释上搞清楚这个定义,死信,顾名思义就是无法被消费的消息,字面意思可以这样理 解,一般来说,producer 将消息投递到 broker 或者直接到queue 里了,consumer 从 queue 取出消息 进行…

Linux 下 使用点阵在LCD上显示汉字,字符

文章目录前言一、显示字符1.获取点阵:2.描点(显示字符函数):3. 要打开LCD设备:4. 通过ioctl 获取Framebuffer参数:5. 通过mmap映射出Framebuffer的地址:6.清屏并显示字符:二、显示汉字1.区位码&…

多线程基础入门

文章目录前言一、认识线程(一)概念1.线程是什么2.为啥要有线程(轻量级进程)为什么线程比进程更轻量经典面试题:谈谈进程和线程的区别和联系3.线程的结构(二)第一个多线程程序(三&…

我国用电信息采集系统行业应用需求及市场容量分析 现6省上线运行

用户用电信息采集系统是通过对配电变压器和终端用户的用电数据的采集和分析,实现用电监控、推行阶梯定价、负荷管理、线损分析,最终达到自动抄表、错峰用电、用电检查(防窃电)、负荷预测和节约用电成本等目的。建立全面的用户用电…

RabbitMQ 第一天 基础 4 RabbitMQ 的工作模式 4.4 Topic 通配符模式 4.5 工作模式总结

RabbitMQ 【黑马程序员RabbitMQ全套教程,rabbitmq消息中间件到实战】 文章目录RabbitMQ第一天 基础4 RabbitMQ 的工作模式4.4 Topic 通配符模式4.4.1 模式说明4.4.2 代码编写4.4.3 小结4.5 工作模式总结第一天 基础 4 RabbitMQ 的工作模式 4.4 Topic 通配符模式 …

32天高效突击:开源框架+性能优化+微服务架构+分布式,面阿里获P7(脑图、笔记、面试考点全都有)

今年的大环境不佳,所以大部分的人在今年的招聘旺季都没有收获到好的结果。 但不要着急,今天分享的内容则是由 一位阿里P7的面试心得,通过32天的高效突击训练,成功拿下offer的学习方法。 篇章分为三大章节,可以根据自…

day 10 模拟和高精度

P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布 #include<bits/stdc.h> using namespace std; int n, na, nb, fa, fb;//f:得分 int a[205], b[205];void fun(int ta, int tb){if(ta 0 && tb 1) fb;if(ta 1 && tb 0) fa;if(ta 0 && tb …

【nowcoder】笔试强训Day2

目录 一、选择题 二、编程题 2.1排序子序列 2.2倒置字符串 一、选择题 1.A 派生出子类 B &#xff0c; B 派生出子类 C &#xff0c;并且在 java 源代码有如下声明&#xff1a; 1. A a0new A(); 2. A a1new B(); 3. A a2new C(); 问以下哪个说法是正确的&#xff08;&…

机器学习 | 线性回归

一.基本原理 利用回归方程&#xff08;函数&#xff09;对一个或多个自变量&#xff08;特征值&#xff09;和因变量&#xff08;目标值&#xff09;之间关系进行建模的一种分析方式 根据线性代数&#xff0c;我们可以定义方程 xwy&#xff0c;在线性回归问题中&#xff0c;x…

前端小知识:赋予变量默认值(逻辑与运算符、空值合并运算符、逻辑空运算符)

8. 逻辑与运算符、空值合并运算符、逻辑空运算符&#xff08;可用赋予默认值&#xff09; &#xff08;空值合并运算符&#xff09;官方文档&#xff1a; https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing   &#xff08;逻辑…

【推荐收藏】这份图解算法数据结构的材料太良心

5年前发生的一件事&#xff0c;成为了我职业生涯的重要转折点。当时的我在交大读研&#xff0c;对互联网求职一无所知&#xff0c;但仍然硬着头皮申请了 Microsoft 实习生。面试官让我在白板上写出“快速排序”代码&#xff0c;我畏畏缩缩地写了一个“冒泡排序”&#xff0c;并…