ollama run llama3 gets a model answering questions in about thirty seconds, on a laptop, with zero configuration. That is a genuinely remarkable thing to be able to say about a large language model in 2026, and it is also completely irrelevant to a different question: what happens when 200 people hit that same model at once?
Those are two different engineering problems, and most “vLLM vs Ollama” content collapses them into one, as if the two projects were competing for the same job. They aren’t. This article covers what each one actually optimizes for, the two ideas — PagedAttention and continuous batching — that explain the entire performance gap under load, and a straight answer to which one you need for the workload you actually have.

What Ollama Actually Is
Ollama is a thin, well-designed operational layer over llama.cpp — Georgi Gerganov’s C/C++ inference engine, the same engine that made running LLaMA-family models on ordinary laptops practical in the first place. Ollama adds the parts that make it feel like a product rather than a research project: a CLI (ollama run llama3), a REST API, a model library of pre-quantized GGUF files you can pull by name, and a Modelfile format for customizing prompts and parameters.
That simplicity is the entire point, not a limitation to apologize for. llama.cpp can offload as many transformer layers to GPU as will fit (Metal on Apple Silicon, CUDA, ROCm, Vulkan) and run the rest on CPU, which is why Ollama runs acceptably on hardware that has no business running a modern LLM at all. It was designed around one machine, one user at a time, and it does that job better than almost anything else available.
What it was not designed around is a request scheduler. Ollama does queue concurrent requests, but there is no mechanism comparable to what’s described next — no iteration-level batching, no purpose-built memory manager for many simultaneous KV caches. That isn’t a bug; the entire design brief was “run a model with essentially no setup,” and every one of those decisions is correct for that brief.
What vLLM Actually Is
vLLM comes out of a research paper, not a product roadmap: “Efficient Memory Management for Large Language Model Serving with PagedAttention” (Kwon et al., UC Berkeley, published at SOSP 2023). The paper’s headline claim — 2-4x higher throughput than serving systems available at the time, such as FasterTransformer and Orca, at the same latency — came from solving one specific, unglamorous problem: GPU memory was being wasted on the KV cache.
PagedAttention is the fix. Every token generated needs the attention mechanism to reference a growing cache of key/value tensors for everything generated so far. Naive serving reserves one contiguous memory block per request, sized for the worst case, which means memory sits unused whenever the real output is shorter — and that unused memory can’t be reassigned to a different request without stopping and reshuffling everything. PagedAttention borrows the idea straight from operating-system virtual memory: split the KV cache into small, fixed-size blocks, allocate them on demand, and reference them indirectly through a block table. Waste shrinks to almost nothing, and — a secondary benefit that matters for things like parallel sampling or beam search — identical prefixes across requests can share the same physical blocks via copy-on-write.
The second piece is continuous batching — sometimes called iteration-level scheduling, an idea introduced by Orca (Yu et al., OSDI 2022) before vLLM productionized it at scale. Older serving systems form a batch, run every request in it to completion, and only then start the next batch — so a single long-running request holds the whole GPU batch hostage while shorter requests finish and their slots sit empty. Continuous batching schedules at the level of individual generation steps: the instant one sequence in a batch finishes, its slot is handed to the next waiting request, on the very next iteration. The GPU stays saturated instead of idling on stragglers.
Put those two together and the result isn’t “vLLM makes the model smarter or faster per token” — it’s “vLLM keeps far more concurrent requests in flight on the same hardware, with less memory wasted and less GPU sitting idle.” That is a throughput story, and it is the entire reason vLLM exists.
Getting Started With Each
Neither of these takes more than a few minutes to try, and running both side by side is the fastest way to feel the difference this article describes rather than just read about it.
Ollama — already shown above, one command pulls and runs a quantized model:
ollama pull llama3ollama run llama3 "Explain PagedAttention in one sentence"vLLM exposes an OpenAI-compatible API server out of the box:
pip install vllmvllm serve mistralai/Mistral-7B-Instruct-v0.2# now POST to http://localhost:8000/v1/chat/completionsThat single vllm serve command already gives you continuous batching and PagedAttention — there’s no separate flag to turn them on; they’re the engine’s default request path, not an opt-in mode. If you’re wiring the result into agent tooling — MCP servers or a coding assistant like the ones compared in AI Coding Agents in 2026 — that OpenAI-compatible endpoint is exactly what makes either engine a drop-in replacement for a hosted API, without touching client code.
The Real Trade-off
Neither engine is “better.” They’re optimized for different points on the same curve, and the decision comes down to one question: is your bottleneck the number of concurrent requests, or the operational complexity of running a GPU fleet?
- Prototyping and internal tools with a handful of users — Ollama wins on setup cost alone. There is no batching behavior to reason about because there is essentially no contention to manage.
- A customer-facing API serving many concurrent users — this is the scenario PagedAttention and continuous batching exist for. The gap between the two engines widens as concurrency rises; it is close to invisible at 1 request and large at 50.
- A multi-GPU fleet where cost per token matters — vLLM supports tensor and pipeline parallelism to spread a large model across GPUs, often on a managed Kubernetes GPU node pool (see GKE Autopilot vs Standard for how that scheduling choice plays out for GPU workloads specifically), and higher achievable GPU utilization translates directly into fewer GPUs needed for the same load.
- Edge devices or environments with no dedicated GPU ops team — Ollama’s CPU/GPU-offload flexibility and minimal footprint are the right fit; vLLM’s value proposition assumes GPU infrastructure you’re actively managing.
Quantization is where the two projects diverge in a way worth knowing before you commit to one. Ollama’s GGUF models (K-quants like Q4_K_M) are built for the CPU/GPU-split use case and are covered in depth in Quantization Explained: How to Run a 70B Model on Consumer Hardware — that article’s VRAM math applies directly to sizing an Ollama deployment. vLLM instead leans on GPU-first formats such as AWQ and GPTQ, which tend to be faster when the model fits entirely in VRAM, plus growing FP8 support on newer hardware. If you’re planning to serve a model you’re currently only running locally, that quantization format is one of the first decisions the migration forces on you.
Who Else Is in This Space
vLLM and Ollama are the two names that come up most, but they aren’t the only options, and it’s worth knowing where the others sit:
- Text Generation Inference (TGI), from Hugging Face, targets the same production-throughput niche as vLLM with its own continuous-batching implementation and a Rust-based serving core. A reasonable pick if your stack already lives in the Hugging Face ecosystem.
- SGLang, from the same research lineage as vLLM, adds structured generation and constrained decoding on top of a similarly optimized backend — relevant if your workload leans heavily on structured output or agentic tool-calling rather than open-ended chat.
- LM Studio and llama.cpp’s own bundled server sit closer to Ollama’s niche: local-first, single-user-oriented, with LM Studio adding a desktop GUI on top.
None of these change the underlying decision. They’re variations on the same two poles — optimized for concurrent throughput, or optimized for zero-friction local use — and the honest answer to “which one” starts with being honest about which of those two problems you actually have.
The Bottom Line
ollama run llama3 and a production inference endpoint serving 200 people are not the same engineering problem wearing different clothes — they’re genuinely different problems, and conflating them is why “vLLM vs Ollama” arguments so often talk past each other. Ollama’s entire value is refusing to force you to think about batching, scheduling, or GPU memory layout, and for a huge share of real use — prototyping, internal tools, small teams, edge deployment — that’s exactly the right trade to make. vLLM’s entire value is PagedAttention and continuous batching turning GPU memory and scheduling into something you actively manage, because at real concurrency that management is where the throughput comes from.
Most projects that matter end up using both, just not at the same time: Ollama while you’re figuring out whether the product works at all, vLLM once concurrent users are the thing standing between you and the next order of magnitude of scale. Picking based on which stage you’re actually in, rather than which name sounds more serious, is the whole decision.




From the community
Discussion on the Fediverse
Replies from Mastodon and Bluesky — straight from the open web, no tracking.
Loading replies …
No replies yet. Start the conversation:
Replies could not be loaded right now.