此前将micro_speech部署在STM32H753上时,采用了通用代码并添加了几乎所有优化手段,最佳推理耗时达到51ms。起初因担心增加部署难度而未使用CMSIS-NN,但实际使用后发现其部署流程与通用代码完全一致,并未引入额外操作。
采用STM32H7A3VIT6再此验证一下。
工程命名为H7A3_MicroSpeech_NN,Template Language 选择C++,配置外部时钟,配置调试串口。同此前一样,选择release模式,创建External文件夹并将用户inner_main.c等文件及Path加入。
执行
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 Symbols的Includes选项卡中,为GNU C和GNU 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"。
直接执行,耗时31ms。下面进行多次测试:
| I-Cache | D-Cache | -O3 | 禁用debug | 耗时ms |
|---|---|---|---|---|
| × | × | × | × | 31 |
| × | × | √ | × | 22 |
| × | × | √ | √ | 22 |
| √ | × | √ | × | 12 |
| √ | √ | √ | × | 4 |
其中禁用debug包括在.ioc文件中禁用debug接口,同时在“G++ Complier”中移除-fno-rtti -fno-exceptions参数,重新生成代码编译运行。事实证明这一步操作几乎没有优化。
另外,对GenerateSingleFeature进行测试,验证发现预处理模型单次推理耗时近1ms左右,符合预期。