Pixel-art RX 7900 XTX running small local language models within a 24 GB VRAM limit

When Qwen3.8-27B arrived, I thought the next step would be simple: install the new model, confirm the generational leap, and delete the old weights.

My Ollama library had become a small museum. There were Qwen3 models in several sizes and quantizations, Qwen3.5, Qwen3.6, two Gemma 4 models, GPT-OSS, specialist coding models, and a few experiments that had earned permanent residency by being interesting once. Newer models were clearly getting better at reasoning and agentic work. Surely the oldest files were now just taking up space.

That was the theory.

The audit turned into something else. The newest model was often the smartest, but not always the most useful. The model with the highest generation rate did not always finish first. A 4B model handled the factual test cleanly but spent more than 2,500 tokens thinking. A 12B model answered that the Earth-Moon barycenter was 1.7 metres from Earth’s centre. Another model produced a correct-looking answer containing a conversion that was wrong by roughly 285 times.

The useful question stopped being, “Which model wins?”

It became: which model earns a role on this particular machine?

The machine is part of the benchmark

This is the same homelab behind my earlier notes on running Qwen in production and benchmarking local models for n8n.

ComponentMy setup
GPUAMD Radeon RX 7900 XTX, 24 GB VRAM
CPUAMD Ryzen 9 7950X3D
RAM64 GB DDR5
RuntimeOllama 0.33.1 with ROCm
Main workloadn8n email sorting, extraction, classification, summaries, and tool use
Awkward workload60K to 120K coding-agent contexts

That last row controls most of the story. A model can advertise a huge context window and still be a poor fit for my system. Qwen3.8-27B officially supports 262,144 tokens natively, but its weights already occupy roughly 17 GB in my Ollama installation. The remaining VRAM must hold the , runtime overhead, and everything else needed to do actual work.

The context window on the box is therefore not the number printed on the model card. It is the amount of context I can use before latency, memory pressure, or CPU offload turns an automation into a waiting room.

THE MEMORY BUDGET
Qwen3.8 weights · 17
0 GB24 GB VRAM

Two tests, two different questions

I used two test paths, and their numbers should not be mixed.

The first was a non-thinking OpenWebUI run that resembled my everyday n8n workload. It recorded total duration, time to first byte, output length, generation rate, estimated input tokens, context bucket, and GPU utilisation. Every model completed successfully with zero retries.

The second was a thinking-mode Ollama CLI run with the same five short questions about the Moon. Ollama’s --verbose output recorded the exact prompt and generation counts, rates, and wall-clock time. That run measured both reasoning efficiency and whether the final answer was actually correct.

These are field tests, not a scientific leaderboard. Chat templates differed. The visible prompt was the same in the CLI test, but prompt token counts still ranged from 87 to 144. OpenWebUI also estimated input length rather than reporting Ollama’s exact prompt count. The results describe my stack and my workload, not a universal ranking.

The non-thinking n8n-style run

ModelDurationFirst byteOutputRateEstimated inputContext bucketGPU util.
Qwen3.5 4B4.92 s3.25 s187 tokens38.0 tok/s5,03311,26448%
Qwen3.5 9B6.27 s3.94 s191 tokens30.5 tok/s5,61211,26448%
Gemma 4 12B QAT9.75 s7.41 s140 tokens14.4 tok/s4,37110,24047%
Gemma 4 26B-A4B QAT10.98 s9.77 s107 tokens9.7 tok/s4,72410,24046%
Qwen3.8 27B IQ4_XS19.88 s13.97 s204 tokens10.3 tok/s4,87111,26448%
Qwen3.8 27B Q4_K_M22.26 s15.56 s260 tokens11.7 tok/s5,69311,26449%

The small models did exactly what I needed them to do. Qwen3.5-4B returned first, and 9B followed only 1.35 seconds later. The 27B models produced more tokens per second than their total durations might suggest, but most of the wait happened before the first byte arrived. For a queue of email classifications, that startup and prompt-processing delay matters more than peak generation speed.

The Qwen3.8 IQ4_XS build also finished sooner than Q4_K_M in this run, despite generating slightly slower. It had fewer estimated input tokens and produced 56 fewer output tokens, so this is not proof that IQ4_XS is inherently faster. It is evidence that total work, not one throughput number, decides when the answer arrives.

The thinking run exposed a different hierarchy

ModelTotal timeGeneratedEval ratePromptPrompt eval rate
GPT-OSS 20B4.27 s525 tokens131.52 tok/s142 tokens540.65 tok/s
Gemma 4 26B-A4B QAT9.60 s878 tokens93.50 tok/s99 tokens487.76 tok/s
Qwen3 8B11.27 s1,040 tokens93.28 tok/s87 tokens777.91 tok/s
Gemma 4 12B QAT12.91 s798 tokens62.37 tok/s99 tokens910.61 tok/s
Qwen3.5 9B15.61 s1,279 tokens82.44 tok/s92 tokens1,027.65 tok/s
Qwen3.8 27B IQ4_XS21.74 s746 tokens35.56 tok/s144 tokens592.09 tok/s
Granite 4.2 8B21.98 s1,852 tokens84.65 tok/s100 tokens1,059.83 tok/s
Qwen3.5 4B22.84 s2,597 tokens114.12 tok/s92 tokens1,193.50 tok/s

Thinking-run chart comparing evaluation rate with wall-clock time and generated tokens for each local model

Qwen3.5-4B is the clearest warning against reading only the eval-rate column. At 114.12 tokens per second it looked very fast, but it generated 2,597 thinking tokens before answering. GPT-OSS generated only 525 and finished the entire run in 4.27 seconds.

SPEED IS MORE THAN TOKENS PER SECOND
Qwen3.5 4B
22.84 s
2,597 generated tokens at 114.12 tok/s.
GPT-OSS 20B
4.27 s
525 generated tokens at 131.52 tok/s.

Granite and Qwen3.5-9B reveal the same effect. Their raw generation rates were close, 84.65 versus 82.44 tokens per second, but Granite generated 573 more tokens. The result was 21.98 seconds for Granite and 15.61 for Qwen3.5-9B.

For automation, the user does not receive tokens per second. The user receives an answer after a delay. Generation rate measures token production after prompt processing has begun. The wall-clock wait can also include model loading, cache warm-up, prompt evaluation, and however many tokens the model chooses to generate. An unattended workflow also pays for every unnecessary thought before that answer.

Correct answers were not evenly distributed

The Moon prompt was deliberately simple:

  1. Compare the Moon’s diameter with Earth’s.
  2. Give the Earth-Moon barycenter distance from Earth’s centre.
  3. Give the Moon’s orbital period.
  4. Explain whether tides come only from pulling on the near side.
  5. Say whether the Moon is moving towards or away from Earth.

The expected barycenter answer was about 4,670 km from Earth’s centre. That one number became surprisingly useful.

ModelWhat happened in the thinking run
Qwen3.8 27B IQ4_XSAnswered all five correctly and distinguished the 27.32-day sidereal orbit from the 29.53-day phase cycle.
Qwen3.5 9BAnswered all five correctly, including about 4,671 km and the 3.8 cm/year recession.
Qwen3.5 4BAnswered all five correctly, but used 2,597 thinking tokens to get there.
GPT-OSS 20BAnswered all five correctly in the shortest wall-clock time.
Qwen3 8BAnswered all five correctly, with a concise final response after a longer trace.
Gemma 4 26B-A4B QATGave about 4,400 km for the barycenter, lower than the usual mean but in the right physical scale.
Gemma 4 12B QATSaid the barycenter was 1.7 metres from Earth’s centre. The correct scale is thousands of kilometres.
Granite 4.2 8BIts final thinking answer used roughly 4,500 km after its own trace calculated about 4,684 km. Its non-thinking answer later added a severely wrong Earth-radius conversion.

The Gemma 4 12B mistake is easy to miss when scanning a clean numbered answer. It knew that the barycenter lies inside Earth, but its final value was not a small rounding error. The rest of its answer was sensible. That combination is exactly why the content still needs checking even when the model finishes successfully.

The old model that refused to retire

I had almost stopped using GPT-OSS-20B. Newer Qwen models are better at the kind of reliable tool use I care about, and tool calling from the GPT-OSS era could be hit or miss.

Then GPT-OSS produced 131.52 tokens per second, generated only 525 thinking tokens, answered the five questions correctly, and finished in 4.27 seconds.

That changed its job description. GPT-OSS is no longer my trusted tool orchestrator, but it is an excellent high-speed heavyweight for work that does not need to choose tools: long summaries, transformations, extraction, and reasoning over already-clean input. Its age matters less when it still clears a real queue faster than newer models.

The mistake would have been asking one model to be good at everything. GPT-OSS survived because the audit gave it a narrower role.

The 26B model that outran the 12B model

Gemma 4 delivered the stranger result.

My gemma4:12b-it-qat managed 62.37 tokens per second in the thinking run. The much larger gemma4:26b-a4b-it-qat reached 93.50 and finished 3.31 seconds sooner.

That sounds backwards until the architecture enters the story. Gemma 4 26B-A4B is a mixture-of-experts model: many parameters live in the model, but only a smaller subset is active for each token. On my GPU, it behaved like the architecture promised. It was both the more capable model and the faster generator.

Its resident weights still matter. A 15 GB model leaves less context headroom than a 7.2 GB one, so the 12B has not become physically useless. The non-thinking run also put the 12B slightly ahead in wall-clock time. Yet its barycenter error was the most serious miss in the raw thinking test, so I cannot call it the safer reasoning model on this evidence.

For short and medium deep-reasoning jobs, the 26B-A4B remains the more interesting choice. The 12B survives mainly as a context-friendly alternative and a second model family, not as the automatic middle tier.

The same result effectively retired Qwen3-8B. It generated at almost exactly the same rate as Gemma 4 26B-A4B, while Gemma finished sooner and gave me the more useful model. Two similar clocks, one clearer role.

Qwen3.8 is the best model I cannot use everywhere

The quality jump from Qwen3.6-27B to Qwen3.8-27B is real in my testing. Tool use, planning, and difficult agentic work feel substantially better. The official Qwen model card describes the same priorities: stronger long-horizon execution, better handling of environmental feedback, and flexible thinking control.

But the Q4 model occupies the large-model end of the card. In the non-thinking run it took 22.26 seconds, including 15.56 seconds before the first byte. It is an escalation model, not the engine for every incoming email.

I also tested an IQ4_XS quant. It reduced the model footprint by around 2 GB, which is valuable because those gigabytes can become KV cache. In the CLI thinking run it generated at 35.56 tokens per second. In the OpenWebUI run it completed in 19.88 seconds, compared with 22.26 seconds for Q4_K_M, but the two requests did not contain or produce the same number of tokens.

The two builds now have separate jobs:

  • Q4_K_M: normal Qwen3.8 work when the context fits comfortably.
  • IQ4_XS: Qwen3.8 work where extra context headroom is worth the quantization tradeoff.

Neither replaces Qwen3.5-4B or 9B. A smarter 27B model that crowds out the context needed for a 60K-token email is not an upgrade for that email.

Then Granite got the Moon wrong

Granite 4.2-8B looked like the candidate I had been waiting for: a current, agent-focused model in roughly the same operational class as Qwen3.5-9B. IBM positions Granite 4.2 around reasoning, tool use, coding, and multi-step enterprise workflows.

The speed was excellent. In thinking mode it generated 1,852 tokens at 84.65 tokens per second and finished in 21.98 seconds. Qwen3.5-9B ran at a similar 82.44 tokens per second, but needed only 1,279 tokens and 15.61 seconds.

Then I read the answer.

The test included the same simple questions about the Moon. In its thinking trace, Granite calculated the barycenter at about 4,684 km. Its final answer rounded that down to about 4,500 km, which was rough but still in the right area. The more serious error appeared in the non-thinking answer: it correctly stated about 4,670 km and then called that 0.00257 Earth radii.

It is approximately 0.73 Earth radii.

The main fact looked right. The helpful extra conversion was nonsense. The thinking trace also described its 4,500 km result as “about 1.8 Earth radii inside Earth,” another impossible relationship.

This was more revealing than a wrong trivia answer. It showed a dangerous automation failure mode: a correct primary answer carrying confidently wrong derived metadata.

An email summary can survive an awkward phrase. A workflow that reads 7.2 GB used out of 8 GB and derives the wrong utilization can trigger the wrong action.

The non-thinking OpenWebUI run added another warning. Granite called the knowledge-search tool five times, received no results each time, and only then answered from general knowledge. The surrounding system prompt may share some blame, so I will not treat it as a final verdict on Granite’s tool use. But it was poor tool economy, and unattended agents live or die on tool economy.

Granite stays installed for coding, structured extraction, and controlled tool-selection tests. It has not earned a production n8n role yet.

What actually worked for me

After the audit, my useful collection became a ladder rather than a leaderboard.

RoleModelWhy it stays
Bulk classification and extractionQwen3.5 4B, non-thinkingFast, small, and strong enough; the OpenWebUI run completed in 4.92 s
Default n8n agentQwen3.5 9BBetter ambiguity handling and tool use while leaving useful context headroom; 6.27 s in the same run
Fast non-tool heavyweightGPT-OSS 20BCompleted the CLI thinking test correctly in 4.27 s
Short/medium deep reasoningGemma 4 26B-A4B QATFaster than my 12B build in the CLI run, with a less severe factual miss
Context-friendly second familyGemma 4 12B QATSmaller resident footprint, but the barycenter result requires more quality testing
Maximum local qualityQwen3.8 27B Q4_K_MBest difficult agentic model when the job fits
Large-context quality optionQwen3.8 27B IQ4_XSTrades quantization headroom against maximum fidelity
Candidate, not productionGranite 4.2 8BExcellent raw speed; numeric consistency and tool economy need more evidence

A role ladder routing local AI jobs from Qwen3.5 4B through larger models on a 24 GB GPU

That lineup also made the deletions easier. Qwen3.6-27B has no role beside Qwen3.8 in the same deployment class. Qwen3-8B loses to Gemma 4 26B-A4B at nearly identical generation speed. Llama3.2-3B has been displaced by Qwen3.5-4B. The old 18 to 19 GB coding models leave too little room for the long contexts that coding agents actually consume. Duplicate Qwen3 4B tags and redundant Gemma 12B quantizations are storage, not strategy.

I may keep one old Qwen3 4B Instruct build as a latency baseline. A benchmark needs a past tense.

The red thread was the memory budget

The audit began as a search for the newest small model. It ended by confirming the lesson my homelab keeps teaching me: local AI is a systems problem.

Model weights compete with context. Thinking competes with latency. Tool definitions compete with the user’s input. A clever model can lose to a concise one. A benchmark winner can still invent a conversion that quietly poisons a workflow.

The models that worked for me were not simply the newest or the largest. They were the ones that accepted a clear role:

  • Qwen3.5-4B for volume.
  • Qwen3.5-9B for the everyday decisions.
  • GPT-OSS for fast heavy lifting without tools.
  • Gemma 4 26B-A4B for deeper reasoning.
  • Qwen3.8 for escalation.

Everything else must prove that it does something this ladder cannot.

That is now my deletion rule. A new model does not earn disk space by being interesting. It earns disk space by replacing a job, creating a new one, or making an existing workflow measurably safer or faster.

The Moon question stays in the test set.

Primary model sources



Buy Me a Coffee