Видите в середине очень странный пик?
Даже следящему за показаниями приборов человеку тяжело его заметить, а вот МЛ модель справится с этим легко, и "не проморгает" момент
Всё крутится вокруг того, как бы нам максимально ужать модель, чтобы она влезла в небольшое устройство. В качестве "устройства" сойдет всё: чайник, промышленный сенсор, утюг, телефон, браслет и т.д.
А помочь засунуть жирную нейронку в худенький датчик поможет такой трюк, как Квантизация. Суть метода проста - а давайте сократим место, занимаемое числами в памяти. Обычные нейронки используют такой тип данных, как толстый 32 битный флоат. Что будет, если мы заменим их на худые 8 битные инты? Места занимать они станут меньше, но и качество упадёт.
Недостижимая мечта - использовать 1 бит. Тогда мы получим гигантский выигрыш в размере. Жаль, что это невозможно.Или возможно? Бинаризированные свёрточные нейронные сети к вашим услугам. Почитать о них подробнее можно здесь.
Перемножение матриц в этом случае выглядит "немного" по другому
А теперь, дабы было задорнее, немного кода. Сделаем простейшую модель, предсказывающую синус числа.
Данные готовы. Теперь делим их на тренировочную, тестовую и валидационную выборку (эту и некоторые другие части кода я пропущу для экономии вашего времени, полный ноутбук с кодом вот тут).
Время строить нашу нейронку!
Теперь давайте посмотрим, что получилось:
Полученное качество для наших экспериментов вполне сойдет
Итак, основная модель готова. Настало время "посжимать" её самыми разными способами. А поможет в этом нам TFLiteConverter, созданный специально для облегчения ваших нейронок.
Итого имеем три нейронные сети: обычную, конвертированную TensorFlow Lite без квантизации, конвертированную TensorFlow Lite с квантизацей. Самое время сравнить, сколько же места они занимают.
Потеря качества почти не существенна, на уровне погрешности. Но стоит иметь ввиду, что мы используем весьма простую модельку для теста, на более крупных моделях результат может быть не настолько оптимистичным!Все предыдущие действия мы делали на Python в ноутбуке, но ведь нас интересует, как задеплоить модель в микроконтроллер, правильно? А для этого требуется сконвертировать полученную модель в код, с которым эти сами микроконтроллеры привыкли работать. ВАЖНО! Приведенный ниже код я запускал на Ubuntu, если хотите подобное сделать на Windows - придётся искать обходные пути.
Модель у нас есть, а теперь посмотрим, как будет выглядеть наш С код на, собственно, микроконтроллере. Перед деплоем на микроконтроллер код можно (и нужно) сперва запустить на компьютере. Сразу скажу, что я выцепил только самые интересные куски кода, однако если вы хотите запустить его на своем компе - то вот.
Далее выделяем место на нашем устройстве. Сколько его взять? На самом деле, вопрос решается в лоб: берем некое рандомное, разумное число. Если модель вмещается и всё работает- хорошо, пробуем сократить место. Продолжать сей процесс, пока система не перестанет работать.Ну и наконец, вот так выглядит предсказание синуса на микроконтроллере:
Отдельно стоит упомянуть платформу Edge Impulse от ребят, плотно занимающихся TinyML.
Она берет на себя много работы по деплою моделей непосредственно на микроконтроллеры, достаточно всего лишь подключить какую нибудь ардуинку к компьютеру, и в пару кликов накатить на неё модельку. Сам не пользовался, и не думаю, что что нибудь очень серьезное на её базе сделать получится, однако желающим немного поиграться - точно сюда.Если хотите знать больше по теме, то присоединяйтесь к нашему NoML Community - https://t.me/noml_community.