Розробка машинного навчання (TensorFlow Lite) у мобільних додатках
TensorFlow Lite — один з двох стандартів мобільного on-device ML (поряд з Core ML та ONNX Runtime). Його сила — у контролі: ви обираєте делегат, рівень квантизації та спосіб завантаження моделі. Його слабість — та ж гнучкість: неправильний делегат або неоптимізована модель дають гіршу продуктивність, ніж хмарний API.
Делегати: де відбувається більшість помилок
TfLiteGpuDelegateV2 на Android дає реальний приріст тільки при batch infer або на важких згорткових моделях (EfficientDet, MobileNet SSD). На легких моделях (MobileNetV2 зі входом 224×224), GPU делегат повільніший за CPU через overhead передачі даних. Ми профілювали це на Xiaomi Redmi Note 11: CPU 78 ms, GPU 112 ms. Висновок: завжди вимірюйте на цільових пристроях, не на флагманах.
NNAPI делегат (NnApiDelegate) теоретично використовує апаратні акселератори (DSP, NPU), але підтримка операцій дуже нерівномірна. Якщо модель містить нестандартні ops (наприклад, кастомний squeeze-excitation блок), NNAPI беззвучно падає на CPU. Завжди логуйте InterpreterApi.Options.setNumThreads та перевіряйте через Interpreter.getSignatureInputs(), які операції дійсно виконуються на акселераторі.
На iOS TFLite використовує CoreMLDelegate—обгортку над Core ML. Для таргета >= iOS 12, CoreMLDelegate автоматично задіює Neural Engine для підтримуваних шарів. Непідтримувані шари падають на CPU-інтерпретатор TFLite. Змішане виконання працює, але latency непередбачувана без профілювання.
Оптимізація моделі перед розгортанням
Квантизація є обов'язковою для мобіля. Три варіанти:
- Post-training dynamic range quantization — найпростіший, ваги стиснуті до INT8, активації залишаються float. Розмір моделі зменшується ~4x, CPU швидкість поліпшується на 20–40%.
- Post-training integer quantization — як ваги, так і активації в INT8, потребує калібрувального датасету. Потрібен для NNAPI та Edge TPU.
- Quantization-aware training (QAT) — найкраща INT8 точність, але потребує переучення моделі.
Використання tf.lite.TFLiteConverter з optimizations = [tf.lite.Optimize.DEFAULT] охоплює перші два. QAT налаштовується через tfmot.quantization.keras.quantize_model.
Реальний приклад: програма розпізнавання рослин (класифікатор EfficientNetB0, 29 MB float32). Після повної цілочисельної квантизації: 7.4 MB, infer з NNAPI на Pixel 7: 18 ms проти 95 ms на float32 CPU. На Snapdragon 778G, NNAPI довелося повертатися на CPU через непідтримувану операцію LEAKY_RELU—додали fallback через NnApiDelegate.Options.setAllowFp16PrecisionForFp32.
Інтеграція в додаток
На Android використовуйте org.tensorflow:tensorflow-lite + org.tensorflow:tensorflow-lite-gpu через Gradle. Для підтримки Task Library (ImageClassifier, ObjectDetector), додайте org.tensorflow:tensorflow-lite-task-vision. Task Library обробляє preprocessing зображення (ресайз, нормалізація), усуваючи значну кількість boilerplate.
На iOS, CocoaPods pod 'TensorFlowLiteSwift' або Swift Package Manager (TFLite 2.13+). Обгорніть infer в actor для thread-safety:
actor TFLiteInferenceService {
private let interpreter: Interpreter
func classify(pixelBuffer: CVPixelBuffer) throws -> [Float] { ... }
}
Завантажуйте моделі з бандлу або URL з верифікацією SHA-256. Для OTA оновлень використовуйте Firebase Remote Config з URL моделі, завантажуйте через URLSession.downloadTask у фоні.
Часові рамки
Інтеграція готової TFLite-моделі з вибором делегата та базовою оптимізацією: 1 тиждень. Повний цикл з конвертацією, квантизацією, тестуванням на цільових пристроях та OTA оновленнями: 2–3 тижні. Вартість розраховується індивідуально після аналізу моделі та вимог.







