使用CMSIS-NN加速MicroSpeech推理
分类: 硬件 发布于: 2025-04-18

此前将micro_speech部署在STM32H753上时,采用了通用代码并添加了几乎所有优化手段,最佳推理耗时达到51ms。起初因担心增加部署难度而未使用CMSIS-NN,但实际使用后发现其部署流程与通用代码完全一致,并未引入额外操作。

采用STM32H7A3VIT6再此验证一下。

1. 创建工程

工程命名为H7A3_MicroSpeech_NN,Template Language 选择C++,配置外部时钟,配置调试串口。同此前一样,选择release模式,创建External文件夹并将用户inner_main.c等文件及Path加入。

2. 移植TFLite文件

执行

python tensorflow/lite/micro/tools/project_generation/create_tflm_tree.py  --makefile_options="TARGET=cortex_m_generic TARGET_ARCH=cortex-m7 OPTIMIZED_KERNEL_DIR=cmsis_nn" --example="micro_speech" ../gen_micro_speech_nn

gen_micro_speech_nn文件夹放在External之下,在gen_micro_speech_nn/examples/micro_speech下编写推理接口,以供inner_main调用。

Path and SymbolsIncludes选项卡中,为GNU CGNU C++添加以下配置:

External/gen_micro_speech_nn/third_party/kissfft
External/gen_micro_speech_nn/third_party/cmsis_nn
External/gen_micro_speech_nn/third_party/cmsis_nn/Include
External/gen_micro_speech_nn
External/gen_micro_speech_nn/third_party/flatbuffers/include
External/gen_micro_speech_nn/third_party/gemmlowp
External/gen_micro_speech_nn/examples/micro_speech

Symbols中添加定义:

CMSIS_NN
TF_LITE_STATIC_MEMORY
CMSIS_DEVICE_ARM_CORTEX_M_XX_HEADER_FILE="stm32h7xx.h"

最后在properties -> C/C++ build -> Settings -> MCU/MPU G++ Compiler -> Miscellaneous,点击Add 按钮添加 flag "-std=c++17"。

3. 性能测试

直接执行,耗时31ms。下面进行多次测试:

I-Cache D-Cache -O3 禁用debug 耗时ms
× × × × 31
× × × 22
× × 22
× × 12
× 4

其中禁用debug包括在.ioc文件中禁用debug接口,同时在“G++ Complier”中移除-fno-rtti -fno-exceptions参数,重新生成代码编译运行。事实证明这一步操作几乎没有优化。

另外,对GenerateSingleFeature进行测试,验证发现预处理模型单次推理耗时近1ms左右,符合预期。