Gemma 4 vs Qwen vs Ornith: Which Local LLM Codes Best on 8GB

I tested three model families on the same hardware, same quantization, and same coding tasks. The results surprised me – the “best” model depends entirely on what you’re asking it to do.

Gemma 4 is the fastest. Qwen2.5-Coder is the most focused. Ornith is the smartest. None of them is universally “the best” – they’re different tools for different jobs, and understanding the tradeoffs is what makes a local AI setup actually useful instead of just impressive.

Here’s how they compare on my RTX 3060 Ti with 8GB VRAM.

The Contenders

I tested three specific models – not the “best version” of each family, but the specific quantizations that fit in 8GB VRAM and run at usable speeds:

Model Architecture Active Parameters Total Parameters Quantization
Gemma 4 E4B MoE 4B ~12B Q4_K_M
Qwen2.5-Coder 7B Dense 7B 7B Q4_K_M
Ornith 35B-A3B MoE + MTP 3B 35B UD-IQ4_NL

Gemma 4 E4B is Google’s small MoE model – 4 billion active parameters out of roughly 12 billion total. It’s designed for speed on consumer hardware.

Qwen2.5-Coder 7B is Alibaba’s dedicated coding model. Dense architecture – all 7B parameters fire on every token. No MoE efficiency, but the entire model was fine-tuned on code.

Ornith is the Qwen3.5 MoE variant with MTP support. 35B total, 3B active per token, 256 experts. The largest model that fits in 8GB VRAM with TurboQuant+ KV compression.

Speed Comparison

All measurements from the same GPU with the same KV cache config (q8_0 K, turbo2 V where supported):

Model Generation Speed Context Window Prompt Ingestion
Gemma 4 E4B 68.17 t/s 64k 1664-2346 t/s
Qwen2.5-Coder 7B 37.27 t/s 128k 162.77 t/s
Ornith 35B-A3B 30-36 t/s 128k 670-720 t/s

Gemma 4 E4B is nearly twice as fast as the other two. At 83 t/s, the output arrives faster than you can read it. For quick tasks – generating boilerplate, writing a simple function, answering a question – Gemma is the clear winner.

Ornith and Qwen2.5-Coder are in the same speed range, but Ornith achieves this at 128k context with TurboQuant+ compression, while Qwen2.5-Coder achieves it natively as a smaller dense model.

Quality Comparison: Coding Tasks

I tested each model on three coding scenarios. The results were consistent across multiple runs.

Scenario 1: Generate a Laravel Migration

“Write a Laravel migration for a bookings table with user_id, service_id, date, time, status, and notes fields.”

Model Result
Gemma 4 E4B Good – correct schema, proper foreign keys, used timestamps. Missing `default` value for status.
Qwen2.5-Coder 7B Excellent – correct schema, proper foreign keys, added `default(‘pending’)` for status, added index on `date` column.
Ornith 35B Excellent – same as Qwen but also added a composite index on `(user_id, date)` and a comment explaining the index choice.

Qwen2.5-Coder and Ornith both produced production-ready migrations. Gemma was close but missed the default value. The difference is that Qwen and Ornith were specifically trained/fine-tuned on code, while Gemma is a general-purpose model.

Scenario 2: Debug a Race Condition

“Here’s a Go goroutine pattern with a channel. It’s producing duplicate results. Find the bug.”

Model Result
Gemma 4 E4B Identified the general area but couldn’t pinpoint the exact issue. Suggested adding mutex locks – incorrect solution.
Qwen2.5-Coder 7B Found the race condition correctly. Explained why the channel wasn’t synchronized. Suggested a proper fix with WaitGroup.
Ornith 35B Found the race condition, explained the root cause, suggested the WaitGroup fix, AND pointed out a secondary issue with the error handling that I hadn’t noticed.

This is where model size matters. The reasoning gap between 4B active parameters (Gemma) and 3B active but 35B total (Ornith) is significant. Ornith’s larger parameter space gives it more “world knowledge” to draw from, even though only 3B parameters are active per token.

Scenario 3: Large Context Code Review

“Review this entire WooCommerce plugin (800 lines) for security issues and performance bottlenecks.”

Model Result
Gemma 4 E4B Found 2 obvious issues (missing nonce, direct DB query). Missed subtler problems.
Qwen2.5-Coder 7B Found 4 issues including the nonce, the DB query, an missing capability check, and an inefficient loop.
Ornith 35B Found all 4 issues Qwen found, plus 2 more: a potential SQL injection in a search query and a missing rate limiter on the AJAX handler. The 128k context meant the entire plugin fit in memory without truncation.

At 800 lines of code, all three models had the full context. But the quality of analysis varied significantly. Ornith’s 35B parameter space caught issues that the smaller models missed – not because it’s “smarter” in an abstract sense, but because it has more patterns in its training data to match against.

Quality Comparison: Non-Coding Tasks

Architecture Discussion

“I’m building a multi-tenant Laravel app. Should I use separate databases, separate schemas, or shared tables with tenant_id?”

Model Result
Gemma 4 E4B Gave a reasonable overview of the three approaches. Recommended shared tables with tenant_id without much reasoning.
Qwen2.5-Coder 7B Better – explained tradeoffs for each approach. Recommended shared tables for SaaS, separate databases for compliance-heavy clients.
Ornith 35B Best – covered all three approaches with specific pros/cons, recommended shared tables with tenant_id AND row-level security, mentioned database partitioning as a middle ground, and noted that Laravel’s scoping already supports this pattern.

The architecture discussion is where Ornith’s size advantage is most visible. It connects more dots across a wider knowledge base. For pure coding tasks, Qwen2.5-Coder is competitive. For broader technical decisions, Ornith’s 35B parameters give it an edge.

The Tradeoff Matrix

Factor Gemma 4 E4B Qwen2.5-Coder 7B Ornith 35B
Speed Best (83 t/s) Good (37 t/s) Good (30-36 t/s)
Code quality Good Excellent Excellent
Reasoning depth Basic Good Best
Large context 64k 128k 128k
VRAM usage Lowest Medium Highest
Best for Quick tasks Daily coding Hard problems

What I Actually Use

I don’t pick one model and use it for everything. Each model has a role:

Gemma 4 E4B is my fast worker. When I need a quick function generated, a variable renamed across files, or a simple explanation of a concept, Gemma does it at 83 t/s. No waiting. The quality is good enough for 80% of daily tasks.

Ornith 35B is my daily coder. It understands code structure better than Gemma, produces cleaner output, and handles 128k context. For multi-file refactors, writing tests, and code generation where quality matters, Ornith is the default.

When I need deep reasoning or large context analysis, Ornith’s 35B parameter space catches issues that smaller models miss. It’s both my coder and my architect.

The workflow is simple: start with Gemma for quick tasks. If the output isn’t good enough, step up to Ornith. It’s a two-tier system that covers every scenario without compromising on speed or quality at any level.

When to Switch Mid-Project

I don’t always know which model I need before I start a task. The workflow is more fluid than “pick one and stick with it.” Here’s how switching actually works during a coding session.

I’ll start with Gemma for a quick question about a Laravel helper function. Gemma answers in 2 seconds. Then I realize the answer requires changes across three files. Gemma can handle single-file edits, but multi-file refactors need more context – so I switch to Ornith. The server restarts in about 10 seconds with the new model. Ornith handles the refactor cleanly.

Then I realize the refactor introduces a potential performance issue with database queries. I need someone to review the change and think about implications. Ornith handles this too – it reviews the full context and catches a N+1 query problem that Gemma missed.

Two models, two tiers, all within the same coding session. The switching cost is about 10 seconds. The quality improvement is worth hours of debugging.

The Honest Answer

There is no “best local LLM for coding” on 8GB VRAM. There are three good options that excel at different things. The question isn’t which one to pick – it’s how to use all three effectively.

If I had to choose only one: Ornith 35B. It’s the best balance of speed, quality, and context size for a developer who needs one model for everything. But the three-model stack is strictly better than any single model, and on 8GB VRAM, running them one at a time is free.

The local AI space loves ranking models. The reality is more nuanced – different architectures, different sizes, and different training approaches produce models that are good at different things. The best setup isn’t the fastest model or the biggest model. It’s the right model for the task at hand.

For the full benchmark results across 9 models and 32 configurations, see 9 Models Tested, 3 Rejected: What I Learned From 32 Benchmarks.

Leave a Reply

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

Gravatar profile