Introduction
Organizations increasingly depend on commercial, API-hosted LLMs for software development tasks. This brings three growing risks: rising and unpredictable cost, single-vendor dependency, and exposure of sensitive data to third parties.
GitHub Copilot's pricing for agentic billing, for instance, jumped 10x to 50x for power users after its 2026 billing-model change[1], and independent market research shows continued cost and repricing pressure across major LLM providers[2]. At the same time, security surveys point to real privacy risks in cloud-based coding assistants[3], and market analyses flag single-vendor lock-in as a growing strategic concern for enterprises[4].
On the other side of this equation sits a resource most organizations already own and barely use: GPU capacity. Enterprise infrastructure studies put average GPU utilization at around just 5% outside of dedicated training workloads[5] — the compute capacity is already sitting there, idle, on the developer's own workstation.
This study's premise is simple: for a meaningful share of the AI-assisted development tasks developers report using day to day[6] — writing, debugging, testing, documenting, and reviewing code — can a local model, running on the machine's own idle GPU, already deliver enough quality to replace the API call?
Yes, for at least one model (Qwen3-Coder-30B-A3B, 80% verified pass rate and a perfect score on explanation/review) — but not for most: the average pass rate across the ten models tested was only 25%.
Methodology: what we actually tested
To avoid hand-waving, we built a real execution harness — not a synthetic code-completion benchmark, but an agent that actually reads, creates, and edits files, and runs commands, exactly as a real coding-assistant tool would.
- 10 models specialized in code, ranging from 3B to 30B parameters, all 4-bit quantized (each publisher's Ollama default) — all found and downloaded directly from Ollama's own code-model catalog
- 14 tasks, spanning 7 categories: bug fix, adaptation, creation, explanation, testing, documentation, and code review
- Every category tested in both Python and C
- Fixed hardware: a single consumer laptop with an 8 GB-VRAM GPU — the realistic scenario of an ordinary corporate workstation, not a training server
- An agent with up to 8 steps per task, choosing among reading a file, searching code, creating a file, modifying a file, running a command, or finishing
- A fixed 4,096-token context window for every trial, to keep the comparison fair
To make clear what each category actually asked the model to do, rather than just its abstract name, the table below shows the concrete task instance used in each language:
| Category | Python instance | C instance |
|---|---|---|
| Bug fix | wrong average formula | off-by-one array read |
| Adapt | add function, same file | add filter, same file |
| Create | palindrome checker | min/max/mean reader |
| Explain | dedup. + closure | recursion + pointers |
| Test | password-validator tests | interval-checker tests |
| Document | inventory docstrings | matrix-util Doxygen block |
| Review | mutable default argument (shared-state bug) | unchecked strcpy |
Automatable tasks (bug fix, adaptation, creation, testing, and documentation) were verified through real compilation/execution — no manual judgment involved. Explanation and code-review tasks were manually scored, on a 0-to-5 scale.
Main result: 25% average pass rate, but one outlier at 80%
Of 100 automatically checkable trials (10 models × 10 checkable tasks), only 25 (25.0%) produced verified-correct output. That's a low number — but it hides a huge gap between models.
| Model | tokens/s | Time/task | Pass | Invalid | NL score |
|---|---|---|---|---|---|
| Qwen3-Coder-30B-A3B | 21.4 | 50.1s | 8/10 | 5% | 5.00 |
| CodeGeeX4 9B | 30.3 | 29.3s | 4/10 | 27% | 4.25 |
| North Mini Code 1.0 | 20.5 | 175.6s | 1/10 | 27% | 3.75 |
| Qwen2.5-Coder 7B | 31.7 | 25.5s | 3/10 | 12% | 3.50 |
| DeepSeek-Coder-V2 16B | 34.2 | 25.6s | 4/10 | 22% | 2.75 |
| StarCoder2 7B | 36.5 | 32.5s | 2/10 | 15% | 0.00 |
| CodeQwen1.5 7B | 39.1 | 20.8s | 2/10 | 17% | 0.75 |
| DeepSeek-Coder 6.7B | 36.1 | 63.1s | 0/10 | 6% | 0.75 |
| CodeGemma 7B | 17.0 | 50.6s | 1/10 | 18% | 1.25 |
| Code Llama 7B | 38.8 | 64.3s | 0/10 | 46% | 1.00 |
That's a remarkable result considering this model is a Mixture-of-Experts (MoE) architecture with 30B total parameters — whose full weight exceeds the 8 GB VRAM budget of the tested GPU — but only 3.3B active parameters per token. Even running partly off-GPU, it delivered the best result in the study.
What tokens/s doesn't tell you: time to final response
Raw throughput (tokens per second) hides an important part of the real experience: how many steps the agent needs to reach a final answer, and any fixed per-step overhead (context re-encoding, tool-result formatting). So, alongside tokens/s, we measured the total wall-clock time, from request to final response, for every one of the 14 tasks.
The finding is a genuine speed/correctness trade-off that tokens/s alone doesn't reveal: the four fastest models by response time (CodeQwen1.5, 20.8s; Qwen2.5-Coder, 25.5s; DeepSeek-Coder-V2, 25.6s; CodeGeeX4, 29.3s) are all mid-table or worse on automated correctness — while Qwen3-Coder-30B-A3B, the study's strongest model on correctness and quality, ranks sixth on speed, at 50.1s per task, nearly 2.5x slower than CodeQwen1.5.
Two factors compound here: Qwen3-Coder's raw throughput is little more than half of CodeQwen1.5's (21.4 vs. 39.1 tokens/s, plausibly related to its full weights exceeding the 8 GB VRAM budget even though only 3.3B parameters are active per token), and it also takes more agent steps per task on average (4.7 vs. 3.4) — exact GPU/CPU residency for this model was not independently measured in this study.
In practice, this means model selection for interactive workstation use should treat time to final response as its own criterion, not assume it follows directly from tokens/s or correctness. The most correct model tested here is also comparatively slow to respond, and a team optimizing for snappy, interactive use may reasonably trade some correctness for the sub-30-second response times of CodeQwen1.5, Qwen2.5-Coder, or DeepSeek-Coder-V2, depending on the task's error tolerance.
Two nearly identical MoE models, opposite behavior
Qwen3-Coder-30B-A3B and North Mini Code 1.0 share an almost identical architecture profile (30–30.5B total parameters, 3–3.3B active per token), yet produced very different results (8/10 vs. 1/10 automated passes).
Inspecting the per-trial transcripts shows this wasn't primarily a code-quality gap: North Mini Code exhausted its 8-step budget without reaching a self-reported "done" state on 8 of its 14 trials, versus 2 of 14 for Qwen3-Coder — and a task whose model never signals completion is scored as unverified regardless of the quality of any partial work performed. Mean throughput was comparable (20.5 vs. 21.4 tokens/s), so the gap isn't primarily a speed effect either.
Structured reliability, code competence, and truthfulness are separable
Across all 634 recorded generation steps in the main study, 19.9% (126/634) did not contain a syntactically parseable structured action — ranging from 5% (Qwen3-Coder) to 46% (Code Llama 7B). This rate wasn't, on its own, a reliable predictor of correctness: DeepSeek-Coder 6.7B had the study's second-lowest invalid rate (6%) alongside a 0/10 automated pass rate, while CodeGeeX4 combined a middling invalid rate (27%) with the second-best pass rate (4/10).
The most concerning finding, however, is about honesty. StarCoder2 (2/10 automated passes, a comparatively respectable result) scored 0.00 out of 5 on every one of its four natural-language tasks — fabricating, in all four trials, a fluent, detailed description of a two-argument addition function that does not exist in any of the supplied source files.
Honest limitations
This is a single-trial study, not a statistically robust measurement, and it's important to say that plainly:
- Exactly one run per model-task pair. LLM sampling is stochastic; no figure here has an associated variance measurement.
- Natural-language scores from a single rater, with no second, independent rater or measured inter-rater agreement.
- A single hardware and quantization configuration (4-bit, 8 GB VRAM) — these results are specific to that VRAM budget.
- 14 hand-authored tasks, written by the study's author with prior knowledge of the models' likely failure modes — not a representative sample drawn by an independent process.
Comparisons between models with close aggregate scores (e.g., CodeGeeX4 and DeepSeek-Coder-V2, both 4/10) should not be read as a reliable ranking between them.
Conclusion
This study's motivating premise now has affirmative, if narrow, support: at least one currently available open-weight model (Qwen3-Coder-30B-A3B) can, running on hardware it doesn't even fully fit into, reach an 80% verified pass rate and a perfect natural-language score — evidence that redirecting idle GPU capacity toward local AI is a defensible engineering decision, at least for the task categories tested here.
But this isn't a claim about "local models" as a category. The aggregate 25% pass rate across ten models, and one model's complete, fluent fabrication on every natural-language task, show that this capability is not yet a generic property — it's a property of specific model releases, which must be identified empirically, on the hardware and task mix a team actually intends to use.
Given this scenario — limited VRAM and local models that still fail most of the more demanding tasks — the more realistic strategy isn't to replace paid AI, but to segment by complexity: route the simple, high-frequency tasks developers hit every day (small bug fixes, minor adaptations, documentation, routine tests) to the local model, and reserve the paid LLM for what genuinely requires more complex reasoning. Because these simple tasks are exactly the ones that repeat most often, even a moderate local pass rate already represents meaningful savings on paid tokens over time. Under this logic, the most efficient system isn't "local vs. cloud" — it's a hybrid setup, combining both options according to each task's actual complexity.
Model selection dominates every other variable measured — and time to final response deserves treatment as its own metric, not an automatic consequence of tokens/s.
Planned next steps
This study opens three concrete follow-on directions: (1) a quantization sweep (3-, 4-, 5-, and 8-bit) on the strongest models identified here, to directly characterize the quality/speed/VRAM trade-off; (2) a dedicated software-verification task category — coding-standard conformance checking against MISRA C:2023, detection of deliberately introduced memory-safety and concurrency defects, and coverage-directed test generation scored against measured branch coverage; and (3) a Retrieval-Augmented Generation (RAG) variant of the explanation and review tasks, giving the model the relevant standard or documentation directly instead of relying on parametric memory, to test whether grounding reduces the confident-fabrication failure mode observed in this study.
Comments and discussion