HorizonLux · AI automation

Ship AI agents that reach production

Only about 5% of enterprise agents ever go live. We build the evaluation, routing and cost control that get yours there.

Book a free scoping call
Guides

vLLM vs Ollama: The Metric Where Ollama Looks Better

Two published benchmarks agree vLLM wins and disagree by 2.5x on the numbers. And there is one metric where Ollama beats vLLM outright, which turns out to be the clearest proof of the problem.

Ollama wins on inter-token latency because it queues requests, while vLLM keeps time-to-first-token low under load

TL;DR

Every comparison tells you vLLM wins on throughput, which is true and not very useful. Two things they leave out. First, the two most-cited benchmarks disagree by roughly 2.5x on vLLM's actual numbers, because they ran different hardware, versions and quantization, so neither figure transfers to your setup. Second, there is one metric where Ollama genuinely beats vLLM under load: inter-token latency. That looks like a win and is actually the clearest evidence of the problem, because Ollama keeps it low by making most of your users wait in a queue.

Key Takeaways

  • Ollama defaults to 4 parallel requests. Not a tuning oversight, a design choice for single-user work.
  • Red Hat measured 793 TPS for vLLM against 41 TPS for Ollama on an A100, with P99 time-to-first-token of 80ms against 673ms at peak.
  • A second benchmark on an RTX Pro 4500 put vLLM at 2,031 t/s, roughly 2.5x the Red Hat figure on nominally weaker hardware. Version and quantization differences dominate. Do not quote either number as "vLLM's speed".
  • Ollama wins on inter-token latency above ~16 concurrent requests, because throttling keeps its active batch small. The cost lands in TTFT instead.
  • Tuning Ollama does not fix it. At OLLAMA_NUM_PARALLEL=32 throughput still plateaus and ITL becomes erratic, which is head-of-line blocking.
  • Agent loops are where it compounds. A 20-step agent is roughly 60 to 80 seconds of inference on Ollama against 3 to 5 seconds on vLLM.
  • Four separate Ollama instances on four GPUs is a legitimate pattern for a small team, and almost nobody mentions it.

The number everyone quotes, and why it does not transfer

Search this comparison and you will get a throughput figure presented as fact. The two most-cited published benchmarks do not agree.

Red Hat Exxact
GPU NVIDIA A100-PCIE-40GB NVIDIA RTX Pro 4500, 32GB
Model Llama 3.1 8B Instruct Llama 3.1 8B
vLLM peak throughput 793 TPS 2,031 t/s (BF16), 4,870 (NVFP4)
Ollama 41 TPS 134 t/s single user
vLLM TTFT 80ms P99 at peak ~25ms (BF16), ~13ms (NVFP4)
Ollama TTFT 673ms P99 at peak ~500ms

A workstation card reporting 2.5x the throughput of an A100 is not a contradiction and neither benchmark is wrong. They ran different vLLM versions, different quantization, and different concurrency ranges. Red Hat used original uncompressed weights; the higher Exxact figures lean on NVFP4, which needs Blackwell and is not available on Ollama at all.

The useful conclusion is the ratio, not the number. Both put vLLM roughly 15 to 20 times ahead of Ollama on aggregate throughput, and both put Ollama's TTFT under load at 500 to 700ms against vLLM's 13 to 80ms. Those directions are consistent. The absolute figures are properties of a specific rig.

Worth knowing about the sources: Red Hat sells a vLLM-based inference server and Exxact sells GPU systems. Both have a reason to like the result they published. The reason to believe them anyway is that practitioners on r/LocalLLaMA reach the same conclusion independently, with no product to sell, and that thread ranks alongside both benchmarks.

Throughput against concurrency, showing vLLM scaling while Ollama stays flatTwo lines are plotted against increasing concurrent users. The vLLM line climbs steadily as concurrency rises, reaching a peak far above its starting point, because it batches requests continuously and adds new ones as compute frees up. The Ollama line rises briefly at very low concurrency and then flattens almost immediately, because it is configured by default to handle only four requests in parallel, so additional users queue rather than being served. A note explains that tuning Ollama to thirty two parallel requests lifts the plateau slightly but does not change its shape, and that the gap in the figure is aggregate throughput rather than the speed any single user experiences.Aggregate throughput as concurrent users riseconcurrent requests: 1 to 256tokens / secvLLM, scales with loadOllama, flat after ~4 parallelOllama tuned to 32 parallel: higher plateau, same shapeThis is total server capacity, not the speed one user feels. That distinction matters below.
Shape drawn from Red Hat’s published curves. The plateau is the design, not a misconfiguration.

The metric where Ollama wins

Here is the part almost every comparison omits, and it is the most interesting thing in the data.

Red Hat measured inter-token latency, the gap between successive tokens once generation starts. Above roughly 16 concurrent requests, vLLM's ITL rises while Ollama's stays low and flat. On that chart, Ollama beats vLLM.

Read it without context and you would conclude Ollama generates text more smoothly under load. That is true, and it is true for a reason that should stop you using it in production.

Ollama keeps ITL low by refusing work. With four slots, it only ever has a handful of requests in flight, so each one generates cleanly. Everyone else is in a queue, not being measured. vLLM's ITL rises because it deliberately batches many requests at once to maximise total output, and a bigger batch means slightly slower per-token generation inside it.

The cost of Ollama's approach appears in a different column: P99 time-to-first-token of 673ms against vLLM's 80ms, at peak. Users are not getting smooth generation. They are waiting to start.

Where each engine spends the user’s time, split between waiting to start and generatingTwo horizontal bars break a user’s total wait into two segments. For Ollama, a long segment represents time to first token at six hundred and seventy three milliseconds P99, spent queueing before anything appears, followed by a short smooth generation segment with low and stable inter-token latency. For vLLM, the time to first token segment is very short at eighty milliseconds P99, followed by a generation segment that is marginally less smooth because many requests are batched together. The figure notes that Ollama’s apparent advantage on inter-token latency is produced by the queue in front of it, so the metric it wins on is the metric that hides the waiting, and that a user experiences the sum of both segments rather than either one alone.The same total wait, split two waysP99 figures at peak throughput, Red Hat, A100, Llama 3.1 8BOLLAMAwaiting to start: 673ms TTFTsmooth ITLthis segment is the queue, and it is where the metric Ollama “wins” comes fromvLLM80msgenerating, slightly higher ITL under batchingstarts almost immediately, and the batch is why per-token pacing loosensA metric measured only on requests that are already running cannot see the ones queued behind them.That is the whole trick. Ollama looks smooth because most users are not in the sample yet.
If you benchmark only what is being served, a throttle looks like an optimisation.

Tuning Ollama does not close the gap

The obvious response is to raise the parallelism limit, and Red Hat tested exactly that. They set OLLAMA_NUM_PARALLEL=32, the highest value that stayed stable on an A100.

Two things happened, and the second is the important one.

Throughput still plateaued. Ollama's curve lifted but kept its shape, never approaching vLLM's near-linear scaling at any concurrency level.

Inter-token latency became erratic, with large spikes at higher concurrency. That is the signature of head-of-line blocking, where one stalled request holds up an entire batch. So the metric Ollama won at default settings is the metric that breaks when you tune it for the workload where winning would matter.

That is the honest end of the tuning argument. Ollama is not a throttled vLLM waiting to be unlocked. The architecture is different: vLLM's PagedAttention allocates KV cache in small pages on demand, and continuous batching pulls new requests in the moment compute frees up. Neither exists in Ollama, which is built on llama.cpp for a different job.

Where llama.cpp sits, because this is really a three-way

The comparison is usually framed as two engines. It is closer to two, one of which is a wrapper.

Ollama is built on llama.cpp. It adds model management, a REST API, an OpenAI-compatible mode and the one-command install. It does not replace the inference core. So the frequent claim that llama.cpp is faster than Ollama is not describing a different engine, it is describing wrapper overhead and the configuration surface Ollama hides. On the axis that matters here, concurrency, both sit on the same side of the line, because both inherit llama.cpp's execution model rather than vLLM's.

That leaves a genuine three-way, with one axis the vendor benchmarks do not mention: memory.

llama.cpp Ollama vLLM
Role inference engine llama.cpp plus a server separate engine
Weights GGUF GGUF HuggingFace, FP16/AWQ/GPTQ/NVFP4
Concurrency largely sequential 4 parallel by default continuous batching
KV cache quantization most aggressive, down to 4-bit inherits llama.cpp 8-bit, no 4-bit
VRAM, same quantized model lowest low highest
Configurability maximum, and manual deliberately limited high, and required

Practitioners in the r/LocalLLaMA thread raise the point both benchmarks skip: the llama.cpp family can run a given quantized model in less VRAM than vLLM, because it exposes more aggressive KV cache quantization, and vLLM's CUDA graphs claim memory of their own. If you are fitting a large model onto one modest card, that can settle the question before throughput becomes relevant at all.

The honest three-way, then. llama.cpp for maximum control and minimum VRAM, if you will accept manual work. Ollama for that same engine with the sharp edges removed. vLLM when concurrency is the constraint and you have the memory to pay for it.

Where the gap actually bites: agent loops

For a human reading a streamed reply, 25ms versus 500ms to first token is barely perceptible. This comparison sounds academic right up to the point you put an agent in the loop.

An agent making 20 sequential model calls pays the latency 20 times:

Stack Per step, 256 tokens 20-step agent, inference only
Ollama, single user ~2 to 4s ~60 to 80s
vLLM BF16 ~0.13s ~3 to 5s
vLLM NVFP4 ~0.05s ~1 to 3s

The difference between a minute and four seconds per agent run changes what you can build. This is the same compounding problem that makes agent memory and context engineering worth doing properly: anything paid per step gets multiplied by the loop.

One documented case in the Exxact write-up: an internal knowledge assistant on Ollama went from 3 second P95 latency at 3 users to over a minute at 40. Moving to vLLM on the same hardware brought it back under 2 seconds.

When Ollama is the right answer

The framing that treats this as a winner and a loser is wrong, and there is one deployment pattern that almost never gets mentioned.

Single developer on a workstation. Ollama installs in a minute, needs no containers, and the model management is genuinely better. For local prototyping the throughput conversation is irrelevant, because concurrency is one.

A small team with a GPU each. Four independent Ollama instances across four GPUs deliver roughly 148 t/s per user with zero contention, because nobody shares a queue. If your team is four researchers who each want a dedicated lane, that beats standing up shared serving infrastructure you then have to operate.

Anything where GGUF and simplicity matter more than throughput. Ollama runs GGUF via llama.cpp; vLLM serves HuggingFace-format weights and wants more configuration.

The crossover is not gradual. It arrives the moment more than about five people or agents share one GPU. For the local-desktop end of this decision, LM Studio vs Ollama is the more relevant comparison, and self-hosting vs API covers whether to run anything yourself at all.

Which to pick

Ollama if concurrency is one, or if each user has their own GPU, or if you are prototyping and want to be running in five minutes.

vLLM if more than a handful of users or agents share hardware, if you need predictable latency under load, or if you want NVFP4 and other quantization Ollama does not support.

Both, at different stages, which is what most teams actually do. The migration is an endpoint change and a model format conversion, not a rewrite. Frameworks like LangChain, LangGraph, CrewAI and AutoGen talk to both through the same OpenAI-compatible API, so agent code moves unchanged.

  • SGLang vs vLLM: the next decision up, once you have chosen production serving over a local runtime

Frequently asked questions

Is vLLM faster than Ollama?

For aggregate throughput under concurrent load, substantially. Red Hat measured 793 tokens per second for vLLM against 41 for Ollama on an A100, and a separate benchmark on an RTX Pro 4500 measured 2,031 against 134. For a single user on a local machine the difference is far smaller and Ollama is easier to run.

Why does Ollama have better inter-token latency than vLLM?

Because it limits itself to four parallel requests by default, so its active batch stays small and each running request generates smoothly. The users it is not serving are queued and are not in that measurement. The cost appears in time-to-first-token, which Red Hat measured at 673ms P99 against vLLM's 80ms.

Can I tune Ollama to match vLLM?

No. At OLLAMA_NUM_PARALLEL=32, the highest stable setting Red Hat found on an A100, throughput still plateaued well below vLLM and inter-token latency became erratic with spikes indicating head-of-line blocking. The difference is architectural, not configuration.

How many users can Ollama handle?

Roughly four concurrent requests at default settings, which is what it was designed for. Practitioner reports put noticeable degradation from about five concurrent connections upward. Beyond that, requests queue and time-to-first-token climbs.

Does it matter for AI agents?

More than for humans. An agent making 20 sequential calls multiplies per-step latency, so the same workload is roughly 60 to 80 seconds of inference on Ollama against 3 to 5 seconds on vLLM. Human readers barely notice a 500ms first token; a 20-step loop does.

Is llama.cpp faster than Ollama?

Not meaningfully at the inference core, because Ollama is built on llama.cpp. The difference is wrapper overhead and how much configuration Ollama hides. Both inherit the same execution model, so both behave the same way under concurrency, which is where vLLM separates from them.

Which uses the least VRAM?

The llama.cpp family, including Ollama, for the same quantized model. llama.cpp exposes more aggressive KV cache quantization than vLLM, which offers 8-bit but not 4-bit, and vLLM's CUDA graphs consume additional memory. If a model only just fits on your card, that can decide the choice before throughput matters.

Should I switch from Ollama to vLLM?

Only when you are sharing a GPU across more than a few users or agents. The switch is an endpoint change plus a model format conversion from GGUF to HuggingFace format, and agent code using an OpenAI-compatible client needs no changes.

Sources

Figures are quoted from the published benchmarks above, on the hardware and versions each specifies. They are not ours and they do not transfer to different rigs. Both publishers sell products in this space, which is noted in the article.

Related articles

More on guides from the HorizonLux team.

Ship AI agents that reach production

Only about 5% of enterprise agents ever go live. We build the evaluation, routing and cost control that get yours there.

Prefer email? [email protected]