6,677
社区成员
发帖
与我相关
我的任务
分享我们的demo app里的模型是tflite格式。在gradle里写明模型路径进行最基本调用,没有写任何关于硬件加速的代码。现在主要的问题是速度非常慢。我们现在已经能够把模型用qnn-onnx-converter把模型编译成bin和dlc文件。我们想了解这些dlc和bin格式的模型文件如何正确的在安卓app里使用,使用用途包含如何调用模型,如何调用npu,如何硬件加速,如何并行计算。
- 调用模型: 目前app是kotlin和java写的。不知道是否得使用c++去调用bin和dlc。如果是的话,有没有详细的教程可以参考。
- 调用npu:tflite有调用npu的方法吗?有的话有详细的代码教程或者文档吗。dlc和bin文件的npu调用文档和教材在哪里可以找到。有例子最好。
- 调用硬件:除了调用npu,有其他有益于模型速度的硬件加速可以在Snapdragon 8 Elite Gen 5上实现吗, 如果有请问教程和文档/例子在哪里可以找到。
- 并行计算: 我们准备并行跑4个模型。这四个模型分别是QAI-Hub上的easy_ocr, yolov11 detection, yolov11 segmentation, depth_anything_v2. 我们想了解这样强度的并行计算对手机硬件是否现实,然后如何自查。比如说让所有模型并行调用NPU是否现实。还有没有额外我们要做并行计算需要特别考虑的方面,影响我们软件实现或者模型选择。最后如果能有模型并行inference的例子就最好了。
// native-lib.cpp
#include <jni.h>
#include "QnnInterface.h"
// 全局变量保存句柄
Qnn_ContextHandle_t g_context = nullptr;
Qnn_GraphHandle_t g_graph = nullptr;
extern "C" JNIEXPORT jboolean JNICALL
Java_com_example_myapp_AIModel_init(JNIEnv* env, jobject, jstring modelPath) {
// 1. 加载后端 (libQnnHtp.so)
// 2. 创建 Device
// 3. QnnContext_createFromBinary(...) 加载 .bin 文件
// 4. QnnGraph_retrieve(...) 获取图句柄
return true;
}
extern "C" JNIEXPORT jfloatArray JNICALL
Java_com_example_myapp_AIModel_inference(JNIEnv* env, jobject, jbyteArray imageData) {
// 1. 获取输入 Tensor 指针
// 2. 将 imageData 拷贝或零拷贝(RPCMem) 到输入 Tensor
// 3. QnnGraph_execute(g_graph, ...)
// 4. 读取输出 Tensor 并返回
}
Interpreter.Options options = new Interpreter.Options();
// 添加 QNN Delegate
Delegate qnnDelegate = new QnnDelegate(context, QnnDelegate.Options());
options.addDelegate(qnnDelegate);
Interpreter interpreter = new Interpreter(modelFile, options);
注意:您需要将 SDK 中的 libQnnTfliteDelegate.so 放入工程。
路线 B:QNN Native (性能极致,您的目标)
您已经生成了 .bin (Context Binary),这是性能最强、初始化最快的方式,特别是针对 SM8850 的 V81 架构。
文档位置:
核心流程:docs/QNN/general/api_overview.html (查看 Cache-based execution 章节)
HTP 特定:docs/QNN/general/htp/htp_backend.html
HTP 的 FP16 能力 (V81 特性):
SM8850 的 HTP 原生支持 FP16。如果 YOLOv11 量化掉点,可以在转换时使用 --float_fallback 或指定 FP16 精度,NPU 依然能跑,且比 CPU 快得多。
建议策略:
主力:全部 4 个模型优先尝试 HTP (NPU) INT8 量化。
备选:如果 Depth Anything V2 精度不够,改用 HTP FP16 或 GPU FP16。