Review27 October 202611 min read

Ollama, llama.cpp and vLLM on one homelab GPU

Three ways to serve open-weight models from one machine with a single 24 GB graphics card. I ran each as the back end for my own tools and for a small shared chat.

Verdict
Ollama for one person; vLLM once a team shares the GPU.
Cost
All three are free. The cost is the box: one 24 GB GPU and 64 GB of RAM in this test.
Licence
Ollama: MIT. llama.cpp: MIT. vLLM: Apache 2.0.
What I tested
Install, first answer, switching models, four users at once, idle memory, one upgrade each.
Who it is for
Anyone choosing a local model server for a home lab or a small office.

Sample post: the layout, method and licences are real; the measured figures in it are sample values until Lance publishes his own runs.

The back of a server rack with green and grey network cables

Why I ran this test

I wanted one machine at home to answer requests from my editor, a few scripts and a chat page that three friends use. All three servers speak the same OpenAI-style API, so the client side did not change; only the server did.

Each server ran for a working week as the only back end. I kept notes on what broke, what I had to look up, and how the card behaved when more than one person was typing.

The test box

  • One 24 GB graphics card, 64 GB of RAM, a SATA SSD for model files.
  • Debian stable, Docker for anything that shipped an image.
  • An 8B instruction model as the daily driver, and a 32B model, quantised, for the hard questions.

Ollama

Ollama is the shortest path from nothing to an answer. One install, one ollama run, and the model downloads and loads. It swaps models on request and frees the card after an idle timeout, which suits a machine that does other work.

The limit shows with several users: requests share the card and everyone slows down together. For one person that never mattered.

llama.cpp server

Ollama is built on llama.cpp, and running llama-server directly gives you every flag Ollama hides: context size, batch sizes, parallel slots, which layers go to the GPU. It is the smallest and most predictable of the three, and the one I trust to run for months untouched.

The cost is attention. You pick the GGUF file, you set the slots ahead of time, and switching models means restarting the process.

vLLM

vLLM is a serving engine first. Continuous batching and paged attention keep many requests moving at once, which is exactly what the shared chat needed. It also reserves most of the card at start-up by design, so nothing else on the box gets the GPU.

Install is the hard part: the Python package, the CUDA version and the driver have to agree. The Docker image solves most of that.

Side by side

The same box, the same 8B model in each server’s preferred format, the same four-user script.

Ollamallama.cpp servervLLM
Getting it running
LicenceMITMITApache 2.0
InstallOne installer or a Docker imageBuild from source or a release binaryPython package or a Docker image; needs a matching CUDA stack
First model answeringOne command: ollama runDownload a GGUF file, then start llama-server with flagsStart the server with a Hugging Face model id
Model formatGGUF, pulled from its own library or importedGGUFHugging Face weights (safetensors), plus quantised formats such as AWQ and GPTQ
Running it day to day
Switching modelsLoads on request, unloads after an idle timeoutOne model per process; restart to switchOne model per server; run a second server for a second model
OpenAI-compatible APIYesYesYes
Four users at onceWorks; requests share the card and slow down togetherWorks with --parallel slots set ahead of timeBuilt for it: continuous batching keeps all four moving
Sample throughput, 4 users, 8B model~38 tokens/s each~41 tokens/s each~70 tokens/s each
Memory when idleFrees the card after the timeoutHolds the model until stoppedReserves most of the card up front by design
UpgradesInstaller or image; painless in my runsRebuild or new binary; flags change now and thenPin versions; CUDA and driver updates need care
Verdict
Best forOne person and quick trialsPeople who want every flag and the smallest footprintTeams sharing one GPU

Throughput rows are sample values for this layout, not measurements. Licences checked against each project’s repository.

What I would pick

For a laptop or a desktop that one person uses: Ollama, and do not think about it again. For a box that sits in a cupboard and serves one model to a few scripts: llama.cpp server with fixed flags. For anything that several people use at the same time: vLLM in Docker, with the versions pinned.

What I did not test

Multi-GPU setups, CPU-only serving, and image or audio models. Each deserves its own post.

Read the other posts or email me about this one.