mlmodelc é uma versão compilada do modelo Core ML, otimizada para execução em dispositivos Apple com iOS, macOS e iPadOS. Diferentemente do formato original .mlmodel, o arquivo mlmodelc passa por uma etapa de compilação durante a qual o modelo é convertido em uma representação interna compreendida pelo Core ML Runtime. De acordo com a Documentação para Desenvolvedores Apple, 2025, a compilação ocorre automaticamente ao compilar o aplicativo no Xcode, bem como no dispositivo após baixar o modelo da rede. O mlmodelc proporciona inicialização mais rápida e menor consumo de memória em comparação ao formato interpretável.
Pontos Principais
mlmodelc é um formato de modelo Core ML binário compilado, projetado para execução direta em dispositivos Apple. O formato original .mlmodel é um pacote contendo uma descrição do modelo em protobuf, os pesos como arrays e metadados em JSON. Durante a compilação, essa estrutura é transformada em uma representação binária compacta otimizada para a plataforma de hardware específica.
A principal diferença do mlmodelc é a ausência de uma etapa de interpretação durante a inferência. O Core ML Runtime não analisa o esquema protobuf nem constrói o grafo de computação dinamicamente — todas essas etapas são realizadas em tempo de compilação. Isso proporciona uma melhoria no tempo de primeiro carregamento do modelo de 30% a 60%, dependendo da complexidade da arquitetura.
De acordo com a sessão WWDC 2023 “Core ML Tools e Otimização de Modelos”, a compilação inclui otimização de operações de ponto flutuante, fusão de camadas consecutivas e conversão para um formato compreendido pelo Apple Neural Engine. O desenvolvedor não precisa gerenciar esse processo manualmente — o Xcode realiza a compilação automaticamente em tempo de compilação.
| Característica | .mlmodel | mlmodelc |
|---|---|---|
| Formato de Armazenamento | Pacote (protobuf + pesos) | Binário, específico da plataforma |
| Prontidão para Execução | Requer compilação | Pronto para inferência |
| Tamanho em Disco | Tamanho original | 10–20% menor |
| Velocidade de Primeira Inicialização | Mais lento (análise + compilação) | Inicialização instantânea |
| Suporte ANE | Requer otimização adicional | Automático |
A compilação do modelo para mlmodelc passa por três etapas. Na primeira etapa, o Core ML Tools lê a especificação protobuf do .mlmodel e constrói um grafo de computação interno no formato MIL (Model Intermediate Language). A ferramenta verifica a compatibilidade de cada operação com o dispositivo alvo e marca as camadas não suportadas para execução na CPU.
Na segunda etapa, é realizada a otimização do grafo: fusão de camadas consecutivas (convolução + batch norm → convolução fundida), remoção de nós mortos e quantização dos pesos de FP32 para FP16 ou INT8. De acordo com o Relatório de Engenharia da Apple “Core ML Optimization Pipeline” (2024), a fusão de camadas reduz o número de operações de inferência em até 40%.
A terceira etapa é a geração da representação binária. O grafo otimizado é serializado no formato proprietário do Core ML Runtime. Os pesos são salvos alinhados às linhas de cache da CPU, e os metadados são armazenados em um índice separado para acesso rápido. O resultado é uma pasta com a extensão .mlmodelc, pronta para ser incluída no pacote do aplicativo.
A estrutura do mlmodelc inclui três componentes principais. O Model Description contém metadados do modelo: tipos de entrada e saída, suas dimensões, nomes dos tensores e parâmetros de pré-processamento. Esta seção é armazenada em um formato semelhante a JSON para compatibilidade com a API do Core ML.
Program é a representação binária do grafo de computação na linguagem interna MIL. A Apple utiliza MIL como uma representação intermediária análoga ao MLIR no TensorFlow ou ONNX. Um programa MIL consiste em operações, cada uma com um tipo, tensores de entrada e saída e atributos. O formato MIL é otimizado para execução eficiente no Apple Neural Engine.
O terceiro componente é o weights.bin — um arquivo contendo todos os pesos treinados do modelo. Os pesos são armazenados alinhados a 64 bytes para carregamento ideal em cache. Se a quantização for especificada durante a compilação, os pesos são salvos em FP16 ou INT8, reduzindo o tamanho do arquivo e acelerando a inferência nos chips Apple A17 e M4 com suporte de hardware para esses formatos.
A Apple suporta três formas de incluir mlmodelc em um aplicativo. A primeira é a inclusão estática no pacote: o arquivo mlmodelc é adicionado ao projeto Xcode e vai para o .app na compilação. Esta abordagem é ideal para modelos pequenos de até 100 MB e não requer acesso à rede para a primeira execução.
A segunda forma é o download da rede com compilação no dispositivo via MLModel.compile(at:). O desenvolvedor baixa o .mlmodel, coloca-o em um diretório temporário e chama o compilador Core ML. O resultado é um mlmodelc que pode ser armazenado em cache para execuções posteriores. De acordo com as HIG da Apple para Core ML, esta abordagem é recomendada para modelos com mais de 100 MB e para atualizações dinâmicas sem publicar uma nova versão do aplicativo.
A terceira forma são os Recursos sob Demanda (On-Demand Resources) para modelos baixados conforme necessário. O ODR da Apple permite armazenar mlmodelc na nuvem e baixá-lo apenas quando necessário. Este é um cenário popular para aplicativos com dezenas de modelos onde o usuário utiliza apenas alguns.
Ao baixar um modelo da rede, é importante considerar o tempo de compilação. O MLModel.compile(at:) é executado de forma síncrona e pode bloquear a interface em dispositivos com A12 e anteriores por até 5–10 segundos para modelos de tamanho médio. Recomenda-se realizar a compilação em uma thread em segundo plano e notificar o usuário sobre o progresso através de um indicador de carregamento.
O principal benefício do mlmodelc é a velocidade de carregamento do modelo. De acordo com os Benchmarks de Desempenho da Apple (2024), um modelo ResNet-50 de 100 MB carrega 58% mais rápido no formato mlmodelc em comparação com .mlmodel. Isso é especialmente importante para aplicativos que trabalham com múltiplos modelos sequencialmente.
A segunda vantagem é a redução do consumo máximo de memória. Ao carregar .mlmodel, o Core ML Runtime aloca um buffer para analisar protobuf e um segundo buffer para a compilação do grafo. O mlmodelc é iniciado diretamente, pulando essas etapas. O consumo máximo de memória é reduzido em 30–45% para modelos de visão computacional.
A terceira é a otimização de hardware. O compilador coremlc analisa o dispositivo alvo em tempo de compilação e seleciona a divisão ideal de operações entre ANE, GPU e CPU. Se a compilação for universal, a compilação é transferida para o dispositivo na primeira execução e o resultado é armazenado em cache para sessões posteriores.
Exemplo de carregamento de um modelo compilado do pacote do aplicativo. Basta especificar a URL do modelo e chamar MLModel.load(contentsOf:). O Core ML Runtime detectará automaticamente o formato mlmodelc pela extensão e realizará a inicialização.
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)
Exemplo de compilação de um .mlmodel no dispositivo com armazenamento em cache posterior. Use MLModel.compile(at:) para obter o caminho temporário para o mlmodelc e, em seguida, copie-o para o diretório de cache.
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)
Perguntas Frequentes
Sim, o mlmodelc funciona no simulador iOS, mas sem aceleração ANE, pois o Neural Engine é um componente de hardware ausente no Mac. A inferência é realizada na CPU através do framework Accelerate.
mlmodelc é um formato compilado para execução. .mlpackage é um contêiner para Xcode 15+ que combina o modelo original e múltiplas configurações. O .mlpackage é compilado em mlmodelc ao compilar o aplicativo.
Verifique a extensão do arquivo: .mlmodelc. Se o modelo tiver extensão .mlmodel, ele não está compilado. Após a compilação no Xcode, o mlmodelc pronto está localizado na pasta DerivedData do aplicativo.
Não, não existe descompilação reversa. mlmodelc é um formato binário proprietário da Apple. O .mlmodel original é armazenado separadamente no controle de versão.
Sim, o mlmodelc suporta quantização INT8 através do Core ML Tools. Durante a compilação, os pesos são convertidos de FP32 para INT8, reduzindo o tamanho em quatro vezes e acelerando até 2x no ANE.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também