Search
Write a publication
Pull to refresh
98.86

Как уместить ИИ на edge-устройствах

Level of difficultyMedium
Reading time22 min
Views2K

От AlphaGo до ChatGPT — прогресс в области искусственного интеллекта впечатляет своими масштабами. Однако за красивым фасадом скрывается серьезный разрыв между возможностями современных моделей и реальными условиями их применения. Возьмем, к примеру, GPT-3 с его (уже не такими впечатляющими) 175 миллиардами параметров, требующими 800 ГБ памяти. Такие модели существуют только в лабораториях вроде OpenAI. Что уж говорить о запуске подобных систем на устройствах с ограниченными ресурсами.

При этом именно edge-устройства генерируют львиную долю данных — по прогнозам Gartner, к концу этого года около 75% корпоративной информации будет поступать не из традиционных дата-центров или облака, а с периферийных устройств. Обработка такого объема данных в облаке создает серьезную нагрузку на каналы передачи и увеличивает задержки. 

Граничный ИИ (Edge AI) предлагает элегантное решение: перенести вычисления ближе к источнику данных. Это позволяет обрабатывать информацию локально, без подключения к сети, что критично для систем, требующих мгновенной реакции. 

Но как уместить современные AI-модели в устройства с ограниченными ресурсами? Об этом и поговорим в статье.

TinyML и Edge AI: суть проблемы

Что такое TinyML и Edge AI?

Представьте, что вам нужно распознать лицо определенного человека на дверном звонке. Традиционный подход — отправить фотографию в облако, где изображение будет проанализировано и вернется к вам уже как готовый результат. Но что, если подключение нестабильное? Или вам критична задержка в доли секунды? Именно в таких сценариях нашли свое применение Edge AI и TinyML.

Источник изображения

Edge AI (граничный искусственный интеллект) — это гибрид граничных вычислений и ИИ, позволяющий обрабатывать данные непосредственно на устройстве, где эти данные создаются. Вместо традиционной схемы «сбор данных → передача в облако → анализ → возврат результата», Edge AI предлагает сократить путь: «сбор данных → анализ → результат». Всё происходит локально, без передачи чувствительной информации во внешний мир.

TinyML продвигает эту концепцию ещё дальше, концентрируясь на ультра-маломощных микроконтроллерах и IoT-устройствах. Если Edge AI фокусируется на устройствах с умеренными ресурсами (смартфоны, планшеты), то TinyML идет в экстремальные условия, где объем памяти ограничивается сотнями килобайт. 

Чтобы понять масштаб: популярный микроконтроллер ARM Cortex-M7 (STM32F746) имеет лишь 320 КБ оперативной памяти и 1 МБ флеш-памяти. Это в 1000 раз меньше ресурсов, чем у среднего смартфона, и в миллионы раз меньше, чем у облачных серверов.

Ключевые ограничения

Разработчики TinyML сталкиваются с тремя вызовами, каждый из которых способен свести на нет любые усилия, если его не учитывать должным образом.

Память — это, пожалуй, самый критический ресурс. Микроконтроллеры имеют два типа памяти: SRAM (оперативная память, обычно менее 256 КБ) и флеш-память (постоянная память, от 1 до 2 МБ). SRAM используется для хранения активаций нейросети во время выполнения, а флеш-память — для хранения весов модели. Важно понимать, что дело не только в размере модели: даже если сеть небольшая, промежуточные вычисления могут требовать значительного объема SRAM. Например, распространенная архитектура MobileNetV2 с шириной 1.4 имеет в 4.2 раза меньше параметров по сравнению с ResNet-50, но при этом потребляет в 2.3 раза больше пиковой памяти из-за особенностей своей архитектуры.

Следующее, во что упираются такие системы — это вычислительные ресурсы. Процессоры в микроконтроллерах работают на частотах порядка 216 МГц, что в 10–20 раз ниже, чем у ноутбуков. При этом они не имеют специализированных блоков для матричных операций, составляющих основу нейросетевых вычислений. В результате даже простые операции занимают непропорционально много времени. 

Энергопотребление замыкает топ три ключевых ограничений. Многие современные устройства работают от батарей и должны функционировать месяцами или даже годами без подзарядки. Вычисления на нейросетях — энергоемкий процесс, особенно если модель неоптимизирована. 

Для сравнения: одно инференс-прохождение через MobileNetV1 на микроконтроллере STM32H743 потребляет около 135 мДж энергии. Если запускать такую сеть, скажем, каждые 10 секунд, то батарея CR2032 разрядится приблизительно за неделю — неприемлемо малый срок службы для большинства сценариев.

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

Типичные устройства и сценарии использования

Где же сегодня можно встретить TinyML? На самом деле, практически повсюду. Основными носителями этой технологии выступают микроконтроллеры и миниатюрные вычислительные платформы.

Микроконтроллеры семейства ARM Cortex-M — это настоящие рабочие лошадки TinyML. В частности, STM32F746, STM32H743 и nRF52840 стали своеобразными «эталонными платформами» для исследований и коммерческих приложений. Именно на них обкатываются новейшие методы оптимизации и именно они чаще всего встречаются в готовых решениях. Эти микроконтроллеры часто интегрируются в более сложные устройства: от «умных» термостатов до промышленных датчиков и систем мониторинга.

Носимая электроника представляет собой еще одну важную категорию устройств, где активно применяется TinyML. Умные часы типа Xiaomi и Fitbit, беспроводные наушники с голосовыми помощниками, фитнес-трекеры — все они используют компактные нейросети для локальной обработки данных. Например, современные умные часы непрерывно анализируют показатели здоровья пользователя, определяют вид физической активности и даже могут распознавать потенциальные проблемы — от нарушений сердечного ритма до падений пожилых людей — и всё это без постоянного подключения к смартфону.

Методы сжатия нейронных сетей

Суть проблемы TinyML предельно понятна: как уместить многомиллионные нейросети в крошечную память? Если классический ResNet-50 требует около 100 МБ только для хранения весов, то как запустить что-то похожее на устройстве, где вся доступная память — 512 КБ? 

Хотя понятие «компрессия моделей» появилось задолго до эпохи TinyML, именно в контексте сверхмалых устройств эти методы приобрели критическую важность. 

Для создания облегченных моделей применяются ручные и автоматизированные методов, включая выбор архитектуры, настройку параметров и регуляризацию. Для сжатия модели используют прунинг, квантование и дистилляцию знаний. Источник изображения
Для создания облегченных моделей применяются ручные и автоматизированные методов, включая выбор архитектуры, настройку параметров и регуляризацию. Для сжатия модели используют прунинг, квантование и дистилляцию знаний. Источник изображения

Каждый из этих методов — это своеобразный инженерный компромисс. Правильная комбинация методов требует глубокого понимания как самой нейросети, так и ограничений целевой платформы. В худшем случае можно получить модель, которая действительно помещается в память, но абсолютно бесполезна из-за деградации качества. В лучшем — сжать модель в 10–50 раз с почти незаметной потерей точности. Именно поэтому многие исследования в области Edge AI фокусируются на разработке оптимальных стратегий компрессии для конкретных задач и устройств.

Прунинг: удаление избыточных связей и нейронов

Нейронные сети, особенно глубокие, часто страдают от избыточности. Многочисленные исследования показывают, что до 90% параметров в предварительно обученных моделях можно удалить без существенной потери точности. Этот факт лег в основу техники прунинга (от англ. pruning — «обрезка»), которая стала одним из основных методов компрессии моделей для граничных вычислений.

Прунинг работает по принципу, напоминающему формирование синаптических связей в человеческом мозге: «используй или потеряешь». Менее важные веса или даже целые нейроны и фильтры удаляются из сети, что существенно сокращает количество параметров и вычислений. 

Cхематичная иллюстрация работы прунинга. Источник изображения
Cхематичная иллюстрация работы прунинга. Источник изображения

На практике различные методы прунинга часто комбинируются с другими техниками компрессии. Из основных методов можно выделить следующие:

  1. Прунинг отдельных весов — самый детализированный подход, при котором удаляются конкретные связи между нейронами, а не целые структурные элементы. Хотя этот метод позволяет достичь высокой степени разреженности (до 95% параметров могут быть обнулены), он требует специализированного программного или аппаратного обеспечения для эффективного выполнения разреженных операций, что часто недоступно на простых микроконтроллерах.

  2. Структурный прунинг более практичен в контексте TinyML, поскольку удаляет целые структурные единицы — нейроны в полносвязных слоях или фильтры в свёрточных. Например, метод, предложенный в работе «Сжатие дискретных моделей с ограничением ресурсов для глубоких нейронных сетей», использует эффективную дискретную оптимизацию для прямой настройки канальных вентилей под ресурсные ограничения, что позволяет получить компактную CNN с сильной различительной способностью.

  3. Динамический прунинг — это перспективное направление, которое определяет, какие части сети следует активировать в зависимости от входных данных. Такой подход особенно ценен для задач с изменяющимися требованиями к вычислительным ресурсам. FuPruner, например, оптимизирует как параметрические, так и непараметрические операторы для ускорения нейронных сетей на устройствах с ограниченными ресурсами.

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

Квантование: снижение точности представления весов и активаций

Если прунинг можно сравнить с архитектурным решением «убрать лишние комнаты», то квантование — это скорее выбор менее дорогих материалов для строительства. В стандартных нейросетях веса и активации обычно хранятся с плавающей точкой в 32-битном формате (float32). Один нейрон с 1000 входных связей в таком случае потребует около 4 КБ только для хранения весов. Квантование предлагает радикальное решение: использовать представления с меньшей точностью.

Иллюстрация принципа работы квантования. Источник
Иллюстрация принципа работы квантования. Источник изображения

Суть квантования проста: вместо хранения весов в высокоточном формате float32, используются форматы с меньшей точностью — int8 (8 бит), int4 (4 бита) или даже int2 (2 бита). Такой переход может уменьшить размер модели в 4–16 раз и значительно ускорить вычисления, поскольку операции с целыми числами выполняются быстрее, чем с плавающей точкой. Для микроконтроллеров без FPU (блока для операций с плавающей точкой) разница может быть десятикратной.

Классикой в отношении подходов к квантованию можно считать следующие методы:

  1. Равномерное квантование — наиболее распространенный метод, при котором вещественные значения отображаются на равноотстоящие уровни. Например, при 8-битном квантовании весь диапазон значений [min, max] разбивается на 256 уровней. Этот подход прост в реализации и хорошо поддерживается большинством фреймворков и аппаратных платформ.

  2. Логарифмическое квантование (квантование степенями двойки) — более специализированный подход, при котором квантованные уровни располагаются не равномерно, а с большей плотностью возле нуля. Это хорошо соответствует распределению весов в нейросетях, которые обычно концентрируются вокруг нуля. Кроме того, такое квантование позволяет заменить дорогостоящие операции умножения на простые битовые сдвиги, что может дать дополнительный выигрыш в скорости и энергопотреблении. 

  3. Смешанное квантование — подход, при котором разные части сети квантуются с различной точностью. Например, первые и последние слои (наиболее чувствительные к потере точности) могут использовать 8-битное представление, в то время как скрытые слои — 4-битное или даже 2-битное. CMix-NN — пример фреймворка, специально разработанного для поддержки таких смешанных представлений на микроконтроллерах.

За последние пару лет технология квантования достаточно сильно продвинулась, что видно по свежим исследованиям. Например, был разработан фреймворк RaQu, который объединяет информацию о структуре нейросети и аппаратной платформе для оптимизации вычислений на RRAM-чипах. Другой пример — фреймворк HAQ (Hardware-Aware Automated Quantization). Он автоматически определяет оптимальную политику квантования для каждого слоя DNN на основе архитектуры целевого оборудования, что позволяет снизить задержку и энергопотребление без существенных потерь точности.

Существенный прогресс достигнут и в обучении квантизированных сетей. Например, исследователи из гонконгского политехнического университета предложили метод INT8-обучения, реализованный в системе Octo, который обеспечивает снижение потребления памяти по сравнению с полноточным обучением на коммерческих ИИ-чипах. Другая команда исследователей во главе с Фу разработала прогрессивное и динамическое дробное квантование в рамках FracTrain, что позволяет снизить вычислительные затраты при сохранении точности.

На практике квантование редко применяется изолированно. Наиболее эффективные решения в сфере TinyML объединяют квантование с аппаратно-ориентированной оптимизацией, создавая цепочки преобразований «обучение → квантование → компиляция → развёртывание», где каждый шаг учитывает особенности предыдущих и последующих этапов.

Эффективные архитектуры

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

Легковесные архитектуры. Источник изображения
Легковесные архитектуры. Источник изображения

Ручное проектирование архитектур

Первая волна эффективных архитектур создавалась инженерами вручную, через тщательное переосмысление базовых строительных блоков нейросетей. MobileNet — пожалуй, наиболее известное семейство таких сетей, разработанное Google. Ключевая инновация MobileNet — использование глубинно разделимых свёрток (depthwise separable convolutions). Традиционная свёртка одновременно обрабатывает и пространственные, и канальные зависимости, а MobileNet разделяет эту операцию на два этапа: пространственную фильтрацию (depthwise) и канальное смешивание (pointwise). Это радикально снижает количество вычислений и параметров.

Идея разделения операций получила дальнейшее развитие в архитектуре ShuffleNet. В ней были добавлены групповые pointwise свёртки и операция перемешивания каналов (channel shuffle), позволяющая информации эффективно распространяться между группами каналов даже при использовании групповой свёртки. Что особенно важно, ShuffleNetV2 оптимизировался не просто для теоретических FLOPS, а для реальной скорости на конкретных аппаратных платформах, учитывая такие аспекты, как использование памяти и параллелизм.

В то время как MobileNet и ShuffleNet фокусировались на переосмыслении свёрточных блоков, SqueezeNet в тот же период предложил иной подход — архитектурные «Fire» модули, сочетающие слои «сжатия» (1×1 свёртки, уменьшающие количество каналов) и «расширения» (параллельные 1×1 и 3×3 свёртки). Эта техника позволила создать модель в 50 раз меньше AlexNet с сопоставимой точностью. Эволюция этой идеи продолжилась в SqueezeNext, который оптимизировал базовую концепцию, добавив двухэтапное сжатие и использование свёрток с низким рангом.

Новый взгляд на проблему предложил GhostNet, основанный на наблюдении, что многие каналы в свёрточных слоях избыточны и могут быть получены из других путем простых линейных преобразований. Модуль Ghost генерирует «призрачные» признаки с помощью дешевых операций, что снижает вычисления на 50% при сохранении точности. Этот подход интересен тем, что атакует проблему избыточности на уровне признаков, а не операций.

От ручного дизайна к автоматизации

Несмотря на впечатляющие результаты ручного проектирования, создание оптимальной архитектуры требует перебора огромного количества вариантов и тонкой настройки множества гиперпараметров. Естественным решением стало применение Neural Architecture Search (NAS) — автоматического поиска архитектур с помощью RL, генетических алгоритмов или градиентных методов.

MnasNet стал одним из первых успешных примеров применения NAS для edge-устройств. В отличие от предыдущих подходов, он оптимизирует многоцелевую функцию, учитывающую не только точность, но и задержку на конкретном устройстве. Развивая этот подход, EfficientNet добавил составное масштабирование (compound scaling) — согласованное увеличение глубины, ширины и разрешения, что позволило создать семейство моделей с оптимальным балансом точности и эффективности для различных вычислительных бюджетов.

Значительный прогресс в скорости поиска принес FBNet, использующий дифференцируемый NAS. Этот подход позволяет применять градиентные методы для эффективного поиска в пространстве архитектур, снижая время поиска с тысяч GPU-дней до считанных. Следующий шаг сделали HardCoRe-NAS и MemNAS, которые стали учитывать множественные ограничения ресурсов: не только вычисления, но и память, энергопотребление и задержку — что критично именно для edge-устройств.

Специализация для TinyML

Хотя мобильные архитектуры вроде MobileNet и EfficientNet эффективны для смартфонов, они часто не оптимальны для микроконтроллеров. В ходе изучения выяснилось, что MobileNetV2 — несмотря на то, что содержит в 4,2 раза меньше параметров, чем ResNet-50 — потребляет в 2,3 раза больше пиковой памяти при выводе. Это происходит из-за особенностей активаций и «бутылочных горлышек» в архитектуре.

Для преодоления этого барьера потребовались специализированные решения. MCUNet от MIT Han Lab стал прорывом, объединив поиск оптимальной архитектуры (TinyNAS) и оптимизированный runtime (TinyEngine). TinyNAS использует двухэтапный поиск: сначала оптимизирует само пространство поиска под конкретные ограничения устройства, затем ищет оптимальную архитектуру в этом пространстве. Такой подход учитывает не только количество параметров, но и пиковое потребление памяти — ключевой фактор для TinyML.

MCUNetV2 развил этот успех, добавив перераспределение рецептивного поля и поблочный вывод. Это позволило решить проблему неравномерного распределения памяти между слоями и работать с входными изображениями высокого разрешения даже на устройствах с крайне ограниченной памятью. На микроконтроллере STM32H743 модель достигает впечатляющих 71.8% точности на ImageNet при использовании всего 434 KB оперативной памяти.

По другому пути пошли разработчики MicroNets, сфокусировавшись на точной оптимизации для конкретных микроконтроллеров с использованием дифференцированного NAS, где FLOPs используются как прокси для задержки. А UDC сделал следующий шаг, создавая архитектуры, которые хорошо сжимаются последующей квантованием и прореживанием — признав, что некоторые структуры нейронных сетей лучше поддаются сжатию, чем другие.

Дистилляция знаний и компрессия моделей

Концепция дистилляции знаний, предложенная Джеффри Хинтоном в 2015 году, строится на передаче «мягких» выходов (soft outputs) от большой «учительской» модели (teacher) к компактной «ученической» (student). В отличие от обычного обучения, где целевой функцией служат только жесткие метки классов, в KD ученическая модель дополнительно минимизирует расхождение с распределением вероятностей, предсказанным учителем. Эти вероятности, особенно после регулировки температурным параметром, несут богатую информацию о сходстве между классами, которую невозможно извлечь из одних лишь правильных ответов.

Иллюстрация процесса дистиляции знаний. Источник изображения
Иллюстрация процесса дистиляции знаний. Источник изображения

На практике функция потерь в дистилляции знаний включает два компонента:

L = \alpha \cdot L_{CE}(y_{true}, y_{student}) + (1-\alpha) \cdot T^2 \cdot L_{KL}(y_{teacher}/T, y_{student}/T)

где L_{CE} — стандартная кросс-энтропия между предсказаниями студента и истинными метками, L_{KL} — дивергенция Кульбака-Лейблера между смягченными распределениями учителя и студента, α — коэффициент баланса, а T — температурный параметр, контролирующий «мягкость» распределений.

Дистилляция особенно ценна в TinyML, где часто требуется максимально сжать модель без существенной потери точности. Интересно, что компактные модели, обученные с помощью дистилляции, нередко превосходят точность таких же моделей, обученных традиционным способом. Например, ученическая DynaBERT, способная динамически настраивать глубину и ширину под требования различных устройств, демонстрирует превосходство над другими методами компрессии BERT.

Современные подходы к дистилляции знаний существенно расширили базовую концепцию:

  • При применении самодистилляции (self-distillation) знания передаются внутри одной сети, а не между разными архитектурами. В этом случае учитель и ученик фактически используют одни и те же веса, но передача знаний происходит между различными частями сети.

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

  • Динамическая дистилляция адаптируется к данным и состоянию обучения. Эта методика особенно эффективна для сложных задач регрессии, таких как распознавание лиц или позы человека.

Практическая ценность дистилляции особенно заметна при её комбинации с другими методами компрессии. На примере реальных работ:

  • В работе «Рекомендация следующего элемента на устройстве с самоконтролируемой дистилляцией знаний» описывается создание рекомендательной системы для устройств с ультракомпактными моделями и самоконтролируемым фреймворком для KD. Сжатая модель достигает 30-кратного уменьшения размера почти без потери точности.

  • В работе «Легковесная сеть распознавания личности для замены лиц» разработана компактная сеть для edge-устройств, использующая эффективный модуль внедрения личности и KD-метод для стабильного обучения. Благодаря небольшому размеру (0.5М параметров) и низким вычислительным требованиям (0.33 GFLOPs на кадр), эта сеть позволяет выполнять замену лиц в видео в реальном времени даже на мобильных телефонах.

  • Группа корейских ученых предложила стохастическую схему ансамблевого обучения для квантизированных DNN, использующую KD с постоянно меняющейся учительской моделью. Это улучшает производительность на edge-устройствах без необходимости в громоздких учительских сетях.

При этом не всегда для дистилляции необходима гигантская учительская модель. Модели со схожей вычислительной мощностью могут эффективно обучать друг друга, достигая лучшего баланса между ними. Это открывает перспективы для постепенного улучшения уже развернутых на edge-устройствах моделей без необходимости в массивных перетренировках.

Низкоранговая аппроксимация и факторизация

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

Низкоранговая факторизация. Источник изображения
Низкоранговая факторизация. Источник изображения

Математическая суть проста: вместо хранения и обработки целой матрицы весов W размером d×k мы разлагаем её на произведение двух матриц меньшего ранга: W ≈ BA, где B имеет размер d×r, а A = r×k, причем r намного меньше, чем d и k. Такое разложение существенно сокращает количество параметров с d×k до r×(d+k).

Давайте посчитаем на примере: матрица весов 1000×1000 содержит миллион параметров. Разложив её на две матрицы ранга 10, мы получим всего 20 тысяч параметров — в 50 раз меньше! Это колоссальная экономия памяти и вычислений.

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

SVD training — один из новых методов в этой области. Вместо того чтобы факторизовать уже обученную модель (что обычно приводит к потере точности), этот подход внедряет факторизацию прямо в процесс обучения. В нем используются регуляризаторы, которые стимулируют появление нулевых сингулярных значений. Это позволяет достичь более высокого сжатия при той же точности по сравнению с другими методами факторизации и прунинга.

Другая разработка под названием MicroNet (не MicroNets, о которой писали выше) идет ещё дальше, используя так называемую Micro-Factorized свёртку. Этот метод разлагает поточечные и глубинные свёртки на матрицы низкого ранга, радикально снижая вычислительную сложность. Чтобы компенсировать уменьшение глубины сети, в архитектуру вводится динамическая функция активации Shift-Max. В результате MicroNet-M1 достигает 61.1% точности на ImageNet при всего 12 MFLOP операций, что на 11.3% лучше, чем у MobileNetV3 при тех же вычислительных затратах.

Схожую идею по-другому реализует метод LoRA (Low-Rank Adaptation), хотя он больше известен в контексте файнтюнинга больших языковых моделей, а не TinyML. LoRA основан на наблюдении, что изменения весов при адаптации модели часто имеют низкий «внутренний ранг». Вместо тонкой настройки всей матрицы весов W₀, LoRA обучает лишь небольшую дельту ΔW, представленную в виде произведения двух матриц низкого ранга: W = W₀ + BA.

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

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

Практические подходы и инструменты

Фреймворки для TinyML

Допустим, вы потратили месяцы на разработку нейронной сети, достигли впечатляющей точности и мечтаете запустить её на микроконтроллере. Первый логичный шаг — попытаться использовать знакомые фреймворки вроде TensorFlow или PyTorch. Тут вас ждёт неприятный сюрприз: стандартные ML-библиотеки требуют сотни мегабайт памяти, зависимостей и интерпретатора Python. Даже их «мобильные» версии рассчитаны на смартфоны, где доступны гигабайты RAM, а не на устройства, где счет идёт на килобайты.

Осознав эту проблему, разработчики создали специализированные фреймворки для TinyML. Лидерами в этой области стали TensorFlow Lite Micro (TFLM) от Google и CMSIS-NN от ARM. Они радикально отличаются от своих «старших братьев» и заточены под жесткие ограничения микроконтроллеров.

TensorFlow Lite Micro — это сильно урезанная версия TensorFlow, предназначенная для устройств с памятью от 16 КБ. Фреймворк написан на C++ без стандартной библиотеки (no-std C++11) и не требует операционной системы или динамической памяти. TFLM поддерживает только инференс — запуск уже обученных моделей, а сам процесс выглядит примерно так:

  1. Нейросеть обучается в обычном TensorFlow/Keras.

  2. Модель конвертируется в формат .tflite с помощью TensorFlow Lite Converter.

  3. Возможно применение квантования для уменьшения размера.

  4. Сгенерированный файл преобразуется в C-массив.

  5. Этот массив включается в исходный код программы для микроконтроллера.

Процесс развертывания моделей TensorFlow на микроконтроллерах. Источник изображения
Процесс развертывания моделей TensorFlow на микроконтроллерах. Источник изображения

Основная хитрость в том, что TFLM содержит только самое необходимое ядро. Бинарный размер минимального приложения — около 16 КБ, но может увеличиваться в зависимости от используемых операторов. При правильной оптимизации бинарный файл может быть сжат до 300 КБ, что делает его применимым даже для самых маломощных устройств.

CMSIS-NN создан ARM как низкоуровневая библиотека оптимизированных NN-ядер для своих процессоров Cortex-M. Библиотека входит в часть CMSIS-DSP (Digital Signal Processing) и содержит высокооптимизированные реализации основных операций нейронных сетей: свёрток, полносвязных слоев, пулинга и активаций.

CMSIS-NN напрямую использует специфические особенности ARM-архитектуры, такие как:

  • SIMD-инструкции (Single Instruction, Multiple Data);

  • оптимизированная работа с кэшем;

  • специализированные DSP-инструкции.

В тестах на STM32H743 CMSIS-NN показывает впечатляющую производительность: модель MCUNet-in2 выполняется за 642 мс, потребляя 469 КБ пиковой памяти. Однако при работе с более сложными моделями, такими как MCUNet-in4, библиотека не справляется с ограничениями памяти и выдает OOM (Out of Memory).

Между этими двумя полюсами — универсальным TFLM и низкоуровневым CMSIS-NN — существует несколько специализированных решений:

  • X-Cube-AI от STMicroelectronics представляет собой инструмент расширения для STM32CubeMX, который автоматически конвертирует предобученные модели из популярных фреймворков (Keras, TensorFlow, PyTorch, ONNX) в оптимизированный код для микроконтроллеров STM32. Особенность X-Cube-AI в том, что он оптимизирует код конкретно под аппаратную архитектуру выбранного микроконтроллера, что дает превосходную производительность: 32 мс латентности и 88 КБ пиковой памяти на тесте mcunet-vww0 — значительно лучше, чем CMSIS-NN. Недостаток, конечно, в привязке к экосистеме STM32.

  • TinyEngine — разработка MIT как часть проекта MCUNet — пошла ещё дальше в оптимизации. Вместо универсального движка инференса, TinyEngine генерирует специализированный код, учитывающий архитектуру конкретной модели, что устраняет любые накладные расходы. Это объясняет его превосходные результаты в бенчмарках: 27 мс латентности и всего 59 КБ пиковой памяти для той же модели mcunet-vww0. Фактически, TinyEngine переносит большую часть работы со времени выполнения на время компиляции.

  • Edge Impulse представляет принципиально иной подход — облачную платформу для end-to-end разработки TinyML-моделей. Вы загружаете данные, обучаете модель в облаке, а затем экспортируете её в виде готовой библиотеки для Arduino, STM32, ESP32 и других плат. Edge Impulse облегчает жизнь разработчикам, предоставляя веб-интерфейс для сбора данных, выбора архитектуры, обучения и тестирования. Особенно хорошо платформа подходит для отслеживания активов и предиктивного обслуживания — популярных IoT-сценариев.

  • uTensor от ARM требует всего 2 КБ хранилища и ориентирован на платформу Mbed. Процесс работы с uTensor отличается от TensorFlow Lite: сначала создается нейронная сеть с помощью TensorFlow, затем обученная модель переводится в C++, а uTensor адаптирует её для использования на платах ST, K64 и Mbed. Фокус uTensor на быструю разработку прототипов и самые простые NN.

Принцип работы uTensor
Принцип работы uTensor

Независимые тесты показывают значительную разницу в производительности между фреймворками. Например, для одной и той же модели mcunet-vww0 с входным разрешением 64×64 на STM32H743:

  • CMSIS-NN: 53 мс латентности, 163 КБ пиковой памяти.

  • X-Cube-AI: 32 мс латентности, 88 КБ пиковой памяти.

  • TinyEngine: 27 мс латентности, 59 КБ пиковой памяти.

  • TF-Lite Micro: 587 мс латентности, 163 КБ пиковой памяти.

Существуют также узкоспециализированные инструменты для конвертации «традиционных» ML-моделей в код для микроконтроллеров. MicroMLGen переводит модели Scikit-learn (SVM, RVM) в C-код для ESP32 и Arduino. EmbML конвертирует модели из Scikit-learn или WEKA в C++, проверенный на платах Arduino и Teensy. 

В разработке TinyML также важен выбор языка программирования. Хотя модели обычно создаются на Python, развертывание на микроконтроллерах требует C/C++. Python медленный и ресурсоемкий, а C++ дает точный контроль над памятью и производительностью, хотя и усложняет разработку. Эта «языковая пропасть» — ещё одна особенность экосистемы TinyML, с которой приходится мириться разработчикам.

Аппаратные акселераторы

Даже самый оптимизированный фреймворк упирается в фундаментальные ограничения стандартных микроконтроллеров, которые изначально не проектировались для нейросетевых вычислений. Большинство устройств TinyML сегодня используют ARM Cortex-M — процессоры общего назначения с частотами от 16 до 480 МГц, неэффективные для параллельных матричных операций, характерных для нейронных сетей.

Чтобы преодолеть это ограничение, Google создал Edge TPU — специализированный ASIC (Application-Specific Integrated Circuit) размером с ноготь, потребляющий всего 2 Вт энергии, но способный выполнять до 4 TOPS (триллионов операций в секунду). Для сравнения, типичный микроконтроллер Cortex-M4 выдает примерно 0.001 TOPS. Такой колоссальный прирост достигается за счет узкой специализации — Edge TPU оптимизирован исключительно для 8-битных квантизированных моделей TensorFlow Lite.

Платы Coral от Google. Источник изображения
Платы Coral от Google. Источник изображения
Сердце плат Coral — Edge TPU. Источник изображения
Сердце плат Coral — Edge TPU. Источник изображения

Не желая отставать, Intel выпустила Neural Compute Stick — USB-устройство с чипом Movidius Myriad X VPU (Vision Processing Unit). В отличие от жестко зафиксированной архитектуры ASIC, это решение основано на FPGA (Field-Programmable Gate Array) — программируемых логических матрицах. Такой подход дает больше гибкости: акселератор можно перепрограммировать под различные архитектуры нейросетей. При энергопотреблении около 1 Вт устройство обеспечивает до 4 TOPS, что делает его идеальным для прототипирования.

Intel Neural Compute Stick 2 с Raspberry Pi. Источник изображения
Intel Neural Compute Stick 2 с Raspberry Pi. Источник изображения

Но самое интересное происходит в области нейроморфных вычислений, где инженеры не просто оптимизируют существующие архитектуры, а создают принципиально новые, имитирующие работу биологического мозга. В отличие от традиционных систем с фиксированным тактом, они используют импульсные нейроны и синаптическую пластичность. Intel Loihi 2 содержит миллион таких нейронов и демонстрирует энергоэффективность в 1000 раз выше, чем у стандартных CPU. 

Источник изображения

Прагматичный подход к аппаратному ускорению демонстрируют производители мобильных SoC (System-on-Chip), интегрирующие NPU (Neural Processing Unit) напрямую в свои чипы. Qualcomm Hexagon, Apple Neural Engine, MediaTek NeuroPilot — все они включают специализированные блоки для нейросетевых вычислений. Некоторые решения, как NeuroPilot, содержат гетерогенный кластер ядер разной мощности, что позволяет гибко балансировать производительность и энергопотребление в зависимости от сложности модели. 

Интересный тренд в индустрии — гибридные акселераторы, органично комбинирующие различные типы вычислительных элементов в одной системе. Например, архитектура FARNN разделяет вычисления рекуррентных нейронных сетей между FPGA и GPU, где каждый акселератор выполняет те задачи, для которых он лучше всего подходит. Такой симбиоз повышает производительность до 4.2 раз по сравнению с использованием одного типа процессора.

Современные аппаратные решения для TinyML поражают своей энергоэффективностью. BitSystolic, гибкий NPU, поддерживающий модели с точностью от 2 до 8 бит, демонстрирует производительность до 26.7 TOPS/Вт при пиковом энергопотреблении всего 17.8 мВт — такие характеристики позволяют интегрировать действительно мощные модели даже в устройства с батарейным питанием. Специализированные акселераторы для более экзотических архитектур, такие как ApGAN для генеративно-состязательных сетей, используют бинаризацию весов и вычисления в памяти, достигая 28.6-кратного улучшения энергоэффективности.

Перспективные направления исследования и будущие тренды

Что же ждет нас дальше? 

Начнем с того, что сегодняшняя парадигма — обучать модели в облаке, а затем развертывать их на устройствах — имеет ограничения. Модель, обученная на обобщенных данных, никогда не будет учитывать индивидуальные особенности пользователя и его уникальной среды. Именно поэтому обучение на устройстве (on-device training) становится одним из самых актуальных направлений исследований. 

Но обучение на устройстве — это лишь первый шаг. По-настоящему революционные изменения произойдут, когда мы научимся эффективно упаковывать в микроконтроллеры не просто компактные модели компьютерного зрения, а большие языковые модели (LLM) и мультимодальные системы. То, что казалось фантастикой еще год назад, сегодня постепенно становится реальностью: уже есть примеры запуска урезанных версий GPT-2 на телефонах, а новые исследования демонстрируют потенциал упаковки LLM на устройства с ограниченной памятью. Ключевые технологии, которые делают это возможным — квантование до 4 и даже 2 бит, специализированные архитектуры внимания и векторизация токенов. 

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

И все это уже стало делом времени. Вопрос лишь в том, кто первым освоит эти технологии и сумеет извлечь из них максимальную пользу.

На этом у нас все! А что думаете вы — действительно ли будущее за нейросетями прямо на устройствах, или это всё ещё игры для энтузиастов? Поделитесь своим мнением в комментариях!

Tags:
Hubs:
+19
Comments1

Articles

Information

Website
magnus-tech.ru
Registered
Founded
2017
Employees
201–500 employees
Location
Россия