mlmodelc är den kompilerade versionen av en Core ML-modell, optimerad för exekvering på Apple-enheter som kör iOS, macOS och iPadOS. Till skillnad från det ursprungliga .mlmodel-formatet genomgår mlmodelc-filen en kompileringsfas där modellen omvandlas till en intern representation som är begriplig för Core ML Runtime. Enligt Apple Developer Documentation, 2025 utförs kompilering automatiskt när applikationen byggs i Xcode, samt på enheten efter att modellen har laddats ner från nätverket. mlmodelc ger snabbare start och lägre minnesförbrukning jämfört med det tolkade formatet.
Huvudpunkter
mlmodelc är ett kompilerat binärt format av Core ML-modellen, avsett för direkt exekvering på Apple-enheter. Det ursprungliga .mlmodel-formatet är ett paket som innehåller modellbeskrivningen i protobuf, vikter i form av arrayer och metadata i JSON. Vid kompilering omvandlas denna struktur till en kompakt binär representation, optimerad för en specifik hårdvaruplattform.
Den viktigaste skillnaden med mlmodelc är avsaknaden av tolkningsfas under inferens. Core ML Runtime tolkar inte protobuf-schemat och bygger inte beräkningsgrafen dynamiskt — alla dessa steg utförs i kompileringsfasen. Detta ger en tidsbesparing vid första start av modellen på 30% till 60% beroende på arkitekturens komplexitet.
Enligt sessionen WWDC 2023 „Core ML Tools och optimering av modeller” innefattar kompilering optimering av flyttalsoperationer, sammanslagning av på varandra följande lager och konvertering till ett format som är begripligt för Apple Neural Engine. Utvecklaren behöver inte hantera denna process manuellt — Xcode utför kompileringen automatiskt i byggfasen.
| Egenskap | .mlmodel | mlmodelc |
|---|---|---|
| Lagringsformat | Paket (protobuf + vikter) | Binärt, plattformsspecifikt |
| Redo för exekvering | Kräver kompilering | Redo för inferens |
| Storlek på disk | Ursprunglig storlek | 10–20% mindre |
| Hastighet för första start | Långsammare (tolkning + kompilering) | Omedelbar start |
| Stöd för ANE | Kräver ytterligare optimering | Automatiskt |
Kompilering av modellen till mlmodelc går igenom tre faser. I den första fasen läser Core ML Tools protobuf-specifikationen av .mlmodel och bygger en intern beräkningsgraf i MIL-format (Model Intermediate Language). Verktyget kontrollerar kompatibiliteten för varje operation med målenheten och markerar ej stödda lager för exekvering på CPU.
I den andra fasen utförs optimering av grafen: sammanslagning av på varandra följande lager (convolution + batch norm → fused convolution), borttagning av döda noder, kvantisering av vikter från FP32 till FP16 eller INT8. Enligt Apple Engineering Report „Core ML Optimization Pipeline” (2024) minskar sammanslagning av lager antalet inferensoperationer med upp till 40%.
Den tredje fasen — generering av binär representation. Den optimerade grafen serialiseras till Core ML Runtime:s proprietära format. Vikter sparas med inriktning mot processorcache-linjer och metadata i ett separat index för snabb åtkomst. Resultatet — en mapp med tillägget .mlmodelc, redo att inkluderas i applikationspaketet.
Strukturen för mlmodelc innefattar tre nyckelkomponenter. Model Description — modellens metadata: typer av in- och utdata, deras dimensioner, tensorernas namn, parametrar för förbehandling. Denna sektion lagras i ett JSON-liknande format för kompatibilitet med Core ML API.
Program — den binära representationen av beräkningsgrafen i det interna MIL-språket. Apple använder MIL som en mellanrepresentation, liknande MLIR i TensorFlow eller ONNX. Ett MIL-program består av operationer, var och en med en typ, in- och utdata-tensorer och attribut. MIL-formatet är optimerat för effektiv exekvering på Apple Neural Engine.
Den tredje komponenten — weights.bin — filen som innehåller alla tränade vikter i modellen. Vikter lagras med 64-byte justering för optimal inläsning i cache. Om kvantisering har angetts vid kompilering sparas vikterna i FP16 eller INT8-format, vilket minskar filstorleken och snabbar upp inferens på Apple A17 och M4-chips med hårdvarustöd för dessa format.
Apple stödjer tre metoder för att inkludera mlmodelc i applikationen. Den första — statisk inkludering i paketet: mlmodelc-filen läggs till i Xcode-projektet och hamnar i .app vid bygge. Denna metod är optimal för små modeller upp till 100 MB och kräver inte nätverksåtkomst för första start.
Den andra metoden — nedladdning från nätverket med kompilering på enheten via MLModel.compile(at:). Utvecklaren laddar ner .mlmodel, placerar den i en tillfällig katalog och anropar Core ML-kompilatorn. Resultatet — mlmodelc, som kan cachas för efterföljande starter. Enligt Apple HIG för Core ML rekommenderas detta tillvägagångssätt för modeller större än 100 MB och för dynamiska uppdateringar utan att publicera en ny version av applikationen.
Den tredje metoden — On-Demand Resources för modeller som laddas på begäran. Apple ODR gör det möjligt att lagra mlmodelc i molnet och bara ladda när det behövs. Detta är ett populärt scenario för applikationer med dussintals modeller, där användaren bara använder några få.
När modellen laddas ner från nätverket är det viktigt att ta hänsyn till kompileringstiden. MLModel.compile(at:) körs synkront och kan blockera gränssnittet på enheter med A12 och äldre i upp till 5–10 sekunder för modeller av medelstorlek. Det rekommenderas att utföra kompileringen i bakgrunden och informera användaren om processen via en laddningsindikator.
Den största fördelen med mlmodelc är hastigheten på modellinläsning. Enligt Apple Performance Benchmarks (2024) laddas ResNet-50-modellen på 100 MB 58% snabbare i mlmodelc-format jämfört med .mlmodel. Detta är särskilt viktigt för applikationer som arbetar med flera modeller sekventiellt.
Den andra fördelen är minskning av toppminnesanvändning. Vid inläsning av .mlmodel allokerar Core ML Runtime en buffert för tolkning av protobuf och en andra buffert för kompilering av grafen. mlmodelc startar direkt och hoppar över dessa faser. Toppminnesanvändningen minskar med 30–45% för datorseendemodeller.
Den tredje — hårdvaruoptimering. Kompilatorn coremlc analyserar målenheten i byggfasen och väljer den optimala fördelningen av operationer mellan ANE, GPU och CPU. Om bygget är universellt överförs kompileringen till enheten vid första start och resultatet cachas för efterföljande sessioner.
Exempel på inläsning av en kompilerad modell från applikationspaketet. Det räcker att ange modellens URL och anropa MLModel.load(contentsOf:). Core ML Runtime kommer automatiskt att identifiera mlmodelc-formatet baserat på filändelsen och utföra initieringen.
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)
Exempel på kompilering av .mlmodel på enheten med efterföljande cachning. Använd MLModel.compile(at:) för att få den tillfälliga sökvägen till mlmodelc, kopiera den sedan till cachekatalogen.
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)
Vanliga frågor
Ja, mlmodelc fungerar på iOS-simulatorn, men utan ANE-acceleration, eftersom Neural Engine är en hårdvarukomponent som saknas på Mac. Inferens utförs på CPU via Accelerate framework.
mlmodelc — kompilerat format för exekvering. .mlpackage — container för Xcode 15+ som kombinerar originalmodellen och flera konfigurationer. .mlpackage kompileras till mlmodelc när applikationen byggs.
Kontrollera filändelsen: .mlmodelc. Om modellen har ändelsen .mlmodel är den inte kompilerad. Efter bygge i Xcode finns den färdiga mlmodelc i applikationens DerivedData-mapp.
Nej, bakåtdkompilering finns inte. mlmodelc är ett binärt proprietärt format från Apple. Den ursprungliga .mlmodel förvaras separat i versionshanteringssystemet.
Ja, mlmodelc stödjer INT8-kvantisering via Core ML Tools. Vid kompilering omvandlas vikter från FP32 till INT8, vilket ger en fyrfaldig storleksminskning och upp till 2x acceleration på ANE.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också