Нейросетевой чип с интерфейсом, привычным Embedded программисту

Обычно я пишу циклы статей по двум причинам. Либо я участвую в какой-то разработке и, с одной стороны, хочу рассказать о ней, но с другой — описать что-то интересное про применённые там технологии, так как овладел ими в достаточной мере. Самый большой цикл был про комплекс Redd, который перерос в разработку USB-анализатора на его базе. Другая причина засесть за клавиатуру — я нашёл какую-то интересную поделку

В сегодняшней статье (которая, надеюсь, разрастётся до цикла) всё несколько иначе. Поделка сама нашла меня. Её разрабатывают в другом отделе нашей же компании. Но именно в соседнем отделе, не в моём. Как она устроена внутри, мне знать не положено. Зато я могу, вдобавок к чтению документации, не просто расспрашивать авторов про пользовательский интерфейс, а ещё и давать им советы, как его изменить.

Речь пойдёт про чип, который по задумке разработчиков должен помочь Embedded-программистам начать работу с Искусственным Интеллектом, не погружаясь в его недра, а оперируя только привычными им сущностями. Давайте разбираться более детально.

rozmzktijgc7h4n-6oa_7tt7onq.png

Зачем это надо


Если организация работает по проектной модели, то кто-то в ней находит Заказчика, который спускает некую задачу. Если задача базируется на хорошо известных для разработчиков технологиях — это просто отлично. Но в реальности, обычно от какого-то кусочка до абсолютно всего является новым. Станешь ждать проектов, где нет неизведанного — ну не будет работы, а значит — не будет денег. Знаем мы, что бывает с теми, кто ждёт принцев, отвергая реальные варианты… Поэтому обычно при старте проекта, народ садится и читает документацию, благо обычно новые вещи вовсе не невиданные, а просто непривычные. Можно сесть и разобраться за приемлемый срок.

Я не возьмусь рассуждать, насколько это надолго, но сейчас всё чаще Заказчики хотят, чтобы в системах были элементы, относящиеся к Искусственному Интеллекту. И вот тут возникла проблема. Всё, что я говорил выше про «просто непривычность», относилось к Embedded-технологиям. Давным-давно, когда наши ребята сделали первые робкие попытки взять проекты с ИИ, выяснилось, что классическому программисту там придётся туго. Там надо менять весь подход к работе.

Собственно, вместо просто программирования, надо выяснить, какой тип нейросети выбрать. Потом поставить SDK для него. Потом начать что-то делать, отличное от привычного программирования… В общем, осваивать много чего нового.

Нет, кто сразу привычен к этому, он всё сделает. Вот, скажем, мой сын, он какие-то там нейросети по учебным делам делает. Но когда я его попросил о помощи с одной моей несложной идейкой, выяснилось, что он это всё делает на уровне шаманства. Именно начинает думать, какой же пакет он возьмёт для работы… Может тот, может этот… Причём ориентируется по принципу «нутром чую», а любой программист-железячник скажет, что нутро — это не калиброванный измерительный инструмент. Ему подавай чёткое понимание процессов.

В общем, тем, кто привык к работе с железом, тяжко менять подход к работе. Лично я просто не касался этих новомодных штучек.

И вот возникла у нашего руководства идея спрятать нейросеть внутрь микросхемы. Сделать этакий как бы сопроцессор. Здесь «Этакий» и «как бы» — не слова паразиты. Настоящий сопроцессор реализован аппаратно. У нас же реализация программная. Наш код с нейросетью зашивается в отдельно припаиваемый микроконтроллер, но с точки зрения конечного пользователя, всё выглядит, как настоящий сопроцессор. Что и как работает внутри, никто не знает. Для конечного пользователя предоставляется привычный ему интерфейс. Сейчас это I2C, но в задумках есть и SPI. Для доступа к чипу имеется несложный API, оформленный в стиле, привычном именно системному программисту. Шлём чипу запросы, получаем ответы.

Собственно, именно такую штуку мне и дали для экспериментов. А так как разработчиков интересует как можно больше мнений, то ещё попросили описывать всё это в виде статей.

Какая сеть используется


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

Но зачем набивать шишки с нуля, если можно изучить опыт тех, кто их уже набил? Это позволит отбросить проверку заведомо бесперспективных вещей и выбрать те, которые позволят получить положительный опыт. А уже потом, когда этого опыта будет много, там и интуиция подтянется. И можно будет искать другие пути. А начать лучше с того, который хвалят другие.

В сети есть много статей и видеоматериалов от разработчиков ST, которые работают с ESN (Echo State Network) сетями, использующими резервуары. Вот пишу умные слова, а спроси меня кто в комментариях о подробностях, я не смогу ничего сказать. Для тех, кто интересуется подробностями, я попросил у наших разработчиков дать мне ссылки на теоретические статьи. Вот что мне выдали:

1) Types of Recurrent Neural Networks For Non-linear Dynamic System Modelling
2) A review on TinyML: State-of-the-art and prospects
3) Deep Reservoir Computing: A Critical Analysis
4) Long Short Term Memory-based anomaly detection applied to an industrial dosing pump

Правда, про эти резервуары у ST-шников можно судить только по теоретическим выкладкам. Практического кода нет. Мало того, даже теоретические выкладки у них расплывчатые, так что идти всё равно пришлось с нуля. Но хотя бы в ту сторону, где точно можно что-то найти. Почему именно ST? Авторитет этих разработчиков достаточно высок. Вряд ли они станут выкладывать какие-то выдумки и подгонять результаты под свои домыслы. Если пишут, что есть успех, значит есть. Поэтому в нашей разработке также используется ESN Сеть с резервуарами. И в принципе, наши ребята утверждают, что подтверждают цифры, заявленные в ST.

Что в итоге распознаём


В итоге, полученный чип способен распознавать аномалии в сигналах. Судя по разговорам тех, кто всё время работает с нейросетями, это очень известный термин. Но повторю: я с ними не работаю. И если не я один, то объясню собратьям суть решаемой задачи.

Допустим, у нас имеется некий двигатель. ST-шники любят рассказывать про бесколлекторный электромотор. Вот мы снимаем либо его вибрации, либо его звук. И обучаем сеть, что вот этот снятый сигнал — это одно нормальное поведение, вот этот — другое. А прочее — это аномалии. При желании, можно даже обучить, какой конкретный сигнал соответствует какой аномалии.

Ну, а дальше, ориентируясь на сигналы, можно как-то ловить аномалии и пользоваться ими. Простейший случай — аварийно всё отключать, чтобы система не пошла вразнос. Ну, или ещё какие меры принимать. Самые первые опыты велись на вентиляторе. Система училась определять скорость, на которой тот работает, анализируя вибрации, которые на разных скоростях будут разными. В одной из следующих статей, я планирую рассказать реальный случай, который я в своё время решал для анализа работы станка. Но тогда всё решалось путём сбора данных и программного анализа спектра. Штука хорошая, но собрать новые данные — это надо повозиться. Здесь же подкупает, что нажал на кнопочку, показал звук. Ещё раз нажал, показал другой звук. Несколько нажатий на кнопку, и система обучилась.

Да, под данный конкретный станок! Но зато именно под него она обучилась замечательно! Сеть же обучается быстро, буквально за секунды, так что можно калибровать аномалии под конкретное оборудование. Собрали, обучили, дальше оно работает. Для производства тысяч изделий за смену, необходимость обучить каждую индивидуально — это недостаток, а вот для штучных вещей, точная подгонка по месту — достоинство. Хотя, и в случае конвейерного производства… Ну, несколько раз нажать на кнопку и подождать по секунде. На телевизионном заводе в нашем городе в своё время по 700 изделий за смену выпускали, у которых каждому геометрию настройщики выставляли, и ничего! А тут — кнопку и робот нажать может.

В целом, спектр используемых сигналов может быть весьма широк. Однажды я встретил ведущего разработчика из той группы в продуктовом магазине. Он явно был на взводе. Прижал меня к прилавку с овощами и взахлёб рассказывал, что они попробовали распознавать с помощью этой системы жесты. Без какой-либо подготовки, точность распознавания составила 80%. С тех пор были приняты меры по повышению этой самой точности, но вот факт. Сигналы могут оказаться самыми удивительными и неожиданными. И возможно, многие сигналы могут быть классифицированы по классам и аномалиям.

Важная особенность обучения


Самая главная особенность ESN сетей — простота их обучения. Не нужны серьёзные вычислительные мощности, не нужны большие датасеты. Достаточно в течение нескольких секунд показать сети сигнал, чтобы она научилась классифицировать его. Если точнее, то мне сказали, что в целом, достаточно даже миллисекунд.

Сами разработчики утверждают, что при этом сеть обучается не строго на такой же сигнал, а на сигнал плюс-минус. Вот тут я даже знаю умное слово «переобучение», это когда нейросеть распознаёт только те образцы, которые ей показали и не воспринимает остальных. Это мне ребёнок рассказывал, объясняя важность большого датасета, которого в случае с ESN как раз нет. Я лично ещё только в начале экспериментов с чипом, так что ничего не скажу. Но в следующих статьях как раз буду уделять чувствительности к погрешностям особое внимание. Будем надеяться, что там всё в порядке.

Что за чип


Всё это дело реализовано в чипе ESP32-C3. Как объяснили те, кто отвечал за выбор, этот чип безумно дешёвый, но при этом достаточно мощный. Он имеется у большого количества продавцов. На него есть приличная документация. В общем, почему бы и нет?

В целом, я с ними согласен. Вообще, ESP32 — это один из самых известных контроллеров для работы с Wi-Fi и Bluetooth, но в нашем случае, ни одна из этих функций в нём не используется. Это просто удобный кристалл с ядром RISC-V. Предельная тактовая частота у него приличная, есть возможности по энергосбережению. Но главное — это возможность шифрования кода.

Очень многие разработчики решений на базе ИИ любят хвастаться своими результатами в статьях, но при этом не дают никому своих наработок. Наши разработчики — не исключение. Наработки они отдавать не хотят. Но выдать чип на пробу — почему бы нет? В старых системах «прошивка» закрывалась битом защиты. Чтобы обновить прошивку, спрятанную таким способом, файл с нею всё равно надо выдать. Приходилось придумывать какие-то свои методы шифрования протокола. Не всегда идеально устойчивые. Взлом же бита защиты — это любимая тема для многих хакеров.

Ох, какой был переполох среди моих знакомых, когда китайцы вскрыли защиту AtMega8 и сделали клон их платы! Старые версии оборудования были скомпрометированы, и подделки были за копейки выброшены на TaoBao. Понятно, что покупатели стали смотреть на них, а не на легальные комплексы. Я помогал ребятам сделать навесной модуль дополнительной защиты, содержащей советский чип, не имеющий импортных аналогов. Китайцы не смогли разгадать, что же там такое стояло… Новые версии ПО не работали без этого чипа, проект хоть и пострадал, но хоть в утиль не слился.

У ESP32 всё проще. Прошили во фьюзах ключ шифрования, после этого контроллер будет расшифровывать «прошивку» на лету. Вышла новая версия — файл с нею можно разослать всем. У кого есть кристалл с соответствующим ключом — «прошивка» заработает. Остальные будут смотреть на неё, а вскрыть — не смогут. И использовать на кристаллах, купленных в другом месте тоже не смогут. Поэтому проблема «отдать наработки» при использовании ESP32-C3 не стоит. Исходный код — это да. Его даже мне не дают. А двоичный код — да сколько угодно! Ну, прекрасный же контроллер!

Макетные платы


«Большой» вариант


Итак, мы выяснили, что для управления чипом нужна шина I²C. Вообще никто не мешает взять и подключить всё к ПК через FT232H, но не всё так просто. Для экспериментов нужны сигналы с датчиков. В целом, можно подключить датчики к тому же ПК, но насколько это всё будет удобно? Поэтому разработчики решили, что сигналы лучше слать с микроконтроллера на автономной плате. Настолько автономной, что она даже может питаться от батареи (но именно может, основной источник, разумеется, кабель USB). Давайте будем потихоньку наворачивать блок-схему… Итак. У нас уже есть целевой чип, управляющий контроллер и питание…

s5zxswlnytc_raeusz1yujt0zfy.png

Хорошо. Теперь не забудем про те самые датчики, с которых будут сниматься воздействия для экспериментов. Для этого на плате установлен MEMS гироскоп-акселерометр-магнетометр MPU-9250, чтобы ловить разнообразные вибрации и другие изменения положения в пространстве, а также пара PDM-микрофонов MP34DT06.

Для взаимодействия с пользователем просто необходим экран и какие-никакие, а кнопки.

Когда аномалии пойманы, иногда надо отметить это звуковым сигналом. Для этого в системе имеется I2S-ЦАП с усилителем и динамик. Добавляем их на рисунок.

ezmrk_l_dcbtzbdsza7bqxn0mba.png

Если эта система вся из себя такая автономная, то просто просится беспроводная связь, поэтому в качестве управляющего контроллера был выбран модуль на базе ESP32-S3. Для его программирования можно воспользоваться доступом к JTAG и виртуальному COM порту через основной разъём USB (есть такая интересная штука внутри ESP32-S3), но шина USB может быть занята каким-то функционалом. Так что добавляем на плату переходник USB-UART для обновления «прошивок» управляющего контроллера. И, раз используется модуль, выводим его свободные линии на разъёмы нашей платы.

В итоге, получаем такую систему:

6ka2ebzxba9kikpjjc3uz6fgdgm.png

И последний штрих. Добавим модную возможность отломить целевой чип от отладочной платы, чтобы установить его куда-то в рабочую систему. Честно говоря, я ни разу не слышал, чтобы кто-то когда-то что-то отламывал от макетной платы, но такую возможность добавлять почему-то принято. Не избежали соблазна и наши разработчики. Причём я, как балалаечник-любитель (подробнее про это тут), заметил, что если часть с чипом отломать, та половина будет похожа на корпус балалайки. Давайте я сфотографирую результирующую плату, а то на начальную картинку был вынесен красивый рендеринг.

bhnesse-efrfzzcol2dgsmk7cvg.png

Минималистичный вариант


За всё надо платить. Каждый элемент, припаянный на «большой» вариант модуля стоит денег. По копеечке набегает приличная сумма. Я когда эту сумму на Озоне увидел — сам чуть со стула не упал. Но ведь у кого-то уже может иметься Ардуинка с кучей готовых датчиков! Зачем переплачивать? Для этого случая, разработан минималистичный вариант модуля. Он выглядит вот так:

-xqlysk40vvvt_cgakl0nlidshq.png

Честно говоря, я как-то привык к Ардуиновским проводочкам под разъёмы с шагом 2.54 мм, поэтому белый разъём I2C вместо привычных штырей, меня смутил. Но разработчики сказали, что, во-первых, нужные линии продублированы на разъёме J4, надо только его впаять… А, во-вторых, для Ардуинки можно купить новомодный Grover Shield, на котором разъём I2C выглядит именно так. Тогда подключение будет выглядеть следующим образом:

mygsaxlsj0fp3twerbhweb-ifym.png

Ну, и существуют другие макетные платы именно с таким разъёмом. Скажем, такая, тоже на базе ESP32 C3:

7wpqiahvsayj_ouzqgy2xyottxi.png

Программная поддержка


Для опытов с модулем, создано целых два репозитория на GitHub. В первом хранится всё про SDK — документы и функционал. Этот репозиторий расположен тут Grovety/grc_sdk

Как бы ни был хорош документ, а всё равно без реальных примеров в нём разобраться обычно очень сложно. Поэтому во втором репозитории лежит проект, который прошит в «большую» плату по умолчанию. Этот репозиторий расположен тут: Grovety/grc_devboard

Сейчас в составе проекта имеются три демонстрационных приложения:

  • Распознавание жестов (на основе акселерометра),
  • Распознавание ритмов, которые обычно настукиваются пальцем,
  • Распознавание вибраций (разработчики тренировались определять скорость работы вентилятора).


Про каждое из них я планирую сделать отдельный разбор. Сегодня статья — обзорная, поэтому я просто рассказал, что эти приложения существуют, они опубликованы в данном репозитории и могут быть взяты за основу, чтобы понять, как пользоваться SDK.

Где купить


Большие платы уже продаются на Озоне. Их там можно найти вот по этой ссылке… Цена, правда, кусачая. Не совсем для любителей. Но руководство обещало, что в ближайшее время там же появятся и бюджетные варианты. Пока же, если вдруг имеется желание добыть плату — обращайтесь в личку по координатам из профиля или в диалогах, постараемся решить вопрос.

Цели статьи


Ну, первая цель проста. Когда я буду писать про свои опыты с этим чипом — я смогу ссылаться на эти общие сведения, чтобы было хоть понятно, о чём идёт речь.

Но интереснее вторая цель. Сейчас разработка находится в стадии активного поиска. Любая идея может натолкнуть авторов на какое-то озарение. Под воздействием свежих идей, они могут сделать крутой поворот туда, о чём ещё вчера даже не задумывались.
• Где ещё можно использовать данную систему? — Да, это тот случай, где не решение делается под задачу, а наоборот, ищутся задачи под решение. Это не коммерческий, а внутренний проект, на котором нарабатывается опыт. Варясь в собственном соку, можно сделать какого-то сферического коня в вакууме, который на практике никому не нужен.
• А может, у кого-то есть не просто идеи, а реальные потребности, которые ложатся на эту концепцию.
• Вдруг кто-то соберётся поиграть в эту систему на практике? И даст советы, где и что надо подкрутить в рамках функционала SDK.
• Или, скажем, поймает реальные проблемы переобучения… Ну, или ещё какие проблемы, которые разработчикам не видны, а реальным потребителям — вполне.

Собственно, основная цель статьи — это расширение кругозора наших разработчиков. Само собой, они будут читать комментарии. Ну, а если надо — можно и в личной переписке пообщаться.

© Habrahabr.ru