【个人开源】——从零开始在高通手机上部署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的时候报错

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

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

相关文章

从混沌到有序:一个数据血缘分析的进化故事

从混沌到有序:一个数据血缘分析的进化故事 从混沌到有序的数据治理之路数据血缘的建设方法和实践路径数据血缘的实践场景和未来趋势。 数据就像流淌在企业血管中的血液,它的每一次流动、每一次转化都留下独特的印记。 作为数据工程师,我曾困惑…

JavaSE学习笔记25-反射(reflection)

反射 在Java中,反射(Reflection) 是一种强大的机制,允许程序在运行时检查和操作类、方法、字段等信息。通过反射,可以动态地创建对象、调用方法、访问字段,甚至修改私有成员。反射的核心类是 java.lang.re…

图表控件Aspose.Diagram入门教程:使用 Python 将 VSDX 转换为 PDF

将VSDX转换为PDF可让用户轻松共享图表。PDF 文件保留原始文档的布局和设计。它们广泛用于演示文稿、报告和文档。在这篇博文中,我们将探讨如何在 Python 中将 VSDX 转换为 PDF。 本文涵盖以下主题: Python VSDX 到 PDF 转换器库使用 Python 将 VSDX 转…

【测试】⽤例篇

本节重点⽬标 测试⽤例的概念 设计测试⽤例的万能思路 设计测试⽤例的⽅法 基于需求的设计⽅法 具体的设计⽅法 等价类 边界值 判定表法 正交法 场景法 错误猜测法 1. 测试⽤例 1.1 概念 什么是测试⽤例? 测试⽤例(Test Case)是为…

C++17中std::chrono::duration和std::chrono::time_point的舍入函数

文章目录 1. std::chrono::duration的舍入函数1.1 floor1.2 ceil1.3 round 2. std::chrono::time_point的舍入函数2.1 示例 3. 舍入函数的应用场景3.1 时间测量3.2 数据记录3.3 时间同步 4. 总结 在C17中, std::chrono库提供了一组强大的时间处理工具,包…

Go 语言结合 Redis 实现固定窗口、滑动窗口、令牌桶和漏桶限流算法的示例代码

固定窗口算法 原理:将时间划分为固定大小的窗口,在每个窗口内对请求进行计数。如果请求数超过设定的阈值,则拒绝后续请求,直到进入下一个窗口。代码: package mainimport ("fmt""time""git…

linux之perf(17)PMU事件采集脚本

Linux之perf(17)PMU事件采集脚本 Author: Once Day Date: 2025年2月22日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: Perf性能分析_Once_day的博…

兰州百合基因组(36.68 Gb)-文献精读113

The evolutionary tale of lilies: Giant genomes derived from transposon insertions and polyploidization 百合的进化故事:由转座子插入和多倍化导致的巨型基因组 百合(Lilium spp.),被誉为“球根花卉之王”,因其…

macos sequoia 禁用 ctrl+enter 打开鼠标右键菜单功能

macos sequoia默认ctrlenter会打开鼠标右键菜单,使得很多软件有冲突。关闭方法: end

UE5.3 C++ TArray系列(一)

一.TArray概述 它们就相当于C动态数组Vector,但是被UE封装了,懂得都懂反射嘛,要不一不小心就被回收了。 它真的非常常见,我所用的容器中,它绝对排名第一,第二是TMap。 同类好理解,我平时也常用…

Docker+Dify部署DeepSeek-r1本地知识库

安装配置Docker Desktop 软件下载 Docker Desktop版本:4.38.0.181591 Docker Desktop下载地址:Docker: Accelerated Container Application Development 或者从这里下载:DockerDesktop-4.38.0.181591资源-CSDN文库 点击图下所示位置,下载windows-AMD64版本软件 启用Hy…

MySQL数据库——表的约束

1.空属性(null/not null) 两个值:null(默认的)和not null(不为空) 数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办法…

腿足机器人之十一- 深度强化学习

腿足机器人之十一- 深度强化学习 机器人能力腿足机器人RL问题建模强化学习解决方案 强化学习算法库选择建议 深度学习技术已经在语音、图像、视频、文本等领域应用广泛,其和强化学习的结合使得基于深度学习的大模型能力更是上升一个台阶。因而用在腿足机器人的运动中…

如何教计算机识别视频中的人类动作

作者简介: 高科,先后在 IBM PlatformComputing从事网格计算,淘米网,网易从事游戏服务器开发,拥有丰富的C++,go等语言开发经验,mysql,mongo,redis等数据库,设计模式和网络库开发经验,对战棋类,回合制,moba类页游,手游有丰富的架构设计和开发经验。 =============…

Redisson分布式锁java语法, 可重入性实现原理 ,(还有可重试性,超时不释放,主从一致性)

Redisson在java的使用方法 Redisson分布式锁不可重入的实现原理 设置一个HSET key为锁的名字,field为当前获取锁的线程名字,value为可重入锁的当前已经重入次数 追踪源码发现RedissonClient类的tryLock就是用lua脚本和上图逻辑实现的加锁解锁&#xf…

YOLOv8与DAttention机制的融合:复杂场景下目标检测性能的增强

文章目录 1. YOLOv8简介2. DAttention (DAT)注意力机制概述2.1 DAttention机制的工作原理 3. YOLOv8与DAttention (DAT)的结合3.1 引入DAT的动机3.2 集成方法3.3 代码实现 4. 实验与结果分析4.1 实验设置4.2 结果分析推理速度性能对比 5. 深度分析:DAttention在YOLO…

MAC快速本地部署Deepseek (win也可以)

MAC快速本地部署Deepseek (win也可以) 下载安装ollama 地址: https://ollama.com/ Ollama 是一个开源的大型语言模型(LLM)本地运行框架,旨在简化大模型的部署和管理流程,使开发者、研究人员及爱好者能够高效地在本地环境中实验和…

springboot+dubbo+zookeeper的注册服务和调用实践

目录 zookeeper为什么可作为注册中心zookeeper注册中心优缺点启动zookeeper编写springboot项目提供dubbo服务1. 服务接口2. Springboot引入dubbo实现服务接口2.1 工程目录和依赖2.2 启动程序和application.properties2.3 DubboService 实现服务接口2.4 测试api,用于…

GTSAM 库详细介绍与使用指南

GTSAM 库详细介绍与使用指南 一、GTSAM 概述 GTSAM(Georgia Tech Smoothing and Mapping)是由佐治亚理工学院开发的 C 开源库,专注于 概率图模型(尤其是因子图)的构建与优化,广泛应用于机器人定位与建图&a…

Missing required prop: “maxlength“

背景&#xff1a; 封装一个使用功能相同使用频率较高的input公共组件作为子组件&#xff0c;大多数长度要求为200&#xff0c;且实时显示统计子数&#xff0c;部分input有输入提示。 代码实现如下&#xff1a; <template><el-input v-model"inputValue" t…