ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

tflite-micro 集成 CMSIS-NN 优化算子:构建参数、源码路径与速度/体积权衡实战指南

tflite-micro 集成 CMSIS-NN 优化算子:构建参数、源码路径与速度/体积权衡实战指南 人工智能深度学习推理引擎本地部署嵌入式物联网【免费下载链接】tflite-microInfrastructure to enable deployment of ML models to low-power resource-constrained embedded targets (including microcontrollers and digital signal processors).项目地址https://gitcode.com/gh_mirrors/tf/tflite-micro点击查看免费下载本指南以 tflite-micro 仓库中 tensorflow/lite/micro/kernels/cmsis_nn/README.md 为核心系统讲解如何在 TensorFlow Lite MicroTFLM中启用 Arm Cortex-M 平台的 CMSIS-NN 优化算子包括OPTIMIZED_KERNEL_DIRcmsis_nn的构建开关、CMSIS/CMSIS-NN/Cortex_DFP 三种源码来源的配置方式以及按速度或体积编译内核的取舍方法。读完本文你将能够在 make 构建系统中独立配置出针对 Cortex-M 系列 MCU 的 CMSIS-NN 加速推理构建并能解释其背后的 make 脚本与内核实现原理。CMSIS-NN 是什么为什么 TFLM 需要它CMSIS-NN 是 Arm 提供的、包含面向 Arm Cortex-M 系列处理器内核级优化算子kernel optimizations的软件库。它利用 Cortex-M 的 SIMD如 DSP/MVE 扩展与定点量化特性将卷积、全连接、Softmax 等算子的计算密集型路径改写为高度优化的汇编级实现从而在资源受限的嵌入式目标微控制器、DSP上显著降低推理延迟。TFLM 的默认构建使用的是纯 C/C 编写的 reference参考算子实现。要让设备用上 CMSIS-NN 的优化版本只需要在 make 命令行中追加一个开关OPTIMIZED_KERNEL_DIRcmsis_nn其工作机制在 tensorflow/lite/micro/tools/make/Makefile 中有明确注释OPTIMIZED_KERNEL_DIR指定从哪个专用内核目录拉取实现OPTIMIZED_KERNEL_DIR_PREFIX默认为tensorflow/lite/micro/kernels因此cmsis_nn对应的实际目录就是 tensorflow/lite/micro/kernels/cmsis_nn/。该目录下每个算子文件与通用算子同名构建时按目录覆盖 reference 实现。覆盖了哪些算子从 tensorflow/lite/micro/kernels/cmsis_nn/ 目录内容可见CMSIS-NN 优化实现覆盖以下算子算子实现文件卷积 Conv 2D含 INT8/INT16/INT4 权重conv.cc转置卷积 Transpose Convtranspose_conv.cc深度可分离卷积 Depthwise Convdepthwise_conv.cc全连接 Fully Connectedfully_connected.cc池化 PoolingAvg/Maxpooling.ccSoftmaxsoftmax.ccSVDFsvdf.cc加法 Add、乘法 Mul、最大/最小add.cc、mul.cc、maximum_minimum.ccPad、Transpose、Batch Matmul、单向序列 LSTMpad.cc、transpose.cc、batch_matmul.cc、unidirectional_sequence_lstm.cc以 conv.cc 为例其实现直接包含 CMSIS-NN 头文件#include Include/arm_nnfunctions.h见 conv.cc在Prepare阶段调用arm_convolve_wrapper_s8_get_buffer_size/arm_convolve_wrapper_s16_get_buffer_size查询所需 scratch buffer 大小并通过RequestScratchBufferInArena在内存池中预留见 conv.cc在Eval阶段通过模板化的convolve_wrapper分发到arm_convolve_wrapper_s8/arm_convolve_wrapper_s4/arm_convolve_wrapper_s16见 conv.cc。由此可见 CMSIS-NN 集成并不是简单替换函数而是把 TFLM 的张量/量化参数转换成cmsis_nn_conv_params、cmsis_nn_per_channel_quant_params、cmsis_nn_dims等结构后再交给 Arm 库完成底层计算。指定 CMSIS-NN 源码路径的三种方式CMSIS-NN 依赖 CMSIS-Core提供启动代码、中断处理和内核定义因此在指定路径时两者必须同时给出。TFLM 提供三种来源方式。方式一默认下载构建时自动拉取不指定任何路径时构建过程会自动把 CMSIS 与 CMSIS-NN 下载到 make 的 downloads 目录下再编译。下载行为由 tensorflow/lite/micro/tools/make/ext_libs/cmsis_nn.inc 驱动默认路径为$(DOWNLOADS_DIR)/cmsis即tensorflow/lite/micro/tools/make/downloads/cmsis与$(DOWNLOADS_DIR)/cmsis_nn若目录不存在则调用 ext_libs/cmsis_download.sh 和 ext_libs/cmsis_nn_download.sh 通过 wget 下载固定版本 ZIP 并做 MD5 校验后解压下载脚本还会顺带拉取 CMSIS Cortex_DFP 组件到downloads/cmsis/Cortex_DFP用于通用的 Arm Cortex-M 设备支持。这种方式最简单适合快速验证但网络不可用时需要离线手段。方式二外部源码路径如果希望使用自己克隆或定制的 CMSIS/CMSIS-NN 代码树可以同时指定两个变量缺一不可make -f tensorflow/lite/micro/tools/make/Makefile OPTIMIZED_KERNEL_DIRcmsis_nn \ CMSIS_PATHexternal/path/to/cmsis/ \ CMSIS_NN_PATHexternal/path/to/cmsis-nn/ \ TARGETcortex_m_corstone_300 TARGET_ARCHcortex-m55 kernel_conv_test在 cmsis_nn.inc 中make 只在CMSIS_PATH/CMSIS_NN_PATH等于默认下载路径时才触发下载一旦你显式传入外部路径下载步骤会被跳过直接编译外部代码树。同时该文件会把$(CMSIS_PATH)/CMSIS/Core/Include、$(CMSIS_NN_PATH)/Include等加入INCLUDES保证 CMSIS 源码内部形如#include arm_math.h的依赖也能被正确解析见 cmsis_nn.inc。方式三链接预编译的 CMSIS-NN 静态库如果 CMSIS-NN 已经以静态库形式如cmsis-nn.a提供可以只链接库而不用重新编译 CMSIS-NN 源码但此时CMSIS_PATH仍然必须给出用于提供头文件和 CMSIS-Core 的系统/启动代码make -f tensorflow/lite/micro/tools/make/Makefile OPTIMIZED_KERNEL_DIRcmsis_nn \ CMSIS_NN_LIBSpath/to/cmsis-nn.a \ CMSIS_PATHpath/to/cmsis/ \ TARGETcortex_m_corstone_300 TARGET_ARCHcortex-m55 kernel_conv_test注意 cmsis_nn.inc 中的强制约束一旦提供了CMSIS_NN_LIBS而未同时提供CMSIS_PATH或CMSIS_NN_PATHmake 会直接报错CMSIS_NN_LIBS provided but not CMSIS_PATH/... not CMSIS_NN_PATH。这是因为头文件与库必须来自同一代码基线若库来自外部而头文件来自默认下载路径二者基路径不一致会引发构建错误。两个重要提醒性能/体积可能受影响使用外部预编译库时其编译选项可能与 TFLM 构建所采用的选项不同例如优化级别、是否启用 MVE因此最终性能或代码体积可能与本仓库自行编译的版本有差异。原文档明确提示了这一风险。路径一致性CMSIS_NN_LIBS、CMSIS_NN_PATH与CMSIS_PATH应当拥有相同的基路径否则会因为头文件与库不匹配而构建失败见 cmsis_nn.inc 的校验逻辑。指定 Cortex_DFP 路径Cortex_DFP 提供 Cortex-M 设备级的启动文件startup与系统初始化代码system。TFLM 默认使用随 CMSIS 一起下载的 Cortex_DFP位于downloads/cmsis/Cortex_DFP参见 cmsis_download.sh。需要替换时用附加标志指定CORTEX_DFP_PATHpath/to/cmsis/Cortex_DFP在 Corstone-300 目标中cortex_m_corstone_300_makefile.inc 会使用$(CORTEX_DFP_PATH)/Device/$(ARM_CPU)/Source/system_$(ARM_CPU).c与startup_$(ARM_CPU).c编译启动代码并把$(CORTEX_DFP_PATH)/Device/$(ARM_CPU)/Include加入 include 路径。也就是说Cortex_DFP 路径直接影响最终链接进固件的启动/系统代码来源。实战示例基于 Arm Corstone-300 FVP 构建卷积单元测试Corstone-300 是一个基于 Arm Corstone-300 软件栈的固定虚拟平台FVP其目标信息见 tensorflow/lite/micro/cortex_m_corstone_300/README.md。Corstone-300 模拟 Cortex-M55 系统同时向后兼容因此也可以运行为 Cortex-M7 等编译的代码。以下三种构建方式均以kernel_conv_test为目标对应源码 kernels/conv_test.cc 与 Makefile.inc 中定义的microlite_test目标。使用自动下载的 CMSIS-NN 源码构建make -f tensorflow/lite/micro/tools/make/Makefile OPTIMIZED_KERNEL_DIRcmsis_nn \ TARGETcortex_m_corstone_300 TARGET_ARCHcortex-m55 kernel_conv_test使用外部 CMSIS-NN 源码构建make -f tensorflow/lite/micro/tools/make/Makefile OPTIMIZED_KERNEL_DIRcmsis_nn \ CMSIS_PATHexternal/path/to/cmsis/ \ CMSIS_NN_PATHexternal/path/to/cmsis-nn/ \ TARGETcortex_m_corstone_300 TARGET_ARCHcortex-m55 kernel_conv_test链接外部预编译的 CMSIS-NN 静态库make -f tensorflow/lite/micro/tools/make/Makefile OPTIMIZED_KERNEL_DIRcmsis_nn \ CMSIS_NN_LIBSpath/to/cmsis-nn.a \ CMSIS_PATHpath/to/cmsis/ \ TARGETcortex_m_corstone_300 TARGET_ARCHcortex-m55 kernel_conv_test关于TARGET_ARCH的可选值cortex_m_corstone_300_makefile.inc 支持cortex-m0、cortex-m3、cortex-m4、cortex-m4fp、cortex-m55、cortex-m7、cortex-m7fp不在此列表中的值会直接报错TARGET_ARCH... is not supported。对于cortex-m55该文件还会使用-mcpu8.1-M.Main.mve.fp与 hard-float 配置见 cortex_m_corstone_300_makefile.inc从而启用 MVE 指令。面向速度或体积的构建OPTIMIZE_KERNELS_FOR两种模式的语义TFLM 允许内核提供针对速度或体积的不同实现在构建时通过OPTIMIZE_KERNELS_FOR选择。二者的本质差异原文档定义KERNELS_OPTIMIZED_FOR_SPEED默认更低的推理延迟但需要更大的 scratch buffer临时缓冲区KERNELS_OPTIMIZED_FOR_SIZE代码/缓冲区占用更小但延迟更高。当嵌入式系统内存有限、模型较大时这是必要选项。目前支持该开关的内核仅有转置卷积transpose conv。Makefile 层面的定义与注释见 tensorflow/lite/micro/tools/make/MakefileOPTIMIZE_KERNELS_FOR只有两个合法值KERNELS_OPTIMIZED_FOR_SIZE和KERNELS_OPTIMIZED_FOR_SPEED默认值是KERNELS_OPTIMIZED_FOR_SPEED同时它会通过-D标签的方式大写转换后注入编译期宏见 Makefile供源码用#ifdef分支选择实现。构建静态库 microlite 示例构建目标microlite会产出libtensorflow-microlite.a静态库。以下命令使用TARGETcortex_m_generic通用 Cortex-M 目标对应文档见 tensorflow/lite/micro/cortex_m_generic/README.md架构为 cortex-m55。面向速度默认值也可显式指定make -f tensorflow/lite/micro/tools/make/Makefile \ TARGETcortex_m_generic TARGET_ARCHcortex-m55 \ OPTIMIZED_KERNEL_DIRcmsis_nn \ OPTIMIZE_KERNELS_FORKERNELS_OPTIMIZED_FOR_SPEED microlite注意原文档强调速度是默认选项即使完全不写OPTIMIZE_KERNELS_FOR也会按默认值KERNELS_OPTIMIZED_FOR_SPEED构建见 Makefile 中 Makefile 的默认赋值。面向体积make -f tensorflow/lite/micro/tools/make/Makefile \ TARGETcortex_m_generic TARGET_ARCHcortex-m55 \ OPTIMIZED_KERNEL_DIRcmsis_nn \ OPTIMIZE_KERNELS_FORKERNELS_OPTIMIZED_FOR_SIZE microlite构建系统源码级补充CMSIS-NN 是如何被接进编译链的如果你希望深入理解上述参数在 make 内部的完整走向可以沿着以下链路继续阅读当前仓库Makefile当OPTIMIZED_KERNEL_DIR非空时将路径拼为$(OPTIMIZED_KERNEL_DIR_PREFIX)/$(OPTIMIZED_KERNEL_DIR)即tensorflow/lite/micro/kernels/cmsis_nn并校验目录存在性随后include $(MAKEFILE_DIR)/ext_libs/$(OPTIMIZED_KERNEL_DIR).inc即引入 ext_libs/cmsis_nn.inc。ext_libs/cmsis_nn.inc完成源码收集find $(CMSIS_NN_PATH)/Source -name *.c加入THIRD_PARTY_KERNEL_CC_SRCS或静态库链接MICROLITE_LIBS $(CMSIS_NN_LIBS)并统一加入头文件路径与编译宏ARM_NN_ENABLE_F16/ARM_NN_ENABLE_F32默认均为 0即默认关闭 FP16/FP32 CMSIS-NN 路径见 cmsis_nn.inc。kernels/Makefile.inckernel_conv_test等测试目标的源码/头文件依赖清单配合 Corstone-300 的测试脚本 testing/test_with_arm_corstone_300.sh 在 FVP 上运行。算子的 TFLM 注册入口例如 conv.cc 中的Register_CONV_2D()/Register_CONV_2D_INT8()等通过TFLMRegistration暴露给MicroMutableOpResolver使用。这些链路共同解释了“为什么加一个OPTIMIZED_KERNEL_DIRcmsis_nn就能整体替换参考算子”make 在目录层面完成了实现替换在 ext_libs 层面完成了第三方源码/库的接入而算子源码内部则通过arm_nnfunctions.h完成对 Arm 优化函数的调用。常见问题与注意事项速查问题/场景处理方式只想快速启用 CMSIS-NN只加OPTIMIZED_KERNEL_DIRcmsis_nn其余交给自动下载使用自建 CMSIS 代码树同时指定CMSIS_PATH与CMSIS_NN_PATH链接预编译cmsis-nn.a指定CMSIS_NN_LIBSCMSIS_PATH 建议同时CMSIS_NN_PATH三者基路径必须一致否则报错需要替换设备启动/系统代码使用CORTEX_DFP_PATH指向自备 Cortex_DFP默认使用随 CMSIS 下载的版本大模型内存受限用OPTIMIZE_KERNELS_FORKERNELS_OPTIMIZED_FOR_SIZE换更小 scratch buffer目前仅转置卷积生效默认是 speed外部库性能差异外部库编译选项可能与 TFLM 不同性能/体积可能变化属于预期行为综上CMSIS-NN 集成是 TFLM 在 Arm Cortex-M 上获得高性能推理的关键路径。通过OPTIMIZED_KERNEL_DIR与配套路径变量的组合你可以在自动下载、外部源码、预编译库三种模式间自由切换并通过OPTIMIZE_KERNELS_FOR在延迟与内存占用之间做出适合自己硬件的取舍。赞分享人工智能深度学习推理引擎本地部署嵌入式物联网【免费下载链接】tflite-microInfrastructure to enable deployment of ML models to low-power resource-constrained embedded targets (including microcontrollers and digital signal processors).项目地址https://gitcode.com/gh_mirrors/tf/tflite-micro点击查看免费下载相关推荐tflite-micro 代码体积Code Size测量与优化实战指南tflite micro 代码体积Code Size测量与优化实战指南 本文以 TFLMTensorFlow Lite for Microcontroll人工智能深度学习推理引擎本地部署嵌入式物联网CANN ops-nn 算子实战Conv3DTransposeV2 三维转置卷积反卷积算子的原理、参数与调用指南CANN ops nn 算子实战Conv3DTransposeV2 三维转置卷积反卷积算子的原理、参数与调用指南 本篇技术指南以 CANN 神经网络算子库人工智能算子库深度学习CANNAscend5分钟掌握Locale Remulator彻底告别游戏乱码的智能解决方案5分钟掌握Locale Remulator彻底告别游戏乱码的智能解决方案 你是否曾经遇到过打开日文游戏却看到满屏乱码或者想玩韩文游戏却因为语言环境问题无法正桌面应用系统编程上一篇解决90%用户痛点FunASR离线语音识别服务深度排障指南下一篇WXPush完全上手从API调用到多用户管理的完整教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表