7.10. CMSIS-NN

L’elenco di operatori che TFLM percorre è composto per lo più da una manciata di operatori pesanti: la convoluzione, che fa scorrere una piccola griglia di pesi appresi su un tensore di input e scrive la somma pesata in ogni posizione; la convoluzione depthwise, che fa lo stesso canale per canale; i livelli fully-connected, ovvero moltiplicazioni matriciali tra un vettore di input e una matrice di pesi; il pooling, che riduce un tensore prendendo il massimo o la media su piccole vicinanze; le funzioni di attivazione come ReLU e sigmoide, eseguite puntualmente su ogni valore. Un’inferenza di visione spende la maggior parte dei suoi cicli all’interno di questi pochi operatori.

Implementati nel modo più diretto, sarebbero lenti su un microcontrollore. CMSIS-NN è la libreria di Arm con le versioni veloci – ottimizzate a mano in assembly, quantizzate a interi ai valori int8 e uint8 descritti in tensor I/O, e scritte sfruttando le istruzioni SIMD della CPU. SIMD – Single Instruction, Multiple Data – consente alla CPU di eseguire una singola operazione aritmetica su più valori nello stesso ciclo. Una semplice moltiplicazione-addizione scalare produce un risultato per ciclo; una moltiplicazione-addizione SIMD impacchetta più valori in un registro ampio e li produce tutti in una volta sola.

Il Cortex-M7 dell’H7 e dell’RT1062 dispone della DSP extension di Arm, che contiene quattro valori int8 in un registro a 32 bit ed esegue una moltiplicazione-addizione su tutti e quattro in un ciclo. Il Cortex-M55 dell’AE3 dispone di Helium – formalmente MVE, la M-profile Vector Extension – che contiene sedici corsie int8 in un registro a 128 bit, quadruplicando il throughput per ciclo. Helium è un set di istruzioni della CPU più ampio, non un acceleratore; l’acceleratore è la NPU Ethos-U55 sullo stesso die.

Le build TFLM fornite sono collegate a CMSIS-NN, e TFLM indirizza ogni operatore pesante alla giusta variante SIMD per la camera a runtime. Sull’AE3 l’indirizzamento è un po” più articolato: il compilatore Vela ha già percorso il modello offline e ha contrassegnato porzioni connesse di operatori idonei alla NPU – i subgraph – per l’invio all’Ethos-U. Al momento dell’inferenza quei subgraph vengono eseguiti sull’acceleratore in un unico blocco, mentre il resto ricade su Helium CMSIS-NN sull’M55.

Gli operatori in virgola mobile bypassano completamente CMSIS-NN e vengono eseguiti tramite i kernel di riferimento portabili di TFLM. La differenza di accuratezza tra un modello int8 e uno in virgola mobile è solitamente piccola; la differenza di throughput è grande. Per questo motivo i modelli forniti sulla camera sono quantizzati a int8.