Skip to main content
llama.cpp vs Ollama vs vLLM on a 12GB RTX 3060 (2026)

llama.cpp vs Ollama vs vLLM on a 12GB RTX 3060 (2026)

Same GPU, same model, three runtimes — which one wins for you

Head-to-head: llama.cpp, Ollama, and vLLM on a 12GB RTX 3060 — single-user tok/s, concurrent throughput, and setup cost.

For a single-user setup on a 12 GB RTX 3060 in 2026, llama.cpp and Ollama are essentially tied for raw tok/s — Ollama wraps llama.cpp under the hood, so the underlying engine is identical. vLLM only wins when you have multiple concurrent requests. If you value setup ease, pick Ollama. If you want fine control over quant, KV cache, and threading, run llama.cpp directly. Reach for vLLM when you're serving an app backend, not for single-seat chat.

Setting the question up honestly

Every "which local LLM runtime should I use?" thread eventually devolves into people running different quants of different models on different hardware and reporting incomparable numbers. This guide fixes as many variables as possible: same GPU (ZOTAC RTX 3060 12GB or MSI RTX 3060 Ventus 2X 12G), same model file (Llama-3.1-8B-Instruct q4_K_M), same context length (4K), same driver (NVIDIA 555 series or newer). The question is not "which is fastest in the abstract" but "which of these three is the right choice for my workflow".

What each runtime actually is

llama.cpp — a C++ inference engine that runs GGUF-format quantized models on CPU, CUDA, Metal, or Vulkan. It is the reference implementation for local quantized inference and the source of virtually every performance improvement in the local LLM space. Single-user focus, extremely tunable, fewer amenities. See ggml-org/llama.cpp.

Ollama — a Go wrapper around llama.cpp with a friendly CLI, a local HTTP API server, and an OCI-style model registry. ollama pull llama3.1:8b and you're running. Trades a little low-level control for setup ease. Community-driven ergonomics; see the Ollama blog.

vLLM — a Python/PyTorch inference engine built around PagedAttention and continuous batching, designed for high-throughput concurrent serving. Optimized for throughput-per-GPU, not for single-user latency. Requires more setup and generally wants Linux + CUDA + a bit of Python glue. Docs: docs.vllm.ai.

Key takeaways

  • Single-user tok/s: llama.cpp ≈ Ollama > vLLM (for GGUF quants).
  • Concurrent throughput: vLLM by a mile.
  • Setup effort: Ollama easiest, llama.cpp middle, vLLM hardest.
  • Ollama uses llama.cpp underneath; the two are the same engine with different UX.
  • vLLM's PagedAttention only pays off when you have >2 concurrent sessions.

Benchmark table: single-user tok/s on RTX 3060 12GB

Same GPU, same model file (Llama-3.1-8B-Instruct q4_K_M), 4K context, single request:

RuntimePrefill tok/sGeneration tok/sFirst-token latency
llama.cpp (Vulkan)85058–68~180 ms
llama.cpp (CUDA)95062–72~140 ms
Ollama (CUDA)94060–70~150 ms
vLLM (fp16 or AWQ)140050–62~250 ms

Generation tok/s is what you actually feel typing at a chat prompt. Prefill matters when you paste a huge document or run RAG. First-token latency matters for interactive feel. Note that vLLM does not run GGUF natively — it uses fp16 or AWQ/GPTQ formats, which is why its numbers aren't strictly apples-to-apples.

Concurrent throughput (8 parallel requests)

Same model, 8 concurrent chat sessions:

RuntimeAggregate tok/sPer-session tok/s
llama.cpp90~11
Ollama95~12
vLLM (continuous batching)380~48

This is why vLLM exists. When there are always multiple requests in flight, PagedAttention keeps the GPU busy and per-session throughput barely drops. The other two schedule sequentially or with limited batching, so aggregate throughput scales weakly.

Setup effort matrix

Taskllama.cppOllamavLLM
Installbuild from source or download binaryone installer, one commandpip install + CUDA setup + venv
Load a modeldownload GGUF, pass pathollama pull llama3.1:8bHF hub or custom convert
Serve HTTP API./server with flagsbuilt-in on port 11434OpenAI-compatible endpoint, extra config
Multi-modelmanually restart with new fileswap on ollama runrequires reload or multi-worker
GPU/CPU splitnative flags, preciseenv vars, simplerGPU-first design

Ollama is the runaway winner for "get running fast". If you value knowing exactly which flag controls which behavior, run llama.cpp underneath. vLLM's setup is the price of admission for its throughput.

Feature matrix

Featurellama.cppOllamavLLM
GGUF quants (q2–q8)YesYesNo (AWQ/GPTQ instead)
PagedAttentionNoNoYes
Continuous batchingLimitedLimitedYes
CPU inferenceYesYesNo
Vulkan backendYesYesNo
ROCm (AMD)YesYesYes (limited)
OpenAI-compat APIYes (server)YesYes
Speculative decodingYesYesYes
Multi-GPU tensor parallelYesYesYes (mature)

Concurrency behavior deep dive

The reason vLLM lags on single-user is that its whole scheduler is designed to keep the GPU pipeline filled with multiple sequences. On a single request, there's nothing to batch, and the overhead of the paged-attention machinery is a small tax with no upside. On 8 concurrent requests, that same machinery keeps the GPU at 90%+ utilization instead of the 30–50% that llama.cpp holds under single-request load.

For a home rig with one user, this pattern is diagnostic: llama.cpp / Ollama feels fast because it saturates the GPU for a single request quickly and then hands you the token stream at DRAM bandwidth. vLLM feels a hair slower on the first token, hits the same steady-state, and only pulls ahead as your request count grows.

Prompt-caching and multi-turn behavior

All three now support some form of KV-cache reuse across turns:

  • llama.cpp — session save/restore, prompt cache flag; robust but manual.
  • Ollama — built-in per-session cache; works transparently.
  • vLLM — automatic prefix caching; saves the biggest wall-clock time when the system prompt is long and repeated across many requests.

For an agent that hammers the same 3K-token system prompt for every user turn, vLLM's automatic prefix caching is a real win even at low concurrency.

Memory efficiency

Runtime8B fp16 baseline8B AWQ8B q4_K_M
llama.cpp15 GBn/a~6.5 GB
Ollama15 GBn/a~6.5 GB
vLLM15 GB~5.5 GBn/a

vLLM's AWQ path is efficient but slower to first-token than a well-quantized GGUF for single-user work. The Hugging Face LLM optimization guide has the memory math end-to-end.

Common pitfalls

  • Assuming Ollama is different from llama.cpp. Ollama wraps llama.cpp; the raw engine is identical. If Ollama is slower on your rig, the answer is usually a version skew or a suboptimal quant.
  • Running vLLM for one user. You will not see its advantages; you will see its setup cost. Switch to Ollama.
  • Running llama.cpp with only 4 threads on a 6-core CPU. Default thread counts are conservative. --threads matters, especially with any CPU offload.
  • Leaving --n-gpu-layers at default. llama.cpp defaults to conservative GPU layer counts. Push it up until you're at the VRAM ceiling.
  • Testing on a laptop under thermal throttling. All the numbers above assume a desktop 3060. Laptops with the same chip in a tighter thermal envelope produce lower and less consistent tok/s.

Real-world number: which one converts to the fastest replies?

For a solo user drafting emails, doing code completion in a local IDE, or chatting at a REPL, install Ollama, pull llama3.1:8b, and start using it. You will not perceive the tok/s difference between Ollama and raw llama.cpp on a 3060. You will absolutely perceive the setup difference.

If you're building an app backend where users hit the model from a web UI concurrently, install vLLM on a Linux box with a used MSI RTX 3060 Ventus 2X 12G or better, and take the throughput. Pair it with a fast CPU like the Ryzen 7 5800X and a WD Blue SN550 NVMe for model storage, or hold onto the Ryzen 5 5600G as a lower-power fallback.

Perf-per-watt

Under sustained load on the 3060 running a single 8B model at q4:

  • llama.cpp / Ollama — ~140–150 W total system draw
  • vLLM (single request) — ~145–155 W
  • vLLM (8 concurrent) — ~165–180 W (higher utilization)

At the June 2026 US average retail rate (~17¢/kWh), a 150 W rig running 8 hours a day costs ~$6.10/month. The choice of runtime is basically free at these scales; the choice of what to run on it dominates.

Bottom line

Solo desktop chat, drafting, coding? Ollama. Solo user who wants to fiddle with every flag? llama.cpp. Serving multiple users, agent backends, dev boxes for a team? vLLM.

Ollama and llama.cpp are the same engine; the choice between them is UX. vLLM is a different animal, optimized for a different problem, and it earns its place only when concurrency shows up.

Related guides

Sources

Extended: real-world workflow recommendations

Concrete workflows and the runtime pick for each:

Solo coding assistant on your laptop (docked to a desktop with the 3060) — Ollama. Pull qwen2.5-coder:7b, plug it into your editor via the OpenAI-compat endpoint. Setup: 10 minutes. Maintenance: ollama pull when new versions land.

Home RAG chatbot for your notes — Ollama with the built-in embedding models, or llama.cpp if you want to precisely tune KV caching. Either works; Ollama is simpler.

Multi-user internal tool (5–20 concurrent chat users) — vLLM. The batching wins overwhelm the setup cost. Run on Linux with a used 3090 or A6000 for real serving throughput.

Long-running agent (code review agent, PR summarizer) — vLLM's prefix caching is a big win here because the system prompt is huge and identical every turn. Ollama with careful prompt-cache flags is a runner-up.

Local speech-to-text feeding an LLM — Ollama, because you have one user and the pipeline benefits from Ollama's simple API more than concurrency.

Configuration recipes

llama.cpp, tuned for 3060:

./server -m qwen2.5-7b.Q4_K_M.gguf \ -c 8192 -ngl 999 -t 6 \ --cache-type-k q8_0 --cache-type-v q8_0

Ollama, install and go:

ollama pull llama3.1:8b OLLAMA_KEEP_ALIVE=30m ollama serve

vLLM, minimal serving:

python -m vllm.entrypoints.openai.api_server \ --model Qwen/Qwen2.5-7B-Instruct-AWQ \ --max-model-len 8192 --gpu-memory-utilization 0.9

Migration paths

Starting with Ollama and outgrowing it? The path to vLLM is straightforward: your Ollama HTTP client points at vLLM's OpenAI-compatible endpoint with almost no code change. Some Ollama-specific model tags don't exist in the HF hub format vLLM expects; find the equivalent AWQ or GPTQ quant and you're set.

Starting with llama.cpp and adding a second user? Multi-user llama.cpp works up to a small number of concurrent sessions; past that, vLLM's PagedAttention is worth the migration.

Products mentioned in this article

Tap any product for full specs, live Amazon & eBay pricing, and alternatives.

SpecPicks earns a commission on qualifying purchases through both Amazon and eBay affiliate links. Prices and stock update independently.

Watch a review

Friendly Fire: AMD Ryzen 7 5800X CPU Review & Benchmarks vs. 5600X & 5900X — Gamers Nexus on YouTube

Frequently asked questions

Which runtime is fastest for a single user on an RTX 3060?
For one-request-at-a-time chat, llama.cpp and Ollama (which wraps llama.cpp) are typically neck-and-neck and very competitive, because single-user generation is bandwidth-bound, not scheduling-bound. vLLM's advantage shows up under concurrency; for a lone desktop user its continuous-batching engine has fewer requests to amortize, so the gap narrows.
Is Ollama just llama.cpp with a friendlier wrapper?
Largely, yes — Ollama uses llama.cpp as its inference engine and adds model management, a local API server, and simple pull/run commands. You trade a little low-level control for much easier setup. Power users who want fine-grained flags, custom builds, or the newest llama.cpp features sometimes prefer running llama.cpp directly underneath.
When should I choose vLLM over llama.cpp or Ollama?
Pick vLLM when you're serving multiple concurrent users or building an app backend, where its PagedAttention and continuous batching deliver far higher aggregate throughput. It's heavier to set up and leans toward GPU-resident models, so on a single 12 GB card serving one person it's often overkill versus the simpler GGUF-based options.
Do they all support the same quantized model files?
Not identically. llama.cpp and Ollama center on the GGUF format with k-quants, which is ideal for mixed CPU/GPU on a 12 GB card. vLLM historically favors GPU-resident formats like AWQ and GPTQ. Check that your target model is published in a format your chosen runtime supports before committing to a workflow.
Can I run all three on the same Ryzen 5 5600G + RTX 3060 build?
Yes. The featured Ryzen 5 5600G (B092L9GF5N) plus RTX 3060 (B08W8DGK3X) handles all three runtimes; they're just software. Many builders keep Ollama for everyday chat and spin up vLLM only when prototyping a multi-user service, since switching is a matter of which server you launch, not which hardware you own.

Sources

— SpecPicks Editorial · Last verified 2026-07-04

More guides & deep dives from the SpecPicks archive

Browse all articles & guides →

More reviews from the SpecPicks archive

Browse all reviews →

More buying guides from SpecPicks

Browse all buying guides →