induwara.lk
Opinionlocal-llmquantizationself-hosting

Your local LLM isn't dumb. Your inference stack is.

A Level1Techs writeup captured raw logits across attention kernels, quants and tensor-parallel settings. The same model gave different answers. What that means if you self-host on a budget.

Induwara Ashinsana5 min read
Forum thread header for a technical post about local LLM inference quality and quantization
Image: Level1Techs Forums

If your local LLM feels dumber than the benchmark charts promised, the model file is probably fine and the stack around it probably isn't. That's the argument in Why your local LLM feels dumber than it is on the Level1Techs forum, and it's the most useful thing I've read on self-hosting this month.

The author didn't run a vibes test. They captured raw logits and counted how often the top-ranked token changed when only the plumbing changed. It changed a lot.


🔍 The experiment is the point, not the conclusion

Most "is Q4 good enough?" arguments end in perplexity scores nobody can feel. This post did something harder: it ran real long-context tool-calling work (network automation transcripts in the 96k–100k token range) and captured full BF16 logits every 32 prompt tokens as a reference, then diffed against them.

The unit of measurement is the top-1 token flip — how often the highest-probability next token differs from the reference run. Flip one token in a tool call and the whole call is wrong, silently.

The post's sharpest example: a single flip caused the model to target Cisco interface GigabitEthernet0/1/4 instead of GigabitEthernet0/0/1.201, then run show run where it should have run show mac address table. Not a "worse" answer. A wrong one, confidently formatted.

That's the failure mode nobody catches with a chat window. You catch it when your agent has been quietly editing the wrong config for a week.


📊 Every layer below the weights moves the output

Four separate layers each caused divergence, and none of them are things you normally think of as "the model":

Layer changed What the post found
Attention backend (FlashAttention 2 / Flash Inference / Triton) Same weights, same prompt, different top-1 flips — clustered at specific prompt positions, not spread evenly
KV cache quant (weights left at BF16) INT8 broke tool calls but recovered; INT4 did not recover
Weight quant INT8 W8A16 held up best; NVFP4 was worst at roughly 50% token flips at 88k context; NVFP4 and AWQ both failed to close tool calls and botched command syntax
Tensor parallelism TP1 gave a good tool call, TP2 failed, TP4 succeeded again

That TP result is the one I'd pin above my desk. Same model, same quant, same prompt. The only variable was how many GPUs the tensors were split across, and correctness flipped, then flipped back.

The author also points out that a nightly vLLM container image carried 734 packages, each with its own bugs. When people say "I'm running Qwen locally," they're running Qwen plus 734 other decisions.

Key takeaway: "The model" is not a file you downloaded. It's the file times the runtime times the attention kernel times the quant times the sampler. Change any factor and you are, for practical purposes, running a different model.


⚡ Why this bites harder on a Sri Lankan budget

Here's the local angle. When VRAM costs what it costs here, and you're building on a single consumer card or a rented hourly GPU, your instinct is to take the smallest quant that fits and call it a win. I've done exactly this.

The post's evidence says that instinct is fine for chat and dangerous for anything agentic:

  • Chat degrades gracefully. Slightly flatter prose, slightly worse recall. You'd barely notice.
  • Tool calling degrades catastrophically. An unclosed JSON block or a mangled argument isn't 5% worse, it's 100% broken.
  • Long context amplifies both. The worst divergence numbers in the post show up at 88k+ context, not at 2k.

So the cost calculus isn't "how much quality can I afford to lose." It's "which of my workloads can survive lossy inference at all." A summariser on Q4 is fine. An agent that touches your database on Q4 is a liability.

If you're sizing this out before you spend money, our LLM VRAM calculator and GGUF quantization size calculator will tell you what actually fits, and the quantization method comparison covers how GGUF, GPTQ and AWQ differ before you commit to a download over a metered connection.


🛠️ What I'd actually change on Monday

You don't need an RTX PRO 6000 to act on this. You need to stop evaluating models the way you currently do.

  1. Build a golden set from your real work. Ten to twenty prompts pulled from your actual pipeline, with known-correct outputs. Not MMLU questions. The post's whole method rests on this: "Nobody could have benchmaxed for this." Your workload is unbenchmarkable by definition, which is exactly what makes it a good test.
  2. Change one variable at a time. Runtime, then quant, then KV cache, then sampler. If you swap three at once you learn nothing.
  3. Leave the KV cache alone first. It's the cheapest-looking memory saving and, per the post, INT4 KV cache was an unrecoverable failure while weight quantization at INT8 was mostly fine. Quantize weights before you quantize cache.
  4. Check your sampler against the model card. The post notes temp 1.0, top-p 0.95 as typical for the models tested, and warns that "setting temp too low is why your qwen is sitting there looping." Many of us default to temp 0.1 for "determinism" and then blame the model for repeating itself.
  5. Pin your runtime version. If 734 packages can move your output, an unpinned nightly is not a reproducible system.

Pick the runtime deliberately, not by whichever install script you found first: Ollama vs LM Studio vs llama.cpp vs vLLM lays out the tradeoffs, and the Modelfile generator pins your sampler settings into a file instead of leaving them to defaults.


💡 The uncensored fine-tune finding deserves its own warning

Buried in the post is a result I haven't seen quantified elsewhere. Four popular "uncensored" community fine-tunes were measured against the stock model. The spread was wide: one held at 0.717% top-1 flips, another hit 5.831% and corrupted operational output, turning a word into a hyphen inside a hostname and breaking a PostgreSQL port specification.

Abliteration and "uncensoring" are not free. They're a modification to the weights, and the post's numbers show some of them damage instruction-following and formatting well beyond the refusal behaviour they targeted.

If you grabbed an uncensored variant because a Reddit thread said it was better, you took a quality hit you never measured. That's a fair trade if you made it on purpose. Most people didn't.


What this means for you

Nothing here says don't self-host. I'd still argue local inference is the right call for a lot of Sri Lankan teams: no per-token bill in dollars, no data leaving the building, no rate limits.

What it says is that the honest version of self-hosting includes an evaluation harness. If you can't answer "what would I notice if my stack got 3% worse tomorrow," you're not running a system, you're running a demo that happens to work.

Start small. Twenty prompts, one spreadsheet, one variable at a time. That's a weekend, and it's the difference between an LLM you trust with real work and one you're constantly, vaguely disappointed by.

#local-llm#quantization#self-hosting
IA

Induwara Ashinsana

Information Systems student at UCSC and Executive Director at Ryzera Technologies. Writes about software, AI, and what it means for builders in Sri Lanka.

About the author →

Keep reading