Paul Visciano Blogs

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.

Close-up of a 14-inch MacBook Pro running Open WebUI with Bonsai-27B-Q1_0, hardware stats on a side panel: M2 Pro, 16 GB unified
Open WebUI on the glass. M2 Pro, 16 GB unified, 10-core CPU, 16-core GPU. This is the machine.

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.

  1. Idle. No models. 565 processes before a token is asked.
  2. Loaded, no inference. The resident cost.
  3. Text chat. The generate cost.
  4. 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.

Conversation mode pipeline: speak, Whisper transcribe, Bonsai-27B infer with system prompt, message, Kokoro TTS
Listening state in Open WebUI. Audio in at the mic, audio out from Kokoro, Bonsai in the middle with the system prompt attached.

The comparison

Same laptop, four states. First, the shape of it — where Memory Used lands in the 16 GB pool, state by state.

Memory used by state · 16 GB total

Idle no models · 565 processes 8.19 GB · 51% 8.19
Loaded Bonsai resident, no inference 11.27 GB · 70% 11.27
Text chat generating tokens 14.66 GB · 92% 14.66
Conversation Whisper + Bonsai + Kokoro 14.73 GB · 92% 14.73

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 same MacBook close-up with the four live memory states on screen: idle 8.19 GB, loaded 11.27 GB, text chat 14.66 GB, conversation 14.73 GB
Idle 8.19 · Loaded 11.27 · Text 14.66 · Conversation 14.73. Hugging Face’s 3.9 GB is the GGUF, not this desk.

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.

ProcessMemWhat it is
Activity Monitor86 MB · 170 MB realThe app in the screenshot.
Terminal68 MB · 142 MB realThe window running the commands.
Ollama40 MB · 137 MB realLeftover daemon. Zero models loaded. Not the stack.
expressvpnd21 MBVPN I installed. Not Apple.
http://127.0.0.1:49166/73 MB · 196 MB realA 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.

ProcessMemWhat it is
WindowServer246 MB · 23.5% GPUThe compositor. Every pixel on screen goes through this.
Finder34 MBThe file manager. Always on, even with no windows.
Dock + DockHelper26 MB + 17 MBThe icons at the bottom of the screen.
Control Center36 MBWi-Fi, Bluetooth, Focus. The menu you open twice a day.
Notification Center34 MBBanners. Running whether anything is notifying or not.
loginwindow18 MBThe session that started when you typed your password.

Voice you did not open

Hide Siri. These still run.

ProcessMemWhat it is
siriinferenced16 MBOn-device Siri model. Waiting for a phrase you are not saying.
sirttsd26 MBSiri text-to-speech. Waiting to talk.

Policy, drivers, keep-alive

The OS watching the OS.

ProcessMemWhat it is
launchd15 MBPID 1. Starts everything else. You cannot kill it.
syspolicyd34 MBGatekeeper. "Are you sure you want to open this?"
softwareupdated15 MB · 111 MB realChecks for macOS updates in the background.
DriverKit-AppleBCMWLAN30 MBThe Wi-Fi driver. A process now, not just a kext.
Accessibility17 MBVoiceOver / zoom plumbing. Runs even if you never turn them on.
WeatherWidget16 MBThe widget. Present whether you added it or not.
ServiceExtension31 MBA plugin host. Some app's helper, named like a virus.
VTDecoderXPCService19 MBHardware video decode. A helper for anyone playing a frame.
coreaudiod15 MB · 73 MB realCore Audio. Every beep, every mic. Always on.
iconservicesagent11 MB · 71 MB realThe icon cache. Finder and Dock thumbnails.
sharingd11 MB · 70 MB realAirDrop, Handoff, "sharing." Waiting for a nearby Mac.
duetexpertd11 MB · 66 MB realContinuity. Sidecar, Universal Clipboard. Named after the research, not the iPad app.
chronod12 MB · 66 MB realCalendar / time-sensitive events. A clock with opinions.
mobileassetd8 MB · 65 MB realDownloads Apple system assets. Fonts, dictionaries, Siri bits.
nsattributedstringagent10 MB · 66 MB realText layout helper. Apple uses it everywhere you see styled text.
TextInputMenuAgent14 MB · 60 MB realThe input-source menu. Flags, keyboards, the 中 character.
homed10 MB · 55 MB realHomeKit. Your house, as a daemon.
Most of these live in /System. You cannot uninstall WindowServer. You can hide Siri and 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?

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.

8.19 GB gone at idle. Half the machine taxed before a single useful byte. Every 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.

More from Sci-Fi Labs

Jailbreaking Your Laptop, Part 1: Take Over the Machine → Omarchy — A glimpse into the future → Local AI + RAG: the Full Stack in 16 GB → Local TTS on 16 GB →

Click or Esc to close