Розробка машинного навчання (TensorFlow Lite) в мобільному додатку
Ми інтегруємо TensorFlow Lite в iOS та Android — від конвертації та квантизації до вибору делегата та OTA-оновлень. За 5 років на ринку ми виконали більше 50 проєктів з on-device ML: розпізнавання об'єктів, класифікація зображень, обробка звуку. Нижче — конкретний технічний досвід, накопичений на реальних кейсах.
Чому варто обрати TFLite для on-device ML?
TensorFlow Lite дає повний контроль над моделлю: ви вирішуєте, який делегат використовувати, рівень квантизації та спосіб завантаження. Втрата точності після квантизації — 1–3% при правильному налаштуванні, а швидкість інференсу на CPU зростає на 20–40%. На відміну від хмарних API, on-device ML не залежить від мережі, захищає дані користувача та не має затримок передачі.
Які проблеми вирішуємо: делегати та продуктивність
TfLiteGpuDelegateV2 на Android дає приріст лише на моделях з важкими згортками (EfficientDet, MobileNet SSD). На легких моделях (MobileNetV2 з 224×224 входом) GPU-делегат повільніший за CPU — ми профілювали на Xiaomi Redmi Note 11: CPU 78 ms, GPU 112 ms. Висновок: завжди вимірюйте на цільових пристроях, не на флагманах.
NNAPI-делегат (NnApiDelegate) теоретично використовує апаратний акселератор (DSP, NPU), але підтримка операцій нерівна. Якщо модель містить нестандартні op (наприклад, кастомний squeeze-excitation блок), NNAPI мовчки падає на CPU. Обов'язково логуйте InterpreterApi.Options.setNumThreads та перевіряйте через Interpreter.getSignatureInputs(), які операції реально виконуються на акселераторі.
На iOS TFLite використовує CoreMLDelegate — обгортку над Core ML. Якщо таргет >= iOS 12, CoreMLDelegate автоматично задіює Neural Engine для підтримуваних шарів. Інші шари падають на CPU-інтерпретатор. Змішане виконання дає непередбачувану латентність без профілювання.
Порівняння делегатів TFLite на мобільних пристроях
| Делегат | Коли ефективний | Типова затримка | Ризики |
|---|---|---|---|
| CPU | Легкі моделі (MobileNetV2) | 80–100 ms (Snapdragon 778G) | Нема прискорення |
| GPU | Важкі згортки (EfficientDet) | 50–70 ms (Adreno 640) | Overhead на передачу даних |
| NNAPI | Сумісні моделі, DSP/NPU | 18–40 ms (Pixel 7) | Неповна підтримка операцій |
| CoreML | iOS 12+, нейромережеві шари | 15–30 ms (iPhone 13) | Змішане виконання |
Як оптимізувати модель перед деплоєм?
Квантизація — обов'язковий крок для мобіля. Три варіанти:
- Post-training dynamic range quantization — найпростіший, ваги стискаються в INT8, активації залишаються float. Розмір моделі зменшується в ~4 рази, швидкість зростає на 20–40% на CPU.
- Post-training integer quantization — ваги та активації в INT8, потребує калібрувальний датасет. Потрібен для NNAPI та Edge TPU.
- Quantization-aware training (QAT) — найкраща точність при INT8, але потребує донавчання моделі.
Галузеве правило: завжди профілюйте квантизовані моделі на цільових пристроях.
| Тип квантизації | Розмір моделі | Інференс (CPU) | Точність |
|---|---|---|---|
| float32 | 100% | 1x | Еталон |
| dynamic range int8 | ~25% | 1.2–1.4x | 1–2% втрата |
| full integer int8 | ~25% | 1.5–2x | 1–3% втрата |
| QAT int8 | ~25% | 1.5–2x | 0.5–1% втрата |
Приклад з практики: додаток для розпізнавання рослин (класифікатор EfficientNetB0, 29 MB float32). Після full integer quantization — 7.4 MB, інференс з NNAPI на Pixel 7 — 18 ms проти 95 ms на float32 CPU. На Snapdragon 778G з NNAPI довелося відкотитися на CPU через непідтримувану LEAKY_RELU операцію — додали fallback через NnApiDelegate.Options.setAllowFp16PrecisionForFp32.
Чек-лист оптимізації моделі
- Вибір типу квантизації під цільовий делегат.
- Калібрування full integer quantization на репрезентативному датасеті.
- Профілювання на 3–5 пристроях різного класу.
- Fallback-стратегія при непідтримуваних операціях.
- Тестування точності на тестовій вибірці.
Що входить в роботу
- Аналіз та конвертація — завантаження моделі з TensorFlow/Keras, PyTorch (через ONNX), вибір формату (float32/int8/float16).
- Вибір делегата — профілюємо на 3–5 реальних пристроях, визначаємо оптимальний делегат (CPU/GPU/NNAPI/CoreML).
- Інтеграція в код — підключаємо Task Library (ImageClassifier, ObjectDetector) для Android, обгортаємо в actor для iOS, забезпечуємо thread-safety.
- OTA-оновлення — завантаження моделі за URL з верифікацією SHA-256, керування через Firebase Remote Config.
- Тестування — навантажувальне тестування, перевірка точності на тестовій вибірці.
- Документація та навчання — інструкція з оновлення моделі, контакти для підтримки.
Для точної оцінки вашої моделі зв'яжіться з нами — ми запропонуємо оптимальне рішення.
Інтеграція в додаток
На Android використовуємо org.tensorflow:tensorflow-lite + org.tensorflow:tensorflow-lite-gpu через Gradle. Для підтримки Task Library (ImageClassifier, ObjectDetector) — org.tensorflow:tensorflow-lite-task-vision. Task Library бере на себе передобробку зображення (ресайз, нормалізація), що прибирає значний пласт boilerplate.
На iOS — CocoaPods pod 'TensorFlowLiteSwift' або Swift Package Manager (починаючи з TFLite 2.13). Інференс обгортаємо в actor для thread-safety:
actor TFLiteInferenceService { private let interpreter: Interpreter func classify(pixelBuffer: CVPixelBuffer) throws -> [Float] { ... } } Завантаження моделі з бандла або за URL з верифікацією через SHA-256. Для OTA-оновлень — Firebase Remote Config з URL моделі, download через URLSession.downloadTask в фоні.
Терміни
Інтеграція готової TFLite-моделі з вибором делегата та базовою оптимізацією — від 1 тижня. Повний цикл з конвертацією, квантизацією, тестуванням на таргетних пристроях та OTA-оновленням — 2–3 тижні. Вартість розраховується індивідуально після аналізу моделі та вимог.
Зв'яжіться з нами — ми оцінимо вашу модель і запропонуємо оптимальне рішення за 1–2 дні. Гарантуємо прозорість кожного етапу. Замовте консультацію з оптимізації моделі.







