← The X99 Build

Four small LLMs, one 8GB mining card: which one reads a job posting best?

Gemma 4 E4B, Qwen3.5 4B, Qwen3 8B and Qwen2.5 3B, benchmarked on structured extraction over 78 hand-labeled documents, all running on the 200 Bucks Inference Machine. September 2026. The same models rerun on llama.cpp and mistral.rs are in mistral.rs vs llama.cpp.

X99 build series: The build · mistral.rs vs llama.cpp · Four LLMs compared · Wake on LAN · ReBar BIOS mod · CMP 40HX unlock · V100 + VFIO

I tested four small LLMs on pulling eligibility flags out of internship postings, with every flag backed by a quote that code verifies. Gemma 4 E4B won with 95% precision and 97% recall. Qwen3 8B, the biggest model, caught just as much but flagged far too often, ran slowest and nearly filled the card, and Qwen2.5 3B wasn't usable for this task.

95% precision Gemma 4 E4B, with 97% recall, best of the four 63% precision Qwen3 8B, twice Gemma's effective size, same recall 78 documents Hand-labeled postings, including deliberate traps
RankModelPrecisionRecallMedian timeGPU memory
1Gemma 4 E4B95% (60/63)97% (60/62)27 s~4.4 GB
2Qwen3.5 4B83% (59/71)95% (59/62)20 s~3.6 GB
3Qwen3 8B63% (60/95)97% (60/62)39 s~6.8 GB
4Qwen2.5 3B43% (46/107)74% (46/62)15 s~2.6 GB

The task

Each model reads one internship posting and fills in a fixed JSON schema with five yes/no eligibility flags:

For every flag it sets, the model also has to copy one sentence from the posting, word for word, as evidence. A short Python check then looks for that sentence in the posting text, ignoring whitespace and curly quotes. A flag only counts if its quote is really there, so the model does the extracting and plain code makes the call.

This is a good fit for a small local model: the postings are 1–6k tokens, the output is tightly constrained, and nothing here needs outside knowledge. It's also a good test of whether a model can follow a definition ("a no-sponsorship line is not a citizenship requirement") instead of matching keywords.

Setup

Results

Accuracy

Precision: share of flags raised that were correct 0% 25% 50% 75% 100% Gemma 4 E4B Gemma 4 E4B: 95.2% (60 correct, 3 false alarms, 2 missed) 95% Qwen3.5 4B Qwen3.5 4B: 83.1% (59 correct, 12 false alarms, 3 missed) 83% Qwen3 8B Qwen3 8B: 63.2% (60 correct, 35 false alarms, 2 missed) 63% Qwen2.5 3B Qwen2.5 3B: 43.0% (46 correct, 61 false alarms, 16 missed) 43% Recall: share of true requirements caught 0% 25% 50% 75% 100% Gemma 4 E4B Gemma 4 E4B: 96.8% (60 correct, 3 false alarms, 2 missed) 97% Qwen3.5 4B Qwen3.5 4B: 95.2% (59 correct, 12 false alarms, 3 missed) 95% Qwen3 8B Qwen3 8B: 96.8% (60 correct, 35 false alarms, 2 missed) 97% Qwen2.5 3B Qwen2.5 3B: 74.2% (46 correct, 61 false alarms, 16 missed) 74%
Figure 1. All five flags pooled: 62 true requirements to find. Precision counts only flags whose quote was verified in the posting. Hover a bar for counts.

Recall is close for three of the four models: Gemma, Qwen3 8B and Qwen3.5 4B each found 59–60 of the 62 requirements. They split on precision, which is what matters for a screening step, since each false alarm is a posting wrongly marked "you can't apply".

Where the false alarms came from

0 10 20 30 40 Gemma 4 E4B Qwen3.5 4B Qwen3 8B Qwen2.5 3B U.S. citizenship of 70 postings Gemma 4 E4B, U.S. citizenship: 0 false alarms out of 70 postings without it 0 Qwen3.5 4B, U.S. citizenship: 0 false alarms out of 70 postings without it 0 Qwen3 8B, U.S. citizenship: 0 false alarms out of 70 postings without it 0 Qwen2.5 3B, U.S. citizenship: 39 false alarms out of 70 postings without it 39 Undergrad only of 64 postings Gemma 4 E4B, Undergrad only: 2 false alarms out of 64 postings without it 2 Qwen3.5 4B, Undergrad only: 10 false alarms out of 64 postings without it 10 Qwen3 8B, Undergrad only: 29 false alarms out of 64 postings without it 29 Qwen2.5 3B, Undergrad only: 2 false alarms out of 64 postings without it 2 No sponsorship of 38 postings Gemma 4 E4B, No sponsorship: 1 false alarms out of 38 postings without it 1 Qwen3.5 4B, No sponsorship: 2 false alarms out of 38 postings without it 2 Qwen3 8B, No sponsorship: 6 false alarms out of 38 postings without it 6 Qwen2.5 3B, No sponsorship: 17 false alarms out of 38 postings without it 17
Figure 2. False alarms per flag: verified flags raised on postings that don't have the requirement. Clearance and PhD-only had no false alarms from any model except Qwen2.5 3B (3 PhD-only).

Cost

Median time per posting 0 s 10 s 20 s 30 s 40 s Gemma 4 E4B Gemma 4 E4B: median 27.2 s per posting, 90th percentile 35.2 s 27.2 s Qwen3.5 4B Qwen3.5 4B: median 20.4 s per posting, 90th percentile 31.5 s 20.4 s Qwen3 8B Qwen3 8B: median 38.8 s per posting, 90th percentile 54.6 s 38.8 s Qwen2.5 3B Qwen2.5 3B: median 15.3 s per posting, 90th percentile 27.9 s 15.3 s GPU memory while running (8 GB card) 0 GB 2 GB 4 GB 6 GB 8 GB Gemma 4 E4B Gemma 4 E4B: about 4.4 GB of GPU memory while running 4.4 GB Qwen3.5 4B Qwen3.5 4B: about 3.6 GB of GPU memory while running 3.6 GB Qwen3 8B Qwen3 8B: about 6.8 GB of GPU memory while running 6.8 GB Qwen2.5 3B Qwen2.5 3B: about 2.6 GB of GPU memory while running 2.6 GB
Figure 3. Median wall time per posting (prompt processing plus generation) and approximate GPU memory in use during the run, on one CMP 40HX.

Every flag

FlagGemma 4 E4BQwen3.5 4BQwen3 8BQwen2.5 3B
caught / false alarms
U.S. citizenship (8 true, 70 not)7 / 06 / 06 / 06 / 39
Undergrad only (14 / 64)13 / 214 / 1014 / 294 / 2
No sponsorship (39 / 38)39 / 139 / 239 / 636 / 17
Security clearance (1 / 77)1 / 00 / 01 / 00 / 0
PhD only (0 / 78)– / 0– / 0– / 0– / 3

Comparing the four

Gemma 4 E4B: the most careful reader

Gemma was the only model that followed the definitions consistently. It never mistook a sponsorship or work-authorization line for a citizenship requirement. Its two undergrad false alarms were real borderline cases: Amazon's "one quarter/semester remaining" and Fractio's "enrolled in, or graduated within the past year". It also caught three things my first answer key missed: both Genuine Parts postings ("Working on a BS degree") and a "Federal security clearance" line buried in an IBM posting. I corrected the key before scoring.

"E4B" means about 4B effective parameters. The file is 9.6 GB because a large per-layer embedding table sits in system RAM, and most layers use sliding-window attention, so long contexts are cheap on an 8 GB card. That same design makes prompt-cache reuse awkward in llama.cpp, which I dealt with in mistral.rs vs llama.cpp.

Qwen3.5 4B: close behind, and faster

It's the newest model here and the closest competitor, about 25% faster than Gemma, uses less memory, and has a perfect sponsorship score. Its weakness is that it over-flags undergrad-only: it treats "pursuing a university degree" with no level given as bachelor's-only, and once offered Figma's "join us!" as evidence. It also missed the clearance line and two citizenship test copies. If speed mattered more than precision it would be the pick; for a screening step it doesn't.

Qwen3 8B: same recall, far more false alarms

It's twice Gemma's effective size with the same recall, but it flagged almost anything mentioning a bachelor's degree as undergrad-only. That included "Preferred education: Bachelor's Degree" on several IBM postings and "Pursuing a Bachelor's or Master's". It also read application-form questions ("Do you now or will you in the future require immigration sponsorship…") as no-sponsorship statements. At 6.8 GB it nearly fills the card, leaving little room for context, and it was the slowest at 39 s per posting.

Qwen2.5 3B: keyword matching

It called 39 of 70 postings citizenship-only, citing lines like "located in the United States" and "Bachelor's degree or above", and for sponsorship it quoted Figma's housing stipend and Goldman's email policy. It also produced the most quotes that weren't in the posting at all. It's the fastest and smallest model, which makes it fine for cache experiments where answer quality doesn't matter, but not for this.

What I took away

Qwen3 8B lost to a model half its effective size. On a narrow extraction task, following instructions carefully mattered more than raw capacity, and public leaderboards, where Qwen3 8B usually looks strong, didn't predict that. An evaluation built from your own data is worth the hour it takes.

The quote check stops invented evidence, but it can't check meaning. Nearly all of Qwen2.5 3B's false alarms passed it: the sentences it quoted really were in the postings; they just didn't say what the model claimed. So every flag stays a hint that a stronger reviewer confirms, and nothing is dropped on the small model's word alone.

All four models missed "Only United States citizens are eligible for this internship.", the one test sentence without the words "citizenship" or "must be a citizen". A plain text search for "citizen" running alongside the model catches all 8 test copies at no cost.

System RAM turned out to be a bigger problem than VRAM. With only 15 GiB of system RAM, Ollama was killed for running out of memory when Gemma was still loaded as the next model started. It restarted within 5 seconds, but the next run failed on nearly every posting during that gap. Rerunning with one model loaded at a time fixed it. On a machine this size, OLLAMA_MAX_LOADED_MODELS=1 is worth setting.

Caveats