Apple platforms have three machine learning frameworks from Apple itself: Core ML, Create ML, and MLX. Each targets a different job.
Choosing the wrong one leads to unnecessary work. Converting a model to Core ML when MLX would work, or using MLX for a model that should be a static Core ML asset, both cost time and performance.
This guide compares the three frameworks across training, deployment, performance, and developer experience, with concrete advice for choosing.
Core ML is Appleβs production inference framework. Core ML Tools converts models from libraries such as PyTorch and TensorFlow into Core ML models. Core ML then runs them with hardware-specific optimizations.
flowchart LR
PyTorch --> coremltools
TensorFlow --> coremltools
coremltools --> mlpackage
mlpackage --> Xcode
Xcode --> AppThe conversion step (coremltools in Python) is where friction lives. Not every operation in a source model has a Core ML equivalent. Unsupported operations may require changing the model, using a supported composite operation, or adding a custom operation.
Create ML is Appleβs no-code/low-code training tool. It ships with Xcode and provides a drag-and-drop interface plus a Swift API for training common model types.
The Xcode UI presents a step-by-step wizard: pick a task type, point to your data, configure training parameters, and click Train. The output is a Core ML model ready to drag into your app.
// The Swift API for the same task
import CreateML
let data = try MLImageClassifier.DataSource
.labeledDirectories(at: URL(filePath: "/path/to/images"))
let model = try MLImageClassifier(trainingData: data)
try model.write(to: URL(filePath: "/path/to/output.mlpackage"))MLX is Appleβs array framework for ML, designed for Apple silicon. It is the newest of the three (open-sourced late 2023) and takes a fundamentally different approach: you work directly with array operations instead of converting models to Core ML first.
import MLX
import MLXLLM
import MLXLMCommon
import MLXHuggingFace
import HuggingFace
import Tokenizers
let model = try await #huggingFaceLoadModelContainer(
configuration: LLMRegistry.gemma3_1B_qat_4bit
)
let session = ChatSession(model)
print(try await session.respond(to: "What is the capital of Vietnam?"))With the Hugging Face integration, the model downloads, loads into memory, and runs without a Core ML conversion step.
| Core ML | Create ML | MLX | |
|---|---|---|---|
| Purpose | Deployment | Training (simple) | Research & dynamic inference |
| Training | On-device updates for prepared models | Yes (limited) | Yes (full autodiff) |
| Inference | Optimized Core ML model | N/A | Flexible, lazy execution |
| Neural Engine | Yes | N/A | No |
| GPU | Yes | N/A | Yes |
| CPU | Yes | N/A | Yes |
| Model protection | Built-in | N/A | None |
| Conversion needed | Yes (from PyTorch etc.) | No (outputs .mlpackage) | No (loads weights directly) |
| Best for | Shipped models | Quick prototypes | LLMs, custom models |
| Swift API | Yes (VNCoreMLModel) | Yes (CreateML) | Yes (MLX Swift) |
| Python API | coremltools | No | Yes (mlx) |
Does your model need to run on the Neural Engine?
βββ YES β Use Core ML
βββ NO β Does Create ML support your training task?
βββ YES β Use Create ML to train, then ship the Core ML model
βββ NO β Do you need a flexible research or training workflow?
βββ YES β Use MLX
βββ NO β Benchmark Core ML and MLX for your model| Use case | Recommendation |
|---|---|
| Image classifier shipped with app | Create ML β Core ML |
| LLM chat app | Benchmark Core ML and MLX |
| Real-time video processing | Core ML |
| On-device model personalization | Core ML for updatable models; MLX for general fine-tuning |
| Prototype a classifier quickly | Create ML |
| Run a Hugging Face model on Mac | MLX |
| Production app with static model | Core ML |
| Research / experiment with custom architectures | MLX |
| Model needs Neural Engine | Core ML |
The frameworks are not mutually exclusive. Core ML supports on-device updates for models prepared as updatable, while MLX supports broader training workflows. A common pattern:
Or:
Both frameworks can coexist in the same app. MLX handles the flexible model workflow, while Core ML handles optimized deployment where it is a better fit.