Разработчик обучил модель сегментации на 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. Экономия на этапе развертывания — один из ключевых результатов наших проектов.
Edge AI и оптимизация: деплой моделей без облака
Представьте: ваша модель распознавания лиц выдаёт 4 секунды latency на Jetson Orin, батарея садится за час, модель вылетает по OOM. Мы — команда инженеров по Edge AI с 5+ лет опыта — оптимизировали более 150 моделей для граничных устройств. Без профилирования и правильного выбора квантизации или дистилляции проект обречён. Разрыв между исследовательским кодом и edge-деплоем — отдельная инженерная дисциплина, мы помогаем её освоить за 2–16 недель под ключ. Услуги Edge AI и оптимизация моделей — это не просто экспорт, а системная работа с железом.
Почему просто «экспортировать модель» не работает
PyTorch-модель с float32 и batch_size=32 не готова к edge. Типичные проблемы:
- ResNet-50 в fp32 занимает 98 MB, inference на Cortex-A78 — 380 мс. После INT8-квантизации
torch.ao.quantization — 24 MB, 95 мс. Экспорт в ONNX + TensorRT на Jetson — 28 мс.
- YOLOv8m на Raspberry Pi 5 в fp32 — 2.8 fps. TFLite INT8 — 9.4 fps. С XNNPACK делегатом — 14 fps.
- Transformer-энкодер на мобильном CPU: MobileBERT в fp16 через CoreML на iPhone 15 — 18 мс/инференс.
distilbert-base-uncased в ONNX — 42 мс.
Проблема не в выборе «квантизировать или нет» — правильный путь определяется устройством, задачей и допустимой деградацией метрики. Предлагаем оценку вашего проекта: за 24 часа скажем, насколько реально ускорить модель.
Какой метод квантизации выбрать для вашей задачи?
PTQ (Post-Training Quantization) — быстрый путь. Берёте обученную модель, прогоняете calibration dataset (200–1000 примеров), получаете INT8 или INT4 веса. Инструменты: torch.ao.quantization, ONNX Runtime quantization tool, bitsandbytes. Деградация точности: 0.5–2% на классификации. Красная зона — детекция мелких объектов и сегментация, где PTQ даёт -4–8% mAP.
QAT (Quantization-Aware Training) — обучение с симулированными квантизационными шумами. Дороже (переобучение), но деградация 0.1–0.5%. Оправдано, когда PTQ неприемлем. В PyTorch — torch.ao.quantization.prepare_qat().
GPTQ / AWQ — для LLM. AWQ лучше сохраняет качество при 4-bit квантизации. llm-compressor от Neural Magic или autoawq — основные библиотеки.
| Метод |
Время реализации |
Деградация точности |
Инструменты |
| PTQ |
1–2 дня |
0.5–2% (до 8% на детекции) |
torch.ao, ONNX RT, bitsandbytes |
| QAT |
1–3 недели |
0.1–0.5% |
torch.ao.prepare_qat, TF Quantization |
| GPTQ/AWQ |
3–7 дней |
1–3% (LLM) |
autoawq, llm-compressor |
Экономия от выбора правильного метода: до 350 000 ₽ в год на облачных инстансах за счёт снижения latency и энергопотребления. Стоимость проекта рассчитывается индивидуально — диапазон от 100 000 до 500 000 ₽ в зависимости от сложности модели.
Прунинг и дистилляция
Структурный прунинг удаляет каналы или слои. torch.nn.utils.prune — базовый инструмент. Для transformer — прунинг attention heads (LTP, movement pruning). Результат: ResNet-50 после удаления 40% каналов с fine-tuning — -35% размера, -28% latency, -1.2% top-1 accuracy.
Knowledge distillation — обучаем маленькую student имитировать большую teacher. Классика через KLDivLoss на soft labels. Feature distillation на промежуточных слоях эффективнее. Hugging Face DistilBERT: 66M vs 110M параметров, -40% latency, -3% на GLUE. Согласно Wikipedia, это техника сжатия модели.
Комбинированный подход: дистилляция → прунинг → QAT. Даёт максимальный эффект на ограниченном железе. Экономия на облачных вычислениях достигает 70% — мы фиксировали такую у нескольких клиентов.
Целевые платформы и инструменты
| Платформа |
Предпочтительный формат |
Инструмент |
Специфика |
| NVIDIA Jetson |
TensorRT engine |
trtexec, torch2trt |
INT8 calibration, DLA offload |
| Apple Silicon / iOS |
CoreML (.mlmodel) |
coremltools |
ANE (Neural Engine) автоматически |
| Android |
TFLite (.tflite) |
tf.lite.TFLiteConverter |
GPU delegate, NNAPI |
| x86 CPU |
ONNX + ORT |
onnxruntime |
AVX-512, VNNI |
| Arm Cortex |
TFLite / ONNX |
ort-arm, tflite |
XNNPACK, NEON |
| Qualcomm NPU |
QNN (.dlc) |
Qualcomm AI Hub |
Hexagon DSP |
TensorRT — главный инструмент для NVIDIA edge. TRT строит граф с fusion операторов, выбирает оптимальные ядра. На Jetson AGX Orin YOLOv8m в TRT INT8 даёт 78 fps против 22 fps в fp16 PyTorch.
Практический кейс: детекция дефектов на производственной линии
Задача: обнаружение царапин на металле в реальном времени, 30 fps, камера к Jetson Xavier NX (16GB). Исходная модель YOLOv8l mAP50 0.91, inference на сервере 28 мс, на Jetson в fp16 — 110 мс (9 fps). Не подходит.
Шаги оптимизации:
- Переход на YOLOv8m — mAP50 0.887 (-2.3%), 68 мс
- Экспорт в TensorRT FP16 через
yolo export format=engine half=True — 31 мс (32 fps)
- INT8 calibration на 500 кадрах — 22 мс (45 fps), mAP50 0.879
Итого: деградация 3.5% при 5× ускорении. Клиент получил engine и документацию. Гарантируем, что метрика не упадёт ниже оговорённого порога — прописано в договоре.
Пример профилирования модели (latency по слоям)
Срез профиля YOLOv8m на Jetson Xavier NX (fp16):
- Convolution (layer 1–5): 12 ms
- Bottleneck (layer 6–10): 8 ms
- Head (detection): 11 ms
Узкое место — последние слои head'а. После квантования head'а отдельно latency head снизилась до 4 ms.
Что входит в работу
- Отчёт по профилированию модели на целевом устройстве (latency по слоям, узкие места)
- Выбор и обоснование методов оптимизации (quantization / pruning / distillation)
- Оптимизированная модель (TensorRT engine / TFLite / CoreML / ONNX)
- Конфиги для воспроизведения (скрипты, Docker-образ, инструкция)
- Тестирование на реальном устройстве (не менее 10 000 инференсов)
- Обучение вашей команды (2 часа онлайн)
- Поддержка 1 месяц после передачи
Как заказать оптимизацию модели
- Оставьте заявку на сайте или свяжитесь с нами любым удобным способом.
- Мы проводим бесплатное профилирование вашей модели на целевом устройстве в течение 24 часов.
- Готовим план оптимизации с оценкой trade-off (скорость vs качество).
- Вы утверждаете план — мы приступаем к работе.
- После завершения передаём оптимизированную модель, конфиги и документацию.
- Проводим обучение вашей команды и предоставляем месячную поддержку.
Сроки: оптимизация готовой модели — 2–4 недели. Разработка с нуля под edge — 6–16 недель.
Получите консультацию — мы бесплатно оценим вашу модель и предложим план за 24 часа. Закажите бесплатное профилирование прямо сейчас.