Создание и преобразование моделей

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

В этом документе описывается процесс преобразования модели TensorFlow для работы на микроконтроллерах. Также описываются поддерживаемые операции и даются рекомендации по проектированию и обучению модели для работы в условиях ограниченного объёма памяти.

Полный рабочий пример построения и преобразования модели см. в примере Hello World .

Преобразование модели

Чтобы преобразовать обученную модель TensorFlow для работы на микроконтроллерах, следует использовать API конвертера LiteRT на Python . Это преобразует модель в FlatBuffer , уменьшив её размер и подготовив её к использованию операций LiteRT.

Чтобы получить наименьший возможный размер модели, следует рассмотреть возможность использования квантования после обучения .

Преобразовать в массив C

Многие платформы микроконтроллеров не поддерживают файловую систему. Самый простой способ использовать модель из вашей программы — включить её в виде массива C и скомпилировать в вашу программу.

Следующая команда Unix сгенерирует исходный файл C, содержащий модель LiteRT в виде массива char :

xxd -i converted_model.tflite > model_data.cc

Вывод будет выглядеть примерно так:

unsigned char converted_model_tflite[] = {
  0x18, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33, 0x00, 0x00, 0x0e, 0x00,
  // <Lines omitted>
};
unsigned int converted_model_tflite_len = 18200;

После создания файла вы можете включить его в свою программу. Важно изменить объявление массива на const для повышения эффективности использования памяти на встраиваемых платформах.

Пример включения и использования модели в вашей программе см. в hello_world_test.cc в примере Hello World .

Архитектура модели и обучение

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

Размер модели

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

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

Рабочая нагрузка

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

Поддержка операции

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

Поддерживаемые операции можно увидеть в файле micro_mutable_ops_resolver.h