When vLLM belongs in a home lab
Don't run vLLM for one person typing into a chat box. Qualify that fast, though: "one person" and "one request at a time" are not the same thing, and plenty of home GPU boxes carry more overlapping load than their owners notice. Continuous batching earns its complexity once requests genuinely stack up on the accelerator, a chat session and a background completion daemon and someone else's overnight job all reaching for the same card in the same few seconds. Strip that overlap out and you're paying serving-stack overhead to answer one prompt at a time, a job a plainer runner handles with far less to babysit.
The shared GPU is where this makes sense
My reference point is a 24 GB Linux box that several developers actually hit at once. Nothing exotic, no lab conditions, no claim that this setup generalizes to yours. Before touching a config flag, write down the job: interactive chat, code completion, document extraction, an overnight batch. Decide what "good" means for that job, because the metric that matters for a chat session, time to first token, is close to irrelevant for a batch run nobody is watching in real time. Then test what concurrency actually trades against: installation cost and idle memory on one side, real concurrent throughput and tail latency on the other, same inputs every run, launch command saved next to the result.
job: the one workload you're actually optimizing for
concurrency: requests that genuinely overlap, not headcount
latency: cold start, warm, and p95 (medians hide the pauses)
memory: idle footprint vs. peak under real concurrent load
verdict: keep, revert, or retest after the next driver bump
Include a cold start whenever a human will hit one for real, and run long enough for heat or queueing to show up. Medians describe the typical request; the slow tail is what a user actually complains about, so keep both in the record, along with notes on setup friction and noise. Those costs decide whether the thing survives past week one.
Loaded is not the same as fast
The trap I see most is a datacenter-shaped stack bolted onto a machine that serves one prompt at a time. It boots. The logs look clean. Someone declares victory. But "it loaded" is not a performance result, and "the answer looked fine" is not an evaluation. Check the runtime logs and the OS-level memory and GPU metrics instead of trusting the flag you passed at launch, because the two disagree more often than the documentation suggests. Change one variable per run and be able to state why you expect it to move the number, or you're not benchmarking, you're collecting anecdotes with timestamps attached. Watch the maintenance side too: a fragile five-percent win evaporates the moment a model, driver, or runtime version shifts, and a serving stack has more parts that can shift than a single-model runner does. If you're unsure which camp your workload falls into, Ollama in daily use is the honest baseline, paired with an honest look at what the card in front of you can actually carry. Keep a small script, a handful of representative prompts, and a plain-text result file. That's enough to retest after an upgrade without building an observability platform for a box under your desk.
The one thing I won't skip
Choose vLLM because the workload has sustained concurrency. Never as a badge of seriousness. Test the smallest change first, leave real headroom on the card for the model you'll want to try next month, and stop tuning the moment latency and quality both clear the bar you wrote down before you started.