All 6 data centres operational

Paid in crypto · No identity check · Root access in under 5 minutes

Practice guide · 11 min read

Serving Llama 3.3 70B on one node.

From a machine delivered five minutes ago to an OpenAI-compatible endpoint answering requests — with the two flags that quietly halve your throughput and the one that gets you compromised.

The short answer

Memory needed
43 GB at 4-bit, 82 GB at FP8, 164 GB at BF16 — all at 8k context
Simplest machine
One 80 GB card. No sharding, no interconnect, no synchronisation
Time to first token
Under fifteen minutes from delivery, most of it downloading weights
The one mistake
Publishing port 8000 on a public address. It has no authentication

What you need

70 billion parameters. At 4-bit that is 35 GB of weights; the KV cache adds 2.5 GB at 8k context for a single request, and the runtime overhead about 15%. Everything else follows from those three numbers — the sizing guide shows where they come from.

Memory needed for Llama 3.3 70B, by precision and context
PrecisionWeights Total at 8kTotal at 32kTotal at 128k
BF16 / FP16Reference quality 140 GB 164 GB 173 GB 207 GB
FP8Near-reference, Hopper and Blackwell 70 GB 82 GB 86 GB 103 GB
4-bit (AWQ, GPTQ)Smallest weights, cache stays FP16 35 GB 43 GB 52 GB 86 GB

Note the 4-bit row at 128k: the weights shrink to 35 GB but the cache does not shrink at all, because AWQ and GPTQ quantise weights only. That single fact decides most of the machine choice below.

Choosing the node

The cheapest machines in our catalogue that hold this model on a single card, which is the configuration you want if you can have it — no sharding means no synchronisation and one less thing to debug.

Nodes that hold Llama 3.3 70B on one card
NodePrecision that fitsCard memoryEstimated tok/sPer month
NVIDIA RTX A6000PCIe 5.0 · 768 GB/s 4-bit (AWQ, GPTQ) 48 GB ~10 $286/mo
2 × NVIDIA RTX A6000PCIe 5.0 ×16 · 768 GB/s 4-bit (AWQ, GPTQ) 48 GB ~10 $597/mo
NVIDIA L40SPCIe 5.0 · 864 GB/s 4-bit (AWQ, GPTQ) 48 GB ~11 $714/mo
NVIDIA A100 PCIePCIe 5.0 · 1,935 GB/s 4-bit (AWQ, GPTQ) 80 GB ~25 $1,091/mo

Throughput is single-stream generation, bounded by memory bandwidth, and deliberately conservative. With continuous batching the aggregate across concurrent requests is several times higher — that is the whole point of vLLM.

Ten minutes of setup

Nothing here is specific to us except the address. Docker, the NVIDIA container toolkit and a working driver stack are already on the machine.

Confirm the machine, then give the weights somewhere to live
$ ssh root@203.0.113.42
$ nvidia-smi --query-gpu=name,memory.total --format=csv

# Weights on the fast local NVMe, not the system volume.
$ mkdir -p /scratch/models
$ df -h /scratch

# A gated model needs a token. Skip if yours is open.
$ export HF_TOKEN=hf_xxxxxxxxxxxxxxxxxxxx

Starting the server

One container. The first run downloads roughly 40 GB of quantised weights, which on a 1 Gbit/s port takes a few minutes; every restart afterwards is seconds.

vLLM, single card, 4-bit
$ docker run -d --name vllm --restart unless-stopped \
    --gpus all --ipc=host \
    -v /scratch/models:/root/.cache/huggingface \
    -e HF_TOKEN="$HF_TOKEN" \
    -p 127.0.0.1:8000:8000 \
    vllm/vllm-openai:latest \
    --model casperhansen/llama-3.3-70b-instruct-awq \
    --quantization awq_marlin \
    --max-model-len 8192 \
    --gpu-memory-utilization 0.92

# Watch it load. "Application startup complete" is the signal.
$ docker logs -f vllm
First request
$ curl -s http://127.0.0.1:8000/v1/models | head

$ curl -s http://127.0.0.1:8000/v1/chat/completions \
    -H 'Content-Type: application/json' \
    -d '{"model":"casperhansen/llama-3.3-70b-instruct-awq",
         "messages":[{"role":"user","content":"In one sentence: what is a KV cache?"}],
         "max_tokens":80}'

The flags that matter

--max-model-lenSet it to the context you servevLLM reserves KV cache for the declared maximum. Declaring 131072 when you serve 8192 throws away sixteen times the memory you need, and the symptom is "not enough concurrency", not an error.
--gpu-memory-utilization0.90 to 0.95The fraction of the card vLLM may claim. Everything it does not claim is wasted; leaving the 0.90 default on a dedicated machine costs you real concurrency. Do not go above 0.95.
--ipc=hostRequired, not optionalWithout it the container's shared memory is capped at 64 MB. On a single card you may get away with it; on a sharded model NCCL hangs with no useful error.
--tensor-parallel-sizeOnly when the model does not fitSharding a model that fits on one card makes it slower. See the interconnect guide — this is the single most common way to make an expensive node underperform a cheap one.
--kv-cache-dtype fp8Halves your cacheOn Hopper and Blackwell. Doubles the context or the concurrency you can hold, at a quality cost that is usually not measurable. The easiest win on this list.
--max-num-seqsCap it to your real concurrencyLeaving it at 256 on a machine serving eight users means vLLM plans for 256 and admits requests it cannot hold, which shows up as latency spikes rather than refusals.

Not publishing it to the world

The OpenAI-compatible API has no authentication by default. Bound to 0.0.0.0 on a public address it is an open inference server, and scanners find those in hours. Note the -p 127.0.0.1:8000:8000 in the command above — that leading address is what keeps it off the internet, and it is the single character most often dropped when copying a command from elsewhere.

Reach it from your own machine over an SSH tunnel — no port opened, no certificate to manage, nothing to misconfigure:

From your laptop
$ ssh -N -L 8000:127.0.0.1:8000 root@203.0.113.42

# Now http://127.0.0.1:8000 on your laptop is the server.

If it genuinely must be public, put a reverse proxy in front with TLS and an API key, and restrict the source addresses in the firewall as well. The documentation has a minimal ruleset. Belt and braces is the correct posture for an endpoint that will answer anyone who asks.

Getting the throughput up

In the order worth trying. The first two are free and usually give the largest gains.

  1. Lower --max-model-len to your real context. Almost always the biggest single win, and it costs nothing you were using.
  2. Raise --gpu-memory-utilization to 0.95. This is a dedicated machine; there is nothing else on the card to leave room for.
  3. Turn on FP8 KV cache if the card supports it. Doubles what you can hold.
  4. Batch on the client side. Continuous batching only helps if requests arrive concurrently. One-at-a-time requests leave most of the card idle whatever you configure.
  5. Then, and only then, consider a faster card. Generation is bounded by memory bandwidth, so an H200 at 4,800 GB/s is roughly 2.4× an H100 PCIe at 2,000 for the same model — a real gain, and the most expensive one on this list.
Measure before and after — do not guess
$ docker exec vllm python -m vllm.entrypoints.openai.api_server --help | head -1
$ docker exec vllm vllm bench serve \
    --model casperhansen/llama-3.3-70b-instruct-awq \
    --num-prompts 200 --request-rate 8

# And watch the card while it runs: if utilisation sits below 90%,
# the bottleneck is your client, not the GPU.
$ nvidia-smi dmon -s um

Keeping it running

Three things worth doing on the first day, because all three are annoying to discover on the fourteenth.

Restart policy

--restart unless-stopped is in the command above. After a reboot the container comes back and the weights are already on /scratch, so it is up in under a minute.

Watch the card, not the process

A GPU that has fallen off the bus keeps a healthy-looking container. nvidia-smi -q -d PERFORMANCE in a health check catches it; a port check does not.

Weights are not backed up

They are on your local NVMe and nowhere else. That is fine — they are re-downloadable. Your fine-tuned adapters are not, so put those somewhere off the machine.

And when the term ends, the disks are erased within the hour with no grace period. Everything on /scratch goes with it. That is deliberate — it is the same promise that guarantees the machine you were given had nobody else's data on it — but it means the last day of a term is not the day to start copying things off.

Check this model against every node we rent.

The configurator reports which configurations hold it on a single card, which have to split it, and what each costs.

Sign in

Console, invoices and out-of-band access.

No account yet?

There is no separate sign-up. Your account is created while you place your first order — you choose the email and the password on the payment step, and the console is open by the time the machine is.

Configure a server

Language