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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також