Core ML Model Conversion — це процес трансформації навчених моделей машинного навчання з популярних фреймворків у формат Core ML (.mlmodel), оптимізований для виконання на пристроях Apple. Конвертація необхідна, оскільки PyTorch, TensorFlow та інші фреймворки використовують власні формати, несумісні з Core ML Runtime. Згідно з документацією coremltools, 2025, бібліотека підтримує конвертацію з PyTorch, TensorFlow 1.x та 2.x, Keras, ONNX, scikit-learn та libsvm. coremltools автоматично замінює непідтримувані операції на еквівалентні, зберігаючи числову точність моделі.
Головне
Core ML Model Conversion — це процес перетворення навченої моделі машинного навчання з формату вихідного фреймворку у формат .mlmodel, зрозумілий Core ML Runtime на пристроях Apple. Без конвертації модель, навчена в PyTorch або TensorFlow, не може бути завантажена та виконана на iOS або macOS безпосередньо.
Процес конвертації включає трансляцію графу обчислень: кожен оператор вихідного фреймворку (Conv2D, BatchNorm, ReLU) відображається на відповідний оператор Core ML. Якщо прямої заміни немає, coremltools використовує складені операції або користувацькі шари. Згідно з Apple ML Research, бібліотека охоплює понад 200 операторів з різних фреймворків.
Після конвертації модель зберігається в пакетному форматі .mlmodel, який включає protobuf-опис графу, ваги в бінарному вигляді та метадані. Цей файл потім компілюється в mlmodelc для виконання на цільовому пристрої.
coremltools версії 7.x підтримує конвертацію з шести джерел. PyTorch — через torch.jit.trace або torch.export, TensorFlow 2.x — через SavedModel та Keras H5, TensorFlow 1.x — через заморожений граф .pb. Для ONNX використовується проміжне представлення, яке потім транслюється в Core ML.
| Фреймворк | Вхідний формат | API coremltools |
|---|---|---|
| PyTorch | TorchScript, torch.export | CTConverter / convert() |
| TensorFlow 2.x | SavedModel, Keras H5 | convert() |
| TensorFlow 1.x | Frozen .pb | convert() |
| ONNX | .onnx | onnx_to_coreml() |
| scikit-learn | .pkl / Pipeline | converters.sklearn.convert() |
| Keras | .h5 / .keras | convert() |
coremltools — це офіційна Python-бібліотека з відкритим кодом від Apple, доступна через pip install coremltools. Бібліотека надає єдиний API для конвертації з усіх підтримуваних фреймворків, а також інструменти для пост-обробки: квантування, перевірка точності та візуалізація графу.
Встановлення та базова конвертація моделі з PyTorch:
import coremltools as ct
import torch
import torchvision
model = torchvision.models.resnet18(pretrained=True)
model.eval()
example_input = torch.rand(1, 3, 224, 224)
traced_model = torch.jit.trace(model, example_input)
mlmodel = ct.convert(
traced_model,
source="pytorch",
inputs=[ct.ImageType(shape=example_input.shape)]
)
mlmodel.save("ResNet18.mlmodel")
Для конвертації з TensorFlow використовуйте SavedModel як джерело. coremltools автоматично визначає вхідні та вихідні тензори на основі signature_def:
import coremltools as ct
mlmodel = ct.convert(
"saved_model_dir",
source="tensorflow",
@minimum_deployment_target=ct.target.iOS16
)
mlmodel.save("MyTFModel.mlmodel")
Процес конвертації складається з чотирьох етапів. На першому етапі coremltools завантажує вихідну модель та виконує трасування (tracing) або сканування графу. Для PyTorch використовується torch.jit.trace, який проганяє зразок вхідних даних через модель та записує послідовність операцій.
На другому етапі виконується відображення операторів (operator mapping). Кожен оператор з вихідного графу зіставляється з оператором Core ML. Якщо прямої заміни немає, coremltools розбиває оператор на послідовність підтримуваних. Згідно з документацією coremltools, покриття операторів PyTorch перевищує 95% для типових архітектур.
Третій етап — оптимізація графу. coremltools виконує злиття операцій (наприклад, conv + batch norm), видалення зайвих перетворень та перестановку операторів для підвищення ефективності. Четвертий етап — серіалізація у формат .mlmodel із збереженням ваг та метаданих.
Найбільш поширена проблема при конвертації — непідтримувані операції. Якщо модель містить оператор, відсутній в Core ML, coremltools повідомляє про помилку із зазначенням імені операції. Рішення — замінити оператор на еквівалентну комбінацію підтримуваних або реалізувати користувацький шар через custom layer API.
Друга проблема — невідповідність розмірностей. PyTorch використовує формат NCHW, а Core ML — NHWC за замовчуванням. coremltools автоматично вставляє транспонування, але іноді порядок осей визначається неправильно. Перевірте вхідні та вихідні розмірності в логах конвертації та при необхідності вкажіть input_features з правильними іменами.
Третя проблема — втрата точності після квантування. При конвертації з палітрою FP16 або INT8 точність моделі може знизитися. coremltools надає утиліту ct.models.CompiledModel для порівняння виходів вихідної та конвертованої моделі на однакових вхідних даних. Якщо розбіжність перевищує 1%, використовуйте квантування з палітрою FP16 без калібрування або відмовтеся від квантування.
Приклад конвертації моделі MobileNetV3 з PyTorch із зазначенням типу вхідних даних та мінімальної версії iOS. Використовуйте ct.ImageType для автоматичної нормалізації зображень:
import coremltools as ct
import torchvision
model = torchvision.models.mobilenet_v3_small(
pretrained=True
)
model.eval()
example = torch.rand(1, 3, 224, 224)
traced = torch.jit.trace(model, example)
mlmodel = ct.convert(
traced,
source="pytorch",
inputs=[ct.ImageType(
shape=example.shape,
scale=1.0/255.0,
bias=[0, 0, 0]
)],
@minimum_deployment_target=ct.target.iOS16
)
# Зберегти в .mlmodel для пізнішої компіляції в Xcode
mlmodel.save("MobileNetV3.mlmodel")
Приклад конвертації з TensorFlow Keras із квантуванням FP16. Вкажіть minimum_deployment_target для вмикання підтримки FP16 на пристроях з Apple A13 та новіших:
import coremltools as ct
from tensorflow import keras
keras_model = keras.applications.EfficientNetB0(
weights="imagenet"
)
mlmodel = ct.convert(
keras_model,
source="tensorflow",
@minimum_deployment_target=ct.target.iOS17
)
# Квантувати ваги в FP16 для зменшення розміру в 2 рази
mlmodel_fp16 = ct.models.neural_network.quantization_utils.quantize_weights(
mlmodel, 16
)
mlmodel_fp16.save("EfficientNetB0_fp16.mlmodel")
Часто задавані питання
Так, якщо модель збережено в форматі TorchScript, SavedModel або ONNX. coremltools завантажує ці формати без необхідності в вихідному коді та виконує конвертацію за графом обчислень.
coremltools виводить список непідтримуваних операцій в лог при конвертації. Використовуйте ct.utils.get_coreml_operations() для отримання повного списку доступних операторів Core ML.
Палітра квантування — це набір параметрів для стиснення ваг моделі: fp16, int8 або palettization. coremltools підтримує 8-бітну, 16-бітну палітру та LUT-квантування з різною бітністю.
Так, .mlmodel необхідно зкомпілювати в mlmodelc перед виконанням на пристрої. Компіляція виконується автоматично в Xcode при збірці або на пристрої через MLModel.compile(at:).
Використовуйте ct.models.CompiledModel для порівняння виходів вихідної та конвертованої моделі. Подайте однакові вхідні дані та порівняйте результати через метрику MSE або cosine similarity.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також