mlmodelc: что это, формат скомпилированной модели и компиляция

Автор: IT Sectr Опубликовано: 2026-07-17 Время чтения: 7 мин

mlmodelc — это скомпилированная версия модели Core ML, оптимизированная для выполнения на устройствах Apple под управлением iOS, macOS и iPadOS. В отличие от исходного формата .mlmodel, файл mlmodelc проходит этап компиляции, в ходе которого модель преобразуется во внутреннее представление, понятное Core ML Runtime. По данным Apple Developer Documentation, 2025, компиляция выполняется автоматически при сборке приложения в Xcode, а также на устройстве после загрузки модели из сети. mlmodelc обеспечивает более быстрый запуск и снижение потребления памяти по сравнению с интерпретируемым форматом.

Главное

  • mlmodelc — скомпилированный формат модели Core ML для выполнения на устройствах Apple.
  • Компиляция .mlmodel в mlmodelc выполняется Xcode при сборке приложения или на устройстве через MLModel.compile().
  • Формат включает Model Description, бинарный граф вычислений на MIL и файл weights.bin.
  • mlmodelc обеспечивает ускорение запуска на 30–60% за счёт предварительной оптимизации графа.
  • Поддерживаются Apple Neural Engine, GPU и CPU через Core ML Runtime.

Что такое mlmodelc и чем отличается от .mlmodel

mlmodelc — это скомпилированный бинарный формат модели Core ML, предназначенный для непосредственного выполнения на устройствах Apple. Исходный формат .mlmodel представляет собой пакет, содержащий protobuf-описание модели, веса в виде массивов и метаданные в JSON. При компиляции эта структура преобразуется в компактное бинарное представление, оптимизированное под конкретную аппаратную платформу.

Ключевое отличие mlmodelc — отсутствие этапа интерпретации во время инференса. Core ML Runtime не парсит protobuf-схему и не строит граф вычислений динамически — все эти шаги выполнены на этапе компиляции. Это даёт выигрыш во времени первого запуска модели от 30% до 60% в зависимости от сложности архитектуры.

По данным сессии WWDC 2023 «Core ML Tools и оптимизация моделей», компиляция включает оптимизацию операций с плавающей точкой, слияние последовательных слоёв и преобразование в формат, понятный Apple Neural Engine. Разработчику не нужно управлять этим процессом вручную — Xcode выполняет компиляцию автоматически на этапе сборки.

Сравнение mlmodelc и .mlmodel

Характеристика.mlmodelmlmodelc
Формат храненияПакет (protobuf + веса)Бинарный, платформо-специфичный
Готовность к выполнениюТребует компиляцииГотов к инференсу
Размер на дискеИсходный размерНа 10–20% меньше
Скорость первого запускаМедленнее (парсинг + компиляция)Мгновенный запуск
Поддержка ANEТребует дополнительной оптимизацииАвтоматическая

Как устроен процесс компиляции mlmodelc

Компиляция модели в 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

Структура 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 с аппаратной поддержкой этих форматов.

Способы развёртывания mlmodelc в приложении

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

Основной выигрыш mlmodelc — скорость загрузки модели. По данным Apple Performance Benchmarks (2024), модель ResNet-50 размером 100 МБ загружается на 58% быстрее в формате mlmodelc по сравнению с .mlmodel. Это особенно важно для приложений, работающих с несколькими моделями последовательно.

Второе преимущество — снижение пикового потребления памяти. При загрузке .mlmodel Core ML Runtime выделяет буфер для парсинга protobuf и второй буфер для компиляции графа. mlmodelc запускается напрямую, минуя эти этапы. Пиковое потребление памяти снижается на 30–45% для моделей компьютерного зрения.

Третье — аппаратная оптимизация. Компилятор coremlc анализирует целевое устройство на этапе сборки и выбирает оптимальное разбиение операций между ANE, GPU и CPU. Если сборка универсальная, компиляция переносится на устройство при первом запуске, а результат кэшируется для последующих сессий.

Примеры работы с mlmodelc в коде Swift

Пример загрузки скомпилированной модели из бандла приложения. Достаточно указать URL на модель и вызвать MLModel.load(contentsOf:). Core ML Runtime автоматически определит формат mlmodelc по расширению и выполнит инициализацию.

swift
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, затем скопируйте её в кэшевую директорию.

swift
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?

Да, mlmodelc работает на симуляторе iOS, но без ускорения ANE, так как Neural Engine — это аппаратный компонент, отсутствующий на Mac. Инференс выполняется на CPU через Accelerate framework.

Чем отличается mlmodelc от .mlpackage?

mlmodelc — скомпилированный формат для выполнения. .mlpackage — контейнер для Xcode 15+, объединяющий исходную модель и несколько конфигураций. .mlpackage компилируется в mlmodelc при сборке приложения.

Как проверить, что модель уже скомпилирована в mlmodelc?

Проверьте расширение файла: .mlmodelc. Если у модели расширение .mlmodel, она не скомпилирована. После сборки в Xcode готовый mlmodelc находится в папке DerivedData приложения.

Можно ли декомпилировать mlmodelc обратно в .mlmodel?

Нет, обратной декомпиляции не существует. mlmodelc — бинарный проприетарный формат Apple. Исходный .mlmodel сохраняется отдельно в системе контроля версий.

Поддерживает ли mlmodelc квантованные модели в INT8?

Да, mlmodelc поддерживает INT8 квантование через Core ML Tools. При компиляции веса преобразуются из FP32 в INT8, что даёт четырёхкратное уменьшение размера и до 2x ускорение на ANE.

Итоги

  • mlmodelc — скомпилированный формат модели Core ML, оптимизированный для выполнения на устройствах Apple.
  • Компиляция включает оптимизацию графа, слияние слоёв и квантование весов под целевую платформу.
  • Формат обеспечивает снижение времени загрузки на 30–60% и уменьшение пикового потребления памяти на 30–45%.
  • Развёртывание возможно через статический бандл, загрузку из сети с компиляцией или On-Demand Resources.
  • mlmodelc поддерживает выполнение на Apple Neural Engine, GPU и CPU через Core ML Runtime.
  • Для загрузки используйте MLModel.load(contentsOf:) в фоновом потоке с обработкой ошибок.
  • Мониторинг производительности моделей выполняется через Instruments с шаблоном Core ML.

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также