9 Models Tested, 3 Rejected: What I Learned From 32 Benchmarks

Not every model that claims to be “good for coding” actually is. I tested 9 different LLMs on my RTX 3060 Ti, ran 32 benchmark configurations, and rejected 3 of them outright. The failures taught me more about what matters in local AI than the successes.

Here’s the honest breakdown – what worked, what didn’t, and why.

The Full Roster

Model Size Type Quantization Verdict
Gemma 4 E4B 4B active MoE Q4_K_M Kept – fast worker
Qwen3-4B Thinking 4B Dense Q4_1 Kept – simple planner
Qwen3.5 9B 9B Dense Q4_K_M Maybe – too heavy for speed
Gemma 4 26B-A4B 4B active MoE Q4_K_M / UD-IQ4_NL Kept – reasoning model
GLM-4.6V-Flash Dense Q4_K_M + mmproj Rejected
Qwen3-Coder 30B-A3B 3B active MoE IQ4_XS Maybe – not worth the complexity
Qwen2.5-Coder 7B 7B Dense Q4_K_M Kept – daily coder
Qwen3.6 35B-A3B MTP 3B active MoE + MTP UD-IQ4_NL Kept – strong planner
Ornith 35B-A3B 3B active MoE + MTP UD-IQ4_NL Kept – senior planner

Out of 9 models, 6 earned a permanent spot, 2 are “maybe” (useful in specific scenarios), and 1 was rejected completely.

The 3 Rejections

GLM-4.6V-Flash: Dead on Arrival

I tried GLM-4.6V-Flash three times. Three rejections.

The model is Zhipu’s multimodal offering – it has vision capabilities through the mmproj (multi-modal projector) component. On paper, it sounds interesting. In practice, it was unusable.

Run 1 (Q4_K_M + mmproj, 32k context): 9.75 t/s generation. Output was garbled Chinese text despite English prompts. Tokenizer warnings in the server log.

Run 2: 12.31 t/s. Slightly better but still producing mixed Chinese/English output. The model clearly wasn’t trained to handle the prompt format I was using.

Run 3: 18.91 t/s. Speed improved but output quality was still broken. Repeated phrases, incoherent code suggestions, and occasional character soup.

The lesson: model speed means nothing if the output is garbage. GLM-4.6V-Flash is optimized for Chinese language tasks. Running it for English coding was the wrong model for the job. I should have checked the training data language distribution before downloading.

Qwen3-Coder 30B: Too Much Complexity for Too Little Gain

Qwen3-Coder 30B-A3B was my attempt at a large dedicated coding model. 30 billion parameters, 3 billion active per token, with IQ4_XS quantization to fit in VRAM.

The model worked. The speed was acceptable (14-19 t/s depending on MoE layer count). The code quality was good. But it never justified its complexity over simpler alternatives.

The MoE tuning nightmare: Getting acceptable speed required tuning the -ncmoe parameter through 8 different values (20, 25, 30, 36, 37, 40, 41, 37 at 128k). At ncmoe 20-25, speed was 10-14 t/s – too slow. At ncmoe 37, it hit 18.57 t/s – acceptable but not impressive.

The context scaling problem: At 32k context, Qwen3-Coder ran at 18.57 t/s. At 128k context, it dropped to 16.71 t/s. The speed degradation with context size was worse than Ornith, which maintained 30-36 t/s at 128k.

The comparison problem: At 37 MoE layers, Qwen3-Coder hit 18.57 t/s. Ornith at ncmoe 34 hits 30-36 t/s. Ornith is faster, has more parameters, supports MTP, and requires less tuning. There’s no reason to use Qwen3-Coder when Ornith exists.

The lesson: a model that works isn’t the same as a model that’s worth the effort. Qwen3-Coder 30B is a perfectly functional model, but the maintenance overhead of tuning it for 8GB VRAM doesn’t justify its existence when better options are available.

Qwen3.5 9B: Technically Good, Practically Slow

Qwen3.5 9B is a solid general-purpose model with vision capabilities. It ran correctly, produced good output, and handled both text and image inputs. I kept it as a “maybe” because the speed never justified daily use.

At 125k context with Q4_K_M quantization, the model generated at 22.58 t/s. Not slow in absolute terms, but slow compared to the alternatives. Gemma E4B does the same quick tasks at 83 t/s. Qwen2.5-Coder handles coding tasks at 37 t/s. The 9B model sits in an awkward middle ground – too slow for quick tasks, not deep enough for hard problems.

The vision capability is interesting, but I don’t need local vision enough to justify the speed penalty. If I need image analysis, I use a cloud API.

The lesson: a model that’s “good at everything” is often “not the best at anything.” Specialization wins on limited hardware.

What the 6 Keepers Have in Common

The models I kept share three characteristics:

1. Clear role assignment: Each model does something specific well. Gemma is fast. Qwen Coder is code-focused. Ornith is deep. None of them tries to be everything.

2. Acceptable speed for its role: A “fast worker” needs to be genuinely fast (83 t/s). A “daily coder” needs to be interactive (37 t/s). A “senior planner” needs to be fast enough to not interrupt flow (30+ t/s). Models below 15 t/s get demoted to “maybe.”

3. Minimal tuning overhead: If a model requires 8 rounds of ncmoe tuning to be usable, it’s not worth the effort. The models that earned a permanent spot worked with reasonable defaults.

The Surprises

MTP Changes Everything for Large Models

Before testing MTP-enabled models, I thought speculative decoding was a minor optimization – maybe 10-20% speed improvement. The reality: MTP nearly doubles generation speed on models that support it.

The Qwen3.6 35B without MTP runs at ~18 t/s. With MTP n=1, it hits 27.19 t/s. That’s a 50% improvement from a single flag change. For Ornith with optimized MTP settings, the improvement is even larger – from an estimated 18-19 t/s base to 30-36 t/s with MTP.

If your model supports MTP and you’re not using it, you’re running at half speed.

The 4B MoE Model Outperforms the 7B Dense Model on Speed

Gemma 4 E4B at 83 t/s versus Qwen2.5-Coder 7B at 37 t/s. The smaller MoE model is nearly twice as fast. This makes sense – MoE activates fewer parameters per token – but the quality gap is smaller than you’d expect. For simple coding tasks, Gemma’s output is 80-90% as good as Qwen’s, at nearly twice the speed.

TurboQuant+ KV Compression Is Not Optional

The first configs I tested used symmetric q8_0/q8_0 KV cache. Maximum context was 32k on 8GB VRAM. After switching to asymmetric q8_0/turbo2, context jumped to 128k. The KV cache is the bottleneck, not the model weights. This optimization alone is worth more than any model swap.

The Final Scorecard

Model Speed Quality Tuning Effort Role Verdict
Gemma 4 E4B 83 t/s Good Low Fast worker Daily driver
Qwen3-4B 86 t/s Basic Low Quick planner Useful
Qwen3.5 9B 22 t/s Good Low Vision/general Maybe
Gemma 4 26B 18 t/s Good Medium Reasoning Useful
GLM-4.6V 9-18 t/s Broken N/A Vision Rejected
Qwen3-Coder 30B 18 t/s Good High Coding Maybe
Qwen2.5-Coder 7B 37 t/s Excellent Low Code specialist Useful
Qwen3.6 35B MTP 27 t/s Excellent Medium Planning Keep
Ornith 35B 30-36 t/s Excellent Low Daily coder + senior planner Daily driver

The local AI space moves fast. New models drop every month. But the methodology stays the same: test on your hardware, measure what matters, reject what doesn’t work, and build a stack around roles instead of chasing the single “best” model.

32 test runs taught me that the answer isn’t one model. It’s three models, each doing what it does best.

For the complete breakdown of how I use these three models in daily work, see My 3-Model Local AI Stack: Fast Worker + Coder + Senior Planner.

Leave a Reply

Your email address will not be published. Required fields are marked *

Gravatar profile