← all posts
// hardware · rack-server

Rack server or tower for local LLMs?

Somebody buys a used rack server because the price per core is absurd, wheels it home, and finds out on first boot that the fans sound like a jet taxiing right past their desk. That's not rare, it's a rite of passage on every homelab forum: the compute was never the problem, the room was.

Density, remote management, and PCIe lanes no consumer board matches at the price are real advantages, which is why ten years of enterprise gear collapses to bargain prices once nobody wants a loud 2U chassis near a desk. The price fell for a reason, and that reason follows the box home.

The chassis you inherit, not the one you chose

A rack board's idle floor was built for a room where nobody notices another circuit; a tower's idle floor was built for a desk right next to your ear, a gap no spec sheet will show you. GPU fit is the other trap: consumer cards expect airflow across an open bench, server chassis expect blower-style cards instead, and a triple-slot card either won't close in a 2U case or cooks itself for lack of room to breathe.

Where the rack wins outright is lights-out management: IPMI or iDRAC lets you power-cycle, reflash, and watch POST remotely, where a tower's answer to a hung server is walking over to it. The chassis-specific tuning matters more than the spec sheet, see what holds a DL380 back once you drop an H100 into it.

Decide what you're actually optimizing before you order anything

None of that matters until you know what the hardware is for. Stop treating the model as the unit you're optimizing and start treating the completed task as the unit: evidence in, an answer out, something checks it, and the rest of the machine stays responsive.

Before you touch a launch flag or swap a case, write down what has to get better:

  • time to first token
  • accepted jobs per hour
  • how many models you can keep resident at once
  • energy per completed task
  • how often you have to fix the output afterward

"Make it faster" protects nothing. It won't tell you when the job is done, or whether the answer got worse on the way there.

Pin everything, then run it cold and warm

Pin the model artifact, tokenizer, prompt template, runtime build, launch command, and sampling settings, then test against a small set of real-workload inputs, including the awkward ones. Run once cold, nothing resident, because that's the path a real user hits first, then run warm long enough to expose cache effects, queueing, memory pressure, and thermal behavior.

Price the whole platform, not just the CPU and GPU: rails, cooling, the circuit it sits on, the room it heats, and whether the board and PSU support the accelerator you want. VRAM math is unforgiving regardless of chassis, worth working through before you commit to a card, see the offload arithmetic.

Record phase-level timings, not one total:

PhaseWhat it exposes
Queue waitcontention before generation starts
Model load or activationcold-start tax on every swap
Prefillwhat the prompt length costs
Time to first tokenwhat a user sits through
Decode ratesteady-state throughput once flowing
Peak RAM, VRAM, power, swapwhether you're inside budget
Quality pass, retry, abstain, repairwhether speed kept the answer honest

Raw tokens per second is diagnostic, not the product result. For a batch job, count valid completed records per hour; for coding, add review and correction time; for chat, watch p50 and p95 time-to-first-token across real conversation lengths, not one warm best case.

What keeps working while it quietly gets worse

Here's the failure a benchmark won't show: local runtimes keep working too well. Layers offload to CPU, a cache misses, a kernel falls back to a generic implementation instead of the one built for your card, and the server still answers. Nothing crashes, nothing warns you. Check the startup log, watch where each tensor landed, and confirm the fused kernel is active for your real context length and shapes, not the example in the docs.

Change one variable at a time unless you're comparing two whole systems, and rerun the quality gate every time: quantization, context compression, and sampling changes can make output faster and quietly worse in the same breath. A shorter answer isn't automatically complete, and a faster extractor isn't automatically producing more valid records. Weigh operational cost too: startup, upgrades, rollback, rebuilding after a disk dies. A five-percent win resting on an undocumented patch or a hand-warmed cache is a bad trade for anything you plan to run for a year.

The rule that holds up: buy the platform you can operate every day without thinking, not the one that wins one benchmark run. Write the decision down with the workload, the date, and the reason, plus what should force a retest, new model family, driver update, longer context, another user, different traffic. Then leave headroom past the target: spare memory for prompt variance, spare queue for a batch job, and thermal margin for the one night everyone hits it at once.

So before you commit to either box: measure idle draw and noise floor in the room you'd use it, confirm your candidate GPU physically clears the chassis, and check whether the board gives real lights-out management if it's going somewhere you can't walk to. Answer those three first. Everything else is pricing rack units.

#rack-server#workstation#homelab