При спробі розгорнути навчену модель на iPhone розробники часто стикаються з несумісністю: PyTorch або TensorFlow безпосередньо не працюють на Apple Silicon. Без конвертації в Core ML ви втрачаєте доступ до Neural Engine (ANE) — а це 15-кратний приріст продуктивності та 10-кратне зниження енергоспоживання. Типовий сценарій: ви навчили YOLOv8 детекцію об'єктів під PyTorch і хочете запустити її на iPhone у реальному часі. Прямий експорт через torch.onnx часто падає через непідтримувані операції — наприклад, torch.nn.functional.scaled_dot_product_attention або кастомних шарів. Ми допомогли десяткам команд перенести моделі від комп'ютерного зору до LLM під iOS та macOS.
Чому Apple Neural Engine критичний для продуктивності?
Apple Neural Engine — це спеціалізований співпроцесор, що виконує матричні операції у 16-бітному форматі. Для нейромереж він дає до 15-кратного прискорення та 10-кратного зниження енергоспоживання порівняно з CPU. Однак ANE приймає лише моделі, конвертовані в Core ML з 16-бітним або квантованим представленням. Якщо ваша модель використовує операції, не сумісні з ANE (наприклад, динамічні роздільності або кастомні активації), інференс буде виконано на CPU або GPU, що споживає батарею та фрейми.
Як конвертувати PyTorch модель в Core ML?
Основний інструмент — бібліотека coremltools від Apple. Вона підтримує конвертацію з PyTorch, TensorFlow/Keras, ONNX. Приклад для PyTorch:
Приклад коду для конвертації
import coremltools as ct
import torch
model = torch.load('model.pth')
traced_model = torch.jit.trace(model, example_input)
coreml_model = ct.convert(traced_model, inputs=[ct.TensorType(shape=example_input.shape)])
coreml_model.save('model.mlpackage')
В результаті отримуємо файл .mlpackage, який можна запускати на iPhone, iPad, Mac через MLModel. При конвертації важливо враховувати формат вхідних даних та динамічні розміри. Для моделей із змінною послідовністю (NLP) використовуйте ct.EnumeratedShapes.
Порівняння інструментів конвертації
| Інструмент | Підтримувані фреймворки | Особливості |
|---|---|---|
| coremltools | PyTorch, TensorFlow, ONNX | універсальний, квантування, палетизація |
| mlx-lm | HuggingFace Transformers | оптимізований для LLM на Apple Silicon |
| ONNX→Core ML | через coremltools | проміжний конверт |
Вибір інструменту залежить від архітектури: для класичних згорткових мереж достатньо coremltools, для LLM (наприклад, LLaMA 3) краще використовувати mlx-lm — він дає приріст швидкості до 40% за рахунок оптимізації під MPS-граф.
Що робити з непідтримуваними операціями?
Не всі операції мають прямий аналог у Core ML. Типові рішення:
- замінити кастомний шар на підтримуваний (наприклад,
torch.nn.functional.leaky_reluнаct.nn.leaky_relu); - реалізувати операцію через
ct.CompositeOp; - попередньо спростити модель — замінити рідкісні функції на стандартні.
Наприклад, при конвертації YOLOv8 ми зіткнулися з операцією nn.Upsample mode='bilinear' — coremltools підтримує тільки 'nearest' через шар upsample_bilinear. Рішення — замінити mode перед трасуванням. У складних випадках використовуємо ct.converters.onnx як проміжний формат.
Оптимізація під Neural Engine
ANE найкраще працює зі статичними розмірами тензорів та квантуванням. Ми використовуємо 8-бітне квантування (linear_symmetric) або 4-бітну палетизацію для зменшення розміру моделі. Це дає приріст швидкості до 30% на ANE без помітного падіння якості. Типові метрики після оптимізації:
| Тип квантування | Розмір моделі | Падіння точності (top-1) | Приріст швидкості |
|---|---|---|---|
| Float32 | 100% | — | 1x |
| Float16 | 50% | <0.1% | 2x |
| INT8 (лінійний) | 25% | 0.2–0.5% | 3x |
| 4-bit палетка | 12% | 0.5–1% | 4x |
Для моделей з high-level embeddings (наприклад, BERT) використовуємо квантування через ct.quantize_weights з калібруванням на репрезентативній вибірці.
Як протестувати модель після конвертації?
Після конвертації обов'язково порівнюємо виходи обох версій на тестовій вибірці. Контролюємо max absolute error — для Float16 він не повинен перевищувати 1e-4. Додатково прогоняємо модель на iPhone, iPad та Mac, вимірюємо затримку (p99) та енергоспоживання. У нашій практиці p99 latency для YOLOv8 на iPhone 15 Pro становить 2 мс, а енергоспоживання знижується на 80% порівняно з запуском на CPU.
Скільки часу займає конвертація?
Час залежить від складності моделі та бажаної оптимізації. Проста конвертація без квантування займає від кількох годин до одного дня. Якщо потрібна повна оптимізація під ANE, квантування та тестування на пристроях — розраховуйте на строк від двох до п'яти днів. Ми завжди надаємо попередню оцінку після аналізу вашої моделі.
Що входить в роботу
- Аналіз моделі та визначення стратегії конвертації.
- Конвертація з вибором оптимальних налаштувань (квантування, динаміка).
- Оптимізація під ANE та тестування на реальних пристроях.
- Надання готового
.mlpackageз документацією. - Підтримка при інтеграції в додаток на Swift/Objective-C.
Чому обирають нас
Наш досвід — понад 50 успішно конвертованих моделей для iOS та macOS. Сертифіковані інженери Apple (ADP, WWDC учасники). Ми гарантуємо працездатність моделі на всіх цільових пристроях. Середній час проекту — від кількох днів до двох тижнів залежно від складності.
Отримайте консультацію щодо конвертації вашої моделі: ми проаналізуємо архітектуру, підберемо оптимальні інструменти та надамо реалістичні строки. Замовте тестову конвертацію однієї моделі — побачите результат до початку повноцінної роботи.







