Core ML Model Conversion — это процесс трансформации обученных моделей машинного обучения из популярных фреймворков в формат Core ML (.mlmodel), оптимизированный для выполнения на устройствах Apple. Конвертация необходима, поскольку PyTorch, TensorFlow и другие фреймворки используют собственные форматы, несовместимые с Core ML Runtime. По данным coremltools documentation, 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 — через frozen graph .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
)
# Save to .mlmodel for later compilation in 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
)
# Quantize weights to FP16 for 2x size reduction
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 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также