
В последние годы нейронные сети стали самой современной технологией для специалистов по данным. В то же время значимость науки о данных для выпуска продуктов значительно возросла. Это не только помогает получить представление о рынке, но и обеспечивает новые ценности для клиентов, такие как профилактическое обслуживание, самонастраивающиеся контуры управления или распознавание объектов. Чтобы обеспечить наилучшее качество обслуживания клиентов, мы часто должны обеспечивать ценность для клиентов с малой задержкой, по низкой цене и независимо от текущего состояния подключения к облаку. Чтобы оправдать эти ожидания, важно запускать нейронные сети не только в облаке, но и на периферии. Существует несколько определений «периферии»: от кластеров kubernetes и сетей доставки контента до простых устройств на базе микроконтроллеров. На границах с ограниченной вычислительной мощностью доставка и выполнение нейронных сетей становится все более сложной задачей.
С 2019 года публикуются новые технологии и библиотеки, которые помогают разработчикам преодолевать эти трудности.
- Тензорфлоу лайт
- STM 32Cube MX и STM32Cube.AI
- Набор инструментов встроенного кодера Matlab
- NNoM
- AWS IoT Гринграсс
В этой статье представлен обзор того, как работают технологии, и сделан вывод о том, какая из них наиболее перспективна для нас. Он написан для разработчиков микропрограмм, специалистов по данным и инженеров по машинному обучению (ML), которые хотят развернуть и запустить предварительно обученную модель на микроконтроллере.
Введение в нейронные сети на микроконтроллерах
Запускать нейронные сети на встроенном устройстве по-прежнему сложно. В этой статье мы определяем «встроенное устройство» следующим образом: устройство работает на микроконтроллере с производительностью до 1000 DMIPS, со встроенной оперативной памятью (‹1 МБ) и флэш-памятью (‹10 МБ) и ограниченным использованием микросхем внешней памяти. Эти встроенные устройства не работают с системами с вытесняющими операционными системами, такими как Linux или Android. Основное внимание уделяется устройствам с операционной системой для совместной работы или вообще без нее.
Нейронные сети могут обучаться — в терминологии машинного обучения это называется «обучение нейронной сети». Это обучение позволяет улучшить автоматизированное принятие решений, но требует большого объема данных и высокой вычислительной мощности. Поэтому функция обучения в идеале должна выполняться в масштабируемой облачной среде. Кроме того, облачная среда позволяет проводить непрерывное обучение во время работы продукта.
Это приводит к первому критерию качества для применения нейронных сетей к периферийным устройствам: должна быть возможность обновлять развернутую сеть. Чтобы избежать обновления прошивки при каждом новом тренировочном цикле, мы должны разделить код (прошивку) и данные (веса), которыми мы можем легко обмениваться.
Нейронные сети состоят из связанных нейронов, расположенных в несколько слоев. Связь между двумя нейронами определяется их весом, числовым значением, вычисляемым во время обучения.

Чтобы описать нейронную сеть, нам нужны два элемента: первый — это ее архитектура. Архитектура определяет количество нейронов, их распределение по слоям и существующие связи. Этот элемент описания не изменится, если мы переобучим сеть. Второй элемент состоит из рассчитанных значений веса, также называемых «параметрами». Они меняются, если мы переобучаем нейронную сеть.
На встроенном устройстве сетевая архитектура может быть изменена только в том случае, если мы выполним обновление прошивки.
С другой стороны, гири заменяются обычной передачей данных, обновление прошивки не требуется.
Поэтому важно разделить эти два элемента описания.
Введение в процесс разработки нейронных сетей
На следующей диаграмме показан процесс проектирования и развертывания нейронной сети, которая должна работать на микроконтроллере.

Для проектирования и обучения нейронных сетей специалисты по данным используют такие инструменты, как Matlab, Tensorflow, Keras, ONNX, Caffe, Lasagne или ConvNetJS. В зависимости от инструмента, используемого для проектирования нейронной сети, формат выходного файла может отличаться. Однако они всегда включают архитектуру нейронной сети и веса. На этапе создания кода C/C++ инструмент считывает сетевую архитектуру и преобразует ее в код C. Далее код C компилируется и загружается в микроконтроллер. Также снабженный весами, микроконтроллер теперь может запускать нейронную сеть.
Критерии качества
Обучение. Обучение нейронных сетей требует больших объемов данных и высокой вычислительной мощности. На микроконтроллерах вычислительная мощность и объем памяти ограничены. Поэтому обучение нейронных сетей исключительно на микроконтроллере целесообразно только в случае обучения с подкреплением, когда обучение и принятие решений тесно связаны. Для всех остальных видов обучения нейросеть должна обучаться в облаке, а обученная модель доставляться в микроконтроллер.
Переобучение и непрерывная доставка.Возможность непрерывного обучения новым данным, поступающим от датчиков или других источников данных в облачную инфраструктуру. Переобученная нейронная сеть в идеале должна автоматически доставляться в микроконтроллер. Важно, чтобы время простоя и время загрузки были короткими.
Избегайте долгосрочных последствий. Долговременные эффекты, такие как накопление динамической памяти во встроенном ПО, могут привести к нежелательным состояниям системы. Чтобы система не исчерпала свободную память, рекомендуется по возможности избегать использования кучи. Архитектура нейронной сети будет определять последовательность выполнения и объем памяти алгоритма в микроконтроллере, веса определяют результаты каждого выполнения и не влияют на объем памяти и последовательность выполнения.
Таким образом, отделив архитектуру нейронной сети от весов, можно обновить нейронную сеть последними результатами обучения без обновления прошивки.
Общие инструменты. Предоставьте простой в использовании интерфейс для специалистов по обработке и анализу данных и инженеров по машинному обучению. Должно быть легко моделировать, тестировать и развертывать новую модель.
Гибкость. Должна быть возможность определить различную архитектуру нейронной сети для использования в разных архитектурах микроконтроллеров. Более того, модели машинного обучения для использования в микроконтроллерах не должны ограничиваться нейронными сетями. В идеале должна быть возможность генерировать модели следующих типов:
- Любой тип линейной или логистической регрессии
- SVM с разными типами ядра
- Ансамбли деревьев (случайные леса, деревья с градиентным усилением)
- Нейронные сети
- …
Сравнение решений
Мы определили следующие конкурирующие инструменты для преобразования языка описания нейронной сети в код C.
Тензорфлоу Лайт
Tensorflow — это инструмент, который часто используется для описания и обучения нейронных сетей в облаке. Tensorflow Lite предназначен для доставки обученных моделей на периферию (на различные типы микроконтроллеров и микропроцессоров). Он работает под той же лицензией с открытым исходным кодом, что и Tensorflow.
На следующем рисунке показано, как это работает:

Конвертер Tensorflow Lite представляет собой статическую библиотеку, интегрированную в прошивку. В процессе работы преобразователь Tensorflow Lite получает предварительно обученную модель. Он создает буфер под названием «FlatBuffer», который используется интерпретатором. Интерпретатор запускает нейронные сети согласно описанию во «FlatBuffer». Преимущество такого подхода в том, что прошивка создается только один раз и модель может быть заменена в процессе работы. Хотя это является явным преимуществом для разработчиков модели, разработчикам встроенного ПО такое поведение не нравится: во время работы это приводит к динамической памяти и вычислительным затратам. В свою очередь, это увеличивает потребность в сложном управлении памятью и планировании задач.
В настоящее время Tensorflow и Tensorflow Lite поддерживают множество различных типов нейронных сетей, но не поддерживают другие модели машинного обучения, такие как линейная регрессия.
Matlab Coder и Matlab Embedded Coder
В дополнение к Python и R, Matlab и Octave являются предпочтительными инструментами для специалистов по данным и инженеров по машинному обучению. Matlab предлагает наборы инструментов для автоматического создания кода C из кода Matlab. Для создания оптимизированного кода C для встроенных устройств требуется набор инструментов Matlab «Matlab Coder» и «Embedded Coder».
На следующем рисунке показано, как это работает:

Набор инструментов Embedded Coder генерирует код C из файлов .m или из моделей Simulink. Сгенерированный код C зависит от функций, используемых разработчиком Matlab. Сгенерированный код C может использовать как чисто статические, так и динамические объекты. Кодер Matlab можно использовать для любого типа модели машинного обучения. Интерфейсы к созданной модели могут быть определены разработчиком в определении функции в файлах .m. В зависимости от этого определения разработчик может создать пару парсер/интерпретатор, как в подходе, определенном Tensorflow Lite, или выбрать подход, как показано на схеме выше.
Для первоначального определения нейронной сети требуется набор инструментов Matlab, который является лицензированным программным обеспечением с закрытым исходным кодом. Это может увеличить затраты на разработку. Непрерывное обучение существующей модели может выполняться без встроенного инструментария кодера и, следовательно, не требует дополнительных затрат. Важно отметить, что это утверждение зависит от фактической реализации и от того, были ли веса отделены от архитектуры нейронной сети. В случае необходимости обновления и изменения архитектуры нейронной сети снова потребуется доступ к набору инструментов.
Сгенерированный код C может быть скомпилирован для любого микроконтроллера и может использоваться для компиляции новой версии прошивки, когда это необходимо.
STM32CubeMX и STM32Cube.AI
STM32CubeMX — это графический инструмент, который позволяет настраивать микроконтроллеры STM32, а также генерировать соответствующий C-код инициализации. Расширение STM32Cube.AI позволяет преобразовывать обученные нейронные сети в код C. Эти инструменты от ST предлагают графический пользовательский интерфейс и интерфейс командной строки для автоматизации. Cube AI также взаимодействует со средами машинного обучения, такими как Tensorflow Lite, Matlab и PyTorch. Инструмент генерирует код только для использования в микроконтроллерах ST.
На следующей диаграмме показано, как генерируется и запускается исходный код:

Cube AI генерирует несколько файлов .c и .h и, наконец, предоставляет файл статической библиотеки «*.a», который можно использовать для компиляции исходного кода. Всякий раз, когда необходимо заменить веса или архитектуру нейронной сети, прошивку необходимо перекомпилировать и развернуть. Поскольку файл «*.a» не является открытым исходным кодом, неясно, можно ли обновлять веса во время выполнения.
Нейронная сеть на микроконтроллере (NNoM)
NNoM — это высокоуровневая библиотека нейросетей для логического вывода, специально предназначенная для микроконтроллеров (см. https://github.com/majianjia/nnom). На следующей схеме показана его архитектура:

NNoM является бесплатным и открытым исходным кодом под лицензией Apache 2.0. Проекты NNoM состоят из двух программ: программы Python, которая запускает преобразователь NNoM, и программы C, которая запускает настоящую нейронную сеть. Программа Python принимает в качестве входных данных обученную модель Keras и набор тестовых данных. Результатом будет файл «model.h». Затем этот файл интерпретируется на целевом устройстве локальным бэкэндом (частью NNoM Framework).
Похвально, что файл «model.h» генерируется вместе с отпечатком потребления памяти:
Этот подход демонстрирует схожие характеристики с Tensorflow Lite.
AWS IoT Greengrass с лямбда-функциями
AWS Greengrass с лямбда-функциями предполагает, что мощности периферийных вычислений и доступной памяти достаточно для запуска лямбда-функций. Для лямбда-функции требуется среда выполнения для NodeJS, Python или даже Java. Поскольку микроконтроллеры с ограниченным объемом памяти не могут запускать такие виртуальные среды, AWS IoT Greengrass не соответствует нашим потребностям.
Вывод
Краткий обзор следующих четырех технологий убедил нас в том, что сейчас самое подходящее время для развертывания и запуска нейронных сетей на микроконтроллере. Эти технологии, кажется, хорошо поддерживаются, а их выходные артефакты ориентированы на микроконтроллер с ограниченной вычислительной мощностью и памятью.
- Тензорфлоу лайт
- STM 32Cube MX и STM32Cube. ИИ
- Кодер Matlab и набор инструментов встроенного кодера Matlab
- NNoM
Каждая из этих технологий имеет разные возможности, сложность и разные условия использования. Выбор правильной технологии зависит от следующих аспектов:
- Тип микроконтроллера
- Гибкость использования динамически выделяемой памяти в прошивке
- Предпочтения и опыт команды
- Необходимость постоянного обучения
Мы считаем набор инструментов Matlab Coder наиболее многообещающей технологией, поскольку он предлагает высочайший уровень гибкости, что позволяет нам использовать его в различных проектах.
Оставьте комментарий и расскажите нам о своем опыте работы с нейронными сетями на микроконтроллерах.
Свяжитесь с нами: Авторы: Helbling Technik AG: Аарон Риденер, Дэвид Сави
Соавтор: Саймон Курманн
Ссылки:
https://www.st.com/en/embedded-software/x-cube-ai.html
https://github.com/majianjia/nnom
https://aws.amazon.com/de/greengrass/
https://ch.mathworks.com/de/products/matlab-coder.html
https://www.tensorflow.org/lite
Уведомление об авторских правах:
В этом блоге есть сторонние изображения, требующие следующих уведомлений:
Авторское право 2020 г., Владелец: Цзяньцзя Ма, Проект: https://github.com/majianjia/nnom
Под лицензией Apache License, версия 2.0 ("Лицензия");
вы не можете использовать этот файл, кроме как в соответствии с Лицензией.
Вы можете получить копию Лицензии по адресу http://www.apache.org/licenses/LICENSE-2.0