7.10. CMSIS-NN

A lista de operadores que o TFLM percorre é composta principalmente por um conjunto de operadores pesados: convolução, que desliza uma pequena grelha de pesos aprendidos sobre um tensor de entrada e escreve a soma ponderada em cada posição; convolução em profundidade, que faz o mesmo por canal; fully-connected, que realiza multiplicações matriciais entre um vetor de entradas e uma matriz de pesos; pooling, que reduz um tensor calculando o máximo ou a média sobre pequenas vizinhanças; funções de ativação como ReLU e sigmoide, aplicadas ponto a ponto sobre cada valor. Uma inferência de visão passa a maior parte dos seus ciclos dentro desses poucos operadores.

Implementados da forma direta, seriam lentos num microcontrolador. O CMSIS-NN é a biblioteca da Arm de versões rápidas – otimizadas à mão em assembly, quantizadas em inteiros para os valores int8 e uint8 descritos em tensor I/O, e escritas para as instruções SIMD do CPU. SIMD – Single Instruction, Multiple Data – permite ao CPU executar uma operação aritmética sobre vários valores no mesmo ciclo. Uma multiplicação-adição escalar simples produz um resultado por ciclo; uma multiplicação-adição SIMD empacota vários valores num registo largo e produz todos de uma vez.

O Cortex-M7 no H7 e no RT1062 tem a extensão DSP da Arm, que guarda quatro valores int8 num registo de 32 bits e executa uma multiplicação-adição sobre todos os quatro num ciclo. O Cortex-M55 no AE3 tem o Helium – formalmente MVE, a M-profile Vector Extension – que guarda dezasseis lanes int8 num registo de 128 bits, quatro vezes o débito por ciclo. O Helium é um conjunto de instruções de CPU mais largo, não um acelerador; o NPU Ethos-U55 no mesmo chip é o acelerador.

As versões TFLM entregues estão ligadas ao CMSIS-NN, e o TFLM despacha cada operador pesado para a variante SIMD correta para a câmara em tempo de execução. No AE3 o despacho é um pouco mais complexo: o compilador Vela já percorreu o modelo offline e marcou fatias ligadas de operadores elegíveis para NPU – subgrafos – para despacho para o Ethos-U. Em tempo de inferência, esses subgrafos são executados no acelerador num único bloco, e os restantes fazem fallback para o CMSIS-NN Helium no M55.

Os operadores de vírgula flutuante contornam completamente o CMSIS-NN e são executados através dos kernels de referência portáteis do TFLM. A diferença de precisão entre um modelo int8 e um modelo de vírgula flutuante é normalmente pequena; a diferença de débito é grande. Os modelos entregues na câmara são quantizados para int8 por esta razão.