Чому Core ML замість хмарного інференсу?
Конвертуєте модель із Python-середовища в мобільний продакшн — і одразу стикаєтеся з несумісністю форматів, латентністю інференсу та відсутністю механізму оновлення без релізу в App Store.
Core ML розв'язує ці проблеми нативно, але лише якщо його правильно вбудувати в архітектуру застосунку. Ми вже виконали понад 50 інтеграцій Core ML і гарантуємо стабільну роботу на пристроях, починаючи з iPhone 8.
Інференс на пристрої виключає затримки мережі та зберігає конфіденційність даних користувача. Докладніше про можливості Core ML читайте в офіційній документації Apple.
Як уникнути типових помилок під час інтеграції Core ML?
Найпоширеніша помилка — конвертація моделі без урахування цільового обладнання. coremltools дозволяє вказати minimum_deployment_target і тип compute unit: cpuOnly, cpuAndGPU, cpuAndNeuralEngine.
Якщо не вказати cpuAndNeuralEngine для A12+, модель не потрапить на Neural Engine і працюватиме на CPU, що в 5–10 разів повільніше для згорткових мереж. Наші інженери сертифіковані Apple і завжди вибирають оптимальну конфігурацію.
Другий момент — вхідний формат. Core ML очікує CVPixelBuffer з конкретним kCVPixelFormatType. Якщо застосунок отримує UIImage з камери через AVCapturePhotoOutput, потрібна проміжна конвертація через CIImage → CVPixelBuffer.
Робити це в головному потоці — вірний шлях до пропущених кадрів. Увесь ланцюжок захоплення та інференсу має проходити через DispatchQueue з QoS .userInteractive або через фреймворк Vision, який сам керує буферами.
Vision + CoreML — правильна комбінація для більшості завдань: VNCoreMLRequest бере на себе масштабування, нормалізацію та керування буфером. Але якщо потрібна послідовність інференсів на відеопотоці, краще використовувати VNSequenceRequestHandler — він кешує стан між кадрами.
Як ми гарантуємо швидкість інференсу?
Починаємо з аудиту вихідної моделі: формат (ONNX, TensorFlow SavedModel, PyTorch TorchScript), розмір ваг, кількість операцій. Для конвертації використовуємо coremltools 7.x, для квантованих моделей — ct.optimize.coreml з LinearQuantizer або PalettizationConfig.
Квантизація до 8-bit зменшує розмір моделі у 4 рази без помітної втрати точності на більшості класифікаторів.
Приклад із практики: фінтех-клієнт хотів виявлення підроблення документів на пристрої. Початкова TFLite-модель (MobileNetV3, 12 MB) давала 280 ms на iPhone 12.
Після конвертації в .mlpackage з computeUnits = .cpuAndNeuralEngine і Float16-компресією — 34 ms на тому самому пристрої. Додатково обгорнули інференс у MLModelConfiguration з allowLowPrecisionAccumulationOnGPU = true. Економія на серверній інфраструктурі становила до 70%.
| Параметр | До оптимізації | Після оптимізації |
|---|---|---|
| Розмір моделі | 12 MB | 3 MB (Float16) |
| Час інференсу | 280 ms | 34 ms |
| Використовуваний процесор | CPU | Neural Engine |
Дані з офіційного прикладу Apple Core ML Optimization Guide Якщо ви хочете таку саму оптимізацію, зв’яжіться з нами для аудиту вашої моделі.
Технічні деталі конвертації
Окрім квантизації, ми застосовуємо прунінг і профілювання через Xcode Instruments (Core ML Instrument). Для моделей із динамічними розмірами входів використовуємо MLMultiArrayConstraint з shapeFlexibility. Увесь ML-шар ізолюємо в окремий Swift Package з протоколом MLInferenceService.
Що дає квантизація моделі?
Квантизація в 8-bit за допомогою LinearQuantizer скорочує розмір моделі в 4 рази та прискорює інференс до 2 разів на підтримуваному обладнанні. Для задач класифікації точність падає менш ніж на 1%.
Якщо потрібна максимальна точність, використовуємо половинну точність (Float16) — розмір зменшується вдвічі без втрати точності. Наш досвід показує, що більшість моделей можна безпечно квантизувати в 8-bit.
Як ми оновлюємо моделі без релізу?
Для оновлення моделей без релізу налаштовуємо завантаження через CloudKit або власне S3-сумісне сховище. MLModel(contentsOf:) приймає локальний URL — модель завантажується у фоні, верифікується за SHA-256, атомарно підмінюється через FileManager.replaceItem. Стара версія зберігається як fallback.
Архітектурно весь ML-шар ізолюємо в окремий модуль (Swift Package) із протоколом MLInferenceService. Це дає змогу підміняти реалізацію в тестах і перевикористовувати між кількома таргетами.
Що входить у роботу
- Аудит вихідної моделі та вибір шляху конвертації.
- Конвертація в
.mlmodel/.mlpackageчерезcoremltools. - Оптимізація: квантизація, прунінг, вибір compute units.
- Інтеграція через
Visionабо прямийMLModelAPI. - Налаштування OTA-оновлення моделей (CloudKit / S3).
- Unit-тести інференсу з еталонними входами/виходами.
- Профілювання через Xcode Instruments (Core ML Instrument).
Отримайте консультацію щодо інтеграції Core ML вже сьогодні. Зв’яжіться з нами для аудиту вашої моделі — ми розрахуємо терміни та вартість після аудиту.
Терміни
Інтеграція готової сконвертованої моделі в наявний застосунок — від 3 до 5 робочих днів. Якщо потрібна конвертація, оптимізація й налаштування OTA-оновлення з нуля — 1–2 тижні. Вартість розраховується індивідуально після аналізу вимог і вихідної моделі.







