Краткий обзор TinyML
TinyML сам по себе означает внедрение ml в маломощные микроконтроллеры и встроенные системы. Это устройствам IoT выполнять задачи обработки данных и машинного обучения непосредственно на самом устройстве, минимизируя таким образом необходимость в постоянном подключении к интернету или внешним вычислительным ресурсам. Основная цель TinyML — сделать ии или простые модельки доступным для самых маленьких устройств
Основные принципы
В отличие от традиционного машинного обучения, которое требует порой невероятных вычислительных мощностей и облачных ресурсов, TinyML оптимизирован для работы на устройствах с очень ограниченным ресурсами, как, например, микроконтроллеры. TinyML позволяет внедрять интеллектуальные функции в самые маленькие устройства, которые можно представить: от смарт-часов до датчиков в сельском хозяйстве.
Также TinyML обладает способностью работать в условиях невероятного маленького кол-ва энергии. Это огромный плюс, учитывая, что многие IoT-устройства работают от батареек, которые должны служить как можно дольше. К примеру умные датчики, собирающие и анализирующие данные на протяжении месяцев или даже лет на одном заряде батареи.
Принцип работы сбора данных довольно прост: он осуществляется с помощью сенсоров, которые могут быть встроены в любое устройство. Затем, эти данные обрабатываются прямо на устройстве с использованием предварительно обученных ml-моделей, что позволяет принимать решения на месте без необходимости отправлять данные на сервер или в облако.
Отличия TinyML от традиционных ml также в том, что здесь большой акцент делается на оптимизацию, потому что здесь очень много различных проблем: ограниченная память, очень малые вычислительные мощности
Архитектура и технологии TinyML
Архитектура
ARM Cortex-M
Микроконтроллеры ARM Cortex-M известны своей 32-битной архитектурой RISC. Эти микроконтроллеры отличаются несколькими архитектурными инновациями:
Cortex-M используют архитектуру Гарварда, разделяющую шины инструкций и данных. Это разделение позволяет одновременно получать доступ к инструкциям и данным, повышая эффективность обработки.
Центральный процессор ARMv7 в микроконтроллерах Cortex-M включает в себя банк регистров, состоящий из 16 регистров, где первые 13 являются общего назначения, а последние три выполняют специфические функции, такие как указатель стека, регистр ссылок и счетчик программ.
Cortex-M4 работает на архитектуре загрузки-хранения, что означает, что операции с данными требуют загрузки из памяти в регистры, обработки и затем сохранения обратно только при необходимости.
Микроконтроллеры Cortex-M могут включать дополнительные компоненты, такие как память Bit-Band для прямой манипуляции битами, блоки защиты памяти для контроля доступа и привилегий к различным областям памяти и память Tightly-Coupled Memory для доступа с низкой задержкой к важным данным или коду. Наличие таких функций, как кеши инструкций и данных, а также ECC для обнаружения и исправления ошибок в TCM и кеше, также являются опциональными и варьируются в зависимости от модели.
Например, Cortex-M4 поддерживает набор инструкций Thumb-2, который сочетает в себе 16-битные и 32-битные инструкции, предлагая баланс между производительностью и плотностью кода. Кроме того, Cortex-M4 вводит возможности цифровой обработки сигналов, повышая его полезность в приложениях, требующих обработки сигналов или сложных математических вычислений.
RISC-V
Архитектура микроконтроллеров RISC-V разработана как открытая и модульная, что дает возможность огромных возможностей кастомизации и оптимизации под специфические приложения или домены. Основные особенности архитектуры RISC-V включают базовый набор инструкций и набор стандартных расширений, которые добавляют специализированные функциональные возможности.
Базовый набор инструкций включает только самые необходимые операции для обеспечения базовой функциональности с 32-битными целыми числами или его 64-битный вариант RV64I, такие как сложение, вычитание, битовые операции, загрузка и сохранение данных, прыжки и ветвления. Он представлен 47 инструкциями и закодирован в формате 32 бита/
Регистровый файл — основной компонент архитектуры RISC-V, предоставляющий набор мест хранения для данных во время выполнения инструкций. Он организован в набор целочисленных регистров и регистров с плавающей точкой, в зависимости от реализованных расширений в процессоре. Целочисленные регистры используются для хранения и манипулирования целочисленными значениями во время выполнения инструкций, включая операции сложения, вычитания, умножения, деления, манипуляции битами и сравнения.
RISC-V включает в себя набор стандартных расширений, таких как:
M-расширение добавляет поддержку инструкций умножения и деления целых чисел.
A-расширение обеспечивает поддержку атомарных операций с памятью.
F- и D-расширения добавляют поддержку арифметических операций с плавающей точкой одинарной и двойной точности соответственно.
C-расширение вводит набор 16-битных сжатых инструкций, которые могут использоваться вместе со стандартными 32-битными инструкциями.
Фреймворки
TensorFlow Lite
Этот фреймворк от Google — это упрощенная версия TensorFlow Lite, оптимизированная для микроконтроллеров и других устройств с ограниченными ресурсами. Он позволяет разрабатывать и развертывать модели машинного обучения на устройствах с очень низким энергопотреблением.
С ним можно напрямую конвертировать модели TensorFlow в формат, совместимый с TensorFlow Lite for Microcontrollers, и развертывать их на целевом устройстве.
Фреймворк содержит легковесный интерпретатор, который выполняет модели машинного обучения непосредственно на целевом устройстве, что обеспечивает быстрый вывод без необходимости подключения к облачным сервисам.
TensorFlow Lite содержит оптимизированный набор микроопераций, специально предназначенных для выполнения стандартных задач машинного обучения, таких как свертки, активации и пулинг, с максимальной эффективностью на микроконтроллерах.
В комплекте с фреймворком предоставляются инструменты для конвертации моделей, проверки их работоспособности и отладки, что упрощает разработку и тестирование приложений машинного обучения на микроконтроллерах.
Пример:
#include "tensorflow/lite/micro/all_ops_resolver.h"
#include "tensorflow/lite/micro/micro_error_reporter.h"
#include "tensorflow/lite/micro/micro_interpreter.h"
#include "tensorflow/lite/schema/schema_generated.h"
#include "model.h" // заголовочный файл модели
// переменные для TFLite Micro
constexpr int kTensorArenaSize = 10 * 1024;
uint8_t tensor_arena[kTensorArenaSize];
tflite::MicroErrorReporter micro_error_reporter;
// func для инициализации и выполнения модели
void RunInference() {
// получение модели
const tflite::Model* model = ::tflite::GetModel(g_model);
if (model->version() != TFLITE_SCHEMA_VERSION) {
TF_LITE_REPORT_ERROR(µ_error_reporter, "Model version mismatch.");
return;
}
// настройка интерпретатора
tflite::AllOpsResolver resolver;
tflite::MicroInterpreter interpreter(model, resolver, tensor_arena, kTensorArenaSize, µ_error_reporter);
interpreter.AllocateTensors();
// получение указателя на входной тензор
TfLiteTensor* input = interpreter.input(0);
// Инициализация входных данных модели здесь
// например: Заполнение input->data.f с входными данными
// выполнение модели
TfLiteStatus invoke_status = interpreter.Invoke();
if (invoke_status != kTfLiteOk) {
TF_LITE_REPORT_ERROR(µ_error_reporter, "Invoke failed.");
return;
}
// получение указателя на выходной тензор
TfLiteTensor* output = interpreter.output(0);
// использование данных выходного тензора
// например: Чтение output->data.f для получения результатов инференции
}
int main() {
RunInference();
return 0;
}
Подробнее с библиотекой можно ознакомиться в документации.
MicroTVM
MicroTVM — это проект Apache TVM, предназначенный для оптимизации и развертывания моделей машинного обучения на микроконтроллерах и других устройствах с ограниченными ресурсами. MicroTVM автоматизирует процесс оптимизации моделей, делая их более удобными для инференса на tiny девайсах.
Cube.AI
Cube.AI от STMicroelectronics позволяет преобразовывать предварительно обученные нейронные сети в оптимизированный код для микроконтроллеров STM32. Этот фреймворк упрощает интеграцию моделей AI в встроенные системы
Микроконтроллеры для реализации tiny
Для реализации проектов на базе TinyML используются различные микроконтроллеры и платформы. Среди поддерживаемых устройств на международном рынке выделяются платы на базе ARM Cortex-M, такие как Arduino Nano 33 BLE Sense, а также продукты на базе RISC-V, ESP32 и многие другие. К примеру: Raspberry Pi 4, BeagleBone AI, Sony SPRESENSE и Raspberry Pi Pico, которые позволяют реализовывать даже базовые программы искусственного интеллекта.
В России также существуют разработки микроконтроллеров, поддерживающие технологии микромашинного обучения. Одним из примеров является микроконтроллер МК32АМУР от компании Микрон, основанный на архитектуре RISC-V. Этот микроконтроллер имеет встроенную криптозащиту и предназначен для использования в важной инфраструктуре и устройствах с высокими требованиями к безопасности. Микрон отмечает высокий интерес к этому продукту со стороны производителей различного оборудования.
Реальные примеры
Один из примеров — распознавание медицинских масок на микроконтроллере ARM Cortex M7, используя TensorFlow Lite.Размер модели после квантования составлял около 138 КБ, а скорость обработки данных на целевой платформе достигала 30 кадров в секунд.
Еще одно устройство — устройство распознавания жестов, которое может крепиться к трости и помогать людям с нарушениями зрения навигировать в повседневной жизни. Разработчики использовали набор данных жестов для обучения модели ProtoNN с алгоритмом классификации, что позволило создать точное и недорогое решение.
Также TinyML находит применение в автономных транспортных средствах и самоуправляемых автомобилях, где используется замкнутый цикл обучения на основе модели TinyCNN для реализации онлайн-предсказаний, что позволяет модели адаптироваться к реальным данным в режиме реального времени.
TinyML также улучшает применение беспилотных летательных аппаратов, позволяя реализовывать энергоэффективные устройства с низкой задержкой и высокой вычислительной мощностью, которые могут служить контроллерами для этих бпла.
Примеры взяты из этого источника.
TinyML еще не на пике своего развития, однако уже способствует разработке новых приложений, от медицинских диагностических устройств до автономных транспортных средств.
Для тех, кто заинтересован в более подробно изучении TinyML, рекомендую просмотреть подкаст на YouTube от Pete Warden, посвященный началу работы с TinyML. Ссылка на подкаст: tinyML Talks — Pete Warden: Getting started with TinyML.
А в рамках курсов OTUS вы можете изучить как основы классического ML, так и более хардкорные подходы и инструменты. С полным каталогом курсов и их программами можно ознакомиться по ссылке.