Sci-Fi Labs · Field notes
Running Local AI on 16 GB Mac
A 27B model, Whisper, Brave, and a coding session on one 16 GB M2 Pro. Conversation mode: 14.73 GB used, pressure green. Local AI does not mean you stop using the laptop.
The goal
Talk to a local AI on my 16 GB Mac while still being able to use it. Not a benchmark rig, not a lab machine — the laptop I browse and code on every day. Everything in this post is measured against that one bar: can I hold a conversation with a 27B model and keep the laptop a laptop?
Same laptop as the last write-up, new question. Before, I asked how much RAM the RAG stack needs. This time: what is the machine actually doing while you use it? These screenshots are the answer — the laptop, live, with local AI running on it.
Worth saying plainly: 16 GB is not a corner case. It is the laptop most people own. The base M-series MacBook, the default ThinkPad and XPS configs, the mid-range machine on a student’s desk — 16 GB of unified or shared memory is what shipped, and what people are still using to do real work. When someone says local AI “needs 32 GB minimum,” they are telling the majority of laptop owners to buy a new machine before they try anything. This post is the counterexample: the machine you already have can run a 27B model and still be a laptop.
- Idle. No models. 565 processes before a token is asked.
- Loaded, no inference. The resident cost.
- Text chat. The generate cost.
- Conversation mode. Whisper in, model generating, daily use still running.
Those four states ran on one stack: Open WebUI in the browser, llama.cpp serving Bonsai, Whisper in, Kokoro out. No Knowledge Graph. No LightRAG. No Docker, no embeddings server, no second llama slot. If you read the previous 16 GB budget, forget its process list — that was the older setup: Postgres, LightRAG, two model slots, Whisper as its own server. Different stack, different swap. Do not mix the two.
One more thing before the numbers: do not trust the model card. Hugging Face leads with a 3.9 GB deployed footprint. That is the GGUF file, and only the file — not KV cache, not activations, not macOS, not the browser you keep open while you work. Every number from here on came off this machine, live.
Conversation mode
The audio never leaves the machine. Whisper, running in Open WebUI’s Python process, turns speech into a transcript. That transcript is not sent as-is: the UI prepends the system prompt — persona, rules, whatever you set — then llama-server runs Bonsai-27B on it. The reply text comes back into the browser. Kokoro, running on the server, turns it into audio and the browser plays it. Five hops, all local. Text chat skips Whisper and Kokoro.
What each hop costs. Whisper is the reason python3.12 reads 1.12 GB real in the capture: the faster-whisper model is loaded into Open WebUI’s Python process and stays resident between turns, so you pay it once per session, not once per sentence. Kokoro runs on the server alongside it, so its cost lands in the Python process column, not the browser’s. The generation hop is the same Bonsai inference as text chat — the only addition is the audio path, which is why conversation mode (14.73 GB) sits within 100 MB of text chat (14.66 GB). Voice does not double the bill; it rides the same model.
The comparison
Same laptop, four states. First, the shape of it — where Memory Used lands in the 16 GB pool, state by state.
Two jumps, one plateau. Loading Bonsai costs about 3 GB of Memory Used. The first generation costs another 3.4 — mostly wired, the memory that actually does the work. Conversation mode adds almost nothing on top. The machine never crosses into the red.
The chart is the summary; these are the receipts. Each card is a full Activity Monitor capture from that state — swap, wired, compressed, pressure, and the process on top. Scroll through, then read what the numbers are doing below.
The original Activity Monitor captures:
Loading the model does not wire it. Compressed goes 85.5 MB → 3.82 GB, swap appears (2.68 GB), Memory Used 8.19 → 11.27 GB, pressure still green. Generating is the jump: wired 1.71 → 9.43 GB. That jump is not the model getting bigger — it is the memory that only exists once tokens flow: the KV cache (every token of context the model has to remember) and the Metal command buffers and scratch memory the GPU driver pins for compute. Loaded but idle, Bonsai is a file mapped into memory. First generation, the working set gets wired down and stays resident as long as the slot is warm.
Two readings that look like typos and are not. One: swap exists at all — 2.68 GB with pressure green. macOS compresses and swaps proactively, long before the machine is in trouble; it treats SSD as a pressure valve, not a last resort. Swap on this box means “the OS is making room,” not “the OS is failing.” Two: swap drops from 3.11 GB (text chat) to 2.76 GB (conversation). The states are not cumulative screenshots — each was captured in its own moment, and the OS reclaims and re-pages between them. Conversation mode came later in the session, with slightly more of the working set back in physical memory. Read the trend, not the delta.
Conversation mode barely moves the footer (14.66 → 14.73). Whisper shows up as python3.12 real memory, not another 8 GB of GPU. Brave and a coding session stay in the list the whole time.
The true story of a Mac
MacBook Pro 14" (Mac14,9). Apple M2 Pro. 10-core CPU, 6 performance plus 4 efficiency. 16-core GPU, Metal 4. 16 GB unified memory. There is no separate VRAM. CPU, GPU, OS, and models share one pool. Every byte a model takes is a byte the browser is not using.
Idle, no models, this laptop is already running 565 processes. Most people can name Finder, Safari, maybe Activity Monitor. They cannot name mds_stores, sharingd, duetexpertd, siriinferenced, homed. Almost all of them shipped in /System. You did not install them. You cannot uninstall most of them. That is the machine Apple does not put on the box.
The pie is Memory Used at idle, 8.19 GB. Cached files (6.37 GB) sit outside it. Apps you opened are 9%. The rest is the OS.
Memory used at idle · 8.19 GB
- Search / Spotlight familymds, mds_stores, Spotlight, corespotlightd, mediaanalysisd1.56 GB · 19%
- AppsTerminal, Activity Monitor, Ollama, VPN, a local webview0.71 GB · 9%
- The desktopWindowServer, Finder, Dock, Control Center, Notification Center0.47 GB · 6%
- Apple daemonsGatekeeper, updates, Siri, HomeKit, AirDrop, audio, widgets1.11 GB · 14%
- Wired + compressed1.44 GB wired · 85.5 MB compressed · from the footer1.53 GB · 19%
- The other ~530 processesLaunchAgents and XPC helpers not in the screenshot2.81 GB · 34%
1.56 + 0.71 + 0.47 + 1.11 + 1.53 + 2.81 = 8.19 GB. Cached files 6.37 GB sit outside this pie. Physical memory 16.00 GB. Swap 0 bytes.
Apps
The 9% slice. Terminal, Activity Monitor, a leftover Ollama daemon, a VPN. Not the tax.
| Process | Mem | What it is |
|---|---|---|
| Activity Monitor | 86 MB · 170 MB real | The app in the screenshot. |
| Terminal | 68 MB · 142 MB real | The window running the commands. |
| Ollama | 40 MB · 137 MB real | Leftover daemon. Zero models loaded. Not the stack. |
expressvpnd | 21 MB | VPN I installed. Not Apple. |
http://127.0.0.1:49166/ | 73 MB · 196 MB real | A local webview some app opened. Not Apple. Not the stack. |
The desktop — you cannot uninstall this
Comes with the OS. This is how a window appears on a Mac.
| Process | Mem | What it is |
|---|---|---|
| WindowServer | 246 MB · 23.5% GPU | The compositor. Every pixel on screen goes through this. |
| Finder | 34 MB | The file manager. Always on, even with no windows. |
| Dock + DockHelper | 26 MB + 17 MB | The icons at the bottom of the screen. |
| Control Center | 36 MB | Wi-Fi, Bluetooth, Focus. The menu you open twice a day. |
| Notification Center | 34 MB | Banners. Running whether anything is notifying or not. |
loginwindow | 18 MB | The session that started when you typed your password. |
Search — Apple indexes everything
Spotlight is not one process. It is a small company living on the disk.
| Process | Mem | What it is |
|---|---|---|
mds | 37 MB | Metadata server. The Spotlight brain. |
mds_stores | 142 MB · 910 MB real | The actual index. Still chewing from the boot reindex. |
| Spotlight | 123 MB | The magnifying glass. The UI. |
corespotlightd | 16 MB | In-app search. Mail, Messages, every bundle that opted in. |
mediaanalysisd | 39 MB · 215 MB real | Scans photos and video for objects, scenes, faces. You did not ask. |
Voice you did not open
Hide Siri. These still run.
| Process | Mem | What it is |
|---|---|---|
siriinferenced | 16 MB | On-device Siri model. Waiting for a phrase you are not saying. |
sirttsd | 26 MB | Siri text-to-speech. Waiting to talk. |
Policy, drivers, keep-alive
The OS watching the OS.
| Process | Mem | What it is |
|---|---|---|
launchd | 15 MB | PID 1. Starts everything else. You cannot kill it. |
syspolicyd | 34 MB | Gatekeeper. "Are you sure you want to open this?" |
softwareupdated | 15 MB · 111 MB real | Checks for macOS updates in the background. |
| DriverKit-AppleBCMWLAN | 30 MB | The Wi-Fi driver. A process now, not just a kext. |
| Accessibility | 17 MB | VoiceOver / zoom plumbing. Runs even if you never turn them on. |
| WeatherWidget | 16 MB | The widget. Present whether you added it or not. |
| ServiceExtension | 31 MB | A plugin host. Some app's helper, named like a virus. |
| VTDecoderXPCService | 19 MB | Hardware video decode. A helper for anyone playing a frame. |
coreaudiod | 15 MB · 73 MB real | Core Audio. Every beep, every mic. Always on. |
iconservicesagent | 11 MB · 71 MB real | The icon cache. Finder and Dock thumbnails. |
sharingd | 11 MB · 70 MB real | AirDrop, Handoff, "sharing." Waiting for a nearby Mac. |
duetexpertd | 11 MB · 66 MB real | Continuity. Sidecar, Universal Clipboard. Named after the research, not the iPad app. |
chronod | 12 MB · 66 MB real | Calendar / time-sensitive events. A clock with opinions. |
mobileassetd | 8 MB · 65 MB real | Downloads Apple system assets. Fonts, dictionaries, Siri bits. |
nsattributedstringagent | 10 MB · 66 MB real | Text layout helper. Apple uses it everywhere you see styled text. |
| TextInputMenuAgent | 14 MB · 60 MB real | The input-source menu. Flags, keyboards, the 中 character. |
homed | 10 MB · 55 MB real | HomeKit. Your house, as a daemon. |
siriinferenced still runs. That is not a bug. That is the product.Load average 16.6 on a 10-core machine reads like a laptop on fire. It is not. The consumers are mds and five mdworker_shared processes — Spotlight, reindexing after boot. The load will drop. The process count will not. Spotlight will finish. siriinferenced will not leave. That is a Mac at rest.
That is also the case for Omarchy: a machine that runs what you named, not hundreds of LaunchAgents you have never heard of. Fewer processes. Less RAM gone before you open anything. I have not measured Omarchy on this desk. 565 names at idle is why the bet exists.
Look at the four photos. Brave is open. A coding session is in the list. Spotlight never left. Conversation mode at 14.73 GB used of 16, pressure green. You can run local AI on a 16 GB laptop and still use it for daily browsing and coding. VS Code was not in these photos. I will not invent it. The headroom is there.
Measure before you trust. Own the numbers, not the model card.
The case against the OS
Read the whole capture again with one question in mind: who decided what runs on your machine?
- 565 processes before you open a single app.
- Spotlight indexing whether you asked or not.
siriinferencedholding an on-device model in memory, waiting for a phrase you are not saying.mediaanalysisdscanning your photos for faces you did not ask it to find.- None of it uninstallable. Hide Siri and the daemon still runs.
That is not a bug — Apple told you so in the settings panel. It is the product.
Local AI still delivered, despite all of that. A 27B model, speech in, speech out, running alongside the browser and an editor — on a machine that had already given up half its RAM before you opened anything. On 16 GB, that tax is not a rounding error. It is the difference between a model that fits and one that does not.
mdworker_shared reindexing your disk is memory your model is not using — compressed, swapped, competing for the same pool.macOS is beautiful hardware wrapped in an OS that assumes it owns the machine. You bought the laptop; the software treats you as a guest on it. The alternative is not “switch and lose everything” — the Jailbreaking Your Laptop series is the walkthrough. 565 processes at idle is the evidence. How many does a machine run that only starts what you need? Omarchy on the same laptop — coming soon.
Start where the series starts. This is why you should Take Over the Machine.



