Serving Fine-Tuned LLMs on Serverless GPUs
Connor Blier
Founding GTM
Serving Fine-Tuned LLMs on Serverless GPUs
Once you own the checkpoint, three costs appear that a hosted API hides: loading the weights, picking a GPU that fits, and running many small models instead of one large one. In our testing a snapshot restore cut model startup from about 50 seconds to 2.25, and small task-tuned models held 150 requests per second each.
Fine-tuning is the easy half. The moment you have your own weights you leave the world of per-token API pricing and enter the world of capacity planning, and nothing about the training run prepares you for it. Serving fine-tuned llms on serverless gpu infrastructure raises exactly three questions that a hosted endpoint never asks you: how long do the weights take to load, which card do they fit on, and what happens when you have twenty of them instead of one.
Does a fine-tuned model need its own GPU?
Usually yes, and usually a smaller one than you expect. That is the whole economic case for fine-tuning: a task-specific model does one job at a size a general model cannot match.
The production example we measured is Distil Labs, who replaced large general models with small tuned ones and cut inference costs by 50% while accuracy rose from 83% to 92%. The accuracy number is the important one. Cost savings from a smaller model are only interesting if quality survives, and here it improved.
The size argument shows up directly in throughput. A Llama-3-8B served with TensorRT-LLM reaches around 1700 output tokens per second in FP8 on a single A10. Put the same workload on an H100 and you have bought headroom you are not using. Our published rates put the A100 80GB at $0.000592 per GPU-second against the H100 at $0.000953, so right-sizing is a real saving rather than a rounding error. Choosing the engine is a separate decision, and our vLLM, SGLang and TensorRT-LLM benchmark covers that comparison.
The weight-load tax, and how to stop paying it
Here is the cost a hosted API genuinely does hide. Your checkpoint has to reach GPU memory before it can answer anything.
| What you are paying for | Measured |
|---|---|
| Loading a Llama-3-8B into GPU memory | ~10 to 15 seconds |
| Full vLLM cold start on a g5.12xlarge | ~50 seconds |
| Restoring a 9 GiB memory snapshot from S3 | 2.25 seconds |
| Restoring the same snapshot from local NVMe | 9 seconds |
| Provisioning a new worker | 2 to 4 seconds |
Loading a model into GPU memory takes roughly 10 to 15 seconds on every start, and a full vLLM start is far worse. Snapshotting the process after the weights are resident changes the shape of the problem entirely: restoring from a 9 GiB checkpoint reduced startup to 2.25 seconds from S3.
Why that matters more for fine-tuned models than for anything else: you have many of them, each serving a slice of traffic, and each idle for most of the day. If start-up is 50 seconds you keep every one warm and pay for idle GPUs. If it is two seconds you scale each to zero, and new workers provision in 2 to 4 seconds when traffic returns.
Many small models, not one big one
This is the structural difference, and it is the one most serving platforms handle badly.
Distil Labs runs up to 150 requests per second per model during high-traffic periods, with multiple models deployed concurrently. That is not one endpoint under load. It is a fleet of endpoints, each with its own traffic shape, its own scaling curve and its own idle period.
Three consequences worth planning for:
Per-model autoscaling, not per-cluster. A shared pool sized for the busiest model wastes capacity on all the others.
Deployment speed becomes an iteration cost. You redeploy after every training run, so build times of 8 to 14 seconds are the difference between a tight loop and a coffee break.
Per-second billing does the accounting. Twenty models each busy 5% of the day is one GPU's worth of work spread over twenty endpoints, and only per-second pricing bills it that way.
The general version of this deployment problem is in our guide to deploying machine learning models, and if you are serving an open-weight model rather than your own tune, our DeepSeek-R1 walkthrough is the closest analogue.
Work out your own number
Measure weight-load time on your actual checkpoint, not the base model. Adapters merged into the weights change it.
Find the smallest card the model fits on at your batch size and precision, then price that card, not the one you trained on.
Multiply by realistic utilisation per model. With many endpoints, per-model idle time is the dominant term.
Decide warm or cold per model, using measured restore time rather than a platform default.
The full arithmetic for step 3 is in our tokens-per-minute cost breakdown. Current rates are on the pricing page; the figures here come from our published benchmarks and will drift, so re-derive before you budget against them.
The short version
Serving your own checkpoint costs weight-load time, a card decision and per-model idle. Snapshot restore took startup from about 50 seconds to 2.25 in our measurements, right-sizing from an H100 to an A100 is a 38% rate difference, and a fleet of small tuned models held 150 requests per second each while cutting cost in half against the general model they replaced.
Frequently asked questions
- Can I serve a fine-tuned or QLoRA model on serverless GPUs?
- Yes. Serverless GPU platforms serve your own checkpoint the same way they serve an open-weight model. The differences are operational: you pay the weight-load time on each start, and you usually end up with many endpoints rather than one.
- How long does it take to load a fine-tuned model into GPU memory?
- Roughly 10 to 15 seconds for a Llama-3-8B in our testing, and around 50 seconds for a full vLLM cold start on a g5.12xlarge. Restoring a 9 GiB memory snapshot instead reduced that to 2.25 seconds from S3.
- Which GPU should I serve a fine-tuned 8B model on?
- The smallest one it fits on at your batch size and precision. We measured around 1700 output tokens per second in FP8 for a Llama-3-8B on a single A10. Our published rates put the A100 80GB at $0.000592 per GPU-second against $0.000953 for the H100.
- Is it cheaper to fine-tune a small model than to call a large hosted one?
- It was for Distil Labs, who cut inference costs by 50% while accuracy rose from 83% to 92%. The saving comes from serving a smaller model, so it depends on whether your task tolerates one.
- What happens when I have twenty fine-tuned models instead of one?
- Per-model autoscaling and scale-to-zero become the deciding factors, because each endpoint is idle most of the day. Distil Labs runs up to 150 requests per second per model with several deployed concurrently.
Sources
- cerebrium.ai
“With Cerebrium, we reduced their inference costs by 50%, and increased accuracy from 83% to 92%, while keeping latency and reliability consistent at production scale.”
A production customer serving small task-specific models rather than one general model, with both the cost and the accuracy measured.
- cerebrium.ai
“Today, Distil Labs runs up to 150 requests per second per model during high-traffic periods, with multiple models deployed concurrently.”
The throughput that same customer sustains PER MODEL with several deployed at once, which is the shape a fine-tuning team actually ends up in.
- cerebrium.ai
“In this tutorial we will achieve ~1700 output tokens per second (FP8)on a single Nvidia A10 instance however you can go up to ~4500 output tokens per second on a single Nvidia A100 40GB instance or even ~19,000 tokens on a H100.”
What a small model does on a small GPU, which is the right-sizing argument in one number.
- cerebrium.ai
“This code will run on every cold start and takes roughly ~10-15s to load the model into GPU memory.”
The weight-load tax that a self-owned checkpoint pays and a hosted API does not.
- cerebrium.ai
“Restoring from a 9 GiB checkpoint reduced startup to 2.25 seconds from S3 and 9 seconds from local NVMe.”
What removes most of that tax: restoring a memory snapshot instead of loading weights.
- cerebrium.ai
“| NVIDIA A100 80 GB | 80 GB | $0.000592 | $0.000414 | $0.000694 | $0.001111 |”
The per-GPU-second rate for the class of card most fine-tuned models fit on.
- cerebrium.ai
“| NVIDIA H100 | 80 GB | $0.000953 | $0.000831 | $0.001097 | $0.001806 |”
The next card up, for the comparison that decides whether right-sizing is worth doing.
- cerebrium.ai
“- Build times - 8-14 seconds”
The iteration loop, which matters more when you redeploy after every training run.
- cerebrium.ai
“When either metric exceeds its threshold, Cerebrium automatically provisions new instances (workers) — typically within **2–4 seconds**.”
How fast capacity arrives, which is what makes per-model scale-to-zero viable when you are running many endpoints.