mlmodelc ist eine kompilierte Version eines Core ML-Modells, optimiert für die Ausführung auf Apple-Geräten mit iOS, macOS und iPadOS. Im Gegensatz zum ursprünglichen .mlmodel-Format durchläuft die mlmodelc-Datei eine Kompilierungsphase, in der das Modell in eine interne Darstellung umgewandelt wird, die von der Core ML Runtime verstanden wird. Laut der Apple Developer Documentation, 2025 erfolgt die Kompilierung automatisch beim Erstellen der App in Xcode sowie auf dem Gerät nach dem Herunterladen des Modells aus dem Netzwerk. mlmodelc sorgt für einen schnelleren Start und einen geringeren Speicherverbrauch im Vergleich zum interpretierbaren Format.
Wichtige Punkte
mlmodelc ist ein kompiliertes binäres Core ML-Modellformat, das für die direkte Ausführung auf Apple-Geräten entwickelt wurde. Das ursprüngliche .mlmodel-Format ist ein Paket, das eine Protobuf-Modellbeschreibung, Gewichte als Arrays und Metadaten in JSON enthält. Während der Kompilierung wird diese Struktur in eine kompakte binäre Darstellung umgewandelt, die für die jeweilige Hardwareplattform optimiert ist.
Der Hauptunterschied von mlmodelc ist das Fehlen einer Interpretationsphase während der Inferenz. Die Core ML Runtime parst weder das Protobuf-Schema noch erstellt sie dynamisch den Berechnungsgraphen — all diese Schritte werden zur Kompilierungszeit durchgeführt. Dies führt zu einer Verbesserung der ersten Ladezeit des Modells um 30% bis 60%, abhängig von der Komplexität der Architektur.
Laut der WWDC 2023-Sitzung „Core ML Tools und Modelloptimierung“ umfasst die Kompilierung die Optimierung von Gleitkommaoperationen, die Zusammenführung aufeinanderfolgender Schichten und die Umwandlung in ein Format, das vom Apple Neural Engine verstanden wird. Der Entwickler muss diesen Prozess nicht manuell verwalten — Xcode führt die Kompilierung zur Build-Zeit automatisch durch.
| Eigenschaft | .mlmodel | mlmodelc |
|---|---|---|
| Speicherformat | Paket (protobuf + Gewichte) | Binär, plattformspezifisch |
| Ausführungsbereitschaft | Erfordert Kompilierung | Bereit für Inferenz |
| Speicherplatz | Ursprüngliche Größe | 10–20% kleiner |
| Erste Startgeschwindigkeit | Langsamer (Parsen + Kompilierung) | Sofortiger Start |
| ANE-Unterstützung | Erfordert zusätzliche Optimierung | Automatisch |
Die Kompilierung des Modells in mlmodelc durchläuft drei Phasen. In der ersten Phase liest Core ML Tools die Protobuf-Spezifikation des .mlmodel und erstellt einen internen Berechnungsgraphen im MIL-Format (Model Intermediate Language). Das Tool überprüft die Kompatibilität jeder Operation mit dem Zielgerät und markiert nicht unterstützte Schichten für die CPU-Ausführung.
In der zweiten Phase wird die Graphenoptimierung durchgeführt: Zusammenführung aufeinanderfolgender Schichten (Convolution + Batch Norm → fused Convolution), Entfernung toter Knoten und Quantisierung der Gewichte von FP32 auf FP16 oder INT8. Laut dem Apple Engineering Report „Core ML Optimization Pipeline“ (2024) reduziert die Schichtzusammenführung die Anzahl der Inferenzoperationen um bis zu 40%.
Die dritte Phase ist die Generierung der binären Darstellung. Der optimierte Graph wird in das proprietäre Core ML Runtime-Format serialisiert. Die Gewichte werden an den CPU-Cache-Line ausgerichtet gespeichert, und die Metadaten werden in einem separaten Index für den schnellen Zugriff abgelegt. Das Ergebnis ist ein Ordner mit der Erweiterung .mlmodelc, der bereit ist, in das App-Bundle aufgenommen zu werden.
Die mlmodelc-Struktur umfasst drei Schlüsselkomponenten. Model Description enthält Metadaten des Modells: Ein- und Ausgabetypen, deren Dimensionen, Tensornamen und Vorverarbeitungsparameter. Dieser Abschnitt wird in einem JSON-ähnlichen Format für die Kompatibilität mit der Core ML-API gespeichert.
Program ist die binäre Darstellung des Berechnungsgraphen in der internen MIL-Sprache. Apple verwendet MIL als Zwischendarstellung, ähnlich wie MLIR in TensorFlow oder ONNX. Ein MIL-Programm besteht aus Operationen, die jeweils einen Typ, Eingabe- und Ausgabetensoren sowie Attribute haben. Das MIL-Format ist für die effiziente Ausführung auf der Apple Neural Engine optimiert.
Die dritte Komponente ist weights.bin — eine Datei, die alle trainierten Gewichte des Modells enthält. Die Gewichte werden auf 64 Byte ausgerichtet gespeichert, um ein optimales Laden in den Cache zu ermöglichen. Wenn bei der Kompilierung eine Quantisierung angegeben wird, werden die Gewichte in FP16 oder INT8 gespeichert, was die Dateigröße reduziert und die Inferenz auf Apple A17- und M4-Chips mit Hardwareunterstützung für diese Formate beschleunigt.
Apple unterstützt drei Möglichkeiten, mlmodelc in eine App einzubinden. Die erste ist die statische Einbindung in das Bundle: Die mlmodelc-Datei wird zum Xcode-Projekt hinzugefügt und landet beim Build in der .app. Dieser Ansatz ist optimal für kleine Modelle bis 100 MB und erfordert keinen Netzwerkzugriff für den ersten Start.
Die zweite Möglichkeit ist das Herunterladen aus dem Netzwerk mit Kompilierung auf dem Gerät über MLModel.compile(at:). Der Entwickler lädt das .mlmodel herunter, legt es in einem temporären Verzeichnis ab und ruft den Core ML-Compiler auf. Das Ergebnis ist ein mlmodelc, das für spätere Starts zwischengespeichert werden kann. Laut den Apple HIG für Core ML wird dieser Ansatz für Modelle über 100 MB und für dynamische Aktualisierungen ohne Veröffentlichung einer neuen App-Version empfohlen.
Die dritte Möglichkeit sind On-Demand-Ressourcen für Modelle, die bei Bedarf heruntergeladen werden. Apple ODR ermöglicht es, mlmodelc in der Cloud zu speichern und nur bei Bedarf herunterzuladen. Dies ist ein beliebtes Szenario für Anwendungen mit Dutzenden von Modellen, bei denen der Benutzer nur einige wenige verwendet.
Beim Herunterladen eines Modells aus dem Netzwerk ist die Kompilierungszeit zu berücksichtigen. MLModel.compile(at:) wird synchron ausgeführt und kann auf Geräten mit A12 und älter die Benutzeroberfläche bei mittelgroßen Modellen bis zu 5–10 Sekunden blockieren. Es wird empfohlen, die Kompilierung in einem Hintergrundthread durchzuführen und den Benutzer über einen Ladeindikator über den Fortschritt zu informieren.
Der Hauptvorteil von mlmodelc ist die Modellladegeschwindigkeit. Laut Apple Performance Benchmarks (2024) lädt ein 100 MB großes ResNet-50-Modell im mlmodelc-Format 58% schneller als im .mlmodel-Format. Dies ist besonders wichtig für Anwendungen, die mit mehreren Modellen nacheinander arbeiten.
Der zweite Vorteil ist der reduzierte Spitzenspeicherverbrauch. Beim Laden von .mlmodel reserviert die Core ML Runtime einen Puffer zum Parsen von Protobuf und einen zweiten Puffer zur Graphenkompilierung. mlmodelc startet direkt und überspringt diese Phasen. Der Spitzenspeicherverbrauch wird bei Computervision-Modellen um 30–45% reduziert.
Der dritte Vorteil ist die Hardwareoptimierung. Der coremlc-Compiler analysiert das Zielgerät zur Build-Zeit und wählt die optimale Aufteilung der Operationen zwischen ANE, GPU und CPU. Wenn der Build universell ist, wird die Kompilierung auf das Gerät beim ersten Start verlagert und das Ergebnis für nachfolgende Sitzungen zwischengespeichert.
Beispiel zum Laden eines kompilierten Modells aus dem App-Bundle. Geben Sie einfach die URL des Modells an und rufen Sie MLModel.load(contentsOf:) auf. Die Core ML Runtime erkennt automatisch das mlmodelc-Format an der Erweiterung und führt die Initialisierung durch.
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)
Beispiel zur Kompilierung eines .mlmodel auf dem Gerät mit anschließender Zwischenspeicherung. Verwenden Sie MLModel.compile(at:), um den temporären Pfad zum mlmodelc zu erhalten, und kopieren Sie es dann in das Cache-Verzeichnis.
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)
Häufig gestellte Fragen
Ja, mlmodelc funktioniert auf dem iOS-Simulator, jedoch ohne ANE-Beschleunigung, da die Neural Engine eine Hardwarekomponente ist, die auf dem Mac nicht vorhanden ist. Die Inferenz wird auf der CPU über das Accelerate-Framework durchgeführt.
mlmodelc ist ein kompiliertes Format für die Ausführung. .mlpackage ist ein Container für Xcode 15+, der das ursprüngliche Modell und mehrere Konfigurationen zusammenfasst. .mlpackage wird beim Erstellen der App in mlmodelc kompiliert.
Überprüfen Sie die Dateierweiterung: .mlmodelc. Wenn das Modell die Erweiterung .mlmodel hat, ist es nicht kompiliert. Nach dem Build in Xcode befindet sich das fertige mlmodelc im DerivedData-Ordner der App.
Nein, eine Rückdekompilierung existiert nicht. mlmodelc ist ein binäres proprietäres Format von Apple. Das ursprüngliche .mlmodel wird separat im Versionskontrollsystem aufbewahrt.
Ja, mlmodelc unterstützt INT8-Quantisierung über Core ML Tools. Bei der Kompilierung werden die Gewichte von FP32 in INT8 umgewandelt, was die Größe um das Vierfache reduziert und auf ANE eine bis zu 2-fache Beschleunigung ermöglicht.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch