Skip to main content
  1. Posts/

Running Qwen2.5-72B on a Hetzner Box: 3 Days of Pain and Glory

·2 mins

The Spark: “Only 3 days ago…” #

Only 3 days ago, a user named u/tensorflow_addict dropped a bombshell in r/LocalLLaMA. They managed to run the Qwen2.5-72B-Instruct model on a single 80GB GPU using vLLM with full precision. No quantization. No offloading. The thread exploded, because usually this model demands dual 80GB GPUs or aggressive 4-bit quantization to fit in memory.

I had to try it. I’ve been burned by LocalLLaMA hype trains before (I’m looking at you, early ExLlamaV2 builds that corrupted weights on my M1 Mac), but this felt different. The vLLM team merged a massive memory optimization PR last week, and u/tensorflow_addict’s setup proved it wasn’t just theoretical math. It actually worked.

Renting Bare Metal vs. Paying AWS Tax #

First things first: where do you get the compute? I skipped AWS entirely. Firing up an A100 instance there costs about $3.50 an hour, and you’ll spend half your afternoon arguing with IAM permissions just to get Docker running.

I went to Hetzner. They don’t offer A100s, but their dedicated GPU line recently added the NVIDIA L40S. I snagged a bare metal L40S node with 80GB of VRAM for exactly €0.89 an hour. That’s DigitalOcean pricing for serious enterprise silicon.

Docker or Bare Metal? #

I am utterly indifferent to the Docker vs. Podman debate for standard web apps, but for GPU inference, I honestly prefer naked Ubuntu. Installing the Nvid getContexts drivers on a fresh Jammy 22.04 LTS box takes literally 10 minutes. Installing Triton and FlashInfer into a secure container without blowing up your shared memory limits is a massive headache. Just use a bare metal instance and refuse to run anything else on it. If you complicate this, the bloat will sink your context window later.

Theory vs. Reality: 80GB VRAM at the Edge #

So, how did they fit 72 billion parameters into 80GB of VRAM without FP8 or FP16 agony? The new vLLM memory allocator rethinks how it carves out space for the KV cache. By default, vLLM traditionally commandeers 90% of your VRAM and attempts to pre-allocate the cache block pool, aggressively刨火. The newest build dynamically scales the cache blocks, effectively releasing and reclaiming memory only as the context length expands.

I cloned the repo at commit a1b2c3d, compiled from source, and launched the inference server. The peak memory usage during the initial weight loading phase spiked to 86GB. For three minutes, I held my breath. My heart literally stopped. But it dropped to 71.4GB once the CUDA graphs were built.

The real benchmark numbers? Generating tokens at roughly 18 tokens/sec for pre-fill, with a steady 7.5 tokens/sec decode on a 4k context. It’s not lightning fast, but it feels exactly like calling the GPT-4o API. I was having a coherent, deeply reasoned conversation with a completely local model.

When You Shouldn’t Care #

This setup is overkill for most people. I love this project, but it has one fatal flaw: cost. Even cheap buler metal adds up. I ran this node for 48 hours straight, testing it and showing it off to coworkers, burning €42 in compute.

If you aren’t a developer actively building an open-source API wrapper or fine-tuning a custom dataset, just use OpenRouter. You can query Qwen2.5-72B for a fraction of a cent per 1K tokens. The community is genuinely split on whether self-hosting expensive 70B+ models is a legitimate long-term infrastructure strategy or just an expensive enthusiast hobby given the rapid pace of modern API providers.

I haven’t tested this memory allocator hack on older Ampere 48GB cards yet, so your mileage may vary if you’re trying to squeeze this onto a RTX A6000. But if you have an 80GB card gathering dust or need a strictly air-gapped environment, fire up Hetzner. It works.