7.10. CMSIS-NN

La lista de operadores que recorre TFLM se compone en su mayor parte de un puñado de operadores pesados: la convolución, que desliza una pequeña rejilla de pesos aprendidos sobre un tensor de entrada y escribe la suma ponderada en cada posición; la convolución en profundidad, que hace lo mismo por canal; las capas completamente conectadas, que son multiplicaciones de matrices entre un vector de entradas y una matriz de pesos; el pooling, que encoge un tensor tomando el máximo o el promedio sobre pequeños vecindarios; y las funciones de activación como ReLU y sigmoide, que se ejecutan punto a punto sobre cada valor. Una inferencia de visión gasta la mayoría de sus ciclos dentro de esos pocos operadores.

Implementados de la forma directa, serían lentos en un microcontrolador. CMSIS-NN es la biblioteca de Arm con versiones rápidas de ellos: ajustadas a mano en ensamblador, cuantizadas a enteros con los valores int8 y uint8 que describió la E/S de tensores, y escritas contra las instrucciones SIMD de la CPU. SIMD (Single Instruction, Multiple Data) permite a la CPU ejecutar una operación aritmética sobre varios valores en el mismo ciclo. Una multiplicación-suma escalar simple produce un resultado por ciclo; una multiplicación-suma SIMD empaqueta varios valores en un registro ancho y los produce todos a la vez.

El Cortex-M7 del H7 y del RT1062 tiene la extensión DSP de Arm, que aloja cuatro valores int8 en un registro de 32 bits y ejecuta una multiplicación-suma sobre los cuatro en un ciclo. El Cortex-M55 del AE3 tiene Helium (formalmente MVE, la M-profile Vector Extension), que aloja dieciséis carriles int8 en un registro de 128 bits, cuatro veces el rendimiento por ciclo. Helium es un conjunto de instrucciones de CPU más ancho, no un acelerador; el NPU Ethos-U55 en el mismo chip es el acelerador.

Las compilaciones de TFLM que se entregan están enlazadas contra CMSIS-NN, y TFLM despacha cada operador pesado a la variante SIMD adecuada para la cámara en tiempo de ejecución. En el AE3 el despacho es algo más elaborado: el compilador Vela ya ha recorrido el modelo sin conexión y ha marcado segmentos conectados de operadores aptos para la NPU (subgrafos) para despacharlos a la Ethos-U. En el momento de la inferencia esos subgrafos se ejecutan en el acelerador en un único bloque, y el resto recurre a CMSIS-NN con Helium en el M55.

Los operadores de punto flotante se saltan CMSIS-NN por completo y se ejecutan a través de los kernels de referencia portables de TFLM. La diferencia de precisión entre un modelo int8 y uno de punto flotante suele ser pequeña; la diferencia de rendimiento es grande. Por esta razón, los modelos que se entregan en la cámara están cuantizados a int8.