[Day 14] tinyML开发框架(二):Arm CMSIS 简介

[Day 10] tinyML整合开发平台介绍有提到小型AI(tinyML)应用程序开发框架(Fig. 10-3)在推论函式库中可能会使用到CMSIS-NN,这是什麽?为什麽它能起到这重要的地位呢?接下来就帮大家简单介绍一下。

Arm CMSIS全名Common Microcontroller Software Interface Standard,顾名思义就是Arm为了让自家MCU (IP)能跨厂牌(如STM, NXP, 新唐、盛群等)、跨开发平台(MDK, Keil, IAR, eIQ, STM32CubeIDE, Arduino IDE等)、跨家族(Cortex-M0/M0+/M1/M3/M4/M7/M23/M33/M35P/M55/A5/A7/A9)所推出来的软件开发介面,减少使用者的学习曲线。它是一种硬体抽象层(Hardware Abstraction Layer, HAL)的概念,就是不直接驱动硬体而采间接驱动的程序写作概念,这样就可达成上位软件写作统一化的好处,类似使用OpenGL, OpenCL跨GPU开发绘图软件一样。

由Fig. 14-1图可看出CMSIS的基本架构,最下方为实际硬体,包括微处理器(CPU,暂存器、旗标等)、通讯周边(I2C, SPI, UART等)、特殊周边(如ADC, DAC, PWM等)及一些除错相关的硬体。中间层则负责硬体抽象描述,处理所有核心计算及周边信号处理。上一层则为进阶整合性功能,如即时作业系统、神经网路运算等,最後才是组合成完整的应用程序码。目前CMSIS可以支援的元件非常多,有6009项,其中Cortex-M4最多,占了39.1%,Cortex-M3次之,占25.6%,第三为Cortex-M0+,占14.9%,三者合计占79.6%。而支援的开发板高达441种,相关软件也多达682项,可见其普及性及便捷性。

ARM CMSIS架构图
Fig. 14-1 ARM CMSIS架构图。(OmniXRI整理制作, 2021/9/28)

Arm CMSIS为开源项目,主要组成元件(Components)如下所示。

  • 核心(Core):又分为Cortex-M用的Core(M)和Cortex-A用的Core(A),提供标准API及核心运算指令。
  • 驱动程序(Driver):用於连接实际硬体介面的中间软件(Middleware),以实现软件堆叠(Stack)。
  • 数位信号处理器(Digital Signal Processor, DSP):有超过60个以上函式,可处理定点(q7, q15, q31)、32 bit浮点及单指令多资料流(SIMD)指令应用。
  • 神经网路(Neural Network, NN):高性能神经网路运算函式库,执行tinyML、深度学习重要函式库。
  • 即时作业系统(Real Time Operation System, RTOS):又分为V1(Cortex-M0/M0+/M3/M4/M7)和V2(Cortex-M/A5/A7/A9)。
  • 包装(Pack):描述软件元件、设备参数和开发板支持的交付机制。它简化了软件重用和产品生命周期管理 (PLM)。
  • 建置(Build):一组可提高生产力的工具、软件框架和工作流程,例如使用连续整合(CI)。
  • 系统视角描述(System View Description, SVD):可用於在除错工具及创建外设感知设备的描述。
  • 除错存取埠(Debug Access Port, DAP):提供除错存取埠介面所需的的韧体。
  • 区域(Zone):定义方法来描述系统资源并将这些资源划分为多个专案和执行区域。

透过前面章节及上图Fig.14-1可知,Arm Cortex-M4(F)是最适合用来开发tinyML的家族,因为它价格及性能在整个Cortex家族中间,相较M0/M0+/M3等低阶MCU配置有较多的程序码区(Flash)和随机记忆体(SRAM)可用来储放模型及参数,同时支援定点、浮点(FP16/FP32)及整数(INT8)运算,也支援单指令周期DSP及SIMD指令集,可让CMSIS-DSP数位信号处理(含高阶数学运算及机器学习常用统计算法)和CMSIS-NN神经网路函式库发挥更多功效。前面章节使用的Arduino Nano 33 BLE Sense开发板的主晶片内核正是Arm Cortex-M4F。

接下来就帮大家介绍一下CMSIS-DSPCMSIS-NN的主要元件和功能。

CMSIS-DSP 数位信号处理函式库

早期8/16 bit MCU并没有浮点(少部份有定点)运算能力或硬体乘法器、除法器,基本上也不支援像矩阵计算这类高阶的运算,顶多是靠很多层的回圈、乘法及加法来完成。但遇到像数位信号处理时经常用到快速傅立叶转换(FFT)算法,需要大量乘加演算时,此时就只能依靠专用DSP处理器来完成。当Cortex-M3问世後,开始有了多周期的乘加一体(Multiply-Accumulate, MAC, y=ax+b)指令,到了Cortex-M4上市後,开始指供单周期的乘加及SIMD指令集(又称DSP指令集),至此,许多原来需要专用DSP处理器的工作就慢慢被取代了。但是一般程序设计师并没有强大的数学能力,更不懂如何有效地发挥MCU加速计算的能力,所以当遇到像马达控制、声音信号处理等应用时,还是会选择专用的DSP处理器。因此为了让程序设计师能更简单的开发DSP相关产品,於是CMSIS-DSP就此诞生。以下就简单介绍这个函式库提供的主要函式分类,更完整的内容可参考官网文件说明。对於偏属传统机器学习相关或信号预处理的tinyML应用,较会使用到这个部份的函式库。

CMSIS-DSP函式库相关函式:

  • 基本数学函数(向量加法、乘法、点积及位元运算等)
  • 快速数学函数(sine, cosine, 均方根、定点除法等)
  • 复数数学函数(共轭复数、复数点积、乘法、绝对值等)
  • 滤波函数(IIR, FIR, LMS等)
  • 矩阵函数(矩阵加法、减法、乘法、转置、反矩阵等)
  • 变换函数(FFT, DCT等)
  • 马达控制函数(PID, Park, Clarke, Sine, Cosine等)
  • 统计函数(绝对最大、最小,熵、平均值、开平方、次方、均方根、标准差、变异数等)
  • 支持函数(向量排序、复制、填充、加权总合、整数转换等)
  • 插值函数(线性、双线性及立方内插等)
  • 支持向量机函数 (SVM)(线性、多项式、RBF、Sigmoid等)
  • 贝叶斯分类器函数(f16, f32等)
  • 距离函数(Float, Boolean等)
  • 四元数函数(四元转换、反转、正规化、点积等)

CMSIS-NN 神经网路函式库

[Day 05] tinyML与卷积神经网路(CNN)时已帮大家介绍过卷积神经网路常见基本元素(如图Fig. 5-2),而这也是CMSIS-NN的主要元素。在[Day 10] tinyML整合开发平台介绍时(如图Fig. 10-3)也曾提及TensorFlow Lite for Microcontroller (TFLM) 会以CMSIS-NN函式库为基础来产出对应的程序码,方便MCU端可以执行。虽然CMSIS-NN也可运行在没有浮点运算及SIMD指令的Cortex-M0/M0+/M3 CPU上,但其执行效率会和M4以上家族差上数倍到数十倍(含CPU工作时脉速度提升)。

以CMSIS-NN函式库发展出的tinyML应用,包括有:

  • 多层全连接的深度神经网路(Deep Neural Network, DNN):如智慧感测器、手势(动作)辨识、唤醒词侦测等应用,
    *卷积神经网路(Convolutional Neural Network, CNN):如影像分类、物件侦测等视觉应用。

CMSIS-NN函式库相关函式:

  • 卷积函数(1x1, 3x3,定点7位、定点15位、有号8位等)
  • 激活函数(sigmoid, tanh, relu等)
  • 全连接层函数(定点7位、有号8位、无号8位)
  • SVDF层函数(有号8位)
  • 池化函数(平均、最大,定点7位、有号8位)
  • Softmax函数(定点7位、有号8位、无号8位)
  • 基本数学函数(元素相加、相乘,重塑形等)

Arm CMSIS-NN函式库架构图
Fig. 14-2 Arm CMSIS-NN函式库架构图。(OmniXRI整理绘制, 2021/9/28)

至於如何直接使用CMSIS-NN来开发CNN,可参考下列文章介绍,或者等後面章节再补充介绍。假若你不想这麽深入了解底层运作方式,那使用TFLM或其它tinyML云端一站式整合型开发平台即可。

参考连结

Arm Common Microcontroller Software Interface Standard (CMSIS)文件说明
Arm CMSIS-5 Github开源码
Arm Developer - Converting a Neural Network for Arm Cortex-M with CMSIS-NN
Arm Developer - Deploying a Caffe Model on OpenMV using CMSIS-NN
Arm Youtube - Image recognition on Arm Cortex-M with CMSIS-NN in 5 steps
Arm-Software ML-exsamples - CMSIS-NN CIFAR10 Example
Arm CMSIS-NN: Efficient Neural Network Kernels for Arm Cortex-M CPUs


<<:  Day 14 - 网路攻击入门

>>:  [DAY21]Istio-手把手教安装

回归初心;重新出发 IOS基础

受朋友的挑战,也是对自己的考验与面对自己。同时也是自己对自己的坦白,通过铁人赛来测试自己。 比起是比...

[Day15] Tableau 轻松学 - 地图工作表

前言 我们已经学会使用长条图来做资料探索。然而,Tableau Desktop 除了长条图外,还有其...

Day 14 - Valid Palindrome

大家好,我是毛毛。ヾ(´∀ ˋ)ノ 废话不多说开始今天的解题Day~ 125. Valid Pali...

Day-18 BFPRT演算法

最坏情况为,BFPRT演算法 在由随机数决定阵列的分割的情况下,我们如何避免产生出最差情况(虽然出现...

新新新手阅读 Angular 文件 - ngFor(1) - Day19

本文内容 阅读有关 Angular 中有 ngFor 语法的笔记内容。 ngFor 在干嘛的? 它用...