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

QNN SDK学习笔记

QNN 的核心目标

是将 AI 模型高效部署到高通硬件,主要功能包括(来自摘要 1、2、4):

多框架模型转换:

支持将 PyTorch、TensorFlow、Keras、Onnx 等经典框架的模型,转换为 QNN 兼容格式(cpp/json/bin)。

低比特量化(Int8):

提供离线量化工具,通过校准数据集(50-200 张代表性图像)将浮点数模型(Float32)转换为整数模型(Int8),降低模型大小(约 4 倍)、提升推理速度(约 2-3 倍),同时保持精度损失在可接受范围内。

多后端推理加速:

支持高通硬件的CPU、GPU、HTP(Hexagon Tensor Processor,六边形张量处理器)、DSP等后端,通过统一 API 调度硬件资源,最大化模型运行效率。

性能分析与优化:

提供qnn-profile-viewer工具,可分析模型的FLOPS(浮点运算量)、参数量、每一层运行时间等指标,帮助开发者定位性能瓶颈(如某层运行过慢),优化模型结构。

三、QNN SDK 的关键组件

QNN SDK 包含多个工具,覆盖模型部署的全流程(来自摘要 1、5、8):

模型转换器(qnn-xxx-converter):

如qnn-onnx-converter(转换 Onnx 模型)、qnn-tf-converter(转换 TensorFlow 模型),负责将第三方框架模型转换为 QNN 格式,并集成量化功能。

模型库生成器(qnn-model-lib-generator):

将转换后的 QNN 模型(cpp/json/bin)编译为平台特定的共享库(.so for Linux/Android,.dll for Windows),供应用程序调用。

推理测试工具(qnn-net-run):

用于快速验证模型的正确性与性能,支持加载共享库模型,输入测试数据,输出推理结果,并打印运行时间等信息(来自摘要 8)。

性能分析工具(qnn-profile-viewer):

可视化模型的层级性能数据(如运行时间、内存占用),帮助开发者优化模型(来自摘要 1)。

QNN SDK 的典型使用流程

以部署一个 Onnx 模型到高通设备为例,流程如下(来自摘要 4、8):

模型转换与量化:

使用qnn-onnx-converter将 Onnx 模型转换为 QNN 格式,并通过校准数据集完成 Int8 量化:

qnn-onnx-converter --input-model model.onnx --output-dir qnn_model --calibration-data calibration_images

生成序列化上下文:

将 QNN 模型转换为序列化上下文(Binary Context),用于后续编译:

qnn-model-serializer --input-model qnn_model/model.cpp --output-context model.context

编译为共享库:

使用qnn-model-lib-generator将序列化上下文编译为目标平台的共享库(如 Linux 的.so 文件):

qnn-model-lib-generator --input-context model.context --output-lib model.so --target-platform linux-aarch64

推理测试:

使用qnn-net-run加载共享库,输入测试数据,验证推理结果:

qnn-net-run --model-lib model.so --input-data input.bin --output-data output.bin

QNN SDK 的示例应用

QNN SDK 提供qnn-sample-app(位于${QNN_SDK_ROOT}/examples/QNN/SampleApp),这是一个 C++ 示例应用,展示了如何使用 QNN API 执行模型推理(来自摘要 5)。其核心流程如下:

加载后端共享库:

动态加载高通硬件后端的共享库(如libQnnCpu.so、libQnnGpu.so),用于调度硬件资源。

加载模型共享库:

加载通过qnn-model-lib-generator生成的模型共享库(.so/.dll)。

创建推理上下文:

使用 QNN API 初始化推理上下文,设置输入输出张量。

执行推理:

输入数据,调用推理接口,获取输出结果

http://www.dtcms.com/a/263628.html

相关文章:

  • 二十八、【环境管理篇】灵活应对:多测试环境配置与切换
  • python开发|yaml用法知识介绍
  • STM32F4操作内部FLASH简洁版
  • 【代码审计】安全审核常见漏洞修复策略
  • 位运算经典题解
  • 启用不安全的HTTP方法
  • 图像处理专业书籍以及网络资源总结
  • Java编程之状态模式
  • 《UE5_C++多人TPS完整教程》学习笔记40 ——《P41 装备(武器)姿势(Equipped Pose)》
  • 基于Socketserver+ThreadPoolExecutor+Thread构造的TCP网络实时通信程序
  • mac重复文件清理,摄影师同款清理方案
  • flv.js视频/直播流测试demo
  • 2025 推理技术风向标:DeepSeek-R1 揭示大模型从 “记忆” 到 “思考” 的进化路径
  • 【linux】基础开发工具(1)
  • Flink Savepoints 总结
  • js代码09
  • Spring Boot WebSocket方案终极指南:Netty与官方Starter对比与实践
  • MFC的List Control自适应主界面大小
  • Android Gradle 插件和 Android Studio 兼容性
  • Windows下配置Docker+WSL集成开发环境
  • 【C#】如果有一个数值如 168.0000100,如何去除末尾的无效零,只显示有效的小数位数,让DeepSeek给我们解答
  • 飞算JavaAI—AI编程助手 | 编程领域的‘高科技指南针’,精准导航开发!
  • 小米YU7使用UWB技术,厘米级定位精准迎宾,安全防破解无感控车
  • CentOS系统新手指导手册
  • 微信小程序实现table表格
  • 【锂电池剩余寿命预测】GRU门控循环单元锂电池剩余寿命预测(Pytorch完整源码和数据)
  • 清理 Docker 缓存占用
  • 前端常用构建工具介绍及对比
  • 西交从语义到关系、重塑具身导航策略!RSRNav:基于空间关系推理的图像目标导航
  • android stdio 创建 mediaplayertest