Разработчик обучил модель сегментации на Keras, а на железе — зависание. Модель не влезала в 2 МБ Flash STM32, а FP32 вес на TFLite Micro падал с 4 МБ до 1.2 МБ после квантования, но точность упала на 12% — и клиент потерял заказ. Мы знаем, как избежать таких сценариев: за шесть лет мы провели десятки конвертаций для MCU, Arm Linux и Google Coral. Под ключ: анализ модели, выбор формата, квантование, валидация точности, развертывание. Наш опыт: 50+ edge-проектов, 30+ для Coral. Свяжитесь с нами для оценки вашего проекта за один день. Стоимость конвертации рассчитывается индивидуально, но в среднем проект окупается за счёт снижения затрат на вычислительные ресурсы и ускорения инференса.
Проблемы, которые решаем
Несовместимость операций
TFLite Micro поддерживает лишь subset от полного TensorFlow: ~250 операций против ~2000. Часто встречаются tf.nn.depthwise_conv2d, tf.reshape — они есть, но tf.where или tf.sort отсутствуют. Мы вручную заменяем неподдерживаемые слои на эквивалентные — например, заменяем tf.where на tf.cast с tf.multiply. Проблема особенно остра для ML на edge, где каждая операция на счету.
Размер модели и квантование
Edge TPU принимает только INT8-модели и не более 8 МБ. Наша команда имеет опыт адаптации YOLOv5 (14 МБ float) до 4.2 МБ INT8 с падением mAP не более 2%. Используем quantization-aware training для сохранения точности. По сравнению с Float16, INT8 квантование обеспечивает скорость в 3-4 раза выше на Edge TPU при тех же затратах энергии. TFLite Micro на 50% компактнее стандартного TFLite, что критично для MCU.
Падение производительности на MCU
Даже после конвертации на TFLite Micro модель может тормозить из-за неоптимального порядка операций. Мы профайлим каждую операцию и изменяем граф для уменьшения количества вызовов DMA — прирост до 40% на STM32H7. Это особенно важно для ML на STM32, где ресурсы ограничены.
Как мы это делаем
Пайплайн конвертации для каждой платформы.
TFLite (мобильные / Raspberry Pi / x86 edge)
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir) converter.optimizations = [tf.lite.Optimize.DEFAULT] tflite_model = converter.convert() Поддерживает: INT8, FP16, dynamic range quantization. GPU delegate, NNAPI, Hexagon DSP. Идеально для ML на Raspberry Pi.
TFLite Micro (MCU, <1 MB)
Subset операций TFLite, portable C++:
xxd -i model.tflite > model_data.cc # конвертация в C array Поддерживается на: STM32, Arduino, ESP32, nRF52840. Compatibility checker обязателен — мы запускаем его перед началом работ.
Edge TPU (Google Coral)
Edge TPU требует INT8 квантования. Только операции из белого листа выполняются аппаратно (остальное — CPU fallback):
edgetpu_compiler model_quant.tflite # компилятор Google Coral Производительность: 4 TOPS (Coral USB), 4 TOPS (Coral PCIe M.2). Отлично для image classification и object detection. Как рекомендует документация Google Coral, удерживайте модель <8 МБ для полного ускорения.
Сравнение платформ
| Платформа | Устройства | Макс. размер модели | Квантование | Инструменты |
|---|---|---|---|---|
| TFLite | Android, iOS, RPi, x86 | Без ограничений | FP16, INT8, dynamic | TFLite Converter, GPU Delegate |
| TFLite Micro | STM32, ESP32, Arduino | <1 МБ Flash | INT8 обязателен | XXD, compatibility checker |
| Edge TPU | Coral USB/PCIe/M.2 | 8 МБ (полное ускорение) | INT8 обязателен | edgetpu_compiler |
Типы квантования и их параметры
| Тип | Размер весов | Потеря точности | Аппаратное ускорение |
|---|---|---|---|
| FP32 | 4 байта | Базовая линия | CPU/GPU |
| FP16 | 2 байта | <1% | GPU, некоторые TPU |
| Dynamic range | 2-4 байта | 1-3% | CPU (оптимизация) |
| INT8 | 1 байт | 1-5% | Edge TPU, DSP, MCU |
Почему INT8 квантование — стандарт для Edge TPU?
Аппаратура Edge TPU оперирует целыми числами — float операции эмулируются на CPU с падением скорости в 10–20 раз. Мы используем калибровку на репрезентативной выборке, чтобы подобрать шкалы и смещения. Для картинных моделей потери mAP обычно не превышают 1–3%.
Как проверить совместимость модели с TFLite Micro?
Запускаем tflite_micro_compatibility_checker ещё до конвертации. Если неподдерживаемая операция — заменяем её эквивалентом. Например, tf.nn.max_pool заменяем на tf.nn.avg_pool, если задача позволяет. В крайнем случае используем custom operator, но это усложняет развёртывание.
Детальная схема проверки совместимости
- Загрузка модели в формате .tflite.
- Прогон через checker: получаем список неподдерживаемых операций.
- Для каждой операции подбираем замену из доступного набора.
- Повторно проверяем совместимость.
- Если замена невозможна — рассматриваем custom operator или смену платформы.
Процесс работы
- Анализ модели: загрузка, профайлинг операций, оценка размера.
- Выбор платформы: MCU, SBC или Edge TPU — подбираем оптимальный вариант.
- Конвертация и квантование: c применением QAT или post-training quantization.
- Валидация точности: сравнение выходов float и quantized модели на тестовой выборке.
- Развертывание: подготовка C-массива, тестирование на целевом устройстве.
Что входит в работу
- Документация: отчёт о конвертации, инструкция по развёртыванию.
- Исходный код скриптов конвертации и валидации.
- Обучение команды заказчика (1–2 сессии).
- Гарантия точности: отклонение не более 5% от baseline.
- Поддержка после деплоя — 1 месяц.
Сроки и бюджет
Сроки: от 1 до 3 недель в зависимости от сложности модели и требований. Стоимость рассчитывается индивидуально — свяжитесь с нами для оценки проекта за один рабочий день. Получите консультацию и коммерческое предложение с учётом ваших задач. Наш опыт: более 6 лет в edge ML, 50+ проектов, 30+ для Coral. Экономия на этапе развертывания — один из ключевых результатов наших проектов.







