7.10. CMSIS-NN¶
Список операторов, по которому проходит TFLM, состоит в основном из нескольких тяжёлых операторов: свёртка, скользящая небольшой сеткой обученных весов по входному тензору и записывающая взвешенную сумму в каждой позиции; поканальная свёртка (depthwise convolution), делающая то же самое для каждого канала; полносвязный слой (fully-connected), выполняющий матричное умножение между вектором входов и матрицей весов; пулинг (pooling), уменьшающий тензор путём взятия максимума или среднего по небольшим окрестностям; функции активации, такие как ReLU и sigmoid, применяемые поточечно ко всем значениям. Большую часть тактов вывода в задачах зрения занимают именно эти несколько операторов.
Реализованные напрямую, они работали бы на микроконтроллере медленно. CMSIS-NN – это библиотека быстрых реализаций от Arm: написанные вручную на ассемблере, квантованные в целочисленные значения int8 и uint8, описанные в вводе/выводе тензоров, и нацеленные на SIMD-инструкции процессора. SIMD – Single Instruction, Multiple Data – позволяет процессору выполнять одну арифметическую операцию над несколькими значениями за один такт. Обычное скалярное умножение-сложение даёт один результат за такт; SIMD-умножение-сложение упаковывает несколько значений в широкий регистр и выдаёт их все сразу.
Cortex-M7 на H7 и RT1062 имеет DSP-расширение Arm, которое хранит четыре значения int8 в 32-битном регистре и выполняет умножение-сложение над всеми четырьмя за один такт. Cortex-M55 на AE3 имеет Helium – формально MVE, M-profile Vector Extension – который хранит шестнадцать дорожек int8 в 128-битном регистре, обеспечивая вчетверо большую пропускную способность за такт. Helium – это более широкий набор инструкций процессора, а не ускоритель; ускорителем является NPU Ethos-U55 на том же кристалле.
Поставляемые сборки TFLM скомпонованы с CMSIS-NN, и TFLM во время выполнения направляет каждый тяжёлый оператор в подходящий для камеры SIMD-вариант. На AE3 диспетчеризация немного сложнее: компилятор Vela уже прошёл по модели офлайн и пометил связные участки операторов, пригодных для NPU – подграфы – для отправки на Ethos-U. Во время вывода эти подграфы выполняются на ускорителе одним блоком, а остальное отрабатывается через Helium CMSIS-NN на M55.
Операторы с плавающей точкой полностью обходят CMSIS-NN и выполняются через переносимые эталонные ядра TFLM. Разрыв в точности между моделью int8 и моделью с плавающей точкой обычно невелик; разрыв в пропускной способности велик. Именно поэтому модели, поставляемые на камере, квантуются в int8.