Every AI vendor demo makes self-hosting a language model look like a checkbox. Rent a GPU, run one command, done. I built a controlled GPU lab to get hands-on with the failure modes that actually show up in self-hosted inference — version compatibility, storage behavior, model serving, and quantization — before running into them on a client timeline. So I rented a GPU for a weekend, set out to run an open-source AI model two different ways, and compare a full-precision version against a compressed one. It took a lot longer than "one command," and every single detour taught me something worth knowing before I'd ever recommend this path to a client.
Here's the honest version of how it went — bugs, dead ends, and the numbers that actually surprised me.
The setup, in plain terms
The goal: take one open-source AI model (a 7-billion-parameter model called Qwen2.5), run it through two different serving engines — vLLM and SGLang, two widely used open-source model-serving frameworks — and compare a standard version against a compressed ("quantized") version. Same hardware, same questions, real numbers instead of marketing claims.
Why does this matter for a business owner who isn't touching a GPU themselves? Because "run AI on your own infrastructure instead of sending your data to a third-party API" is a real, increasingly common ask — for data privacy, for cost control at scale, or just because a client doesn't want their customer data flowing through someone else's black box. Knowing exactly where the sharp edges are is the difference between a smooth engagement and a client watching me debug in real time.
Snag #1: The cloud GPU market is a maze, and the sticker price lies
Renting a GPU sounds simple until you're comparing a dozen providers, each with wildly different pricing models, storage fees, and fine print about what happens when you stop an instance overnight. I picked RunPod after comparing total cost across realistic usage scenarios, not just the advertised hourly rate — and even then, hit two separate infrastructure surprises that no pricing page mentioned:
The cheaper "Community Cloud" tier can vanish out from under you. I paused my work overnight to pick it back up the next day, and the host that had my GPU simply wasn't available anymore — reclaimed by someone else, because peer-hosted capacity isn't guaranteed the way dedicated infrastructure is. Total loss: about an hour of setup work and a lesson in reading the fine print on "budget" cloud tiers.
"Fast storage" isn't always fast, and you can't tell until after you've paid. The next tier up gave me a storage volume that turned out to be network-attached instead of a local solid-state drive — no error, no warning, just installs and model loads running five to ten times slower than they should. The only way to find out is to check after the fact. I now check this in the first sixty seconds on any new machine, before doing any real work.
Neither of these is a "gotcha" — it's just how cloud infrastructure actually works, and it's exactly the kind of thing that eats a client's budget when nobody's checked for it ahead of time.
Snag #2: The version-mismatch bug that could eat half your day
This is the one I'd tell a room full of engineers about, because it's a perfect example of a whole category of infrastructure bug: two pieces of software that both claim to be compatible, and technically are — just not with each other, not right now, not by default.
Both serving engines I was testing had, as of a recent release, quietly switched their default installs to expect a newer version of NVIDIA's CUDA platform than the GPU driver on my rented machine actually supported. The error message pointed at a missing file. My first fix — reinstalling the underlying math library with an older, compatible version — didn't work, because both serving engines also ship their own separately pre-compiled, highly optimized GPU code, built and locked to that same newer version independently of everything else. I had two things to fix, not one, and the second one wasn't obvious from the error message at all.
The eventual fix looked different for each tool — and this is specifically what worked on the RunPod image I was using that day, not universal installation advice. CUDA defaults and driver versions shift release to release, so treat the exact commands as a snapshot of one environment rather than a recipe to copy blindly. On that box, vLLM's newest release had made the jump; pinning to the last release built against the older, compatible CUDA line solved it in one line:
uv pip install "vllm<0.20"
# resolves to vllm 0.19.1, pulled in against torch 2.10.0+cu128 —
# the last combination still matched to the driver on this box
SGLang needed the opposite move on that same machine — forcing a newer, matching CUDA-tagged build of torch and its own compiled kernels back into alignment, using the sequence from its own install docs rather than the default one:
pip install --upgrade pip
pip install torch==2.11.0+cu129 --index-url https://download.pytorch.org/whl/cu129
pip install sglang[all] --find-links https://flashinfer.ai/whl/cu129/torch2.11
pip install sgl-kernel --find-links https://flashinfer.ai/whl/cu129/torch2.11
Neither was hard once understood. Both were genuinely confusing until then.
Snag #3: The disk that said it had a quadrillion bytes free, then ran out
Midway through, an install failed with a "disk quota exceeded" error — on a drive that, according to the standard disk-usage command, had over a thousand terabytes free. That's not a typo. The network storage system was reporting the capacity of its entire shared cluster, not my actual allotted slice of it.
The real fix was mundane once I found the right tool to actually measure what I was using: cleared out about 40GB of redundant package-download caches — leftover debris from the CUDA version debugging above, where I'd downloaded the wrong version, then the right version, and never cleaned up the wrong one — and the install went through immediately.
The part that actually mattered: what quantization really buys you
All of the above was friction on the way to the actual question: does compressing an AI model (a technique called quantization, which shrinks how much space each of the model's internal numbers takes up) actually help, and where?
Both engines expose an OpenAI-compatible API, so the same test prompts and the same client code worked against all three configurations. Standing up the standard vLLM server looked like this:
vllm serve Qwen/Qwen2.5-7B-Instruct \
--served-model-name qwen2.5-7b-instruct \
--dtype bfloat16 \
--max-model-len 8192 \
--gpu-memory-utilization 0.85 \
--enable-auto-tool-choice --tool-call-parser hermes \
--host 0.0.0.0 --port 8000
Swapping in the quantized weights for the comparison run was a one-flag change — no separate build, no different server:
vllm serve Qwen/Qwen2.5-7B-Instruct-AWQ \
--served-model-name qwen2.5-7b-instruct-awq \
--quantization awq_marlin \
--max-model-len 8192 \
--host 0.0.0.0 --port 8000
And the SGLang side, same model family, its own server process on a different port so both could be benchmarked back to back:
python3 -m sglang.launch_server \
--model-path Qwen/Qwen2.5-7B-Instruct \
--served-model-name qwen2.5-7b-instruct \
--dtype bfloat16 \
--context-length 8192 \
--mem-fraction-static 0.85 \
--host 0.0.0.0 --port 30000
Once a server was up, a plain curl against the standard OpenAI chat-completions endpoint was enough to sanity-check it before running the full benchmark:
curl -s http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model": "qwen2.5-7b-instruct", "temperature": 0,
"messages": [{"role": "user", "content": "Explain KV cache in three sentences."}]}'
The answer was more interesting than a flat "yes":
That last number is the one that surprised me. A model file roughly a third the size loaded in the same amount of time as the full-size one — because the compression format needs an extra repacking step at load time, and that overhead essentially cancels out the benefit of having less data to read. Compression helped exactly where I'd expect (less memory, faster ongoing responses) and did nothing where intuition says it should (faster startup). That's a genuinely useful, non-obvious thing to know before recommending a quantized model to a client who's optimizing for how fast their system comes back up after a restart versus how fast it responds during normal use.
Why I do this kind of lab work
None of this was client work. It was deliberate practice — the same reason a contractor test-fits a tricky joint on a scrap piece of lumber before it's load-bearing on someone's house. I'd rather find the CUDA version trap and the phantom disk quota on my own dime, in my own lab, than in the middle of a client's timeline.
If your business is weighing whether to run AI tools on your own infrastructure — for privacy, for cost control, or just to stop depending on a third party's uptime — that's exactly the kind of decision where it helps to have someone who's already found the landmines.
Thinking about self-hosted or private AI for your business?
Let's talk through whether it's actually the right fit — and if it is, what it really takes to do it well.
Talk With Jeff