При попытке развернуть обученную модель на 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 участники). Мы гарантируем работоспособность модели на всех целевых устройствах. Среднее время проекта — от нескольких дней до двух недель в зависимости от сложности.
Получите консультацию по конвертации вашей модели: мы проанализируем архитектуру, подберём оптимальные инструменты и предоставим реалистичные сроки. Закажите тестовую конвертацию одной модели — увидите результат до начала полноценной работы.







