tensorflow-lite
Облегчённое решение TensorFlow для выполнения инференса моделей машинного обучения на мобильных и встраиваемых устройствах. Библиотека обеспечивает низкую задержку, малый размер бинарного файла и поддержку аппаратного ускорения. Она оптимизирована для работы на устройствах с ограниченными ресурсами.
Особенности
- малый размер: от 200 КБ до 300 КБ в зависимости от набора операторов;
- поддержка квантованных моделей (8-бит и 16-бит) для повышения производительности и уменьшения размера;
- формат моделей на основе FlatBuffers для эффективной загрузки без парсинга.
Основные компоненты
TensorFlow Lite предоставляет набор инструментов и библиотек для преобразования моделей, выполнения инференса и аппаратного ускорения (подробнее с документацией можно ознакомиться здесь).
Модели и конвертер
Основой работы с TensorFlow Lite является формат моделей .tflite, который создаётся из стандартных моделей TensorFlow с помощью конвертера. Этот формат использует FlatBuffers, что обеспечивает быструю загрузку и минимальное потребление памяти.
Основные функции и инструменты:
tf.lite.TFLiteConverter.from_saved_model()— создание конвертера из SavedModel;tf.lite.TFLiteConverter.from_keras_model()— конвертация модели Keras;tf.lite.TFLiteConverter.from_concrete_functions()— конвертация из Concrete Functions;optimizations = [tf.lite.Optimize.DEFAULT]— применение стандартных оптимизаций (квантование);representative_dataset()— предоставление репрезентативной выборки для калибровки при квантовании;target_spec.supported_types = [tf.float16]— указание целевых типов данных;convert()— непосредственно преобразование в формат.tflite.
Интерпретатор
Интерпретатор — это ядро библиотеки, выполняющее модель на устройстве. Он предоставляет API для загрузки модели, передачи входных данных и получения результатов. В зависимости от платформы доступны различные реализации (C++, Java, Python).
Основные методы C++ интерпретатора:
InterpreterBuilder()— построитель интерпретатора из модели;BuildFromFile()/BuildFromBuffer()— загрузка модели из файла или буфера;AllocateTensors()— выделение памяти для тензоров;Invoke()— синхронный запуск инференса;ResizeInputTensor(index, dims)— изменение размерности входного тензора (обязательно после вызоваAllocateTensors()при изменении);SetNumThreads(num)— установка количества потоков для выполнения;SetAllowFp16PrecisionForFp32(allow)— разрешение использования fp16 для ускорения на совместимом оборудовании.
Делегаты
Делегаты позволяют перенести часть вычислений на специализированное аппаратное обеспечение, что значительно ускоряет инференс и снижает энергопотребление. Каждый делегат имеет свой API для инициализации и применения.
Основные делегаты и способы их применения:
- GPU delegate (Android/iOS) —
TfLiteGpuDelegateV2Create()/Interpreter::ModifyGraphWithDelegate(); - NNAPI delegate —
NnApiDelegate()/Interpreter::ModifyGraphWithDelegate()с параметрами выполнения (например,allow_fp16,execution_preference); - Core ML delegate —
TfLiteCoreMlDelegateCreate()/Interpreter::ModifyGraphWithDelegate(); - XNNPACK delegate — включается через опции интерпретатора (флаг
TfLiteXNNPackDelegateCreate()или черезInterpreter::SetNumThreads()); - Hexagon delegate —
TfLiteHexagonDelegateCreate()с указанием библиотеки DSP.
Все делегаты могут быть добавлены как до выделения тензоров, так и после (некоторые требуют пересоздания интерпретатора).
Поддержка типов данных и квантование
TensorFlow Lite оптимизирован для работы с квантованными моделями, что позволяет сократить размер модели и ускорить вычисления на целочисленных ядрах.
Основные типы данных и методы работы с ними:
kTfLiteFloat32,kTfLiteFloat16— числа с плавающей точкой;kTfLiteUInt8,kTfLiteInt8— 8-битные целые (квантованные);kTfLiteInt16— 16-битное квантование;kTfLiteBool— булевы тензоры;kTfLiteString— строковые тензоры;kTfLiteInt64,kTfLiteInt32— дополнительные целые типы.
C API для микроконтроллеров
Для устройств с крайне ограниченными ресурсами (MCU) существует отдельная версия TensorFlow Lite для микроконтроллеров. Она предоставляет минималистичный C API.
Основные функции TFLM:
tflite::GetModel()— получение структуры модели из массива байт;tflite::AllOpsResolver()— создание резолвера операций;tflite::MicroInterpreter()— конструктор интерпретатора для MCU;tflite::MicroInterpreter::AllocateTensors()— выделение памяти в арене;tflite::MicroInterpreter::input()/output()— доступ к тензорам;tflite::MicroInterpreter::Invoke()— запуск инференса.