Independent GPU performance engineering

You bought the GPUs.
You never got the performance you paid for.

We’ve optimized 30+ deployments for companies that own their GPUs but have no performance team. We find out why your inference is slow, fix it, and give you a report you can sign off on — with before/after numbers your own people can re-run. You don’t need to hire a CUDA specialist, and you don’t need to take our word for it.

Get a diagnostic Do we need another GPU? ▸ diagnostic first · target agreed up front
88.7%
Memory-bandwidth utilization measured on an already-tuned vLLM baseline — only 1.13× headroom left.
Qwen2.5-7B · RTX 4090 · FP16 · vLLM
1.44×
Throughput gain from FP8 weights alone, with no scheduler changes.
63.0 → 90.5 tok/s · batch 1
55.5%
Average prefix agreement between FP8 and FP16 output. This is the number most vendors leave out.
6 prompts · 5 diverged
Who we work with

You own the hardware. You don’t have a performance team.

We work with companies that bought GPUs through their budget process — and whose IT team runs the infrastructure but doesn’t do kernel- or bandwidth-level tuning. That is not a weakness: this skill is needed once or twice a year, not every day.

Built for

Manufacturing / industrial equipment

You own more of your own hardware than almost anyone — and have the least room to hire for it.

We’ve optimized: Qwen-32B on 2–4×A100, internal RAG — 30% less latency on similar hardware

Healthcare

Your data cannot leave the building. So “we work inside your environment” isn’t a bonus — it’s the condition.

We’ve optimized: Llama-70B on H100, medical document screening — 1.8× throughput, no new hardware

Legal & professional services

Every request reads dozens of pages. The pain sits in the first token, not in throughput.

We’ve optimized: long-document summarization on 70B models — time-to-first-token cut by a third

Insurance & financial services

Compliance signs off on the purchase, not on the performance. Nobody checks whether the cards are actually working.

We’ve optimized: batch claims screening on Qwen3-32B — +21–29% throughput at concurrency 64
01

“We bought it. It runs. It still doesn’t deliver what we were promised.”

The GPUs are in the rack, the model is serving. But under real load it doesn’t hold up — and nobody here can tell whether that’s the hardware, the model, or a setting.

02

“Our vendor’s answer is always: buy another card.”

That was already the answer last year. We would rather know whether the money we have already spent is doing its job.

03

“We can’t hire for this. The salary band doesn’t exist here.”

A machine-learning performance engineer costs $200,000–400,000 a year — and even if we approved that, our pay structure tops out far below it. This is a service we can buy. It is not a position we can fill.

04

“Nobody here can sign off on whether it’s actually fixed.”

Someone tried something once. It felt faster. That is not a result you can take to management.

If you already have a dedicated inference performance engineer — full time, with time to spare, and authorised to sign the result off — you probably don’t need us. We will say so on the first call.

What we do

Three stages. You can stop after the first one.

The diagnostic is valuable on its own — it tells you how much headroom is actually left, and whether it is worth acting on.

STAGE 01

Diagnostic

We measure your current state as it actually runs — hardware, stack, model, real workload. You get a reproducible baseline and a reachable target.

  • ★ A report you can sign off on
  • Reproducible baseline
  • Bottleneck, identified and evidenced
  • A reachable target, in numbers
STAGE 02

Optimization

Fix the bottleneck, verify each change individually. Nothing ships on a hunch, and every gain is reported next to its cost.

  • ★ Before/after numbers you can re-run
  • The measuring scripts, handed over to you
  • Correctness tested, not assumed
  • Miss the target → this stage is free
STAGE 03

Ongoing support

Load changes, models change, the next card purchase comes around. We keep the numbers current and answer the question that actually costs money.

  • Re-tuning when load shifts
  • Adaptation for new models
  • “Buy another card — or not?”

What it costs — and what it replaces

Doubling your GPU count is not a small line item: an 8×A100 node runs around $48,000 and an 8×H100 node around $240,000 — before procurement time and downtime.

We charge as one project against one outcome. If we don’t reach the agreed target, we don’t charge for that stage.

The physical limit

You are not compute-bound. You are bandwidth-bound.

Generating a token at batch size 1 reads every weight exactly once. So the ceiling on a single stream is pure physics — not a framework trick.

max throughput (tok/s) = memory bandwidth ÷ bytes moved per token ≈ bandwidth ÷ model weights
Qwen2.5-0.5B · transformers · FP16 5.1%
Qwen2.5-7B · transformers · FP16 56.6%
Qwen2.5-7B · torch.compile · FP16 67.0%
Qwen2.5-7B · vLLM · FP16 88.7%
Qwen2.5-7B · vLLM · FP8 weights 73.4%
Qwen3-32B · vLLM · INT4 (AWQ) 83.8%

Memory-bandwidth utilization at batch size 1, RTX 4090 (1008 GB/s peak). Row 5 is the point: FP8 lowers utilization while raising throughput — because each token moves fewer bytes. That is the only lever left.

Measured, not estimated

Our numbers, with the card, stack and precision attached.

Every row was produced on a single RTX 4090 at batch size 1. Published so you can try to disprove them.

Model Stack Precision tok/s @ batch 1 Bandwidth Verdict
Qwen2.5-0.5BtransformersFP16 55.15.1% overhead-bound
Qwen2.5-7BtransformersFP16 40.256.6% headroom
Qwen2.5-7BvLLMFP16 63.088.7% at the wall
Qwen2.5-7BvLLMFP8 W 90.573.4% 1.44×
Qwen3-32BvLLMINT4 AWQ 47.083.8% KV-limited

All rows: RTX 4090, batch size 1, identical script for before/after. Measuring scripts ship with every report.

The finding nobody else publishes

Same flag. Same card. Same vLLM version. Two completely different outcomes:

Qwen2.5-7B · KV-cache FP8 GSM8K 89.23% → 1.14% PPL 7.15 → 77.62 Qwen3-32B · KV-cache FP8 PPL 7.2987 → 7.3229 (+0.33%) +21–29% throughput @ concurrency 64

On the 7B model it destroyed the model — GSM8K output became random digits, and it ran faster because the output was garbage. On the 32B model it was near-lossless. vLLM’s own FP8 KV-cache validation covers Hopper and Blackwell; Ada (sm_89) is outside that scope.

So the right question is not “is FP8 KV-cache good?” but “will it break the model on this card, this model and this engine build?” — and that question does not have a search answer.

Research

The measurements in full, methodology included.

Why Is My vLLM Inference Slow? A Bandwidth-Wall Analysis

A tuned vLLM baseline reaches 88.7% of peak memory bandwidth. Once you are there, only 1.13× remains — and the way forward is smaller weights, not scheduler tuning.

why is my vLLM inference slow · 8 min

FP8 Quantization for LLM Inference: The Real Accuracy Cost

Everyone says FP8 is “effectively lossless.” Our token-level comparison found 5 of 6 prompts diverging, with an average prefix agreement of 55.5%.

FP8 quantization accuracy · 11 min

KV-Cache Quantization Doesn’t Always Help (Measured)

One flag destroyed a model and left another untouched. Why the official validation probably doesn’t cover your GPU — and how to check it yourself in 20 minutes.

KV cache quantization · 9 min
FAQ

Questions we get asked, with the measured answers.

Is FP8 quantization lossless for LLM inference?

No. On Qwen2.5-7B with vLLM on an RTX 4090 we measured GSM8K falling from 89.23% to 88.17% and wikiText perplexity rising from 7.15 to 7.20. Comparing token by token across 6 prompts, 5 of 6 diverged from the FP16 baseline, with an average prefix agreement of 55.5%. A small but real cost — and a larger one than “lossless” suggests.

Does FP8 KV-cache quantization help?

It depends on the GPU, model and engine build — and the outcome can be catastrophic. The same flag, same card, same vLLM version: on Qwen2.5-7B, GSM8K collapsed from 89.23% to 1.14%. On Qwen3-32B, perplexity was essentially unchanged (+0.33%) with 21–29% more throughput at concurrency 64. vLLM’s own validation covers Hopper and Blackwell; Ada (sm_89) is outside that scope.

How much can you improve a deployment that already runs vLLM?

We measured 88.7% memory-bandwidth utilization on an already-tuned vLLM FP16 baseline — 894 GB/s out of a 1008 GB/s peak. Once you are at the bandwidth wall, the only remaining lever is making the weights smaller; scheduler tuning buys you nothing.

Do you need access to our production environment?

No. All work runs in a test environment. If you prefer, we work entirely inside your network so no data leaves it. We sign NDAs, and the access method — SSH, VPN, jump host, remote desktop — is your call.

What if the optimization doesn’t reach the target?

The target is agreed during the diagnostic stage and attached to the contract. If the optimization stage does not reach it, we do not charge for that stage.

Already running vLLM, and you do have a performance engineer? We still find headroom others miss — our measurements show where.

Tell us what’s slow. We’ll tell you whether it’s worth fixing.

A short call is usually enough: model, card, current performance. If we don’t see room to improve, we say so — even though that means no project for us.