I run a 70B model for free and own no GPU. So where does the enterprise AI stack come in?

One AI application followed end to end from a solution architect’s chair: how a RAG tool runs without a GPU, what VRAM and quantization mean, what a GPU would and would not change, why token limits disappear, where Kubernetes fits, and the sizing worksheet, BOM and three-year cost an architect has to produce. Every term…

I run a 70B model for free and own no GPU — share image

Generative AI · Infrastructure · Kubernetes · Solution Architecture

One AI application, followed end to end from a solution architect’s chair: how it runs today without a GPU, what VRAM and quantization really mean, what a GPU would and would not change, why token limits disappear, where Kubernetes fits, and the sizing worksheet, bill of materials and three-year cost an architect actually has to produce.

The setup behind this post
DrJhaGPT Pro: a RAG tool over my own articles and manuals

Answers questions on VMware Cloud Foundation, Kubernetes and AI infrastructure by reading my content first, then writing an answer.

70Bparameters in the Llama model it uses
24×7always on, for anyone
$0what it costs me each month
0GPUs I own

I built a tool called DrJhaGPT Pro. It answers questions about VMware Cloud Foundation, Kubernetes and AI infrastructure by first reading my own articles and manuals, then writing an answer. The industry calls this pattern RAG, retrieval-augmented generation. It uses a 70-billion-parameter Llama model, runs 24×7, costs me nothing, and I do not own a GPU.

That contradiction bothered me. I design infrastructure for a living, and here was an AI application whose infrastructure I could not draw. So I asked the questions I would normally be embarrassed to ask in a customer meeting. This post is those questions, in the order I asked them, arranged along the lifecycle of one application.

This whole post

Inference

Using a model that already exists: you send it text, it sends text back.

In VMware termsRunning the VM that IT gave you. Every day.
A different project

Training / fine-tuning

Building or changing the model itself. 10 to 100 times the hardware.

In VMware termsBuilding the golden image from scratch, on a cluster. Rarely, and usually by someone else.

When someone says “you need an H100 for AI”, they are usually mixing these two up.

Map Start hereThe lifecycle of one AI application

A solution architect does not think in products; they think in phases with a deliverable at the end of each. Here is how the rest of this post lines up with that lifecycle. If you only read one diagram, read this one.

  1. Day 0 · DiscoverWhat does the business need, and what may the data never do?DeliverableRequirements sheet (the ten inputs)Question 8, Step 0
  2. Day 0 · DesignWhich layers exist, and what runs at each?DeliverableLayer diagram and product bill of materialsQuestions 1, 2, 3
  3. Day 0 · SizeHow many GPUs, how much memory, disk, power? What does it cost over three years?DeliverableSizing worksheet, hardware BOM, TCOQuestions 4, 5, 8
  4. Day 1 · BuildHow do the pieces get deployed and wired together?DeliverableKubernetes manifests, runbookQuestions 6, 7
  5. Day 2 · RunWho watches it, patches it, backs it up?DeliverableOperations modelQuestion 7 rules 5 to 8; Question 8 Step 8
  6. EvolveHow do we swap the model, add users, move to a second site?DeliverableRoadmapQuestion 9
In VMware termsDay 0 / Day 1 / Day 2 is the same vocabulary VCF uses: Day 0 is planning and design, Day 1 is the deployment itself, Day 2 is everything after go-live. An AI platform has exactly the same three days.

Q1 DesignIs a RAG tool “an application”? Where does it sit in the stack?

Yes. It sits at the top. An enterprise AI stack is a set of layers, and a RAG tool lives in the application layers and consumes everything underneath. Once I laid my own tool over those layers, the whole picture became obvious, and so did what I was renting rather than running.

Plain exampleRAG is an open-book exam. The student (the model) is not expected to remember everything; it is handed the right pages (retrieval) and asked to write a good answer from them (generation). The answer depends as much on finding the right pages as on the student.
LayerDrJhaGPT Pro todayFully open-source equivalent
LocationWhere it physically runs
RentedStreamlit Community Cloud + Supabase
Your own server, any Kubernetes
App / agent frameworkThe web page and the RAG logic
Own codeStreamlit, Python
Same, or Chainlit / Open WebUI
ModelsThe “brain”: the weights that write the answer
RentedLlama-3.3-70B via Groq, Gemini as failover
Llama / Mistral / Qwen / Granite / gpt-oss
Model servingLoads the brain, answers API calls
RentedGroq API (SaaS)
vLLM or Ollama, same API style
EmbeddingsTurns text into numbers for search
Own codefastembed, local on CPU
Same
Vector / search DBStores the numbers, finds the pages
Rentedpgvector on Supabase + a keyword index
pgvector on your own Postgres, or Milvus / Qdrant
Data pipelineRe-reads the website, refreshes the index
Own codeNightly GitHub Action
Same, or an Argo Workflows cron
IdentityWho can log in, which role
RentedSupabase Auth + role tables
Keycloak (or self-hosted Supabase)
Kubernetes / runtimeKeeps containers running and connected
RentedNone; Streamlit Cloud does it
K3s, OpenShift, VKS, NKP
ObservabilityMetrics, traces, prompt logs
MissingNone
Prometheus/Grafana + Langfuse
GuardrailsContent and policy filters
MissingNone
NeMo Guardrails (optional)
~60% open source, by codeSaaS: serving, DB + identity, hosting

By code, the tool is already about 60% open source. What is SaaS is the serving (Groq), the database and identity (Supabase) and the hosting (Streamlit Cloud). Keep that split in mind; it is the answer to almost every later question.

In VMware termsThe model server is your ESXi host: it is where the work actually happens. The model is the VM image. The vector database is the vCenter inventory search that finds the right object fast. Streamlit is the web client. Kubernetes is vCenter itself. Supabase and Groq are a cloud provider running some of those layers for you.
What the vendors sellUnderneath the branding, these are exactly this stack: GPU drivers, a model server (NIM or vLLM), a vector database (often pgvector), Kubernetes and a UI, pre-wired, validated and supported. When a customer asks what “Private AI” is, the stack above is the answer.
VMware Private AI Foundation with NVIDIANutanix Enterprise AIHPE Private Cloud AIDell AI Factory
Layered architecture diagram of a fully open-source RAG platform generated by the Enterprise AI Stack Builder
The self-hosted version of the tool, drawn layer by layer with my Enterprise AI Stack Builder (template: “Open-source RAG studio”).

A side note on “open source”

If your goal is “open source at every layer”, check the model licence. For an internal tool it rarely matters; for something you publish as “fully open source”, it does.

Open weights, with conditionsLlamaDownloadable and runnable, but the licence is not OSI-approved open source.
OSI open source (Apache-2.0)Mistral · Qwen · Granite · gpt-ossOpen source in the strict sense.

Q2 DesignHow is it running at all if I don’t have an A100 or H100?

Because the model is not running on my hardware. It is running on Groq’s.

1 · The userAsks a questionIn the browser, on my tool’s web page.
2 · My side (CPU only)Streamlit app
  • finds the relevant paragraphs in my index
  • tiny embedding model on CPU
  • bundles paragraphs + question into a prompt
3 · Groq’s data centreLlama-3.3-70BRuns on Groq’s own chips (LPUs, not even GPUs) and returns the answer as plain text.
question / prompt going outanswer coming back

When someone asks my tool a question, the app sends the prompt as text over the internet to Groq’s API. Everything heavy happens in their building. My side only runs the small pieces: the web page, the search over my index, and a tiny embedding model that is happy on a CPU.

Plain exampleI have been taking a metered taxi and wondering why I never needed to buy a car. The taxi is excellent. It is also not mine, and there is a meter.
In VMware termsThis is VMware Cloud on AWS. The ESXi hosts exist, they are just in someone else’s building and on someone else’s bill. My “vCenter” (the app) talks to them over the network exactly as if they were local.

Q3 DesignWhat do “VRAM” and “quantized” actually mean?

VRAM is the memory on a GPU card. To answer even one question, the entire model must sit in that memory at the same time. That is the whole constraint.

In VMware termsVRAM is host RAM, and the model is a VM with a fixed memory reservation. A VM reserved at 140 GB will not power on a host with 80 GB, no matter how idle the host is. Admission control says no.

What the “70B” actually is

The 70B in Llama-3.3-70B means 70 billion parameters. A parameter is one learned number inside the neural network; “weights” means the same numbers. The whole model is, quite literally, a very long list:

parameter 1              →   0.0134
parameter 2              →  -0.2841
parameter 3              →   1.7283
parameter 4              →   0.0047
   ...
parameter 70,000,000,000 →  -0.9182

Training is the process that finds those 70 billion values. Inference is using them. Nothing else is stored in the model file; when you download “the model” you are downloading this list.

Plain exampleA parameter is one dial on a mixing desk. The model is a mixing desk with 70 billion dials, each set during training. To play a song (answer a question) every dial must be present and set; you cannot leave half the desk in the cupboard.

How big is the list?

How many bytes you spend per number is called the precision. Models are trained and normally served at 16-bit (FP16 or BF16), 2 bytes each:

70,000,000,000 × 2 bytes ≈ 140 GB
48 GB card
80 GB card
FP324 bytes / param
≈ 280 GB
Training, scientific work; never for serving a 70B
FP16 / BF162 bytes / param
≈ 140 GB
“Normal” precision; how the model ships
FP81 byte / param
≈ 70 GB
H100/H200 native; small quality cost
INT81 byte / param
≈ 70 GB
Older quantization; still common
INT40.5 bytes · AWQ / GPTQ
≈ 35 GB
What most people mean by “quantized”

Pedantic but useful: 140 GB here is decimal gigabytes (140 × 10⁹ bytes). GPU spec sheets quote binary gibibytes; 140 GB is about 130 GiB. The gap is 7%, roughly the difference between “fits” and “does not fit” on a tight card, so keep the units straight.

No single card holds 140 GB. An A100 or H100 has 80 GB, so you need two, wired together, which is where the “you need A100s” folklore comes from.

The weights are only the first line of the memory bill

A common mistake is to stop here and say “I need a 140 GB GPU”. The weights are the fixed cost. Serving also needs memory that grows with use:

Model weightsKV cacheheadroom
Model weightsFixed: parameters × bytes (the 140 GB above)
KV cacheGrows with context length × concurrent users
ActivationsSmall, per request
CUDA + engineA few GB of fixed overhead
HeadroomKeep some, or the server rejects requests

The red block, the KV cache, is the one that decides the GPU count in real deployments. Question 8 puts numbers on it.

Quantization is storing each weight in 4 bits instead of 16: a rounded, compressed copy of the same model. You lose a little precision; in document Q&A it is usually hard to notice.

FP16 · 140 GB→INT4 · 35 to 40 GB+KV cache≈48 GB: one L40S or RTX 6000-class card
Plain exampleQuantization is saving a photo as a JPEG instead of RAW. Same picture, a quarter of the size, and you have to look very closely to see what was lost.
Not a different modelQuantization is the same model stored more compactly. You do not gain abilities and you do not lose knowledge; you trade a small amount of accuracy for fitting on one card.

Q4 SizeIf I buy a GPU, what will improve? How will it differ from today?

The answers will not get better. A GPU changes where the model runs and who controls it, not how good it is.

The answer I least expected
Groq API todaySelf-hosted on your own GPU
Answer qualityLlama-3.3-70BSame model, same answers
SpeedVery fast; Groq’s specialtyUsually slower unless you buy serious hardware
Your documentsLeave your network, go to GroqStay inside your network
LimitsFree-tier quotas and rate limitsWhatever the card can do, 24×7
Offline / air-gapNoYes
CostFree tier, then per million tokensCard + server + power + your time
Model upgradesGroq adds new modelsYou download and swap them
Who patches itGroqYou

So the honest reasons to self-host are four, and “better answers” is not one of them:

01Privacy and compliance

A client whose manuals cannot leave the building: DPDP Act, RBI, defence.

02No quotas

No per-minute or per-day caps; the card is yours around the clock.

03Offline operation

Air-gapped sites, or anywhere the internet is not guaranteed.

04Learning and credibility

An architect who has stood up Private AI end to end is a different profile from one who calls an API.

In VMware termsThis is the public-cloud-versus-own-data-centre decision you have made a hundred times. The workload is identical either way. You bring it on-prem for data residency, for predictable cost at high utilisation, or because the business wants control. Never because the VM will “run better”.

The break-even nobody shows you

Groq’s paid tier for a 70B model is on the order of $0.60 to 0.80 per million tokens (check the current price sheet; it changes). A single-GPU server with an L40S-class card is roughly $18,000 to 24,000, before power, cooling and the person who looks after it.

What is a token?Roughly three-quarters of a word. This paragraph is about 60 tokens. A million tokens is about 750,000 words, or eight to ten average novels. So “$0.70 per million tokens” means ten novels in and out for the price of a coffee.

How long would a $21,000 server take to pay for itself against the API bill it replaces?

5 M tokens / daya busy training team
API / month≈ $105
≈ 200 months (16+ years)
50 M tokens / daya department
API / month≈ $1,050
≈ 20 months
200 M tokens / daya product
API / month≈ $4,200
≈ 5 months

Most internal tools never get near the middle row. If the reason to buy is cost, do this sum first. If the reason is privacy, the sum does not matter, and that is a perfectly good reason.

RAG changes which model you need

Because a RAG tool hands the model the relevant paragraphs, the model does not have to know the answer; it has to read and write well. That lowers the bar considerably.

Chat over your own documents8B to 14BLlama 3.x 8B, Qwen 14B, Granite 8B. The facts come from retrieval; the model only phrases them.
Summarising a long manual14B to 32BNeeds to hold more context coherently.
Writing a lab guide from several sources32B to 70BSynthesis and structure benefit from size.
Reasoning across conflicting sources70B+ / reasoningThis is where the big models earn their memory.

An 8B model needs about 6 GB of VRAM quantized. That runs on a laptop.

Should I self-host? Five questions
  1. Must the documents or prompts stay on-prem by contract or regulation?
  2. Are you hitting API quotas every week?
  3. Do you need it to work offline or in an air-gapped site?
  4. Do you have someone who will patch and monitor it?
  5. Is the goal to learn and demonstrate the stack?
Two or more “yes”: self-host. Otherwise stay on the API and spend the money elsewhere.

Q5 SizeIf I buy a GPU, will I still hit token limits?

No. Token limits are a business rule, not a property of the model.

Groq is sharing a fixed pool of hardware among thousands of users. To stop one person hogging it, and to nudge people toward paid plans, they cap each key: so many requests per minute, so many tokens per minute, so many per day. When the limit “expires after a while”, that is simply their meter resetting. Paid plans raise the caps; they never remove them.

On your own card there is no meter. The only limit is physics: how much work the card can do per second. The experience flips:

GroqYour own GPU
Tokens per dayCapped by planUnlimited; run it 24×7
Requests / minCapped by planUnlimited, but requests queue behind each other
ResetsPer-minute and per-day windowsNo such concept
When it is busyError: rate limit exceededAnswers get slower; nothing is refused
In VMware termsA rate limit is a resource pool with a hard limit set by someone else. Your own GPU is a host with no limits, only a physical ceiling. On the shared pool you get “insufficient resources” errors; on your own host you get CPU ready time. Slower, never refused.

Two things feel like limits but are not quotas:

A memory ceiling

VRAM is finite

The conversations being processed also live in GPU memory, so a 48 GB card running a quantized 70B handles a few long conversations at once, not dozens. Push past that and the server queues or rejects the request.

It never “resets”, because it was never counting.
A time bill

Rented cloud GPUs

A rented GPU has no token limit either, but it has an hourly bill. You are limited by how long you leave it switched on.

Switch it off when you are done.
Plain exampleOwning the GPU is owning the car: go anywhere, any time, no meter. You just cannot carry more passengers than the seats you bought.

Q6 BuildWhere does Kubernetes come into this?

Self-hosted, my tool becomes five programs that must run all the time: the Streamlit app, the vLLM model server, Postgres with pgvector, Keycloak for login, and later Grafana and Langfuse. Each is a container, a packaged program. Something has to start them, restart them when they crash, connect them to each other, and put each one on a machine with the right resources.

That something is Kubernetes. If you know vSphere, you already know the model:

vSphereKubernetesRole
ESXi host→NodeA server that runs workloads
VM→PodThe unit that actually runs (one or more containers)
vCenter→Control planeHolds the desired state, schedules, heals
DRS→SchedulerDecides which node a pod lands on
HA restart→Deployment / ReplicaSet“Keep N copies running”; restarts a failed pod
VM-Host affinity rule→nodeSelector, taints“This workload must (or must not) run on those hosts”
Datastore→PersistentVolume (CSI)Disk that survives restarts: weights, database files
Port group / VIP→Service / IngressStable name and IP; the entry point from outside
OVF / Content Library→Image + Helm chartThe packaged definition of an app
DirectPath I/O→GPU device pluginHands a physical GPU to one workload
Host / Configuration Profiles→GitOps (Argo CD / Flux)Desired configuration in one place, drift corrected

You describe what you want in YAML (“one vLLM pod with one GPU, one Streamlit pod, a Postgres pod with a 50 GB disk, expose Streamlit on this hostname”) and Kubernetes makes it true and keeps it true. That is its entire job.

But you do not need Kubernetes yet

Start here

docker compose

One server and a training team. Same result with far less to learn; a first working version in an afternoon.

In VMware termsA standalone ESXi host managed through the host client.
When it earns its keep

Kubernetes

Several servers, automatic failover, many apps sharing the same GPUs, or one deployment that works on-prem and in cloud. Also the right thing to practise on.

In VMware termsvCenter with DRS and HA. Nobody buys it for one host; everybody buys it for the second.

Q7 Build and runWhat are the rules for running GPUs on Kubernetes?

Kubernetes does not understand GPUs out of the box. You add a few pieces once, then follow a handful of rules for every workload.

Setup, once per cluster

  1. 1GPU nodesServers with the cards, joined to the cluster, usually in their own node pool.
  2. 2NVIDIA driverOn those nodes.
  3. 3Container ToolkitLets a container see the GPU.
  4. 4Device PluginTells Kubernetes “this node has 2 GPUs” so it can count them.
  5. 5DCGM exporterGPU metrics into Prometheus.
  6. NVIDIA GPU Operator: installs 2 to 5 in one step

That is why the GPU Operator appears in every Private AI reference architecture, and why my stack builder warns you if you pick NVIDIA GPUs and Kubernetes without it.

In VMware termsThe driver is the VIB, the container toolkit is enabling passthrough on the device, the device plugin is vCenter learning the PCI inventory of the host, and DCGM is the GPU panel in Aria Operations. The GPU Operator is the equivalent of the NVIDIA vGPU Manager bundle that VCF installs for you in Private AI Foundation.

Eight rules for every GPU workload

1Ask for the GPU explicitly

No request, no GPU, even on a GPU node.

in the YAML below
2GPUs are whole units

One or two, never half; one GPU belongs to one pod. Sharing (time-slicing, MIG, NVIDIA Run:ai) is an add-on. Think vGPU profiles versus passthrough.

3Keep ordinary pods off GPU nodes

Taint the GPU nodes; only pods that tolerate it may land, or Postgres will occupy your $12,000 node while vLLM waits. A “must run on hosts in group” DRS rule.

in the YAML below
4Match the card

Label nodes by GPU type and use a nodeSelector; a quantized 70B must land on the 48 GB card, not the 24 GB one.

in the YAML below
5Weights need persistent storage

vLLM downloads 35 to 40 GB on first start. Put it on a PersistentVolume or the pod re-downloads after every restart.

in the YAML below
6One model server, not many replicas

One GPU, one vLLM pod; “scale to three” needs three GPUs. Scaling the CPU-only Streamlit pod is fine.

in the YAML below
7Internal Service, never the internet

vLLM has no authentication by default. It becomes http://vllm:8000/v1 inside the cluster; the app talks to it, the world talks to the app.

8Give it time to start

Loading 40 GB takes minutes; without a long startup grace period Kubernetes declares it dead and restarts it in a loop.

in the YAML below

Rules 1, 3, 4, 5, 6 and 8 in one place:

apiVersion: apps/v1
kind: Deployment
metadata: { name: vllm }
spec:
  replicas: 1                          # rule 6: one GPU, one server
  selector: { matchLabels: { app: vllm } }
  template:
    metadata: { labels: { app: vllm } }
    spec:
      nodeSelector: { gpu: l40s }      # rule 4: land on the 48 GB card
      tolerations:                     # rule 3: allowed onto the tainted GPU node
        - key: nvidia.com/gpu
          operator: Exists
          effect: NoSchedule
      containers:
        - name: vllm
          image: vllm/vllm-openai:latest
          args: ["--model", "<a 4-bit checkpoint of Llama-3.3-70B>", "--max-model-len", "16384"]
          resources:
            limits: { nvidia.com/gpu: 1 }   # rule 1: ask for the GPU
          volumeMounts:
            - { name: weights, mountPath: /root/.cache/huggingface }
          startupProbe:                # rule 8: minutes, not seconds
            httpGet: { path: /health, port: 8000 }
            failureThreshold: 60
            periodSeconds: 10
      volumes:
        - name: weights
          persistentVolumeClaim: { claimName: model-weights }   # rule 5

And the one line that changes in the application: the base URL that used to point at Groq now points at http://vllm:8000/v1. vLLM and Ollama both speak the same OpenAI-style API, so the rest of the code does not know the difference.

First-hour stumbleLlama weights on Hugging Face are gated. You must accept the licence on the website and give the pod a Hugging Face token, or the download silently fails and the pod restarts forever. Mistral, Qwen and Granite are not gated.
Kubernetes platform diagram for a single GPU cluster generated by the Hybrid Kubernetes Stack Builder
Everything around that one cluster: distribution, networking, storage, registry, backup, GitOps. Drawn with my Hybrid Kubernetes Stack Builder.

Q8 SizeWhat does a solution architect need to size and price this?

Everything above is the why. This section is the worksheet: the calculations I would put in front of a customer before a single purchase order. One worked example runs all the way through so the arithmetic is visible; change the inputs and the method stays the same.

In VMware termsThis is the same exercise as sizing a vSphere cluster from RVTools data. Count the VMs (users), their vCPU and RAM (tokens and context), the peak (concurrency), decide N+1, then pick hosts. The units are new; the discipline is the one you already have.

The chain to keep in your head

Every sizing conversation about an LLM platform, whether the vendor is NVIDIA, Nutanix, VMware or nobody, walks the same chain left to right. If you remember one line from this post, remember this one:

Model→Precision→Memory→Concurrency & context→GPU type & count→K8s scheduling→Serving engine→Endpoint→Application

Each arrow is a decision that constrains the next. Model and precision make the memory arithmetic. Concurrency and context make the KV cache arithmetic. Memory plus measured throughput gives the GPU count. The GPU count decides the node pool and scheduling rules. The serving engine (vLLM, NIM, NAI) turns the GPUs into a URL. The application only ever sees the URL.

How to answer it in a room

Someone asks: “how would you size GPUs for a 70B model?”

Weak answer

“70 billion times 2 bytes, 140 GB.”

MissingThe KV cache, concurrency, throughput, N+1.
Strong answer

“Parameter count and precision give the weight memory, about 140 GB at FP16 or 40 GB at 4-bit. I add the KV cache from context length and concurrent users, plus engine overhead. That total and a measured tokens-per-second figure at the target latency tell me whether it is one quantized card, two in tensor-parallel, or an 80 GB class GPU. Then N+1 and the node pool, and only then the software on top.”

Steps 1 to 8 below are this answer with numbers in it.
Step 0 · Discover: capture these ten inputs first
  1. Users and peak concurrent users (people mid-question at the same moment)
  2. Peak queries per hour and queries per day
  3. Tokens per query: input (system prompt + retrieved chunks + question) and output
  4. Longest context you must support (a 40-page manual pasted in is about 30,000 tokens)
  5. Latency target: first word within N seconds, full answer within M seconds
  6. Model(s) and precision, and whether you will keep more than one loaded
  7. Data classification: what may leave the network, what may not
  8. Availability: is downtime during patching acceptable? (decides N+1)
  9. Corpus size for RAG: documents, pages, growth per year
  10. Growth: users and tokens at 12 and 36 months
Worked example used in every step belowA 50-person training organisation
Peak concurrent20 users
Queries2,000 / day400 / hour at peak
Tokens per query3,000 in + 500 outprompt + 6 chunks + question
Longest context16,000 tokensoccasionally
Latency≤ 30 sfull answer
ModelLlama-3.3-70B4-bit
Corpus1,000 PDFsabout 300 pages each
Data ruleOn-prem onlydocuments may not leave
Users50one organisation

Step 1Tokens per day (drives the API comparison)

tokens/day = queries/day × (input + output)
2,000 × (3,000 + 500) = 7 million tokens/day ≈ 154 million/month (22 working days)

At about $0.70 per million tokens on a paid API that is ≈ $110 to 140 per month, ≈ $1,300 to 1,700 a year. Keep that number; it is the yardstick everything else is measured against.

Plain example7 million tokens a day is roughly 70 novels’ worth of text read and written every day. It sounds enormous. On a per-token price it is a coffee-shop bill.

Step 2GPU memory: weights

weights GB = parameters × bytes per parameter × 1.1 (runtime overhead)
PrecisionBytes / parameterLlama 70BLlama 8B
FP324≈ 308 GB≈ 35 GB
FP16 / BF16 (native)2≈ 154 GB≈ 18 GB
FP8 / INT81≈ 77 GB≈ 9 GB
INT4 (AWQ / GPTQ)0.5≈ 40 GB≈ 5 GB

These are the Question 3 figures with the 1.1 runtime factor applied, which is why 140 GB shows as 154 GB here. Use this table for sizing and the earlier bars for explaining.

In VMware termsThe weights are the VM’s memory reservation. It is claimed the moment the VM powers on and never given back. The 1.1 is the hypervisor overhead you always add.

Step 3GPU memory: the KV cache (the part everyone forgets)

Every conversation being processed keeps a running memory of its tokens on the GPU, the KV cache. Its size per token depends on the model’s architecture:

KV bytes per token = 2 × layers × KV heads × head dimension × bytes per value
ModelLayersKV headsHead dimKV / token (FP16)16k-token context
Llama-3.x 70B808128≈ 320 KB≈ 5.1 GB per conversation
Llama-3.x 8B328128≈ 128 KB≈ 2.0 GB per conversation
Plain exampleThe KV cache is the model’s short-term memory of this conversation. Every word read or written adds a sticky note to the desk. A long document and twenty simultaneous users means a very full desk, and the desk is the GPU’s memory.
In VMware termsThe KV cache is the VM’s active memory beyond the reservation, growing with the workload, like a database’s buffer pool filling up. Twenty conversations are twenty VMs all warming up their caches at once. Size for the peak, not the average.

For the worked example, 20 concurrent conversations averaging 3,500 tokens each:

20 × 3,500 × 320 KB ≈ 22 GB of KV cache

Step 4Add them up, pick the card

VRAM needed = weights + KV cache + ~2 GB headroom
40 + 22 + 2 = 64 GB

That does not fit on one 48 GB card. The options, in order of cost (bar = the card’s memory; black = weights, red = room left for conversations):

1× L40S (48 GB)Too small
8 GB left for KV after weights

About 7 concurrent at 3,500 tokens, or one 16k conversation.

2× L40S, tensor-parallel (96 GB)Chosen
About 54 GB for KV

About 48 concurrent average conversations, or about 10 at 16k. Fits with headroom.

1× H100 / H200 (80 / 141 GB)Fits, costly
About 38 / 99 GB for KV (bar shows the H100)

Faster, far more expensive per card, and needs a data-centre-class server.

Llama 8B INT4 insteadCheapest
5 GB weights + 9 GB KV on a 24 GB card

Cheapest by a mile, if the quality is acceptable for document Q&A.

Decision for the example

2× L40S. The KV cache, not the weights, made the decision. The most common sizing mistake I see: sizing for the model and forgetting the conversations.

Tensor-parallelSplitting one model across two cards in the same server so their memory adds up, like RAID 0 across two disks. Both cards work on every answer; you get their combined memory and most of their combined speed.

Step 5Throughput and latency (measure, don’t guess)

required aggregate output = peak concurrent × output tokens ÷ target seconds
20 × 500 ÷ 30 s ≈ 333 tokens/second across all users
In VMware termsTokens per second is IOPS; seconds to first word is latency. You would never size a storage array from a brochure IOPS figure without running your own IO profile against it. Same here.

A GPU’s real throughput depends on model, precision, batch size and context length, and the numbers change every quarter. Do not size from a vendor slide. Rent the exact card for an hour, load the exact model, and run vLLM’s own benchmark (vllm bench serve) with your token profile. If the measured aggregate tokens per second at your concurrency beats the required figure with 30% margin, the card count from Step 4 stands; if not, add GPUs or reduce the model. One hour of rental replaces a year of regret.

Step 6Storage

120 GBModel weights

40 GB × 3 versions kept, on fast NVMe: load time = read speed.

size per model × versions kept
4.5 GBVector database

600k chunks × (≈3 KB vector + 2 KB text) × 1.5. Provision 100 GB and stop worrying.

chunks × (dims × 4 B + text + metadata) × 1.5
5 GBSource documents

1,000 PDFs × 5 MB.

as-is
2.5 GBPrompt / trace logs

2,000 × 3,500 × 4 B × 90 days.

queries × tokens × ~4 B × retention days
250 GBBackups

MinIO or an existing S3-compatible target.

2 × (DB + docs + logs) + weights once
2 × 1.92 TBServer disks

NVMe, mirrored.

everything above × 2 for growth
Chunk and embeddingA chunk is one paragraph-sized piece of a document, about 300 words. An embedding is that chunk converted into a list of 768 numbers that captures its meaning, so the database can find “paragraphs that mean something similar to this question”. A library index card whose shelf number is 768 digits long.

The lesson: RAG storage is trivial. A million chunks is a few gigabytes. The only storage that matters for performance is the NVMe the weights load from.

Step 7CPU, RAM, network, power

256 GBSystem RAM

1.5 × 40 + 64 ≈ 124, rounded up to the next standard size.

≥ 1.5 × model weights + 64 GB
2 × 16-coreCPU

vLLM 8 to 16 cores; Postgres 4; Keycloak 2; observability 4; app 4; OS/K8s 4.

sum of the services
2 × 25 GbENetwork

100 GbE / InfiniBand is only for multi-node training.

25 GbE per inference node
1.2 kWPower

2 × 350 W + 500 W server, about 10,500 kWh a year.

L40S 350 W · H100 PCIe 350 W · H100 SXM 700 W
2URack

Standard 32 A feed. An 8-GPU HGX is 6 to 8U and about 10 kW: a rack-power conversation.

2U for a 2-GPU server
In VMware termsA 2-GPU inference server is a slightly fat vSAN ReadyNode. An 8-GPU HGX box is a different animal: one server drawing what a whole rack of ESXi hosts used to draw. Check the PDUs before you check the price.

Step 8Availability

One server means downtime for every kernel patch, driver update and model swap. If that is not acceptable, the BOM doubles (a second server, N+1) and Kubernetes starts to earn its keep: it drains one node while the other serves. For a training team a maintenance window is usually fine. For a customer-facing product, budget for two.

In VMware termsThis is HA admission control. One host is a lab. Two hosts with N+1 is production. GPUs do not change that rule; they only make each host more expensive, so the conversation happens earlier.

Step 9Software: what is licensed by what unit

LayerOpen-source route ($0)Commercial routeLicensed per
KubernetesK3s / RKE2 / upstreamOpenShift, VKS (inside VCF), NKPCore / socket / node
GPU softwareNVIDIA GPU Operator + vLLMNVIDIA AI Enterprise (NIM, support)Per GPU per year (list ≈ US$4,500)
GPU schedulingDevice plugin (whole GPUs)NVIDIA Run:ai (fractions, quotas)Per GPU
Vector DBpgvector / Milvus / QdrantZilliz Cloud, PineconePer vCU / per pod
IdentityKeycloakEntra ID, OktaPer user
ObservabilityPrometheus / Grafana / LangfuseDatadog, DynatracePer host / per GB
BackupVeleroVeeam Kasten, Portworx BackupPer node
GuardrailsNeMo GuardrailsVendor content-safety APIsPer call

For the example I take the open-source route everywhere and add NVIDIA AI Enterprise as an option line. It is what a customer buys when they want a phone number to call at 2 a.m., and it is what the VMware / Nutanix / HPE / Dell bundles include.

Step 10The bill of materials

#ItemQtyIndicative US$ (list)
12U GPU server, 2 × 16-core CPU, 256 GB RAM, 2 × 1.92 TB NVMe, 2 × 25 GbE, redundant PSU, 3-year warranty1$11,000 to 13,000
2NVIDIA L40S 48 GB2$19,000 to 21,000
3Rack, PDU, 25 GbE switch portsExisting / $1,200
4Linux + K3s (or RKE2) + NVIDIA GPU Operator$0
5vLLM + Llama-3.3-70B INT4 weights$0
6PostgreSQL + pgvector; Keycloak; Prometheus/Grafana; Langfuse; Velero; MinIO$0
7Application (Streamlit RAG app)Existing
Total hardware≈ $31,000 to 35,000
Options
ANVIDIA AI Enterprise subscription2 GPUs × 3 yr≈ $27,000 / 3 yrs
BSecond identical server for N+11≈ $31,000 to 35,000
COpenShift instead of K3s (for a supported platform)32 cores × 3 yrQuote

Step 11Three-year TCO versus the API

Self-hosted
open-source route
≈ $53k
Paid API
≈ $6k
Hardware$33,000 · API $0
Power10,500 kWh × $0.10 × 3 yr ≈ $3,200
Warranty / support≈ $2,400
People0.4 FTE × $12,000 × 3 yr ≈ $14,000 · API 0.05 FTE ≈ $1,800
Tokens154 M/month × $0.70 × 36 ≈ $3,900 · self-hosted $0
Add +$27,000 for NVIDIA AI Enterprise and +$33,000 for N+1. Self-hosting becomes cheaper only above roughly 70 to 90 million tokens per day at this hardware size ($53,000 ÷ 36 months ÷ $0.70 per million ≈ 2 billion tokens a month), more than ten times the example’s load.
TCO in plain wordsTotal cost of ownership is what the car costs you over three years including fuel, insurance, servicing and parking, not the showroom price. The API is a taxi: no purchase, no servicing, a small monthly bill. The sum above says the taxi is nine times cheaper for this family. It is still the wrong choice if the family’s rule is “nobody outside the house may see where we go”.
Read that chart honestly

For this organisation the API is roughly nine times cheaper. The self-hosted BOM is justified by exactly one input from Step 0, “documents may not leave the premises”, and nothing else. If that rule is real, $53,000 is the price of compliance. If it is not, buy nothing. A good architect writes both sentences in the proposal.

Step 12The cheap variant, for contrast

Same organisation, but the team accepts an 8B model for document Q&A after a two-week trial on the API. Weights 5 GB + KV 9 GB = 14 GB, so one 24 GB card (an RTX 6000-class workstation GPU, or one L40S with room for a second model). Server ≈ $7,000 to 11,000 all-in.

$53,0003-year TCO · Llama 70B · 2× L40S
−$32,000
$21,0003-year TCO · Llama 8B · one 24 GB card

The model choice moved the bill by $32,000; nothing else in the design changed. Run the quality trial before the sizing exercise, not after.

Architect’s checklist before the purchase order
  • Ten inputs from Step 0 signed off by the business, not assumed by IT
  • Model quality trial done on the API with real documents; size decided after
  • VRAM = weights + KV cache + headroom, at peak concurrency and longest context
  • Throughput measured on a rented identical GPU with vllm bench serve, 30% margin
  • N+1 decision written down with the maintenance window it implies
  • Three-year TCO side by side with the API, break-even stated in tokens per day
  • The one requirement that justifies self-hosting named in the first paragraph of the proposal
  • Licence units confirmed with vendors (core / GPU / node / user), never from a blog
  • Model licence checked (open weights vs open source) against how the tool will be distributed
  • Power, rack-U and network ports confirmed with the data-centre team

The Enterprise AI Stack Builder produces the product-level bill of materials (the “what”) for any design you click together; this section is the sizing behind it (the “how many”). Together they are the two halves of a solution document.

Q9 Run and evolveSo what would I actually do, and tell a client?

1 · KeepThe API for the live tool

It works, it is free at my volume, and the model quality is the ceiling for that model wherever it runs.

2 · Don’tBuy an A100 or H100

If you want hands-on experience, and in infrastructure you should, take one of the two cheap routes below.

3 · Self-host only forPrivacy, quota or offline

The change to the application is a base URL. The change to your life is everything else in this post.

Route 1 · free, 30 minutes

Ollama on your laptop

An 8B model that shows you the whole self-hosting flow. Weaker answers, fine for learning.

ollama run llama3.1:8b
Cost: $0
Route 2 · by the hour

Rent a GPU, run vLLM

The same quantized 70B as Groq, on hardware you control. Switch it off when done.

docker run --gpus all -p 8000:8000 \
  -v ~/.cache/huggingface:/root/.cache/huggingface \
  -e HUGGING_FACE_HUB_TOKEN=$HF_TOKEN \
  vllm/vllm-openai:latest \
  --model <a 4-bit AWQ/GPTQ checkpoint of Llama-3.3-70B> \
  --max-model-len 16384
Data stays in IndiaE2E Networks, Yotta, NxtGen, or AWS Mumbai g6e. RunPod and Lambda are the US-centric options.

When you do self-host: drivers, operators, storage, backup, monitoring, patching. That is not a complaint; that is the job, and it is the job infrastructure people already know how to do.

Day 2 and beyond: what “run” and “evolve” look like

Continuously
Watch GPU utilisation and memoryDCGM metrics in Grafana; alert when the KV cache is near full.
VMware equivalentAria Operations host dashboards
Weekly
Watch answer qualityLangfuse traces: which questions got poor retrieval, which answers users rated down.
VMware equivalentNone. This is new work.
Monthly
Patch OS, driver, KubernetesDrain the node, patch, rejoin. With one server that is a maintenance window.
VMware equivalentLifecycle Manager, rolling remediation
Quarterly
Swap or add a modelNew weights to the PersistentVolume, change one argument, restart the pod, re-run the quality trial.
VMware equivalentNew OVF in the Content Library
Nightly
Re-index the documentsThe data pipeline re-embeds changed documents.
VMware equivalentBackup job
Weekly / quarterly
Back up and test restoreVelero to MinIO: database, documents, config. Weights can be re-downloaded.
VMware equivalentBackup + DR test
As needed
Add users or a second siteStreamlit scales on CPU; the GPU is the bottleneck. A second site is a second server plus GitOps, where Kubernetes pays back.
VMware equivalentAdd a host; add a cluster
What I would tell a client

Put the layer stack from Question 1 next to the TCO from Question 8. Whether you buy a vendor “Private AI” bundle or assemble it yourself, you should be able to point at every layer and say what runs there, why, and what it costs over three years.

Try it yourself

Both diagrams in this post came from two free tools on this site. Load the “Open-source RAG studio” template and you are looking at the self-hosted version of the tool you just read about.

Glossary, with the everyday equivalent

TokenA piece of text about three-quarters of a word long. Models read, write and get billed in tokens.A million tokens ≈ ten novels
Context windowHow many tokens the model can hold in mind at once: question, retrieved paragraphs and answer combined.The size of your desk
InferenceUsing a trained model to produce answers. Everything in this post.Running the VM, not building the golden image
Parameter / weightOne learned number inside the model. “70B” means 70 billion of them.One dial on a 70-billion-dial mixing desk
PrecisionBytes spent per parameter: FP32 4, FP16 2, FP8 1, INT8 1, INT4 0.5. Fewer bytes, smaller model, slightly less accuracy.Image resolution
VRAMMemory on the GPU card. The whole model must fit in it.A VM’s reservation in host RAM
QuantizationStoring weights in fewer bits (4 instead of 16) so the same model fits in less VRAM.JPEG instead of RAW
KV cacheGPU memory a conversation occupies while processed, about 320 KB per token for a 70B model. Grows with users and context.Sticky notes on the desk
Tensor parallelSplitting one model across two or more GPUs in the same server so their VRAM adds up.RAID 0 for models
RAGRetrieval-augmented generation: find the relevant text first, then let the model write from it.An open-book exam
EmbeddingA list of numbers representing the meaning of a piece of text, so “similar” can be computed.A library card with a 768-digit shelf number
Vector databaseStores embeddings and finds the nearest ones fast: pgvector, Milvus, Qdrant.vCenter inventory search for paragraphs
Pod / NodeKubernetes’ unit of work and the server it runs on.VM and ESXi host
Taint / toleration / nodeSelectorKeep the wrong workloads off the GPU hosts and put the right ones on them.VM-Host affinity rules
CNI / CSIThe plug-in standards for Kubernetes networking and storage.NSX and vSAN drivers, vendor-neutral
GPU OperatorNVIDIA’s installer for drivers, container toolkit, device plugin and metrics on every GPU node.The vGPU Manager bundle, for Kubernetes
Open weightsDownloadable and runnable, but the licence carries conditions (Llama). Distinct from OSI open source.Freeware vs open source
N+1 / TCOOne more server than you need, so one can be down. TCO is hardware, power, licences, support and people over the system’s life.HA admission control · the car over three years

Disclosure: DrJhaGPT Pro is my own tool. Groq’s free tier, pricing and limits are as observed at the time of writing and change frequently; treat every dollar figure above as an order of magnitude, not a quote. Hardware and people costs are Indian list prices converted at roughly ₹85 to the US dollar. The KV-cache formula uses Llama-3’s published architecture and differs for other model families.

About The Author


Discover more from Journal of Intelligent Infrastructure

Subscribe to get the latest posts sent to your email.

Leave a Reply

Your email address will not be published. Required fields are marked *

Architect’s Toolkit

About the Author

Dr. Pranay Jha is a Cloud and AI Consultant with 18+ years of experience in hybrid cloud, virtualization, and enterprise infrastructure transformation. He specializes in VMware technologies, multi-cloud strategy, and Generative AI solutions. He holds a PhD in Computer Applications with research focused on Cloud and AI, has published multiple research papers, and has been a VMware vExpert since 2016 and a VMUG Community Leader.

Discover more from Journal of Intelligent Infrastructure

Subscribe now to keep reading and get access to the full archive.

Continue reading