mlmodelc es una versión compilada del modelo Core ML, optimizada para su ejecución en dispositivos Apple con iOS, macOS y iPadOS. A diferencia del formato original .mlmodel, el archivo mlmodelc pasa por una etapa de compilación durante la cual el modelo se transforma en una representación interna que Core ML Runtime entiende. Según la Documentación para Desarrolladores de Apple, 2025, la compilación se realiza automáticamente al compilar la aplicación en Xcode, así como en el dispositivo después de descargar el modelo desde la red. mlmodelc proporciona un inicio más rápido y un menor consumo de memoria en comparación con el formato interpretable.
Puntos Clave
mlmodelc es un formato de modelo Core ML binario compilado, diseñado para su ejecución directa en dispositivos Apple. El formato original .mlmodel es un paquete que contiene una descripción del modelo en protobuf, los pesos como arrays y metadatos en JSON. Durante la compilación, esta estructura se transforma en una representación binaria compacta optimizada para la plataforma de hardware específica.
La diferencia clave de mlmodelc es la ausencia de una etapa de interpretación durante la inferencia. Core ML Runtime no analiza el esquema protobuf ni construye el grafo de cómputo dinámicamente — todos estos pasos se realizan en tiempo de compilación. Esto mejora el tiempo de primera carga del modelo entre un 30% y un 60% según la complejidad de la arquitectura.
Según la sesión de WWDC 2023 “Core ML Tools y Optimización de Modelos”, la compilación incluye optimización de operaciones de punto flotante, fusión de capas consecutivas y conversión a un formato entendible por Apple Neural Engine. El desarrollador no necesita gestionar este proceso manualmente — Xcode realiza la compilación automáticamente en tiempo de compilación.
| Característica | .mlmodel | mlmodelc |
|---|---|---|
| Formato de Almacenamiento | Paquete (protobuf + pesos) | Binario, específico de la plataforma |
| Preparación para Ejecución | Requiere compilación | Listo para inferencia |
| Tamaño en Disco | Tamaño original | 10–20% más pequeño |
| Velocidad de Primer Inicio | Más lento (análisis + compilación) | Inicio instantáneo |
| Soporte ANE | Requiere optimización adicional | Automático |
La compilación del modelo a mlmodelc pasa por tres etapas. En la primera etapa, Core ML Tools lee la especificación protobuf del .mlmodel y construye un grafo de cómputo interno en formato MIL (Model Intermediate Language). La herramienta verifica la compatibilidad de cada operación con el dispositivo objetivo y marca las capas no soportadas para ejecución en CPU.
En la segunda etapa se realiza la optimización del grafo: fusión de capas consecutivas (convolución + batch norm → convolución fusionada), eliminación de nodos muertos y cuantificación de pesos de FP32 a FP16 o INT8. Según el Informe de Ingeniería de Apple “Core ML Optimization Pipeline” (2024), la fusión de capas reduce la cantidad de operaciones de inferencia hasta en un 40%.
La tercera etapa es la generación de la representación binaria. El grafo optimizado se serializa en el formato propietario de Core ML Runtime. Los pesos se guardan alineados a las líneas de caché de la CPU, y los metadatos se almacenan en un índice separado para acceso rápido. El resultado es una carpeta con la extensión .mlmodelc, lista para incluirse en el paquete de la aplicación.
La estructura de mlmodelc incluye tres componentes clave. Model Description contiene metadatos del modelo: tipos de entrada y salida, sus dimensiones, nombres de tensores y parámetros de preprocesamiento. Esta sección se almacena en un formato similar a JSON para compatibilidad con la API de Core ML.
Program es la representación binaria del grafo de cómputo en el lenguaje interno MIL. Apple utiliza MIL como representación intermedia análoga a MLIR en TensorFlow o ONNX. Un programa MIL consta de operaciones, cada una con un tipo, tensores de entrada y salida, y atributos. El formato MIL está optimizado para una ejecución eficiente en Apple Neural Engine.
El tercer componente es weights.bin — un archivo que contiene todos los pesos entrenados del modelo. Los pesos se almacenan alineados a 64 bytes para una carga óptima en caché. Si se especifica cuantificación durante la compilación, los pesos se guardan en FP16 o INT8, lo que reduce el tamaño del archivo y acelera la inferencia en los chips Apple A17 y M4 con soporte hardware para estos formatos.
Apple admite tres formas de incluir mlmodelc en una aplicación. La primera es la inclusión estática en el paquete: el archivo mlmodelc se añade al proyecto de Xcode y termina en el .app al compilar. Este enfoque es óptimo para modelos pequeños de hasta 100 MB y no requiere acceso a la red para el primer inicio.
La segunda forma es la descarga desde la red con compilación en el dispositivo mediante MLModel.compile(at:). El desarrollador descarga el .mlmodel, lo coloca en un directorio temporal y llama al compilador de Core ML. El resultado es un mlmodelc que puede almacenarse en caché para usos posteriores. Según las HIG de Apple para Core ML, este enfoque se recomienda para modelos de más de 100 MB y para actualizaciones dinámicas sin publicar una nueva versión de la aplicación.
La tercera forma son los Recursos Bajo Demanda (On-Demand Resources) para modelos descargados según sea necesario. ODR de Apple permite almacenar mlmodelc en la nube y descargarlo solo cuando se necesite. Este es un escenario popular para aplicaciones con decenas de modelos donde el usuario solo utiliza unos pocos.
Al descargar un modelo desde la red, es importante tener en cuenta el tiempo de compilación. MLModel.compile(at:) se ejecuta de forma síncrona y puede bloquear la interfaz en dispositivos con A12 y anteriores hasta 5–10 segundos para modelos de tamaño mediano. Se recomienda realizar la compilación en un hilo en segundo plano y notificar al usuario del progreso mediante un indicador de carga.
El principal beneficio de mlmodelc es la velocidad de carga del modelo. Según los Benchmarks de Rendimiento de Apple (2024), un modelo ResNet-50 de 100 MB se carga un 58% más rápido en formato mlmodelc en comparación con .mlmodel. Esto es especialmente importante para aplicaciones que trabajan con múltiples modelos de forma secuencial.
La segunda ventaja es la reducción del consumo máximo de memoria. Al cargar .mlmodel, Core ML Runtime asigna un búfer para analizar protobuf y un segundo búfer para la compilación del grafo. mlmodelc se inicia directamente, saltándose estas etapas. El consumo máximo de memoria se reduce entre un 30 y un 45% para modelos de visión por computadora.
La tercera es la optimización de hardware. El compilador coremlc analiza el dispositivo objetivo en tiempo de compilación y selecciona la división óptima de operaciones entre ANE, GPU y CPU. Si la compilación es universal, la compilación se difiere al dispositivo en el primer inicio y el resultado se almacena en caché para sesiones posteriores.
Ejemplo de carga de un modelo compilado desde el paquete de la aplicación. Simplemente especifica la URL del modelo y llama a MLModel.load(contentsOf:). Core ML Runtime detectará automáticamente el formato mlmodelc por la extensión y realizará la inicialización.
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)
Ejemplo de compilación de un .mlmodel en el dispositivo con almacenamiento en caché posterior. Usa MLModel.compile(at:) para obtener la ruta temporal al mlmodelc, luego cópialo al directorio de caché.
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)
Preguntas Frecuentes
Sí, mlmodelc funciona en el simulador de iOS, pero sin aceleración ANE, ya que Neural Engine es un componente hardware ausente en Mac. La inferencia se realiza en la CPU mediante el framework Accelerate.
mlmodelc es un formato compilado para ejecución. .mlpackage es un contenedor para Xcode 15+ que combina el modelo original y múltiples configuraciones. .mlpackage se compila a mlmodelc al compilar la aplicación.
Verifica la extensión del archivo: .mlmodelc. Si el modelo tiene extensión .mlmodel, no está compilado. Después de compilar en Xcode, el mlmodelc listo se encuentra en la carpeta DerivedData de la aplicación.
No, no existe descompilación inversa. mlmodelc es un formato binario propietario de Apple. El .mlmodel original se guarda por separado en el sistema de control de versiones.
Sí, mlmodelc admite cuantificación INT8 mediante Core ML Tools. Durante la compilación, los pesos se convierten de FP32 a INT8, lo que reduce el tamaño cuatro veces y acelera hasta 2x en ANE.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también