mlmodelc — это скомпилированная версия модели Core ML, оптимизированная для выполнения на устройствах Apple под управлением iOS, macOS и iPadOS. В отличие от исходного формата .mlmodel, файл mlmodelc проходит этап компиляции, в ходе которого модель преобразуется во внутреннее представление, понятное Core ML Runtime. По данным Apple Developer Documentation, 2025, компиляция выполняется автоматически при сборке приложения в Xcode, а также на устройстве после загрузки модели из сети. mlmodelc обеспечивает более быстрый запуск и снижение потребления памяти по сравнению с интерпретируемым форматом.
Главное
mlmodelc — это скомпилированный бинарный формат модели Core ML, предназначенный для непосредственного выполнения на устройствах Apple. Исходный формат .mlmodel представляет собой пакет, содержащий protobuf-описание модели, веса в виде массивов и метаданные в JSON. При компиляции эта структура преобразуется в компактное бинарное представление, оптимизированное под конкретную аппаратную платформу.
Ключевое отличие mlmodelc — отсутствие этапа интерпретации во время инференса. Core ML Runtime не парсит protobuf-схему и не строит граф вычислений динамически — все эти шаги выполнены на этапе компиляции. Это даёт выигрыш во времени первого запуска модели от 30% до 60% в зависимости от сложности архитектуры.
По данным сессии WWDC 2023 «Core ML Tools и оптимизация моделей», компиляция включает оптимизацию операций с плавающей точкой, слияние последовательных слоёв и преобразование в формат, понятный Apple Neural Engine. Разработчику не нужно управлять этим процессом вручную — Xcode выполняет компиляцию автоматически на этапе сборки.
| Характеристика | .mlmodel | mlmodelc |
|---|---|---|
| Формат хранения | Пакет (protobuf + веса) | Бинарный, платформо-специфичный |
| Готовность к выполнению | Требует компиляции | Готов к инференсу |
| Размер на диске | Исходный размер | На 10–20% меньше |
| Скорость первого запуска | Медленнее (парсинг + компиляция) | Мгновенный запуск |
| Поддержка ANE | Требует дополнительной оптимизации | Автоматическая |
Компиляция модели в mlmodelc проходит через три этапа. На первом этапе Core ML Tools читает protobuf-спецификацию .mlmodel и строит внутренний граф вычислений в формате MIL (Model Intermediate Language). Инструмент проверяет совместимость каждой операции с целевым устройством и помечает неподдерживаемые слои для выполнения на CPU.
На втором этапе выполняется оптимизация графа: слияние последовательных слоёв (convolution + batch norm → fused convolution), удаление мёртвых узлов, квантование весов с FP32 до FP16 или INT8. По данным Apple Engineering Report «Core ML Optimization Pipeline» (2024), слияние слоёв сокращает количество операций инференса до 40%.
Третий этап — генерация бинарного представления. Оптимизированный граф сериализуется в проприетарный формат Core ML Runtime. Веса сохраняются с выравниванием под кэш-линии процессора, а метаданные — в отдельном индексе для быстрого доступа. Результат — папка с расширением .mlmodelc, готовая к включению в бандл приложения.
Структура mlmodelc включает три ключевых компонента. Model Description — метаданные модели: типы входов и выходов, их размерности, имена тензоров, параметры предварительной обработки. Эта секция хранится в JSON-подобном формате для совместимости с API Core ML.
Program — бинарное представление графа вычислений на внутреннем языке MIL. Apple использует MIL как промежуточное представление, аналогичное MLIR в TensorFlow или ONNX. MIL-программа состоит из операций, каждая из которых имеет тип, входные и выходные тензоры и атрибуты. Формат MIL оптимизирован для эффективного выполнения на Apple Neural Engine.
Третий компонент — weights.bin — файл, содержащий все обученные веса модели. Веса хранятся с выравниванием по 64 байта для оптимальной загрузки в кэш. Если при компиляции указано квантование, веса сохраняются в FP16 или INT8, что уменьшает размер файла и ускоряет инференс на чипах Apple A17 и M4 с аппаратной поддержкой этих форматов.
Apple поддерживает три способа включения mlmodelc в приложение. Первый — статическое включение в бандл: файл mlmodelc добавляется в Xcode проект и попадает в .app при сборке. Этот способ оптимален для небольших моделей до 100 МБ и не требует сетевого доступа для первого запуска.
Второй способ — загрузка из сети с компиляцией на устройстве через MLModel.compile(at:). Разработчик скачивает .mlmodel, помещает его во временную директорию и вызывает компилятор Core ML. Результат — mlmodelc, который можно кэшировать для последующих запусков. По данным Apple HIG для Core ML, этот подход рекомендуется для моделей размером более 100 МБ и для динамического обновления без публикации новой версии приложения.
Третий способ — On-Demand Resources для моделей, загружаемых по требованию. Apple ODR позволяет хранить mlmodelc в облаке и загружать только при необходимости. Это популярный сценарий для приложений с десятками моделей, где пользователь использует лишь несколько.
При загрузке модели из сети важно учитывать время компиляции. MLModel.compile(at:) выполняется синхронно и может блокировать UI на устройствах с A12 и старше до 5–10 секунд для моделей среднего размера. Рекомендуется выполнять компиляцию в фоновом потоке и уведомлять пользователя о процессе через индикатор загрузки.
Основной выигрыш mlmodelc — скорость загрузки модели. По данным Apple Performance Benchmarks (2024), модель ResNet-50 размером 100 МБ загружается на 58% быстрее в формате mlmodelc по сравнению с .mlmodel. Это особенно важно для приложений, работающих с несколькими моделями последовательно.
Второе преимущество — снижение пикового потребления памяти. При загрузке .mlmodel Core ML Runtime выделяет буфер для парсинга protobuf и второй буфер для компиляции графа. mlmodelc запускается напрямую, минуя эти этапы. Пиковое потребление памяти снижается на 30–45% для моделей компьютерного зрения.
Третье — аппаратная оптимизация. Компилятор coremlc анализирует целевое устройство на этапе сборки и выбирает оптимальное разбиение операций между ANE, GPU и CPU. Если сборка универсальная, компиляция переносится на устройство при первом запуске, а результат кэшируется для последующих сессий.
Пример загрузки скомпилированной модели из бандла приложения. Достаточно указать URL на модель и вызвать MLModel.load(contentsOf:). Core ML Runtime автоматически определит формат mlmodelc по расширению и выполнит инициализацию.
import CoreML
guard let modelURL = Bundle.main.url(
forResource: "MyModel",
withExtension: "mlmodelc"
) else { return }
let model = try await MLModel.load(contentsOf: modelURL)
let prediction = try await model.prediction(from: input)
Пример компиляции .mlmodel на устройстве с последующим кэшированием. Используйте MLModel.compile(at:) для получения временного пути к mlmodelc, затем скопируйте её в кэшевую директорию.
let sourceURL = FileManager.default.temporaryDirectory
.appendingPathComponent("MyModel.mlmodel")
let compiledURL = try await MLModel.compile(at: sourceURL)
let cacheURL = FileManager.default.urls(
for: .cachesDirectory, in: .userDomainMask
)[0].appendingPathComponent("MyModel.mlmodelc")
try FileManager.default.copyItem(at: compiledURL, to: cacheURL)
Часто задаваемые вопросы
Да, mlmodelc работает на симуляторе iOS, но без ускорения ANE, так как Neural Engine — это аппаратный компонент, отсутствующий на Mac. Инференс выполняется на CPU через Accelerate framework.
mlmodelc — скомпилированный формат для выполнения. .mlpackage — контейнер для Xcode 15+, объединяющий исходную модель и несколько конфигураций. .mlpackage компилируется в mlmodelc при сборке приложения.
Проверьте расширение файла: .mlmodelc. Если у модели расширение .mlmodel, она не скомпилирована. После сборки в Xcode готовый mlmodelc находится в папке DerivedData приложения.
Нет, обратной декомпиляции не существует. mlmodelc — бинарный проприетарный формат Apple. Исходный .mlmodel сохраняется отдельно в системе контроля версий.
Да, mlmodelc поддерживает INT8 квантование через Core ML Tools. При компиляции веса преобразуются из FP32 в INT8, что даёт четырёхкратное уменьшение размера и до 2x ускорение на ANE.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также