![](https://static.tildacdn.com/tild6163-3266-4338-a136-376638653838/1ee2b66936139654964f.jpg)
А в чем польза?
Представим дорогой промышленный сенсор - 1000 измерений в секунду, температурный датчик, измерение вибраций, передача данных на 10 км, мощный процессор - 20 млн операций в секунду! Его работа это посылать на сервер данные о температуре, вибрации, а также значения других параметров для предупреждения поломокоборудования. Но вот незадача - 99% посылаемых им данных бесполезна, от неё - чистый убыток за электричество. А таких датчиков на производстве могут быть десятки и сотни.В действительности нас интересуют не сами данные с этого устройства, а инсайды из них - всё ли работает в штатном режиме? Нет ли аварийных ситуаций? Быть может, вскоре потребуется ремонт? Так почему бы не задеплоить нейронку на сам датчик, и вместо бесконечного потока данных лишь иногда посылать сигналы "Всё в порядке" или "Аномалии в показателях!" Вот именно этим вопросом и занимается TinyML.
![](https://static.tildacdn.com/tild6536-3764-4363-a233-306262313230/98fb0e1cb641ce4818bc.png)
Видите в середине очень странный пик?
Даже следящему за показаниями приборов человеку тяжело его заметить, а вот МЛ модель справится с этим легко, и "не проморгает" момент
Всё крутится вокруг того, как бы нам максимально ужать модель, чтобы она влезла в небольшое устройство. В качестве "устройства" сойдет всё: чайник, промышленный сенсор, утюг, телефон, браслет и т.д.
![](https://static.tildacdn.com/tild3033-3435-4138-a431-323832323133/143ef718362f80f30886.png)
Преимущества подхода
Во-первых - экономия ресурсов. Так как постоянной связи с сервером не требуется, это весомо экономит электроэнергию, ведь можно обойтись без постоянного подключения к WiFi, Bluetooth и так далее.Во-вторых - быстрая скорость работы. Перекачивать данные на сервер - слишком долго, когда нужен результат "здесь и немедленно".
В-третьих - это экономия на облачных вычислениях. В облачном подходе данные требуется отослать на сервер не только для обучения модели, но и для предикта. Представьте, что для приложения замены лица на вашем телефоне будет постоянно требоваться связь с интернетом, как в случае с навигатором... Весьма неудобно и затратно. Собственно, поэтому такие технологии уже встроены в наш телефон (а это - работа TinyML).
В-четвертых - безопасность. Посылать данные куда-то всегда связано с риском, гораздо безопаснее получать результат уже на устройстве, а с устройства посылать только предикт.
В-пятых - скорость работы самих нейронных сетей становится быстрее, ибо работа с int внутри нейронки идёт быстрее, чем с float - об этом расскажу ниже.
Quantization
А помочь засунуть жирную нейронку в худенький датчик поможет такой трюк, как Квантизация. Суть метода проста - а давайте сократим место, занимаемое числами в памяти. Обычные нейронки используют такой тип данных, как толстый 32 битный флоат. Что будет, если мы заменим их на худые 8 битные инты? Места занимать они станут меньше, но и качество упадёт.
![](https://static.tildacdn.com/tild6163-6238-4163-b838-323030633236/e50b345375139af31d50.jpg)
Или возможно? Бинаризированные свёрточные нейронные сети к вашим услугам. Почитать о них подробнее можно здесь.
![](https://static.tildacdn.com/tild6434-6163-4535-a430-313936363664/fdbb7cbb4e0d825af03d.jpg)
Перемножение матриц в этом случае выглядит "немного" по другому
От теории к практике
А теперь, дабы было задорнее, немного кода. Сделаем простейшую модель, предсказывающую синус числа.
![](https://static.tildacdn.com/tild6262-6637-4533-b366-663334323736/4d0dbef4058933f08ce5.png)
Данные готовы. Теперь делим их на тренировочную, тестовую и валидационную выборку (эту и некоторые другие части кода я пропущу для экономии вашего времени, полный ноутбук с кодом вот тут).
![](https://static.tildacdn.com/tild6631-6462-4334-b139-313136386134/190cc21f96926949a12c.png)
Время строить нашу нейронку!
Теперь давайте посмотрим, что получилось:
![](https://static.tildacdn.com/tild3335-6632-4837-b037-386264643031/beb5c550908c805aad49.png)
Полученное качество для наших экспериментов вполне сойдет
Итак, основная модель готова. Настало время "посжимать" её самыми разными способами. А поможет в этом нам TFLiteConverter, созданный специально для облегчения ваших нейронок.
Итого имеем три нейронные сети: обычную, конвертированную TensorFlow Lite без квантизации, конвертированную TensorFlow Lite с квантизацей. Самое время сравнить, сколько же места они занимают.
![](https://static.tildacdn.com/tild6235-6534-4436-a437-636137613334/0ab10676aabb976f036a.png)
Конвертация в С код
Все предыдущие действия мы делали на Python в ноутбуке, но ведь нас интересует, как задеплоить модель в микроконтроллер, правильно? А для этого требуется сконвертировать полученную модель в код, с которым эти сами микроконтроллеры привыкли работать. ВАЖНО! Приведенный ниже код я запускал на Ubuntu, если хотите подобное сделать на Windows - придётся искать обходные пути.
![](https://static.tildacdn.com/tild3135-6265-4233-b831-663839396330/c97dd9aed583020cabe2.png)
Я вставил лишь первые несколько строк сконвертированной модели, однако вообще их около 400.
Код на микроконтроллере
Модель у нас есть, а теперь посмотрим, как будет выглядеть наш С код на, собственно, микроконтроллере. Перед деплоем на микроконтроллер код можно (и нужно) сперва запустить на компьютере. Сразу скажу, что я выцепил только самые интересные куски кода, однако если вы хотите запустить его на своем компе - то вот.
Ну и наконец, вот так выглядит предсказание синуса на микроконтроллере:
Edge Impulse
Отдельно стоит упомянуть платформу Edge Impulse от ребят, плотно занимающихся TinyML.
![](https://static.tildacdn.com/tild3631-6264-4662-b031-646133666461/3e28bd4d0419998fd1cd.png)
Ну и вместо заключения - тема с TinyML набирает обороты. В некоторых сферах (браслеты отслеживания состояния людей с больным сердцем, обнаружение рака языка встроенной нейронной сетью через фотографию и т.д.) у неё просто нет альтернатив. Рост количества подобных устройств прогнозируется на уровне 20% в год, а значит, об этой технологии мы будем слышать всё чаще и чаще.
Если хотите знать больше по теме, то присоединяйтесь к нашему NoML Community - https://t.me/noml_community.