BFWR AI Tools
Runners

Ollama vs vLLM

Ollama serves one person well. vLLM serves many at once. The decision is not about quality or model support — it is about how many concurrent requests you have and whether the model fits entirely in VRAM.

The short answer

One question decides this: how many requests hit the model at the same time? For one user, Ollama is simpler, runs on any hardware and handles models larger than your VRAM by offloading to system RAM. For many concurrent users, vLLM's continuous batching and paged KV cache are worth an order of magnitude in aggregate throughput — but it needs a GPU big enough to hold the entire model, with no CPU fallback.

Ollama

One user, any hardware, models bigger than your VRAM.

vLLM

Many users, NVIDIA-class GPU, whole model resident.

Ollama vs vLLM at a glance

FactorOllamavLLM
Designed forA single local userConcurrent production serving
BatchingEffectively one request at a timeContinuous batching across many requests
KV cacheContiguous allocation per contextPagedAttention — block-based, shared across sequences
Model must fit in VRAMNo, it can offload layers to system RAMYes, plus room for the KV cache
FormatsGGUFSafetensors, AWQ, GPTQ, FP8
HardwareCPU, NVIDIA, AMD, Apple Silicon, IntelMainly NVIDIA; AMD and others supported with caveats
SetupAn installerPython environment, CUDA, configuration

Why concurrency changes everything

Generating a token means reading the model's weights out of memory. For one user, the GPU spends most of its time waiting on memory rather than computing, and the arithmetic units sit largely idle. That idle capacity is what batching reclaims: process several sequences together and you read the weights once for all of them.

Naive batching makes everyone wait for the slowest sequence in the batch to finish. vLLM's continuous batching adds and removes sequences as they arrive and complete, so the GPU stays full. This is the single largest source of its throughput advantage, and it is worth nothing at all when there is only one sequence.

PagedAttention handles the other half. A KV cache normally needs a contiguous block sized for the longest context the sequence might reach, most of which goes unused. vLLM allocates it in fixed blocks like virtual memory pages, so memory is used as needed and identical prefixes — a shared system prompt, for instance — can be shared between sequences instead of duplicated.

The hard constraint on vLLM

vLLM has no CPU offload path. The weights and the KV cache must fit in GPU memory, and if they do not, it will not start. There is no equivalent of llama.cpp's layer splitting, because the entire design assumes GPU-resident weights and a scheduler managing GPU memory blocks.

In practice that sets a floor on hardware. A 70B model at 4-bit needs roughly 43GB for weights alone, before any KV cache, which means multiple GPUs or a data-centre card. The same model runs on a 24GB consumer card under Ollama — slowly, with layers offloaded, but it runs.

It is also a heavier install. Ollama is one binary and a service. vLLM is a Python package with CUDA dependencies, version constraints and meaningful configuration: how much GPU memory to claim, maximum sequence length, tensor parallel size across cards.

A simple decision rule

If the model is answering you, or one person, use Ollama. Nothing about vLLM helps and several things about it hurt — the setup cost, the hardware floor and the inability to run models larger than your card.

If the model is behind an application with real concurrent users, use vLLM, assuming the model fits your GPU. The crossover comes earlier than people expect: even a handful of simultaneous users is enough for continuous batching to pay for itself.

The awkward middle — a small team, occasional concurrent use, consumer hardware — usually resolves to Ollama with a queue in front of it. Requests wait rather than failing, and you avoid both the hardware floor and the operational weight.

Choose Ollama when

  • You are the only user, or nearly
  • The model does not fit entirely in your GPU memory
  • You are on a Mac, a laptop, or anything that is not a big NVIDIA card
  • You want it working in five minutes

Choose vLLM when

  • Multiple requests arrive at the same time
  • You have a GPU that holds the whole model plus KV cache
  • Aggregate tokens per second across users is your metric
  • You need OpenAI-compatible serving with real production behaviour

Work it out for your own setup

Common questions

Can vLLM run GGUF?
There is partial support, but it works against the design. vLLM's advantages assume GPU-resident weights in a format its kernels are optimised for. If you are using vLLM, use safetensors, AWQ, GPTQ or FP8.
How many users before vLLM is worth it?
Lower than most people assume — a handful of genuinely simultaneous requests is often enough, because a single-user setup leaves most of the GPU's compute idle. The bigger question is usually whether your hardware can hold the model at all.
Is vLLM faster for one user?
Somewhat, on the same GPU, because its kernels are tuned for that hardware. But the gap for a single sequence is modest compared with the gap under load, and it does not justify the setup cost or the hardware floor on its own.
What about SGLang and TGI?
Both sit on the same side of the line as vLLM: GPU-resident batched serving. SGLang focuses on structured generation and prefix caching, TGI is Hugging Face's server. The decision against Ollama is the same for all three.

Guides that go deeper

Longer reads on the concepts behind this comparison.