TF Lite Interpreter — це ключовий компонент TensorFlow Lite, відповідальний за виконання моделей у форматі .tflite на мобільних і вбудованих пристроях. Інтерпретатор завантажує FlatBuffers-представлення моделі, алоціює тензори для вхідних і вихідних даних, виконує граф обчислень і повертає результат. Згідно з TensorFlow Lite API Reference, 2025, Інтерпретатор доступний на Java та C++ для Android, Swift та Objective-C для iOS, а також через Python bindings для тестування. TF Lite Interpreter підтримує делегати для апаратного прискорення через GPU, NNAPI та Core ML.
Головне
TF Lite Interpreter — це мінімалістичне середовище виконання, яке виконує модель машинного навчання на пристрої без серверної інфраструктури. Інтерпретатор не підтримує навчання — лише інференцію. Це робить його легким: бінарний розмір базового інтерпретатора на Android становить близько 300 КБ.
Інтерпретатор працює з моделлю у форматі .tflite, заснованому на FlatBuffers. При створенні Інтерпретатор завантажує модель у пам'ять через mmap, що забезпечує прямий доступ до даних без копіювання. Потім Інтерпретатор алоціює тензори на основі опису з моделі та готовий до виконання.
Кожен екземпляр Інтерпретатора не є потокобезпечним. Для паралельного виконання однієї моделі в кількох потоках створіть окремі екземпляри Інтерпретатора з копіями моделі. Для послідовних викликів в одному потоці екземпляр Інтерпретатора можна використовувати повторно.
На Android Інтерпретатор доступний через Java API в пакеті org.tensorflow.lite.Interpreter. Основний метод — run(Object input, Object output), який приймає багатовимірні масиви або ByteBuffer. Для більш тонкого керування використовуйте методи runForMultipleInputsOutputs() та resizeInput().
На iOS Інтерпретатор доступний через Swift API в модулі TensorFlowLite. Базовий інтерфейс аналогічний Android: ініціалізація через Interpreter.init(modelPath:), виділення тензорів через allocateTensors(), виконання через invoke(). Swift API підтримує Data та MLMultiTensor як типи вхідних даних.
| Платформа | Мова | Клас | Метод інференції |
|---|---|---|---|
| Android | Java / Kotlin | Interpreter | run(), runForMultipleInputsOutputs() |
| Android (native) | C++ | Interpreter | Invoke() |
| iOS | Swift / Obj-C | Interpreter | invoke() |
| Linux / Python | Python | Interpreter | get_tensor(), invoke() |
Делегати — це компоненти, які переносять виконання операцій на спеціалізоване обладнання. GPU Delegate використовує OpenGL ES (Android) та Metal (iOS) для прискорення графічних операцій. NNAPI Delegate переносить виконання на NPU, DSP або GPU через Android Neural Networks API.
Core ML Delegate доступний на iOS і транслює операції TFLite у формат Core ML. За даними Apple ML Benchmarking, використання Core ML Delegate на iPhone 15 Pro прискорює інференцію до 4x порівняно з CPU. Делегат підтримує FP32 та FP16 операції.
XNNPACK Delegate — це універсальне рішення для ARM CPU, оптимізоване для мобільних процесорів. Не потребує спеціального обладнання та підтримує INT8, FP16 та FP32. Рекомендується як baseline-делегат, який активується на всіх пристроях.
Інтерпретатор керує тензорами через пул пам'яті, який алоціюється при виклику allocateTensors(). Розмір пулу визначається на основі опису моделі в .tflite файлі. Після алоцації інтерпретатор не виділяє додаткову пам'ять під час інференції.
Для моделей з динамічними розмірами входів використовуйте resizeInput(). Цей метод перерозподіляє пам'ять під вхідні тензори з урахуванням нового розміру. Після зміни розміру вхідного тензора може знадобитися повторна алоцація через allocateTensors().
При роботі з кількома моделями важливо звільняти ресурси через close(). Незвільнені Інтерпретатори можуть призвести до витоку пам'яті, особливо на пристроях з обмеженою RAM. Для iOS використовуйте автоматичний підрахунок посилань ARC, для Android — try-with-resources або явний виклик close().
Найчастіші помилки при роботі з Інтерпретатором — невідповідність розмірностей тензорів. Якщо вхідні дані не відповідають очікуваній формі, Інтерпретатор викидає IllegalArgumentException на Android або runtime error на iOS. Перевіряйте розмірності через inputTensorAt() та outputTensorAt().
Друга поширена проблема — непідтримувані оператори при використанні делегата. Якщо делегат не підтримує оператор, Інтерпретатор автоматично повертається до CPU для цього оператора. Для виявлення таких ситуацій увімкніть логування через setCancelled() або перевіряйте логи TFLite.
TFLite надає Benchmark Tool для профілювання: вимірювання часу кожного оператора, споживання пам'яті, порівняння делегатів. Benchmark Tool доступний у складі TFLite Support Library і може бути запущений безпосередньо на пристрої.
Приклад виконання моделі на Android з Java API з використанням GPU Delegate. Інтерпретатор створюється з опціями, що включають GPU делегат. Після виконання інференції результат читається з вихідного тензора:
import org.tensorflow.lite.Interpreter;
import org.tensorflow.lite.gpu.GpuDelegate;
import java.nio.MappedByteBuffer;
MappedByteBuffer model = loadModelFile(context);
GpuDelegate gpu = new GpuDelegate();
Interpreter.Options opts = new Interpreter.Options().addDelegate(gpu);
Interpreter interpreter = new Interpreter.create(model, opts);
float[][] input = preprocessImage(bitmap);
float[][] output = new float[1][1000];
interpreter.run(input, output);
int bestClass = argmax(output[0]);
Log.d("TFLite", "Верхній клас: " + bestClass);
gpu.close();
interpreter.close();
Приклад виконання на Python для тестування перед розгортанням. Python API TFLite дозволяє завантажити .tflite, виконати інференцію та вивести результат. Використовується для налагодження та перевірки точності моделі:
import tensorflow as tf
import numpy as np
# Завантажити модель TFLite з файлу
interpreter = tf.lite.Interpreter(model_path="model.tflite")
interpreter.allocate_tensors()
# Отримати деталі вхідних та вихідних тензорів
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
# Підготувати випадкові вхідні дані для тестування
input_data = np.random.randn(
*input_details[0]["shape"]
).astype(np.float32)
interpreter.set_tensor(input_details[0]["index"], input_data)
interpreter.invoke()
output_data = interpreter.get_tensor(output_details[0]["index"])
print("Форма виходу:", output_data.shape)
Часті запитання
Базовий Інтерпретатор для Android займає близько 300 КБ. Додаткова пам'ять виділяється під тензори моделі та залежить від розміру вхідних даних, кількості операторів і режиму квантування.
Один екземпляр Інтерпретатора не потокобезпечний. Для паралельного виконання створіть кілька екземплярів з окремими копіями моделі. Кожен екземпляр використовує власну пам'ять під тензори.
Використовуйте TFLite Support Library — клас DelegatesApi. Викличте DelegatesApi.getAvailableDelegates() для отримання списку доступних делегатів на конкретному пристрої.
Перевірте цілісність .tflite файлу через tf.lite.experimental.Analyzer. Переконайтеся, що модель конвертована для правильної версії TFLite та підтримує операції, доступні на цільовому пристрої.
Використовуйте метод resizeInput(int idx, int[] dims) в Java API або resizeInput(at:to:) в Swift. Після зміни розміру викличте allocateTensors() для перерозподілу пам'яті.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також