当前位置: 首页 > news >正文

【个人开源】——从零开始在高通手机上部署sd(二)

代码:https://github.com/chenjun2hao/qualcomm.ai

请添加图片描述
请添加图片描述

推理耗时统计

单位/ms

硬件qnncpu_clipqnncpu_unetqnncpu_vaehtp_cliphtp_unethtp_vae
骁龙8 gen1+24716.994133440.39723.215411.097696.327

1. 下载依赖

  • 下载opencv_x64.tar,提取码: rrbp
  • 下载opencv_aarch64.tar, 提取码: xj8w
    修改CMakeLists.txtOPENCV_X64_PATHOPENCV_AARCH64_PATH的路径
  • 安装高通QNN,并声明QNN_SDK_ROOT环境变量
  • 下载android_ndk, 我使用的版本android-ndk-r26c

2. 编译

1.linux

mkdir build_x64 && cd build_x64
cmake .. -DCMAKE_BUILD_TYPE=Debug
make -j8

2.android

mkdir build_android && cd build_android
cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_ROOT/build/cmake/android.toolchain.cmake \-DANDROID_ABI="arm64-v8a" \-DANDROID_NDK=$ANDROID_NDK_ROOT \-DANDROID_PLATFORM=android-28 \-DPLATFORM_X64=OFF \..
make -j8

3. x64 cpu执行浮点模型

  1. 转换浮点模型
    参考qualcomm.sd, readme导出浮点模型

  2. 执行

export FLOAT_MODEL_PATH=/data1/chenjun/2_qualcomm_ai/sd2.1			# 修改成自己导出模型的路径
./build_x64/example/sd2.1/sd_15.out \${QNN_SDK_ROOT}/lib/x86_64-linux-clang/libQnnCpu.so \${QNN_SDK_ROOT}/lib/x86_64-linux-clang/libQnnHtp.so \${FLOAT_MODEL_PATH}/qnn_models/text_encoder_float/x86_64-linux-clang/libtext_encoder.so \${FLOAT_MODEL_PATH}/qnn_models/unet_float/x86_64-linux-clang/libunet.so \${FLOAT_MODEL_PATH}/qnn_models/vae_decoder_float/x86_64-linux-clang/libvae_decoder.so \10

可视化output/sd21_portrait.jpg(种子未固定,结果具有随机性):

diffusers pipe结果

4. 高通HTP执行量化模型

  1. 转换浮点模型
    参考qualcomm.sd, readme导出量化模型

  2. 执行
    参考高通的例子,我自己的adb操作,将所有的依赖push到手机再跑模型

export LD_LIBRARY_PATH=$PWD
# 跑sd
./sd_15_htp.out ./libQnnCpu.so ./libQnnHtp.so ./model_quant/libtext_encoder.so ./model_float/libunet.so ./model_float/libvae_decoder.so 10

结果保存在output/sd21_portrait_quant.jpg, 再adb pull下来看

其他

  1. qnn输入输出dataformat都是NHWC
  2. qnn 2.14.0.230828 cpu不支持量化的模型推理,需要用htp的后端
  3. qnn 2.26.0.240827 cpu也不支持量化模型的推理,composeGraphs的时候报错

相关文章:

【个人开源】——从零开始在高通手机上部署sd(二)

代码:https://github.com/chenjun2hao/qualcomm.ai 推理耗时统计 单位/ms 硬件qnncpu_clipqnncpu_unetqnncpu_vaehtp_cliphtp_unethtp_vae骁龙8 gen124716.994133440.39723.215411.097696.327 1. 下载依赖 下载opencv_x64.tar,提取码: rrbp下载opencv_aarch64.t…...

【MCU驱动开发概述】

MCU驱动开发概述 目录 MCU驱动开发概述二、驱动开发的目的三、驱动开发的关键组成部分四、示例 - LED 控制驱动 一、引言 MCU(Microcontroller Unit),即微控制器单元,是一种集成在单个芯片上的计算机系统,通常用于控制…...

PC端Linux之虚拟CAN

在调试QT程序时候需要用到虚拟CAN进行发送和接收的操作,以此记录方法。 在调试QT程序时候需要用到虚拟CAN进行发送和接收的操作,以此记录方法。 1、安装can-utils sudo apt install can-utils ifconig -a【查看是否安装成功,是否有can0网络…...

C++:std::thread、条件变量与信号量

介绍 在多线程编程的世界里,协调不同线程之间的工作是一项极具挑战性的任务。线程可能需要等待特定条件的满足,或者对共享资源的访问进行限制。C 标准库为我们提供了强大的工具,如 std::thread 用于创建和管理线程,条件变量用于线…...

POI pptx转图片

前言 ppt页面预览一直是个问题&#xff0c;office本身虽然有预览功能但是收费&#xff0c;一些开源的项目的预览又不太好用&#xff0c;例如开源的&#xff1a;kkfileview pptx转图片 1. 引入pom依赖 我这个项目比较老&#xff0c;使用版本较旧 <dependency><gro…...

Java File 类

File 类是 Java 中用于处理文件和目录的基本类之一&#xff0c;位于 java.io 包中。它提供了多种方法来创建、删除、检查、修改文件或目录的属性&#xff0c;以及列出文件夹中的内容。虽然 File 类本身不提供直接的读取或写入文件内容的方法&#xff08;这些操作通常由 FileInp…...

工业通信协议 EtherNet/IP 全面解析

工业通信协议 EtherNet/IP 全面解析 EtherNet/IP&#xff08;以太网工业协议&#xff09;是一种基于标准以太网的工业自动化通信协议&#xff0c;由 ODVA&#xff08;开放设备网供应商协会&#xff09; 管理。它融合了 CIP&#xff08;通用工业协议&#xff09; 和以太网技术&…...

使用docker配置PostgreSQL

配置docker阿里云镜像仓库 国内使用docker hub拉取镜像比较慢&#xff0c;所以首先配置个人的镜像仓库。 阿里云的个人镜像仓库是免费的&#xff0c;对个人来说足够用。 具体操作参考阿里云官方链接 。 关于个人镜像仓库的使用参考链接。 配置完个人镜像仓库后将公网配置到doc…...

UITextView删除原有字符串时,光标会上移并且光标会变高

代码运行效果如图&#xff1a; import Foundationclass TestVC: UIViewController {override func viewDidLoad() {super.viewDidLoad()let testV MyCustomTextView(frame: CGRect(x: 0, y: 130, width: SCREEN_WIDTH - 50, height: 170))self.view.addSubview(testV)testV.ba…...

python入门 介绍及变量的使用

1.python介绍 python 是一门计算机语言 常见的计算机语言&#xff1a;python、java、C语言。。。 什么是计算机语言&#xff1a;就是让计算机知道你想干什么&#xff0c;把你的需求使用它能听懂的语言说出来 中国也有一门计算机语言&#xff1a;易语言 能认为是语言的本质上…...

51单片机-按键

1、独立按键 1.1、按键介绍 轻触开关是一种电子开关&#xff0c;使用时&#xff0c;轻轻按开关按钮就可使开关接通&#xff0c;当松开手时&#xff0c;开关断开。 1.2、独立按键原理 按键在闭合和断开时&#xff0c;触点会存在抖动现象。P2\P3\P1都是准双向IO口&#xff0c;…...

Java 8 至 Java 23 版本特性对比表

Java现在发布的版本很快&#xff0c;每年两个&#xff0c;但是真正会被大规模使用的是三年一个的TLS版本。 版本年份LTS关键特性影响力等级Java 82014✅Lambda 表达式、Stream API、方法引用、接口默认方法、Optional 类⭐⭐⭐⭐⭐Java 92017❌模块化系统&#xff08;JPMS&…...

在wsl环境中配置和开发verilog(一种比较新颖的verilog开发指南)

WSL是windows中自带的linux子系统&#xff0c;笔者在若干月前首次接触其便爱不释手&#xff0c;verilog作为一种硬件解释语言&#xff0c;可否像c语言那样被游刃有余的编译和运行呢&#xff0c;笔者这次大胆的尝试在WSL环境VSCODEIverilog开发verilog。 首先默认按照了WSL和VS…...

AI学习指南HuggingFace篇-Hugging Face 的核心工具

一、引言 Hugging Face作为AI领域的重要参与者,提供了许多强大的工具,极大地简化了自然语言处理(NLP)任务的开发流程。其中,Transformers、Datasets 和 Tokenizers 是Hugging Face的三大核心工具。本文将深入介绍这些工具的作用、功能以及它们如何相互配合,帮助读者更好…...

DeepSeek 助力 Vue 开发:打造丝滑的二维码生成(QR Code)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…...

QT 引入Quazip和Zlib源码工程到项目中,无需编译成库,跨平台,压缩进度

前言 最近在做项目时遇到一个需求&#xff0c;需要将升级的文件压缩成zip&#xff0c;再进行传输&#xff1b; 通过网络调研&#xff0c;有许多方式可以实现&#xff0c;例如QT私有模块的ZipReader、QZipWriter&#xff1b;或者第三方库zlib或者libzip或者quazip等&#xff1…...

深入解析桥接模式:软件设计中的解耦利器

桥接模式&#xff1a;软件设计中的解耦利器 在软件开发的复杂世界中&#xff0c;设计模式是开发者解决常见问题的有力工具。桥接模式作为一种重要的结构型设计模式&#xff0c;在处理抽象与实现的关系时展现出独特的优势&#xff0c;它能够巧妙地将抽象部分与实现部分分离&…...

MYSQL-数据库-DDL-DML-DQL-DCL-基础学习

MySql概念&#xff1a; 建立在关系模型基础上&#xff0c;有多张相互连接的二维表组成的数据库 SQL通用语法&#xff1a; 1.SQL语句可以单行或多行书写&#xff0c;以分号结尾 2.SQL语句可以使用空格/缩进来增强语句的可读性 3.MySQL数据库的SQL语句不区分大小写&#xff0c;关…...

rv1126解码的一些原理

rv1126解码篇中&#xff0c;出现最重要的两个api一个是&#xff0c;send_vdec_thread线程里面调用的RK_MPI_SYS_SendMediaBuffer&#xff0c;把数据发到解码器。另外一个是read_vdec_thread线程的RK_MPI_SYS_GetMediaBuffer获取解码器里面的数据。 今天想探讨一下他的底层原理。…...

二级公共基础之数据结构与算法篇(七)排序技术

目录 前言 一、交换类排序 1.冒泡排序法 1. 冒泡排序的思想 2. 冒泡排序的实现步骤 3. 示例 4. 冒泡排序的特点 2.快速排序 1. 快速排序的核心思想 2. 快速排序的实现步骤 3. 示例代码(C语言) 4. 快速排序的特点 二、插入类排序 1. 简单插入排序 1.简单插入排…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

MySQL的pymysql操作

本章是MySQL的最后一章&#xff0c;MySQL到此完结&#xff0c;下一站Hadoop&#xff01;&#xff01;&#xff01; 这章很简单&#xff0c;完整代码在最后&#xff0c;详细讲解之前python课程里面也有&#xff0c;感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...

人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型

在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重&#xff0c;适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解&#xff0c;并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...

前端开发者常用网站

Can I use网站&#xff1a;一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use&#xff1a;Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站&#xff1a;MDN JavaScript权威网站&#xff1a;JavaScript | MDN...