Оптимізація ML-моделей для мобільних: квантизація, делегати, деплой
Уявіть: ваша модель на сервері дає 0.99 F1, але на Android latency 200 мс, 500 МБ RAM. Клієнти скаржаться, uninstall зростає. Ми привозимо такі проекти щотижня. Наша команда — 5 років досвіду, 70+ сконвертованих моделей — допомагає конвертувати модель у TFLite-формат з підбором квантизації та делегатів. Результат: inference під 10 мс, footprint менше 10 МБ. Економія на хмарній інфраструктурі — до 60%. Зниження вартості одного інференсу — до 80%. Оцініть свій проект за 2 дні — просто напишіть нам.
Чому квантизація критична для мобільних застосунків?
На сервері ви можете дозволити FP32, але на пристрої кожен мегабайт і мілісекунда на рахунку. Квантизація зменшує модель у 4 рази (INT8) і прискорює inference у 2–4 рази без спеціального заліза. З делегатами ви вичавлюєте ще 3–10x. Без цього ваш застосунок програє конкурентам за швидкістю та енергоспоживанням. Докладніше про квантизацію нейронних мереж.
Коли потрібна конвертація в TFLite?
Якщо ваш застосунок працює на Android, iOS або embedded Linux (Raspberry Pi, Coral), TFLite — стандартний формат. Він підтримує апаратне прискорення через NNAPI, GPU delegate, Hexagon DSP та Core ML. Без конвертації ви використовуєте тільки CPU — втрачаєте 5–20x продуктивності. TFLite кращий за ONNX Runtime на мобільних платформах завдяки оптимізаціям під ARM та підтримці Edge TPU. Згідно з документацією TensorFlow Lite, GPU delegate може прискорити inference до 10 разів порівняно з CPU.
Як вибрати метод квантизації?
Вибір залежить від вимог до точності та швидкості:
| Метод |
Ваги |
Активації |
Втрата точності |
Прискорення (vs FP32) |
| Dynamic range |
INT8 |
float |
Мінімальна |
2–3x |
| Full integer |
INT8 |
INT8 |
0.5–2% |
3–4x |
| Float16 |
float16 |
float |
~0% |
~2x (на GPU) |
| QAT |
INT8 |
INT8 |
<0.5% |
3–4x |
QAT (Quantization-Aware Training) — найкращий вибір для критичних за точністю завдань. Ми часто використовуємо його на моделях сімейства BERT. Наприклад, fine-tuning з QAT дає падіння <0.3% при прискоренні 4x.
Докладніше про representative dataset
Representative dataset має містити не менше 200–500 зразків, репрезентативних для продакшену. Неправильний вибір датасету — часта причина втрати точності до 5%.
Що дає використання GPU delegate?
GPU delegate дозволяє виконувати тензорні операції на відеокарті — приріст швидкості 3–10x порівняно з CPU. На Qualcomm Snapdragon з Adreno GPU ми отримували 50 FPS на MobileNet v2. Для iOS Core ML delegate дає до 15x. GPU делегат кращий за CPU у 3–10 разів за throughput, але споживає більше енергії — це компроміс. Вартість одного інференсу знижується в 4 рази порівняно з CPU.
Покроковий план конвертації
-
Профілювання — заміряємо розмір, latency, power на цільових пристроях.
-
Вибір стратегії — post-training або QAT, INT8 або float16.
-
Калібрування — готуємо representative dataset (мінімум 200–500 зразків).
- Конвертація — використовуємо
tf.lite.TFLiteConverter з оптимізаціями.
- Валідація — порівнюємо точність та продуктивність на реальних девайсах.
- Документація — готуємо код інтеграції та рекомендації щодо деплою.
# TF/Keras → TFLite
converter = tf.lite.TFLiteConverter.from_keras_model(model)
converter.optimizations = [tf.lite.Optimize.DEFAULT] # post-training quantization
tflite_model = converter.convert()
PyTorch → ONNX → TFLite: PyTorch не має прямого шляху. Використовуємо torch.onnx.export → onnx-tf → TFLite. Важно ретельно тестувати — подвійна конвертація може внести артефакти. Для PyTorch-моделей рекомендуємо ONNX Runtime для мобільних платформ, якщо точність критична.
Порівняння делегатів
| Платформа |
Delegate |
Прискорення (vs CPU) |
Обладнання |
| Android GPU |
GPU Delegate |
3–10x |
Adreno, Mali |
| Qualcomm |
NNAPI / Hexagon |
5–20x |
Snapdragon (DSP) |
| iOS |
Core ML Delegate |
5–15x |
Apple Neural Engine |
| Edge TPU |
EdgeTPU Delegate |
100x |
Coral accelerator |
Типові помилки при конвертації
- Невідповідність representative dataset — leads to accuracy drop. Наприклад, якщо датасет складається з JPEG з високою якістю, а в продакшені стиснуті — точність падає на 3–5%.
- Відсутність перевірки на пристрої: емулятор не показує реальну продуктивність. CPU на емуляторі в 2–3 рази швидший за реальний.
- Ігнорування power consumption при використанні GPU — на слабких батареях троттлінг знижує FPS.
Приклад: портування YOLOv8 на Android
Клієнт хотів real-time детекцію на Snapdragon 8 Gen 2. Ми обрали full integer quantization з representative dataset з 500 зображень. Після калібрування точність впала на 1.2% — компенсували QAT. Підсумок: 30 FPS при 8 МБ моделі. Весь пайплайн зайняв 5 днів.
Що входить у роботу
- Аналіз архітектури моделі та профілювання (розмір, latency, power).
- Вибір стратегії квантизації (post-training / QAT, INT8 / float16).
- Конвертація з калібруванням на representative dataset.
- Тестування точності та продуктивності на цільових пристроях.
- Документація щодо інтеграції та підтримка при деплої.
Досвід команди: за 5 років ми сконвертували 70+ моделей — від YOLOv8 до трансформерів. Маємо сертифікати Google ML та досвід роботи з Qualcomm NPU.
Зв'яжіться з нами для оцінки вашого проекту — розрахуємо терміни (зазвичай 1–2 тижні) та вартість під ваші вимоги. Замовте консультацію безкоштовно.
Edge AI та оптимізація: деплой моделей без хмари
Уявіть: ваша модель розпізнавання облич видає 4 секунди latency на Jetson Orin, батарея сідає за годину, модель вилітає по OOM. Ми — команда інженерів з Edge AI — оптимізували понад 150 моделей для граничних пристроїв. Без профілювання та правильного вибору квантизації або дистиляції проект приречений. Розрив між дослідницьким кодом та edge-деплоєм — окрема інженерна дисципліна, і ми допомагаємо її освоїти за 2–16 тижнів під ключ. Справа не в експорті, а в системній роботі із залізом: GPU utilization, latency p99, memory bandwidth.
Чому просто «експортувати модель» не працює?
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 — основні бібліотеки.
Зв'яжіться з нами для безкоштовного профілювання вашої моделі — ми оцінимо latency та запропонуємо план оптимізації.
| Метод |
Час реалізації |
Деградація точності |
Інструменти |
| 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 |
Прунінг та дистиляція: коли квантизації недостатньо
Структурний прунінг видаляє канали або шари. Наприклад, видалення 40% каналів ResNet-50 з наступним fine-tuning дає -35% розміру, -28% latency при втраті top-1 accuracy лише на 1.2%. Інструменти: torch.nn.utils.prune, для transformer — прунінг attention heads (movement pruning, LTP). Глибша техніка — N:M sparsity, коли з кожних M ваг залишаються N ненульових (NVIDIA Ampere підтримує 2:4).
Knowledge distillation — навчаємо маленьку student імітувати велику teacher через KLDivLoss на soft labels. Feature distillation на проміжних шарах (hint-based) дає краще збереження якості. Hugging Face DistilBERT: 66M vs 110M параметрів, -40% latency, -3% на GLUE. Температура дистиляції — ключовий гіперпараметр (типово 4–8).
Комбінований підхід: дистиляція → прунінг → 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 — прискорення в 3.5 рази.
Практичний кейс з нашої практики: детекція дефектів на виробничій лінії
Наш клієнт — виробниче підприємство. Завдання: виявлення подряпин на металі в реальному часі, 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 години. Замовте безкоштовне профілювання прямо зараз.