7.10. CMSIS-NN

A lista de operadores que o TFLM percorre é, em sua maior parte, um punhado de operadores pesados: convolução deslizando uma pequena grade de pesos aprendidos sobre um tensor de entrada e escrevendo a soma ponderada em cada posição; convolução por canal (depthwise) fazendo o mesmo por canal; totalmente conectado (fully-connected) multiplicações de matrizes entre um vetor de entradas e uma matriz de pesos; pooling encolhendo um tensor ao tomar o máximo ou a média sobre pequenas vizinhanças; funções de ativação como ReLU e sigmoide executadas ponto a ponto em cada valor. Uma inferência de visão gasta a maior parte de seus ciclos dentro desses poucos operadores.

Implementados da maneira direta, eles seriam lentos em um microcontrolador. CMSIS-NN é a biblioteca de versões rápidas da Arm – ajustadas manualmente em assembly, quantizadas em inteiros para os valores int8 e uint8 que a E/S de tensores descreveu, e escritas contra as instruções SIMD da CPU. SIMD – Single Instruction, Multiple Data – permite que a CPU execute uma operação aritmética sobre vários valores no mesmo ciclo. Uma multiplicação-soma escalar comum produz um resultado por ciclo; uma multiplicação-soma SIMD empacota vários valores em um registrador largo e produz todos eles de uma só vez.

O Cortex-M7 do H7 e do RT1062 possui a extensão DSP da Arm, que mantém quatro valores int8 em um registrador de 32 bits e executa uma multiplicação-soma sobre os quatro em um ciclo. O Cortex-M55 do AE3 possui Helium – formalmente MVE, a Vector Extension do perfil M – que mantém dezesseis pistas int8 em um registrador de 128 bits, quatro vezes o throughput por ciclo. Helium é um conjunto de instruções de CPU mais largo, não um acelerador; a NPU Ethos-U55 no mesmo die é o acelerador.

As builds distribuídas do TFLM são vinculadas ao CMSIS-NN, e o TFLM despacha cada operador pesado para a variante SIMD correta para a câmera em tempo de execução. No AE3 o despacho é um pouco mais elaborado: o compilador Vela já percorreu o modelo offline e marcou fatias conectadas de operadores elegíveis à NPU – subgrafos – para despacho à Ethos-U. No momento da inferência esses subgrafos são executados no acelerador em um único bloco, e o restante recai sobre o CMSIS-NN com Helium no M55.

Operadores de ponto flutuante ignoram completamente o CMSIS-NN e passam pelos kernels de referência portáveis do TFLM. A diferença de precisão entre um modelo int8 e um modelo de ponto flutuante costuma ser pequena; a diferença de throughput é grande. Os modelos distribuídos na câmera são quantizados para int8 por essa razão.