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 初始化推理上下文,设置输入输出张量。
执行推理:
输入数据,调用推理接口,获取输出结果