Журнал · Rit.work

RiP сокращает память CNN без замедления инференса

RiP позволяет свёрточным сетям переиспользовать память входа и выхода, сокращая пик активаций на микроконтроллерах без изменения результатов и числа циклов.

Rit.work
Студия разработки
2 октября 2026 г.4 мин чтения

Материал подготовлен автоматически по первоисточникам: ссылки на них — в конце статьи.

Свёрточные сети можно запускать на микроконтроллерах с меньшим запасом SRAM, не меняя результат вычислений и время работы. В препринте PowerLabs Technologies, который не проходил рецензирование и опирается на замеры авторов, RiP сократил пик памяти активаций на 12,5–33,3%. На Raspberry Pi Pico 1 благодаря этому поместились девять моделей вместо шести.

Вход и выход делят один участок памяти

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

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

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

RiP сохраняет обычный построчный порядок. Вход размещается у правого края общей рабочей области, а выход записывается слева с самого начала. По мере вычислений граница записи движется навстречу входу и занимает уже освободившиеся ячейки.

Размер безопасного зазора задаёт кусочно-линейная функция: она сравнивает конец записанного результата с ближайшим входным значением, которое ещё понадобится. Максимум достаточно проверить в постоянном числе точек, поэтому расчёт имеет сложность O(1) и не требует обходить всю карту заранее. Формула учитывает произвольный шаг, расширение, дополнение краёв и прямоугольные ядра.

Последовательный порядок почти не увеличил рабочую область

Проверка включала 10 000 случайно сгенерированных слоёв и 84 слоя из 25 архитектур. Симулятор не обнаружил перезаписи живых входных значений. На реальных слоях RiP в среднем использовал на 24,8% меньше памяти, чем раздельные входной и выходной буферы, а почти во всех случаях отставал от обхода «ёлочкой» не более чем на 5%.

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

Для проверки на устройстве RiP встроили в ядра TinyEngine и запускали модели MCUNet с целочисленными весами и активациями на Raspberry Pi Pico 1 и Pico 2. Контрольные суммы выходов совпали побитно, а число циклов осталось практически тем же. Метод меняет размещение данных, но не добавляет арифметику в саму свёртку.

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

Планы меняются, если продукт упирается именно в SRAM

Для команды, которая выбирает между более крупным микроконтроллером и уменьшением CNN, RiP добавляет третий вариант: оставить архитектуру и точность, но заменить размещение активаций. Метод особенно полезен, когда один обычный свёрточный слой создаёт пик памяти, а вычислительного запаса уже хватает.

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

RiP не уменьшает веса, прошивку, стек и вспомогательные буферы. Если устройство упирается в них, в пропускную способность памяти или во время вычислений, метод не меняет выбор платы. Кроме того, реализация на устройствах пока проверена только в TinyEngine и на двух платах Raspberry Pi Pico, поэтому перенос в другой движок потребует отдельно подтвердить разметку памяти и порядок чтения ядра.

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

Источники

Пауза в чтении

Похоже на вашу задачу?

Расскажите, что собираете. За полчаса разложим на этапы и назовём сроки — это бесплатно и ни к чему не обязывает.

Rit.work

Студия разработки

Собираем мобильные приложения и помогаем командам получать от AI реальную пользу. Основатель и команда, работаем удалённо — с клиентами в России и за рубежом.

← Ко всем материалам
Понравилось? Обсудим вашу задачу