推理耗时统计
单位/ms
硬件 | qnncpu_clip | qnncpu_unet | qnncpu_vae | htp_clip | htp_unet | htp_vae |
---|---|---|---|---|---|---|
骁龙8 gen1+ | 24716.994 | 133440.397 | 23.215 | 411.097 | 696.327 |
1. 下载依赖
- 下载opencv_x64.tar,提取码: rrbp
- 下载opencv_aarch64.tar, 提取码: xj8w
修改CMakeLists.txt
中OPENCV_X64_PATH
和OPENCV_AARCH64_PATH
的路径 - 安装高通QNN,并声明
QNN_SDK_ROOT
环境变量 - 下载android_ndk, 我使用的版本android-ndk-r26c
2. 编译
1.linux
bash
mkdir build_x64 && cd build_x64
cmake .. -DCMAKE_BUILD_TYPE=Debug
make -j8
2.android
bash
mkdir build_android && cd build_android
cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_ROOT/build/cmake/android.toolchain.cmake \
-DANDROID_ABI="arm64-v8a" \
-DANDROID_NDK=$ANDROID_NDK_ROOT \
-DANDROID_PLATFORM=android-28 \
-DPLATFORM_X64=OFF \
..
make -j8
3. x64 cpu执行浮点模型
-
转换浮点模型
参考qualcomm.sd, readme导出浮点模型
-
执行
bash
export FLOAT_MODEL_PATH=/data1/chenjun/2_qualcomm_ai/sd2.1 # 修改成自己导出模型的路径
./build_x64/example/sd2.1/sd_15.out \
${QNN_SDK_ROOT}/lib/x86_64-linux-clang/libQnnCpu.so \
${QNN_SDK_ROOT}/lib/x86_64-linux-clang/libQnnHtp.so \
${FLOAT_MODEL_PATH}/qnn_models/text_encoder_float/x86_64-linux-clang/libtext_encoder.so \
${FLOAT_MODEL_PATH}/qnn_models/unet_float/x86_64-linux-clang/libunet.so \
${FLOAT_MODEL_PATH}/qnn_models/vae_decoder_float/x86_64-linux-clang/libvae_decoder.so \
10
可视化output/sd21_portrait.jpg
(种子未固定,结果具有随机性):
4. 高通HTP执行量化模型
-
转换浮点模型
参考qualcomm.sd, readme导出量化模型
-
执行
bash
export LD_LIBRARY_PATH=$PWD
# 跑sd
./sd_15_htp.out ./libQnnCpu.so ./libQnnHtp.so ./model_quant/libtext_encoder.so ./model_float/libunet.so ./model_float/libvae_decoder.so 10
结果保存在output/sd21_portrait_quant.jpg
, 再adb pull下来看
其他
- qnn输入输出dataformat都是NHWC
- qnn 2.14.0.230828 cpu不支持量化的模型推理,需要用htp的后端
- qnn 2.26.0.240827 cpu也不支持量化模型的推理,composeGraphs的时候报错