CMSIS-NN — библиотека для работы с нейронными сетями для микроконтроллеров ARM Cortex-M


STM32
Оказывается, ещё в январе, в стандартную библиотеку — CMSIS (Cortex Microcontroller Software Interface Standard) включили функционал для реализации нейронных сетей — CMSIS-NN.

Основанием для внесения подобного функционала в стандартную библиотеку, стало признание того, что с развитием интеллектуальных периферийных устройств, IoT и т.п. — нейронные сети становятся всё более популярными для выполнения задач аналитики данных сразу на месте, что позволяет уменьшить латентность системы, а также уменьшить энергопотребление, которое можно будет не затрачивать на передачу данных.

CMSIS-NN представляет собой набор функций для реализации нейронных сетей, разработанных для максимизации производительности и минимизации объема потребляемой памяти на процессорных ядрах ARM Cortex-M.

Библиотека содержит функционал:
свёрки (Convolution Functions),
активации (Activation Functions) (Sigmoid, Tanh, ReLU),
полносвязный слой (Fully-connected Layer Functions),
пулинг (Pooling Functions),
софтмакс (Softmax Functions),
вспомогательные функции.

CMSIS-NN блок-схема

Представление чисел

Традиционно, нейросетевые модели обучаются с использованием 32-битного представления данных числами с плавающей запятой (float32). Однако, при работе модели, такая высокая точность, как правило, не требуется.
Исследования показали, что нейронные сети хорошо работают даже с менее точным представлением данных.
В CMSIS-NN, операции проводятся над целыми числами (Fixed-point quantization), что помогает избежать дорогостоящих вычислений над числами с плавающей запятой, а также уменьшает требуемый объём памяти для хранения весов и активаций, что имеет решающее значение для платформ с ограниченными ресурсами.

@brief 8-bit fractional data type in 1.7 format.
typedef int8_t q7_t;
@brief 16-bit fractional data type in 1.15 format.
typedef int16_t q15_t;

Квантование выполняется с учетом формата с фиксированной запятой до степени двойки, то есть представленное значение будет равно A * 2**n
, где A — целое число, n — представляет собой целое число, указывающее основание счисления.
Коэффициенты масштабирования передаются для смещения (bias) и выхода в качестве параметров функций. Само масштабирование реализуются как побитовые сдвиги.

Быстродействие

Измеренное быстродействие для CIFAR-10 (цветная картинка 32×32, выход — 10 классов) на плате NUCLEO-F746ZG Mbed board с ядром Arm Cortex-M7, работающем на частоте 216 MHz, для 7-слойной свёрточной сети (3 раза — Convolution+Max Pooling) составило 99.1 ms на картинку (точность — 79.9%).

далее: STM32Cube.AI — пакет расширения для STM32CubeMX для встраивания нейронных сетей в микроконтроллеры STM32

Ссылки
New CMSIS-NN Neural Network Kernels Boost Efficiency in Microcontrollers by ~5x
CMSIS-NN: Efficient Neural Network Kernels for Arm Cortex-M CPUs
CMSIS NN Software Library
https://github.com/ARM-software/CMSIS_5
Quant_guide
CMSIS-NN CIFAR10 Example

По теме
От Arduino к STM32
STM32: Урок 2 — Quickstart
uTensor — AI на микроконтроллерах
Глубокие нейронные сети как следующий этап развития программного обеспечения
Будущее глубокого обучения
Проблемы применения машинного обучения для решения реальных задач

Нейронная сеть
Нейронная сеть — введение
Принцип обучения многослойной нейронной сети с помощью алгоритма обратного распространения
Пример работы самоорганизующейся инкрементной нейронной сети SOINN


Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Arduino Bluetooth CraftDuino DIY Google IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение