Разработка машинного обучения (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 дня. Гарантируем прозрачность каждого этапа. Закажите консультацию по оптимизации модели.







