Понимание библиотеки C++

C++-библиотека LiteRT для микроконтроллеров является частью репозитория TensorFlow . Он удобен для чтения, легко модифицируется, хорошо протестирован, легко интегрируется и совместим с обычным LiteRT.

В следующем документе описывается базовая структура библиотеки C++ и представлена ​​информация о создании собственного проекта.

Структура файла

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

Ключевые файлы

Наиболее важные файлы для использования интерпретатора LiteRT для микроконтроллеров расположены в корне проекта, сопровождаемые тестами:

[`micro_mutable_op_resolver.h`](https://github.com/tensorflow/tflite-micro/blob/main/tensorflow/lite/micro/micro_mutable_op_resolver.h)
can be used to provide the operations used by the interpreter to run the
model.

См. раздел «Начало работы с микроконтроллерами», где описано типичное использование.

Система сборки обеспечивает реализацию определенных файлов для конкретной платформы. Они расположены в каталоге с именем платформы, например cortex-m .

Существует несколько других каталогов, в том числе:

  • kernel , который содержит реализации операций и связанный с ними код.
  • tools , который содержит инструменты сборки и их выходные данные.
  • examples , который содержит пример кода.

Начать новый проект

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

Используйте библиотеку Arduino

Если вы используете Arduino, пример Hello World включен в библиотеку Arduino_TensorFlowLite Arduino, которую вы можете вручную установить в Arduino IDE и в Arduino Create .

После добавления библиотеки перейдите в File -> Examples . В нижней части списка вы должны увидеть пример с именем TensorFlowLite:hello_world . Выберите его и нажмите hello_world , чтобы загрузить пример. Затем вы можете сохранить копию примера и использовать ее в качестве основы для собственного проекта.

Создавать проекты для других платформ

LiteRT для микроконтроллеров может создавать автономные проекты, содержащие все необходимые исходные файлы, используя Makefile . В настоящее время поддерживаются следующие среды: Keil, Make и Mbed.

Чтобы создать эти проекты с помощью Make, клонируйте репозиторий TensorFlow/tflite-micro и выполните следующую команду:

make -f tensorflow/lite/micro/tools/make/Makefile generate_projects

Это займет несколько минут, поскольку необходимо загрузить несколько больших наборов инструментов для зависимостей. После завершения вы должны увидеть несколько папок, созданных по пути, например gen/linux_x86_64/prj/ (точный путь зависит от операционной системы вашего хоста). Эти папки содержат сгенерированный проект и исходные файлы.

После запуска команды вы сможете найти проекты Hello World в gen/linux_x86_64/prj/hello_world . Например, hello_world/keil будет содержать проект Keil.

Запустите тесты

Чтобы собрать библиотеку и запустить все ее модульные тесты, используйте следующую команду:

make -f tensorflow/lite/micro/tools/make/Makefile test

Чтобы запустить отдельный тест, используйте следующую команду, заменив <test_name> именем теста:

make -f tensorflow/lite/micro/tools/make/Makefile test_<test_name>

Имена тестов можно найти в Makefiles проекта. Например, examples/hello_world/Makefile.inc определяет имена тестов для примера Hello World .

Сборка двоичных файлов

Чтобы создать работоспособный двоичный файл для данного проекта (например, примера приложения), используйте следующую команду, заменив <project_name> проектом, который вы хотите собрать:

make -f tensorflow/lite/micro/tools/make/Makefile <project_name>_bin

Например, следующая команда создаст двоичный файл для приложения Hello World :

make -f tensorflow/lite/micro/tools/make/Makefile hello_world_bin

По умолчанию проект будет скомпилирован для операционной системы хоста. Чтобы указать другую целевую архитектуру, используйте TARGET= и TARGET_ARCH= . В следующем примере показано, как создать пример Hello World для универсального Cortex-m0:

make -f tensorflow/lite/micro/tools/make/Makefile TARGET=cortex_m_generic TARGET_ARCH=cortex-m0 hello_world_bin

Если указана цель, вместо исходного кода будут использоваться все доступные исходные файлы для конкретной цели. Например, подкаталог examples/hello_world/cortex_m_generic содержит реализации SparkFun Edge файлов constants.cc и output_handler.cc , которые будут использоваться, когда указан целевой cortex_m_generic .

Имена проектов можно найти в Makefiles проекта. Например, examples/hello_world/Makefile.inc определяет двоичные имена для примера Hello World .

Оптимизированные ядра

Эталонные ядра в корне tensorflow/lite/micro/kernels реализованы на чистом C/C++ и не включают аппаратную оптимизацию для конкретной платформы.

Оптимизированные версии ядер находятся в подкаталогах. Например, kernels/cmsis-nn содержит несколько оптимизированных ядер, использующих библиотеку CMSIS-NN от Arm.

Чтобы создавать проекты с использованием оптимизированных ядер, используйте следующую команду, заменив <subdirectory_name> именем подкаталога, содержащего оптимизации:

make -f tensorflow/lite/micro/tools/make/Makefile TAGS=<subdirectory_name> generate_projects

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

Создайте библиотеку Arduino

Если вам нужно сгенерировать новую сборку библиотеки, вы можете запустить следующий скрипт из репозитория TensorFlow:

./tensorflow/lite/micro/tools/ci_build/test_arduino.sh

Полученную библиотеку можно найти в gen/arduino_x86_64/prj/tensorflow_lite.zip .

Порт на новые устройства

Руководство по портированию LiteRT для микроконтроллеров на новые платформы и устройства можно найти в micro/docs/new_platform_support.md .