Микроконтроллеры имеют ограниченную оперативную память и хранилище, что накладывает ограничения на размеры моделей машинного обучения. Кроме того, LiteRT для микроконтроллеров в настоящее время поддерживает ограниченный набор операций, поэтому возможны не все модели архитектуры.
В этом документе объясняется процесс преобразования модели TensorFlow для работы на микроконтроллерах. В нем также описываются поддерживаемые операции и даются некоторые рекомендации по проектированию и обучению модели для работы в ограниченной памяти.
Комплексный и работоспособный пример построения и преобразования модели см. в примере Hello World .
Преобразование модели
Чтобы преобразовать обученную модель TensorFlow для работы на микроконтроллерах, следует использовать Python API конвертера LiteRT . Это преобразует модель в 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