Skip to content
~/skunk $ cat health-change-point-detection.md

A Free 6.5GB Model Reproduced a Frontier Blind Read of My Health Data

2026-07-01LOCAL-LLMHEALTHBENCHMARK

Most of this series has been about documents. This one is about my own body, or at least the data trail it leaves behind.

A ring and a watch log the usual things all day: resting heart rate, HRV, sleep, steps, temperature. I pulled four months of it, one row per day, no labels. The question I wanted answered is the kind a good analyst is for. Where do the trends actually shift? Not the noisy day-to-day wobble, but the real change-points, the days a signal quietly starts behaving differently and keeps it up.

That's a genuinely hard reading task, and it's the sort of thing you'd normally hand to a frontier model in the cloud. Except this is health data. It's the most personal pile I own. So the whole point was to find out whether it could stay on my own machine and still get a frontier-grade read.

The setup

I took a blind analysis from a frontier model (Opus-class) as the answer key. Seven change-points across the four months, found with no hints. Then I gave the same unlabelled table to thirteen local models on the 10GB RTX 3080 and scored each one on how many of those seven it caught, how many it invented, and how fast it worked. A flagged date had to land within five days of a real shift to count as a hit.

Nothing left the box. The data stayed in a gitignored folder, the answers stayed gitignored, and the only thing that ever became public is the column of scores below.

The result

ModelArchitectureF1CaughtPrecisionTime
qwen3.5-9bplain, 6.5GB0.926 / 71.003s
gpt-oss-20bMoE reasoner0.926 / 71.0049s
qwen3.6-35b-a3bMoE reasoner0.917 / 70.8329s
gemma-4-12bplain0.836 / 70.808s
granite-4.1-30bdense0.735 / 70.7534s
gemma-4-e2btiny plain0.444 / 70.3611s
qwen-distill-v1dense reasoner0.000 / 7101s
deepseek-r1-8bdense reasoner0.000 / 7103s

The workhorse from the last post, qwen3.5-9b, did it again. A 6.5GB model reproduced the frontier's blind read: six of the seven change-points, not a single false alarm, in about three seconds, for the price of the electricity. Perfect precision means every date it flagged was a real one. It missed one of the seven, which is the kind of miss a careful human makes too.

A model small enough to sit on a two-year-old gaming card matched a frontier blind analysis of my health data, in three seconds, without the data ever leaving the house.

The twist: it's architecture, not size

Now look at the bottom of the table. Two models scored a flat zero. Not "a bit worse", zero. They caught none of the seven, and took over a hundred seconds each to get there.

Both are dense reasoning models. Give them a 119-row table and they think themselves into a corner, narrating their own analysis until they run out of budget without ever committing to an answer. Analysis-paralysis, measured.

Here's what makes it interesting. The two models tied for the top are also reasoners, but of the MoE kind (mixture of experts), and they thrive on the same task with thinking switched on. So it isn't reasoning that fails. It's dense reasoning on a small box. And size predicts almost nothing. A 6.5GB model ties a 20B and a 35B, while an 8B dense reasoner and a distilled one both flatline.

That's the same lesson as the main benchmark, sharpened to a point. There's no single best local model. There's a best model for the job, and this job rewards a particular shape of model rather than a particular size. Pick purely on parameter count and you might ship one of the zeros.

Why this is the one I care about

The document agent was about work. This is the same idea pointed at me. My health record is exactly the data I'd never paste into a cloud tool, and it's also the data where a good pattern-read would help most. Running that read on my own hardware, getting a frontier-grade answer, and having nothing leave the room is the whole balance this series has been circling.

It also keeps a human in the loop where it counts. The model finds the dates. It doesn't tell me what they mean, and it shouldn't. A shift in resting heart rate around a given week is a reason to go and look, not a diagnosis. The machine does the tedious part, the finding. I do the part that matters.

Takeaways

  • A 6.5GB local model reproduced a frontier blind change-point read of four months of my health data: 0.92 F1, perfect precision, 6 of 7, in about 3 seconds, at roughly $0, on-device.
  • Performance tracked architecture, not size. MoE reasoners topped the board, two dense reasoners scored zero on a long table, and a 6.5GB model tied 20B and 35B ones.
  • The data never left the machine. Only the scores are public. For health data, that's the entire reason to do it this way.

One honest caveat. The answer key here is one frontier model's blind read, not a clinician's. This measures whether a local model can match the frontier, not whether either of them is medically right. That's a different question, and a different day.

~/skunk $ tail -f updates.log

Stay in the loop

Occasional dispatches from the integration trenches. No spam.

‹ back to dispatches