"A model is loaded when its pages are wired. Everything before that is a promise."
Three States of the Same Bytes
A checkpoint on disk is a safetensors file: a JSON header naming every tensor and its byte range, then the raw bytes. Loading it on a Mac is not a copy into a different memory — there is no different memory — but it is three distinct states, and watching them is the clearest way to see unified memory from the kernel's side. Mapped: MLX memory-maps the file, so the tensors exist as addresses without any bytes having moved; if the file is in the page cache (a warm load) those addresses already point at pages in the pool. Touched: the first forward pass reads every weight, faulting in any page not yet resident — from the page cache in nanoseconds, from the SSD in the memory track's cliff-sized time if cold. Wired: pages the GPU is using are pinned so the kernel cannot evict them; this is the memory the recommended working set is talking about, and vm_stat reports it directly.
Measured on office
The code block snapshots vm_stat before loading the 27B, after load(), and after the first forward pass (a warm load; the file was in the page cache):
| Moment | Wired | Active | Free | What happened | Evidence |
|---|---|---|---|---|---|
| before | 29.28 GiB | 199.50 GiB | 79.51 GiB | the machine's normal state: engines, caches, everything else | measured, office, 2026-09-15 |
| after load() — 3.71 s | 27.02 GiB | 213.25 GiB | 52.91 GiB | mapped: the file's pages counted as active, nothing wired for the GPU yet | measured |
| after first forward — 1.27 s | 43.41 GiB | 198.31 GiB | 51.60 GiB | touched and wired: +16.4 GiB wired, the model's 14.1 GiB (MLX's own count) plus working buffers | measured |
Read the wired column: it barely moves at load() (it dips by two gigabytes, something else being released) and jumps by the model's size at the first forward. That is lazy loading made visible — MLX's load returns in under four seconds because it has promised the bytes, not read them; the first token pays for the reading. It is also why the lab script runs a warm-up generation before timing anything, and why a model's "load time" in any runtime is really two numbers.
Cold Loads, and What the Pool Does Not Save You From
Nothing above touched the SSD, because office had read the file earlier in the day and 512 GB of memory keeps a lot of page cache. A cold load is the same three states with a disk read in the middle: 16 GB at the Air's measured 2.85 GB/s is about six seconds, and at a Studio's SSD a couple. Unified memory removes the copy from host memory to device memory; it does not remove the read from disk to memory, and it does not make the wired pages free — they are the pages the memory track's swap cliff is about, and the GPU track's claimant discipline is about leaving enough of the pool unwired for everyone else.