7.10. CMSIS-NN¶
TFLM 走訪的運算子清單大多是少數幾個重量級運算子:convolution(卷積)將一個由學習而來的權重所組成的小網格在輸入張量上滑動,並在每個位置寫入加權總和;depthwise convolution(深度可分離卷積)則對每個通道做相同的事;fully-connected(全連接)在一個輸入向量與一個權重矩陣之間做矩陣乘法;pooling(池化)藉由在小鄰域上取最大值或平均值來縮小張量;activation functions(激活函式)如 ReLU 與 sigmoid 則對每個值逐點運算。一次視覺推論的大部分週期都花在這少數幾個運算子裡。
若以最直接的方式實作,它們在微控制器上會跑得很慢。CMSIS-NN 是 Arm 提供的高速函式庫——以組合語言手工調校,整數量化到 tensor I/O 所描述的 int8 與 uint8 數值,並針對 CPU 的 SIMD 指令撰寫。SIMD——單一指令、多重資料(Single Instruction, Multiple Data)——讓 CPU 能在同一個週期內對多個數值執行一個算術運算。一個單純的純量乘加每個週期只產生一個結果;而 SIMD 乘加將多個數值打包進一個寬暫存器,並一次產生全部結果。
H7 與 RT1062 上的 Cortex-M7 具備 Arm 的 DSP extension(DSP 擴充),它能在一個 32 位元暫存器中容納四個 int8 值,並在一個週期內對全部四個執行乘加。AE3 上的 Cortex-M55 具備 Helium——正式名稱為 MVE,即 M-profile 向量擴充(M-profile Vector Extension)——它能在一個 128 位元暫存器中容納十六個 int8 通道,每個週期的吞吐量是前者的四倍。Helium 是更寬的 CPU 指令集,而非加速器;同一晶粒上的 Ethos-U55 NPU 才是加速器。
出貨的 TFLM 建置都連結了 CMSIS-NN,而 TFLM 會在執行期將每個重量級運算子分派到適合該相機的 SIMD 變體。在 AE3 上,這個分派略為複雜一些:Vela 編譯器已經在離線時走訪過模型,並標記出可由 NPU 處理的連通運算子切片——subgraphs(子圖)——以分派給 Ethos-U。在推論時,那些子圖會在加速器上以單一區塊執行,其餘的則退回到 M55 上的 Helium CMSIS-NN。
浮點運算子會完全繞過 CMSIS-NN,改由 TFLM 的可移植參考核心執行。int8 模型與浮點模型之間的精準度差距通常很小;但吞吐量差距很大。基於這個原因,出貨於相機上的模型都量化為 int8。