Введение в TensorFlow Lite

TensorFlow
Введение в TensorFlow Lite

Введение в TensorFlow Lite

TensorFlow Lite — это облегченное решение, специально разработанное для решения проблемы раздувания TensorFlow на мобильной платформе и встроенной стороне.Это два полностью независимых проекта с TensorFlow, и с TensorFlow в основном нет совместного использования кода. Сам TensorFlow спроектирован и разработан для настольных компьютеров и серверов и не настроен и не оптимизирован для мобильной платформы ARM, поэтому, если он используется непосредственно на мобильной платформе или встроенной стороне, это будет «неприемлемо». TensorFlow Lite реализует маломощную среду машинного обучения с малой задержкой для мобильных платформ и позволяет уменьшить размер скомпилированных бинарных выпусков. TensorFlow Lite не только поддерживает традиционное ускорение ARM, но также обеспечивает поддержку Android Neural Networks API, который может обеспечить лучшую производительность на устройствах, поддерживающих ANN.

TensorFlow Lite не только использует ускорение набора инструкций ARM Neon, но также предварительно устанавливает функции активации, предоставляет функции квантования, ускоряет выполнение и уменьшает размер модели.

Возможности TensorFlow Lite

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

  1. Поддержка полного набора основных операторов, все операторы поддерживают ввод с плавающей запятой и квантованные данные, эти основные операторы индивидуально оптимизированы и настроены для мобильных платформ. Эти операторы также включают предустановленные функции активации, которые могут улучшить вычислительную производительность мобильных платформ, обеспечивая при этом точность квантованных вычислений. Мы можем использовать эти операторы для создания и выполнения нашей пользовательской модели.Если в модели требуются некоторые специальные операторы, мы также можем написать собственную реализацию пользовательского оператора.
  2. Для мобильных платформ определен новый формат файла модели, основанный на FlatBuffers. FlatBuffers — это высокопроизводительная кросс-платформенная библиотека сериализации с открытым исходным кодом, очень похожая на Protobuf, но самая большая разница между ними заключается в том, что FlatBuffers не требует какого-либо синтаксического анализа или создания отчетов перед доступом к данным (что соответствует механизму сжатия Protobuf), потому что формат данных FlatBuffers обычно согласуется с памятью. Кроме того, код FlatBuffers меньше, чем код Protobuf, что более удобно для интеграции с мобильной платформой. Поэтому форматы файлов моделей TensorFlow Lite и TensorFlow различаются.
  3. Предоставляется веб-интерпретатор, оптимизированный для мобильных платформ, что делает весь код компактнее и быстрее. Идея оптимизации этого интерпретатора состоит в том, чтобы использовать путь статического графа, чтобы ускорить скорость принятия решений во время выполнения, и в то же время настроить распределитель памяти, чтобы уменьшить динамическое выделение памяти, гарантировать, что потребление времени и ресурсов модели загрузка и инициализация сокращаются, а скорость выполнения повышается.
  4. Предоставляет интерфейсы аппаратного ускорения, один из которых представляет собой традиционное ускорение набора инструкций ARM, а другой — Android Neural Networks API. Если целевое устройство работает под управлением Android 8.1 (API 27) и более поздних версий, вы можете использовать собственный API ускорения Android, чтобы увеличить общую скорость выполнения.
  5. Предоставляется инструмент преобразования модели, который может преобразовывать модель обучения, созданную TensorFlow, в модель TensorFlow Lite. Это решает проблему разных форматов моделей TensorFlow и TensorFlow Lite.
  6. Скомпилированный двоичный объем очень мал.Используя ARM Clang и настройку оптимизации O3, вся библиотека после компиляции составляет менее 300 КБ, что в основном соответствует операторам, требуемым для большинства современных сетей глубокого обучения.
  7. Предоставляются API-интерфейсы Java и C++, поэтому мы можем интегрировать TensorFlow Lite в приложение Android и встроенное приложение.

Архитектура TensorFlow Lite

Если мы хотим понять, как TensorFlow Lite реализует вышеуказанные функции, мы должны сначала понять архитектурный дизайн TensorFlow Lite. Схема проектирования архитектуры TensorFlow Lite, как показано на рисунке.

20210418165435775_610348284.pngТаким образом, мы можем понять разницу между TensorFlow Lite и TensorFlow.Сначала нам нужно обучить файл модели TensorFlow, а затем использовать преобразователь модели TensorFlow Lite для преобразования режима TensorFlow в файл модели TensorFlow Lite (формат .tflite). Затем преобразованный файл можно использовать в мобильном приложении. Мы можем использовать TensorFlow Lite на Android и iOS и загружать преобразованный файл модели .tflite через TensorFlow Lite. TensorFlow Lite предоставляет следующие методы вызова.

  1. Java API: Java API, упакованный в пакет C++ API на Android, который легко назвать прикладным уровнем приложения Android.
  2. C++ API: можно использовать для загрузки файлов моделей TensorFlow Lite и создания интерпретаторов вызовов. API доступен для платформ Android и iOS.
  3. Интерпретатор: ядро, отвечающее за выполнение модели и вызов операторов в соответствии со структурой сети. Загрузка алгоритма ядра необязательна. Если мы не используем ускоренный алгоритм ядра, потребуется всего 100 КБ пространства; если все ускоренные алгоритмы ядра связаны, это всего 300 КБ, а общий размер очень мал. На некоторых устройствах Android интерпретатор напрямую вызывает Android Neural Networks API для аппаратного ускорения.

Наконец, мы можем реализовать собственный алгоритм ядра через C++ API, а затем загрузить его через интерпретатор и использовать при выполнении глубокой сети.

Структура кода TensorFlow Lite

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

каталог/файл объяснять
c Реализация уровня интерфейса C API TensorFlow Lite, эта часть интерфейса также может использоваться в C++.
core Основной интерфейс и реализация TensorFlow Lite, в основном включая структуру SubGraph, преобразование FlatBuffer и анализ оператора модели и другие функции.
delegates Прокси-реализация TensorFlow Lite.Эта часть кода в настоящее время является экспериментальным интерфейсом, который в основном используется для поддержки TensorFlow Lite для вызова интерфейса GPU или NNAPI для выполнения реальных вычислительных задач. Это гарантирует, что вызывающему объекту будет предоставлен согласованный интерфейс вызова независимо от того, что вызывает вычисление.
java Реализация интерфейса TensorFlow Lite Java, включая реализацию C++ JNI и определение класса Java, эта часть будет подробно объяснена в реализации мобильной платформы.
kernels Реализация основных функций TensorFlow, включая все функции активации и реализации операторов, может решать большинство задач глубокого обучения.
kernels/internal Основная внутренняя реализация TensorFlow предоставляет необходимые базовые настройки для реализации оператора, включая базовые определения типов, тензорные реализации, реализации квантования и даже алгоритмы MFCC. Каталог kernels/internal/optimized оптимизирован для разных мобильных платформ, включая ускоренные реализации на базе Eigen или Neon. Реализация Neon включает ряд оптимизаций сборки и C API.
nnapi Реализация Android NNAPI, эта часть поддерживается только в Android.
profiling Реализация внутренней статистики измерения производительности TensorFlow Lite.
python Реализация интерфейса Python TensorFlow Lite, включая реализацию Python на уровне C, а также определения классов и функций уровня Python, будет подробно объяснена в реализации для мобильной платформы.
schema Определение схемы FlatBuffer структуры данных TensorFlow Lite в основном включает генератор файла заголовка и файл определения модели. Файлы определения схемы включают файл fbs (исходное определение) и файлы заголовков, используемые в коде C, сгенерированном компилятором FlatBuffer.
toco Реализация инструмента преобразования модели, который фактически включает модель, квантование модели и другие реализации оптимизации модели. Он поддерживает прямой вызов из командной строки, а также поддерживает вызов интерфейса Python, что нам удобно интегрировать в нашу собственную цепочку инструментов сборки.
tools Реализация внутренней библиотеки инструментов, включая библиотеку измерения точности модели, библиотеку статистики производительности интерпретатора, библиотеку оптимизации модели, библиотеку проверки модели и т. д.
allocation.h/cc Реализация внутреннего распределителя, основной целью является оптимизация реализации распределения памяти мобильной платформы.
builtin_ops.h Определение внутреннего оператора, в основном определяет значение перечисления внутреннего оператора.
context.h Реализация контекста выполнения TensorFlow Lite, поскольку контекст TensorFlow Lite был определен в реализации C, этот файл напрямую ссылается на внутреннюю реализацию API уровня C.
graph_info.h/cc Реализация графической информации TensorFlow Lite, которая в основном определяет структуру данных графа, включая все узлы, входные, выходные и переменные хранения графа.
interpreter.h/cc Реализация интерпретатора TensorFlow Lite. Определен класс Interpreter, который является внешним интерфейсом для уровня C++ для вызова TensorFlow Lite. Этот класс в основном поддерживает: 1. Построение внутренней структуры графа и модели 2. Добавление внутренних узлов графа и установка параметров узла 3. Получение/установка входных данных графа 4. Получение/установка выходных данных графика 5. Получить/установить переменные графика 6. Получить/изменить тензорные данные внутри графика 7. Настройки других параметров 8. Выполнить модель
model.h/cc Реализация модели TensorFlow Lite, в основном включая классы FlatBufferModel и InterpretBuilder. Класс FlatBufferModel отвечает за чтение данных из файла модели и преобразование их во внутреннюю структуру данных модели TensorFlow Lite. Класс InterpretBuilder отвечает за построение объекта Interpreter в соответствии с FlatBufferModel и OpResolver, указанными пользователем. Избегайте ручного построения графика пользователем во время выполнения.
nnapi_delegate.h/cc Прокси-реализация NNAPI, в основном используемая для изоляции интерфейса и конкретной реализации.
string_util.h/cc Реализация типа StringRef, которая определяет и инкапсулирует внутреннее хранилище строк и реализацию связанных функций инструмента.
util.h/cc Реализация других полезных функций