通过qnn在高通8295的cpu/dsp上部署模型的问题

qq_34312701 2025-04-02 09:42:49

 

qnn sdk: qualcomm_ai_engine_direct.2.31.0.250130.Linux-AnyCPU.qik

部署在高通8295安卓端

CPU部署,步骤:

​```

qnn-onnx-converter -i model.onnx --out_name a --out_name b -d input_imgs 1,1,224,224 -o gaze_stat.cpp --input_list inputs_list.txt

qnn-model-lib-generator -c gaze_stat.cpp -b gaze_stat.bin -o bin -t aarch64-android

./qnn-sample-app --model "./libgaze_stat.so"  --input_list "./inputs_list.txt"  --backend "./libQnnCpu.so" --output_dir "./output_cpu"

```

问题1:

对于CPU推理的执行时间过长

模型未量化版本: 推理400+ms,量化版本:推理50ms左右

如何提升在cpu上部署的推理效率?

DSP V66部署, 步骤:

```

export ADSP_LIBRARY_PATH=/data/local/:/vendor/dsp/cdsp:/vendor/lib/rfsa/adsp:/system/lib/rfsa/adsp:/dsp

export LD_LIBRARY_PATH=/vendor/dsp/cdsp:/vendor/lib64/:/data/local/:${LD_LIBRARY_PATH}

./qnn-sample-app --model libgaze_stat.so --input_list inputs_list_1.txt --backend libQnnDspV66Stub.so

```

问题2:

出现如下错误: 

[ ERROR ] Unable to access symbol [QnnInterface_getProviders]. pal::dynamicloading::dlError(): undefined symbol: QnnInterface_getProviders

Error initializing QNN Function Pointers

如何解决上述两个错误?

...全文
479 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

以下分别针对你在高通 8295 上 CPU 和 DSP 部署模型时遇到的问题进行分析并给出解决建议:

问题 1:提升 CPU 上部署的推理效率

模型层面优化

  • 模型量化:你已经有了量化版本的模型且推理时间大幅缩短,这说明量化是有效的优化手段。可以尝试进一步探索不同的量化策略,例如使用更细粒度的量化(如 INT4 量化),或者采用混合精度量化,结合不同精度的数据类型以平衡精度和性能。
  • 模型剪枝:使用如 AIMET 等工具对模型进行剪枝,去除模型中对结果影响较小的连接和神经元,减少计算量。但要注意剪枝的比例不能过大,以免对模型精度造成严重影响。
  • 模型蒸馏:用一个较小的模型(学生模型)去学习大模型(教师模型)的输出,在保持一定精度的前提下,降低模型的复杂度和计算量。

代码层面优化

  • 并行计算:利用多线程或多核 CPU 进行并行计算。在代码中合理设置线程数,确保每个核心都能充分利用。例如,在 C++ 代码中可以使用 OpenMP 库来实现多线程并行计算。
    ```cpp
    #include
    #include <omp.h>

int main() {
#pragma omp parallel for
for (int i = 0; i < 100; ++i) {
// 并行计算的代码块
std::cout << "Thread " << omp_get_thread_num() << " processing iteration " << i << std::endl;
}
return 0;
}

- **内存优化**:减少内存的频繁读写操作,合理安排数据的存储和访问顺序。例如,采用内存池技术来管理内存,避免频繁的内存分配和释放。

#### 系统层面优化
- **CPU 调度**:确保 CPU 核心的频率和性能处于较高水平。可以通过调整系统的电源管理策略,将 CPU 设置为高性能模式。在 Android 系统中,可以使用相关的系统工具或 API 来实现。
- **编译器优化**:使用合适的编译器选项来优化代码。例如,在使用 GCC 编译器时,可以添加 `-O3` 选项来开启最高级别的优化。

### 问题 2:解决 DSP V66 部署时的符号未定义错误

#### 库文件检查
- **库文件是否存在**:确认 `libQnnDspV66Stub.so` 库文件是否存在于指定的 `LD_LIBRARY_PATH` 路径中。可以使用 `ls` 命令来检查文件是否存在。
```bash
ls /vendor/dsp/cdsp /vendor/lib64/ /data/local/ | grep libQnnDspV66Stub.so
  • 库文件版本兼容性:确保 libQnnDspV66Stub.so 库文件的版本与 QNN SDK 兼容。不兼容的库文件版本可能会导致符号未定义的错误。

环境变量设置

  • 环境变量是否正确设置:检查 ADSP_LIBRARY_PATHLD_LIBRARY_PATH 环境变量是否正确设置。可以使用 echo 命令来查看环境变量的值。
    echo $ADSP_LIBRARY_PATH
    echo $LD_LIBRARY_PATH
    
    确保环境变量中包含了所有必要的库文件路径。

动态链接库加载问题

  • 使用 ldd 命令检查依赖:使用 ldd 命令检查 libQnnDspV66Stub.so 库文件的依赖是否都已正确加载。
    ldd /path/to/libQnnDspV66Stub.so
    
    如果有依赖的库文件缺失或未正确加载,需要进行相应的处理。

重新编译和安装

  • 重新编译库文件:如果以上方法都无法解决问题,可以尝试重新编译 libQnnDspV66Stub.so 库文件,并确保编译过程中没有错误。
  • 重新安装 QNN SDK:有时候,SDK 的安装可能不完整或存在问题。可以尝试卸载并重新安装 QNN SDK,确保所有的库文件和工具都正确安装。

3,769

社区成员

发帖
与我相关
我的任务
社区描述
本论坛以AI、WoS 、XR、IoT、Auto、生成式AI等核心板块组成,为开发者提供便捷及高效的学习和交流平台。 高通开发者专区主页:https://qualcomm.csdn.net/
人工智能物联网机器学习 技术论坛(原bbs) 北京·东城区
社区管理员
  • csdnsqst0050
  • chipseeker
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧