7.10. CMSIS-NN

Список операторів, які виконує TFLM, здебільшого складається з кількох важких операторів: згортка — ковзання невеликої сітки навчених ваг по вхідному тензору із записом зваженої суми в кожній позиції; поканальна згортка — те саме, але для кожного каналу окремо; повністю з’єднані матричні множення вектора входів на матрицю ваг; пулінг — стиснення тензора шляхом знаходження максимуму або середнього в невеликих сусідствах; функції активації на кшталт ReLU та сигмоїди, що застосовуються поелементно до кожного значення. Більшість циклів при інференсі зображень витрачається саме на ці кілька операторів.

При прямолінійній реалізації вони були б повільними на мікроконтролері. CMSIS-NN — це бібліотека швидких реалізацій від Arm, ретельно налаштована на асемблері, квантована до цілих значень int8 і uint8, описаних у tensor I/O, та написана з використанням інструкцій 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 і float зазвичай невелика; різниця в пропускній здатності — значна. Саме тому моделі, що постачаються на камері, квантовані до int8.