mlmodelc to skompilowana wersja modelu Core ML, zoptymalizowana do wykonywania na urządzeniach Apple z systemami iOS, macOS i iPadOS. W przeciwieństwie do oryginalnego formatu .mlmodel, plik mlmodelc przechodzi etap kompilacji, podczas którego model jest przekształcany na wewnętrzną reprezentację zrozumiałą dla Core ML Runtime. Według Apple Developer Documentation, 2025, kompilacja jest wykonywana automatycznie podczas budowania aplikacji w Xcode, a także na urządzeniu po pobraniu modelu z sieci. mlmodelc zapewnia szybsze uruchamianie i mniejsze zużycie pamięci w porównaniu z formatem interpretowanym.
Najważniejsze
mlmodelc — to skompilowany binarny format modelu Core ML, przeznaczony do bezpośredniego wykonywania na urządzeniach Apple. Oryginalny format .mlmodel to pakiet zawierający opis modelu w protobuf, wagi w postaci tablic i metadane w JSON. Podczas kompilacji ta struktura jest przekształcana w kompaktową reprezentację binarną, zoptymalizowaną pod konkretną platformę sprzętową.
Kluczowa różnica mlmodelc — brak etapu interpretacji podczas inferencji. Core ML Runtime nie parsuje schematu protobuf ani nie buduje grafu obliczeń dynamicznie — wszystkie te kroki są wykonane na etapie kompilacji. Daje to oszczędność czasu pierwszego uruchomienia modelu od 30% do 60% w zależności od złożoności architektury.
Według sesji WWDC 2023 „Core ML Tools i optymalizacja modeli”, kompilacja obejmuje optymalizację operacji zmiennoprzecinkowych, łączenie kolejnych warstw i konwersję do formatu zrozumiałego dla Apple Neural Engine. Deweloper nie musi zarządzać tym procesem ręcznie — Xcode wykonuje kompilację automatycznie na etapie budowania.
| Cecha | .mlmodel | mlmodelc |
|---|---|---|
| Format przechowywania | Pakiet (protobuf + wagi) | Binarny, platformowo-specyficzny |
| Gotowość do wykonania | Wymaga kompilacji | Gotowy do inferencji |
| Rozmiar na dysku | Oryginalny rozmiar | O 10–20% mniejszy |
| Szybkość pierwszego uruchomienia | Wolniejszy (parsowanie + kompilacja) | Natychmiastowe uruchomienie |
| Wsparcie ANE | Wymaga dodatkowej optymalizacji | Automatyczne |
Kompilacja modelu do mlmodelc przechodzi przez trzy etapy. W pierwszym etapie Core ML Tools odczytuje specyfikację protobuf .mlmodel i buduje wewnętrzny graf obliczeń w formacie MIL (Model Intermediate Language). Narzędzie sprawdza zgodność każdej operacji z docelowym urządzeniem i oznacza nieobsługiwane warstwy do wykonania na CPU.
W drugim etapie wykonywana jest optymalizacja grafu: łączenie kolejnych warstw (convolution + batch norm → fused convolution), usuwanie martwych węzłów, kwantyzacja wag z FP32 do FP16 lub INT8. Według Apple Engineering Report „Core ML Optimization Pipeline” (2024), łączenie warstw redukuje liczbę operacji inferencji do 40%.
Trzeci etap — generowanie reprezentacji binarnej. Zoptymalizowany graf jest serializowany do zastrzeżonego formatu Core ML Runtime. Wagi są zapisywane z wyrównaniem pod linie pamięci podręcznej procesora, a metadane — w osobnym indeksie dla szybkiego dostępu. Wynik — folder z rozszerzeniem .mlmodelc, gotowy do dołączenia do pakietu aplikacji.
Struktura mlmodelc obejmuje trzy kluczowe komponenty. Model Description — metadane modelu: typy wejść i wyjść, ich wymiary, nazwy tensorów, parametry wstępnego przetwarzania. Ta sekcja jest przechowywana w formacie podobnym do JSON dla zgodności z API Core ML.
Program — binarna reprezentacja grafu obliczeń w wewnętrznym języku MIL. Apple używa MIL jako pośredniej reprezentacji, podobnej do MLIR w TensorFlow lub ONNX. Program MIL składa się z operacji, z których każda ma typ, wejściowe i wyjściowe tensory oraz atrybuty. Format MIL jest zoptymalizowany do efektywnego wykonywania na Apple Neural Engine.
Trzeci komponent — weights.bin — plik zawierający wszystkie wytrenowane wagi modelu. Wagi są przechowywane z wyrównaniem do 64 bajtów dla optymalnego ładowania do pamięci podręcznej. Jeśli podczas kompilacji określono kwantyzację, wagi są zapisywane w FP16 lub INT8, co zmniejsza rozmiar pliku i przyspiesza inferencję na układach Apple A17 i M4 ze sprzętowym wsparciem tych formatów.
Apple obsługuje trzy sposoby dołączania mlmodelc do aplikacji. Pierwszy — statyczne dołączenie do pakietu: plik mlmodelc jest dodawany do projektu Xcode i trafia do .app podczas budowania. Ten sposób jest optymalny dla małych modeli do 100 MB i nie wymaga dostępu sieciowego do pierwszego uruchomienia.
Drugi sposób — pobranie z sieci z kompilacją na urządzeniu przez MLModel.compile(at:). Deweloper pobiera .mlmodel, umieszcza go w katalogu tymczasowym i wywołuje kompilator Core ML. Wynik — mlmodelc, który można buforować do kolejnych uruchomień. Według Apple HIG dla Core ML, to podejście jest zalecane dla modeli o rozmiarze powyżej 100 MB oraz do dynamicznej aktualizacji bez publikowania nowej wersji aplikacji.
Trzeci sposób — On-Demand Resources dla modeli ładowanych na żądanie. Apple ODR pozwala przechowywać mlmodelc w chmurze i ładować tylko w razie potrzeby. To popularny scenariusz dla aplikacji z dziesiątkami modeli, gdzie użytkownik używa tylko kilku.
Przy pobieraniu modelu z sieci ważne jest uwzględnienie czasu kompilacji. MLModel.compile(at:) jest wykonywany synchronicznie i może blokować interfejs na urządzeniach z A12 i starszych do 5–10 sekund dla modeli średniej wielkości. Zaleca się wykonywanie kompilacji w tle i informowanie użytkownika o procesie za pomocą wskaźnika ładowania.
Główną zaletą mlmodelc jest szybkość ładowania modelu. Według Apple Performance Benchmarks (2024), model ResNet-50 o rozmiarze 100 MB ładuje się o 58% szybciej w formacie mlmodelc w porównaniu z .mlmodel. Jest to szczególnie ważne dla aplikacji pracujących z wieloma modelami sekwencyjnie.
Drugą zaletą jest zmniejszenie szczytowego zużycia pamięci. Podczas ładowania .mlmodel Core ML Runtime przydziela bufor do parsowania protobuf i drugi bufor do kompilacji grafu. mlmodelc uruchamia się bezpośrednio, pomijając te etapy. Szczytowe zużycie pamięci spada o 30–45% dla modeli widzenia komputerowego.
Trzecią — optymalizacja sprzętowa. Kompilator coremlc analizuje docelowe urządzenie na etapie budowania i wybiera optymalny podział operacji między ANE, GPU i CPU. Jeśli kompilacja jest uniwersalna, kompilacja jest przenoszona na urządzenie przy pierwszym uruchomieniu, a wynik jest buforowany do kolejnych sesji.
Przykład ładowania skompilowanego modelu z pakietu aplikacji. Wystarczy wskazać URL modelu i wywołać MLModel.load(contentsOf:). Core ML Runtime automatycznie określi format mlmodelc po rozszerzeniu i wykona inicjalizację.
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)
Przykład kompilacji .mlmodel na urządzeniu z późniejszym buforowaniem. Użyj MLModel.compile(at:) aby uzyskać tymczasową ścieżkę do mlmodelc, a następnie skopiuj ją do katalogu pamięci podręcznej.
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)
Często zadawane pytania
Tak, mlmodelc działa na symulatorze iOS, ale bez przyspieszenia ANE, ponieważ Neural Engine to komponent sprzętowy, którego brak na Macu. Inferencja jest wykonywana na CPU przez Accelerate framework.
mlmodelc — skompilowany format do wykonywania. .mlpackage — kontener dla Xcode 15+, łączący oryginalny model i kilka konfiguracji. .mlpackage jest kompilowany do mlmodelc podczas budowania aplikacji.
Sprawdź rozszerzenie pliku: .mlmodelc. Jeśli model ma rozszerzenie .mlmodel, nie jest skompilowany. Po budowaniu w Xcode gotowy mlmodelc znajduje się w folderze DerivedData aplikacji.
Nie, nie istnieje dekompilacja zwrotna. mlmodelc to binarny zastrzeżony format Apple. Oryginalny .mlmodel jest przechowywany osobno w systemie kontroli wersji.
Tak, mlmodelc obsługuje kwantyzację INT8 przez Core ML Tools. Podczas kompilacji wagi są przekształcane z FP32 na INT8, co daje czterokrotne zmniejszenie rozmiaru i do 2x przyspieszenie na ANE.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również