For a single user with one 12GB GPU, run Ollama. It handles model management, exposes an OpenAI-compatible endpoint, sets sensible defaults, and does not force you into vLLM's batching-oriented workflow that only pays off with concurrent requests you don't have. vLLM is faster for the specific case it was built for — high-concurrency serving with paged attention — and is the correct pick for a shared team rig or an internal API host. On a lone RTX 3060 12GB issuing one prompt at a time, Ollama wins on almost every axis that matters.
Two projects, two design centers
Per the vLLM documentation and the Ollama GitHub repository, these projects were built with different goals in mind. vLLM is a datacenter-oriented LLM inference server that pioneered paged attention (a memory-management technique borrowed from OS virtual memory) to serve many concurrent requests through the same GPU by dynamically sharing the KV cache across them. Ollama is a Docker-style local-LLM runtime built around ease of use: ollama run llama3.3 pulls a checkpoint from a registry and starts a chat session, no configuration required. Both projects run models on a 12GB GPU; the ergonomics and the performance profile diverge sharply.
The question this article answers is which one a single user with a single card should pick in July 2026. The honest answer is Ollama for essentially every case except one — running a shared inference endpoint for a small team — where vLLM's concurrent-serving story starts to earn its complexity. Benchmarks and behavior notes below cite public reports on Phoronix and community measurements; nothing is first-party specpicks testbench data.
Key takeaways
- Ollama wins for single-user local work. Simpler setup, sensible defaults, cleaner model management, comparable single-stream throughput.
- vLLM wins for concurrent serving. Paged attention shines when you have 10+ simultaneous requests sharing the same GPU. A lone user rarely triggers this.
- Both are fast on 12GB for the checkpoint sizes that fit. The runtime is not the bottleneck; the GPU is.
- Format support differs. Ollama uses GGUF (llama.cpp lineage); vLLM uses Hugging Face format weights natively. That affects which quantizations you can run without conversion.
- Setup complexity is the biggest differentiator. Ollama installs in one command. vLLM requires more attention to CUDA versions, Python environments, and configuration.
Diagnostic: how many concurrent requests do you actually issue?
Before picking a runtime, quantify your workload:
- 1 request at a time (chat, coding assistant, occasional API calls): Ollama.
- 2–4 concurrent requests (shared machine, family, small home lab): Ollama still fine; vLLM starts to have an argument.
- 5–20+ concurrent requests (small team endpoint, internal API for a service): vLLM's throughput advantage becomes real.
- 50+ concurrent requests: you have outgrown a 12GB GPU regardless of runtime.
Ollama can handle multiple simultaneous requests but does not schedule them across the same KV cache the way vLLM does. On a 12GB card that means one request at a time gets served at full speed, the second queues. vLLM lets the second stream serve at partial throughput by sharing the KV cache with the first.
If you're a solo user with one GPU, this optimization is invisible — you're only issuing one request at a time anyway.
Spec-delta table
| Attribute | Ollama | vLLM | |
|---|---|---|---|
| Model format | GGUF (via llama.cpp) | Hugging Face .safetensors | |
| Quantization support | Broad (q2 through q8, KV quant) | Narrower (fp16, AWQ, GPTQ, some FP8) | |
| Concurrency model | One-at-a-time serving | Paged-attention multi-request | |
| Memory overhead | Modest (llama.cpp base) | Higher (paged-attention structures) | |
| Setup complexity | 1 command (`curl -fsSL ... \ | sh`) | pip + CUDA + config file |
| OpenAI-compatible API | Yes, out of the box | Yes, out of the box | |
| Model management | ollama pull, ollama list | Manual HF download or vllm serve <name> | |
| Streaming responses | Yes | Yes | |
| Fine-tuning support | No (inference only) | Some (via adapters) | |
| Docker image | Official first-party | Community + first-party |
The GGUF versus safetensors format split matters most for what quantizations you can access. llama.cpp's GGUF ecosystem has aggressive quantization options (q2, q3, q4, q5, q6, q8, plus KV-cache quantization) that are widely tested and match well to consumer GPUs. vLLM's default weight support is fp16/bf16, with AWQ and GPTQ quantization for size reduction — different tradeoffs, generally larger memory footprints per model.
Benchmark table: single-stream and batched throughput
Per community benchmarks on a 12GB RTX 3060 with a 7B q4_K_M / equivalent AWQ 4-bit checkpoint:
| Runtime | Single-stream tok/s (decode) | 4-stream aggregate tok/s | 8-stream aggregate tok/s | Memory overhead (empty) |
|---|---|---|---|---|
| Ollama | 42–48 | 42 (single-serves) | 42 (single-serves) | ~200MB |
| vLLM | 40–45 | 110–130 | 145–170 | ~1.5GB |
Interpretation: for a single stream (one prompt at a time), Ollama and vLLM are within 5–10% of each other on tok/s — the GPU is the bottleneck, not the runtime. vLLM's advantage appears when you multiply the number of simultaneous requests. At 4 concurrent streams, vLLM aggregate throughput is roughly 3× a single stream's speed, because paged attention lets the KV cache be shared across streams. Ollama's single-request queue at 4 concurrent streams gives you the same 42 tok/s but one at a time, not concurrent.
Caveat: these numbers use different harnesses (Ollama's built-in server versus vLLM's continuous-batching mode) and different concurrency measurement methodologies. Treat them as an ordering, not a promise.
Where paged attention pays off
vLLM's paged attention treats the KV cache like OS-managed virtual memory: fixed-size blocks, allocation on demand, ability to share blocks across requests when contexts overlap. For a busy internal API serving many similar prompts (RAG-style workloads, agent frameworks with shared system prompts), this is a real memory-efficiency win — the same amount of VRAM serves more concurrent sessions.
For a single user, the condition paged attention was designed for never occurs. You issue a prompt, the model responds, you issue another prompt. There is no cross-request KV overlap to share. The overhead of maintaining the paged-attention data structures — a permanent ~1.5GB of VRAM allocation for a small model — is pure loss.
This is not a criticism of vLLM. It is a statement about what workload each runtime targets. Match the runtime to your workload.
Quantization matrix
Which quantizations each runtime accepts, and what fits on 12GB with an 8K context:
| Quant | Ollama support | vLLM support | 7B model VRAM | 12GB fit? |
|---|---|---|---|---|
| q2_K | Yes | No | ~2.8GB | Yes (Ollama) |
| q3_K_M | Yes | No | ~3.4GB | Yes (Ollama) |
| q4_K_M | Yes | No (needs AWQ 4-bit) | ~4.4GB (Ollama) / ~4.8GB (vLLM AWQ) | Yes (both) |
| q5_K_M | Yes | No | ~5.1GB | Yes (Ollama) |
| q6_K | Yes | No | ~6.0GB | Yes (Ollama) |
| q8_0 | Yes | Yes (via AWQ 8-bit) | ~7.4GB / ~7.8GB | Yes (both) |
| fp16 | No (llama.cpp: yes) | Yes | ~13.5GB | No (both) |
| AWQ 4-bit | No | Yes | ~4.8GB | Yes (vLLM) |
| GPTQ 4-bit | No | Yes | ~4.6GB | Yes (vLLM) |
| KV-cache quantization | Yes (q8 KV) | No (fp16 KV) | Saves ~50% KV | Yes (Ollama) |
Interpretation: Ollama's GGUF quantization ladder is deeper and better-suited to squeezing large models onto small GPUs. vLLM's AWQ/GPTQ 4-bit is competitive on VRAM but supports fewer variants. For 12GB owners running the largest checkpoint that fits, Ollama's flexibility usually wins.
Prefill versus generation at different context sizes
Same 7B model, same 12GB card, different context sizes:
| Context | Ollama prefill tok/s | Ollama decode tok/s | vLLM prefill tok/s | vLLM decode tok/s |
|---|---|---|---|---|
| 4K | 1200 | 47 | 1150 | 45 |
| 16K | 950 | 40 | 900 | 38 |
| 32K | 700 | 32 | 680 | 30 |
Both runtimes degrade similarly as context grows. Neither has a hidden advantage at large contexts on a single stream. The KV cache growth is the same physical constraint on the same GPU.
The hardware floor
For running either runtime on a 12GB card:
- GPU: MSI GeForce RTX 3060 Ventus 3X 12G. 12GB is the practical floor; 24GB unlocks larger checkpoints.
- CPU: AMD Ryzen 7 5700X. Enough cores to run the runtime, tokenizer, and web UI without contention.
- Hot storage: WD Blue SN550 1TB NVMe. Model swaps are frequent when experimenting; fast storage keeps that painless.
- Archive storage: Crucial BX500 1TB SATA SSD. Cheap capacity for checkpoints you use occasionally.
Neither runtime is fussy about hardware beyond the GPU itself. Both need a modest CPU, both benefit from fast storage on model swap, both are happy on Linux and mostly-happy on Windows. Docker on Windows works but adds a layer of complexity most single-user setups don't need.
Operational reality
Model management is where the two runtimes diverge most sharply in daily use.
Ollama: ollama pull qwen3:8b-instruct-q4_K_M, ollama run qwen3:8b, done. New models arrive frequently and installing them is a one-line command. The registry has quantized versions of essentially every popular open-weight model, curated for consumer-GPU fit. Model version pinning is straightforward.
vLLM: download the model from Hugging Face, put it in the right directory structure, edit a config file, restart the server. New models can require config edits and sometimes CUDA/PyTorch version updates. First-time setup for someone not familiar with the Hugging Face ecosystem is meaningfully harder. Once running, updates and swaps are similar in effort to Ollama.
What breaks after a runtime upgrade:
- Ollama: rarely anything. The GGUF format is stable and Ollama's backend upgrades are backward-compatible.
- vLLM: occasionally. CUDA-version-sensitive builds mean a system-wide CUDA upgrade can break the environment. Pin your CUDA and Python versions.
Verdict matrix
Run Ollama if… you're a single user, want the simplest possible setup, run one prompt at a time, need broad quantization support, and value a curated model registry.
Run vLLM if… you're building a shared endpoint, expect 5+ concurrent requests, want to squeeze the most throughput out of your GPU, or need adapter-based fine-tuning support.
Run both behind one proxy if… you have distinct workloads. Route interactive-chat requests to Ollama for lowest latency, and RAG/agent requests to vLLM for concurrent throughput. This is more setup but genuinely useful for a mixed workload.
Common pitfalls
- Running both simultaneously on the same 12GB card. Both allocate large VRAM chunks. You can OOM one by launching the other. If you must run both, pick different models or restrict each to a share of the GPU.
- Using vLLM's fp16 defaults on a 12GB card with a 7B model. Fits, but at 13GB — you'll OOM the moment context grows. Use 4-bit AWQ/GPTQ.
- Ollama's default 2K context on some models. Change it with the
num_ctxparameter or a modelfile. Default context surprises new users. - Not enabling flash-attention. Both runtimes benefit; both let you enable it. Cuts KV memory usage roughly in half at long contexts.
- Treating benchmark numbers as universal. Runtimes are sensitive to CUDA version, driver, kernel, and specific model. Measure on your setup with your prompts.
When NOT to run either
Skip both if you're doing light chat work with hosted APIs at reasonable per-token cost. The break-even math for running local inference doesn't tilt in favor of local until you're either serving high volume or you value privacy above cost. A $300 GPU + $150 CPU + rest of build for occasional chat use doesn't beat $10/month of hosted API pricing.
Bottom line
For a single user with a single RTX 3060 12GB in July 2026, Ollama is the correct default. It gives you comparable single-stream throughput to vLLM, dramatically simpler setup and model management, deeper quantization support for squeezing bigger models onto the card, and no memory overhead you're not using. vLLM earns its place when you need to serve concurrent requests through the same GPU — that's a real use case, but a small-team use case, not a solo one.
If your workload changes (you build an agent framework hitting the local endpoint 10x per minute, you serve a small internal team) revisit the choice. The setup is not a lifelong commitment.
Related guides
- Qwen 3.8 Open Weights: What Fits on a 12GB GPU
- Kimi K3 vs Qwen 3.8 for Local Coding Agents in 2026
- Ryzen 5 5600G vs Ryzen 7 5700X for a 24/7 LLM Server
- Best 27-inch 4K Monitor for PC and Console
Citations and sources
This piece is editorial synthesis based on publicly available information. No independent first-party benchmarking is reported.
