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







