docs/inference/npu.md
目前 MNN 支持通过如下后端调用部分手机上的NPU能力:
QNN后端的部分使用步骤(如生成离线产物,确定QNN的NPU库依赖等)需要指定device的硬件架构对应的SOC ID以及HEXAGON ARCH。对于一些常见的硬件架构,我们列举如下供你参考:
| 硬件 | SOC ID | HEXAGON ARCH |
|---|---|---|
| 8 Gen 1 | 36 | 69 |
| 8 Gen 2 | 43 | 73 |
| 8 Gen 3 | 57 | 75 |
| 8 Elite | 69 | 79 |
对于其他的硬件架构,你可以参考高通官网的设备支持列表。
MNN-QNN后端依赖QNN SDK中的include/QNN与lib,可通过以下步骤获取依赖:
/home/xiaying/third/qnn/qairt/2.38.0.250901~/.bashrc ,增加SDK路径到环境变量, 然后运行 source ~/.bashrc 或者重启终端。eg:export QNN_SDK_ROOT=/home/xiaying/third/qnn/qairt/2.38.0.250901
export QNN_ROOT=/home/xiaying/third/qnn/qairt/2.38.0.250901
export HEXAGON_SDK_ROOT=/home/xiaying/third/qnn/qairt/2.38.0.250901
在线构图模式的使用步骤与其他后端基本一致,主要包含以下三部分。
-DMNN_QNN=ON、-DMNN_QNN_CONVERT_MODE=OFF、-DMNN_WITH_PLUGIN=OFF。参考下面的指令,将以下资源推送到Device侧
libQnnHtp.so、libQnnHtpV${HEXAGON_ARCH}Stub.so、libQnnHtpV${HEXAGON_ARCH}Skel.so、libQnnHtpPrepare.so)。HEXAGON_ARCH="75" # modify this variable according to your environment
MNN_ROOT_PATH="/YOUR/MNN/ROOT/PATH" # modify this variable according to your environment
BUILD_ANDROID_PATH="/your/build/andorid/path" # modify this variable according to your environment
ANDROID_WORKING_DIR="/data/local/tmp" # modify this variable according to your environment
# push mnn libs
cd ${BUILD_ANDROID_PATH}
find . -name "*.so" | while read solib; do
adb push $solib ${ANDROID_WORKING_DIR}
done
cd -
# push your AI exe
adb push /your/AI/exe ${ANDROID_WORKING_DIR}
# push QNN libs
adb push ${QNN_SDK_ROOT}/lib/aarch64-android/libQnnHtp.so ${ANDROID_WORKING_DIR}
adb push ${QNN_SDK_ROOT}/lib/aarch64-android/libQnnHtpV${HEXAGON_ARCH}Stub.so ${ANDROID_WORKING_DIR}
adb push ${QNN_SDK_ROOT}/lib/hexagon-v${HEXAGON_ARCH}/unsigned/libQnnHtpV${HEXAGON_ARCH}Skel.so ${ANDROID_WORKING_DIR}
# The following lib is only needed in the online case.
adb push ${QNN_SDK_ROOT}/lib/aarch64-android/libQnnHtpPrepare.so ${ANDROID_WORKING_DIR}
# push MNN models
adb push model.mnn ${ANDROID_WORKING_DIR}
ADSP_LIBRARY_PATH中添加QNN HTP库所在的目录(部分机型上有效)。如果这样也没法成功链接,可将可执行文件,QNN HTP库推送至同一目录,cd到对应目录后,再运行可执行文件,参考如下指令。adb shell "cd ${ANDROID_WORKING_DIR} && export LD_LIBRARY_PATH=.:${ANDROID_LD_LIBRARY_PATH} && export ADSP_LIBRARY_PATH=.:${ANDROID_ADSP_LIBRARY_PATH} && ./your/mnn/qnn/ai/exe"
MNN_FORWARD_NN,即5。Module::Config中的shapeMutable字段为false。相较于在线构图模式,离线构图模式额外包含一次编译(构建生成离线产物需要的MNN库)以及一个模型转换步骤(将原始的MNN模型转化成QNN产物),具体如下。
-DMNN_QNN=ON、-DMNN_QNN_CONVERT_MODE=ON、-DMNN_WITH_PLUGIN=OFF、-DMNN_BUILD_TOOLS=ON。调用MNN2QNNModel工具,针对Device的硬件架构,生成QNN离线产物(model_${SOC_ID}_${HEXAGON_ARCH}.bin)以及替代模型(model_${SOC_ID}_${HEXAGON_ARCH}.mnn),具体可参考该工具的用法。
-DMNN_QNN=ON、-DMNN_QNN_CONVERT_MODE=OFF、-DMNN_WITH_PLUGIN=ON。与在线构图模式的情况类似,但有以下两点不同:
libQnnHtp.so、libQnnHtpV${HEXAGON_ARCH}Stub.so、libQnnHtpV${HEXAGON_ARCH}Skel.so、libQnnSystem.so(不再依赖libQnnHtpPrepare.so,而是依赖libQnnSystem.so)。model_${SOC_ID}_${HEXAGON_ARCH}.bin)以及替代模型(model_${SOC_ID}_${HEXAGON_ARCH}.mnn)。Executor::RuntimeManager::setExternalPath接口设定离线产物所在的目录。适用于 Mac / iOS / iPad
backend type设置成:MNN_FORWARD_NN
适用于 Android 系统,高通/联发科芯片
打开编译宏 MNN_NNAPI 即可
cd ${MNN}
cd project/android
mkdir build && cd build
../build_64.sh -DMNN_USE_LOGCAT=ON -DMNN_NNAPI=ON
backend type设置成:MNN_FORWARD_NN
适用于 Android 系统, Kirlin芯片
从如下链接下载 DDK https://developer.huawei.com/consumer/cn/doc/hiai-Library/ddk-download-0000001053590180
拷贝相对应的so和include文件到 hiai/3rdParty 目录下,如果没有3rdParty目录,新建一个:
mkdir ${MNN}/source/backend/hiai/3rdParty
cp -r ${DDK}/lib ${MNN}/source/backend/hiai/3rdParty/armeabi-v7a
cp -r ${DDK}/lib64 ${MNN}/source/backend/hiai/3rdParty/arm64-v8a
cp -r ${DDK}/include ${MNN}/source/backend/hiai/3rdParty/include