当前位置: 首页 > 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的时候报错

相关文章:

  • 边缘安全加速(Edge Security Acceleration)
  • Redis 的线程安全问题解析:为什么 Redis 是线程安全的?
  • Unity游戏制作中的C#基础(3)加减乘除算术操作符,比较运算符,逻辑与,或运算符
  • 【opencv】图像基本操作
  • 机器学习 - 参数平均感知器
  • STM32MP157A单片机移植Linux驱动深入版
  • 视频mp4垂直拼接 水平拼接
  • 高级系统架构师--第七章:安全架构设计理论与实践
  • Nginx Embedded Variables 嵌入式变量解析(4)
  • Gradio全解11——使用transformers.agents构建Gradio UI(4)
  • Windows 权限结构和原理:深入浅出
  • 基于flask+vue框架的的医院预约挂号系统i1616(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • React Router v5 vs v6 路由配置对比
  • Vue 中 nextTick 的原理详解
  • DeepSeek掘金——快速集成DeepSeek满血版 搭建智能运维助手
  • 黑马点评自学03
  • Spring MVC 对象转换器:初级开发者入门指南
  • 图书管理系统
  • C++ 设计模式-访问者模式
  • python中的异常-模块-包
  • 自己做淘宝返利网站/搜狗搜索网页版
  • bi网站开发/搜狗关键词排名查询
  • 动态网站建设包括哪些/产品推销方案
  • 鹏鹞网站页面代码/seo公司 杭州
  • 前端网页/seo服务价格表
  • 手机wap网站模板下载/营销型网站制作建设