The GPU cluster as a platform: turning a shared cluster into a multi-tenant service your teams can consume
Contents
TL;DR
Having an expensive GPU cluster and many different workloads that want to use it is not an infrastructure problem: it is an internal product problem. What separates “we have a cluster” from “we have an inference platform” are four layers the market consolidated in 2026: a gateway layer that centralises authentication, routing and policies (LiteLLM, Portkey, Kong AI Gateway); a GPU isolation model appropriate to the tenants’ profile (MIG hardware isolation for untrusted multi-tenant, MPS for processes from the same team, time-slicing only for dev); a quota and rate limiting system with budgets per tenant/team/project (LiteLLM does this in its core at team/user/api-key level with descriptive 429s); and a multi-tenant observability plane that enables real cost attribution (showback as an intermediate step, chargeback as the destination), per-tenant tracing and differentiated dashboards. Applied to a typical mid-scale GPU cluster (one node with 4-8 H100 SXM and NVLink, a common place to start in production), this translates into concrete decisions: with ~640 GB of aggregate VRAM across 8 GPUs and two typical production models (a large 70B+ model with tensor parallel and a replicated mid-sized model), the cluster serves between tens and low hundreds of simultaneous sessions depending on the mix; GPU isolation is usually resolved with MIG on smaller workloads and per-model dedication on large ones; and the platform’s success metric is effective utilisation, which in typical production sits at 30-40% and where the reasonable optimisation target is to push it to 60-70% without degrading SLAs.
This is the fifth post in the MLOps for LLMs series. It is the most operationally oriented one and cuts across several pipeline stages (Deploy + Observe plus cross-cutting concerns). The “you are here” marker flags the two active stages because the notion of a multi-tenant platform does not live in just one.
You are here: Deploy + Observe (the cluster as a product)
The question that changes the framing
When a platform team buys expensive GPU hardware and starts building inference, the first version is almost always single-purpose: one model, one client, one target latency. It works. When the second team turns up asking for the same resource, that single purpose becomes internal politics: how many replicas do we give them? What do we do if the SLAs clash? Who pays for the tokens of team B’s experiment? And when the third one arrives, what was an SRE project becomes an internal product project.
The distinction is not technical, it is one of framing. A cluster is infrastructure. A platform is a service with customers, contracts and success metrics. The change of framing implies:
- Identifiable customers (tenants), not anonymous users.
- Contracts (latency SLA, guaranteed throughput, available models), not “whatever we manage”.
- Success metrics that are not technical but product ones: adoption, satisfaction, cost per query per tenant, time to the first “hello world”.
This post walks through how that change of framing is carried out. It lands it on a mid-scale cluster (4-8 H100 SXM with NVLink in a single node), the usual configuration when starting with serious LLM inference; but the principles generalise to any topology, from a single node with two GPUs to multi-node clusters with InfiniBand.
The four layers of a multi-tenant inference platform
The canonical architecture that settled in 2026 has four layers that any serious multi-tenant platform implements, from the outside in:
Each layer solves a concrete problem. Let us take them one by one.
Layer 1 — AI Gateway: the single front door
The AI Gateway is the component your tenants see. It is an HTTP/gRPC API compatible with OpenAI (typically /v1/chat/completions, /v1/embeddings, /v1/models) that centralises everything that happens before touching the inference backends.
Why centralise
Without a gateway, tenants connect directly to vLLM or whatever the model is. Every change (rotating an endpoint, adding a model, changing credentials, applying a policy) means notifying every tenant. Every tenant has its own retry logic, its own logging, its own auth model. It is unworkable from the third customer onwards.
With a gateway, the change is made in one place. Tenants have a stable URL and a set of credentials; the rest is the gateway’s problem.
The three dominant options in 2026
LiteLLM is the most popular OSS option, Python-first, deployed as a proxy. It supports 100+ providers (OpenAI, Anthropic, Bedrock, self-hosted vLLM, Ollama, and so on) behind a unified OpenAI-compatible API. It has a native multi-tenant hierarchy with Organizations → Teams → Users → API Keys, each level with its own budget. The Apache 2.0 version covers the basics; RBAC, SSO, audit logs and team-level enforcement require the paid Enterprise version. Deployed on K8s with the official Helm chart.
Portkey is the most mature commercial / SaaS option. A single control plane that enforces budgets, quotas, permissions and compliance. Real-time spending tracking with alerting. RBAC, audit, workspaces and SSO included. The trade-off: dependency on an external service and a per-request pricing model.
Kong AI Gateway is the option for organisations that already have Kong as their API gateway. An AI plug-in on top of the existing Kong gateway, integrated with its plugin, consumer and rate-limit model. If your platform team already runs Kong, it is the lowest friction.
When to choose each one
| Situation | Gateway |
|---|---|
| Pure OSS, self-hosted, Python-first team | LiteLLM |
| You need RBAC, SSO, audit log out of the box, and have budget | Portkey |
| You already run Kong as a corporate API gateway | Kong AI Gateway |
| Greenfield enterprise with strict compliance | Portkey (probably) |
| Mid-sized OSS-first company without regulated compliance | LiteLLM (typically) |
The minimum the gateway has to do
Whichever option you pick, this is what any serious deployment must enforce:
- Auth and identity: every request carries an API key resolvable to a tenant + user + team.
- Routing by model: the tenant asks for
model: "gpt-4o"; the gateway decides whether it goes to OpenAI, to Azure OpenAI, or to your vLLM with Qwen3 32B (a cheaper fallback), according to policy. - Rate limiting: RPS per tenant, TPM (tokens per minute), concurrency limits.
- Caching of identical responses: 5-30% of RAG queries are repeats; caching saves latency and cost.
- OTel emission: every call produces a span with
gen_ai.*semantic conventions andtenant_idas an attribute. Covered in the Evals post and MCP observability. - Failover: if vLLM goes down, the gateway redirects to the OpenAI API. If OpenAI rate-limits, the gateway falls back to Anthropic. Configurable policy.
Example of a multi-tenant LiteLLM configuration
# litellm-config.yaml — simplified example
model_list:
- model_name: llama-3-70b
litellm_params:
model: openai/llama-3-70b
api_base: http://vllm-llama3-70b.inference/v1
api_key: os.environ/VLLM_API_KEY
- model_name: qwen3-32b
litellm_params:
model: openai/qwen3-32b
api_base: http://vllm-qwen3-32b.inference/v1
api_key: os.environ/VLLM_API_KEY
- model_name: gpt-4o
litellm_params:
model: openai/gpt-4o
api_key: os.environ/OPENAI_API_KEY
router_settings:
routing_strategy: usage-based-routing-v2
fallbacks:
- llama-3-70b: [qwen3-32b, gpt-4o] # if vLLM goes down, fall back to the external one
general_settings:
master_key: os.environ/LITELLM_MASTER_KEY
database_url: os.environ/DATABASE_URL # Postgres for budgets/keys
# Hierarchy: Organizations → Teams → Users → API Keys
# Created via the API, not in static YAML
Creating a team with a budget:
curl -X POST http://litellm/team/new \
-H "Authorization: Bearer ${LITELLM_MASTER_KEY}" \
-d '{
"team_alias": "soporte-chat",
"max_budget": 500, # 500 USD/month
"budget_duration": "30d",
"tpm_limit": 100000, # 100K tokens/min
"rpm_limit": 1000, # 1000 requests/min
"models": ["llama-3-70b", "qwen3-32b"] # access to these
}'
And the team’s API key:
curl -X POST http://litellm/key/generate \
-H "Authorization: Bearer ${LITELLM_MASTER_KEY}" \
-d '{
"team_id": "<team-id>",
"duration": "30d",
"metadata": {"environment": "production", "app": "support-bot"}
}'
That API key is what the tenant uses. Every request made with it consumes from the team’s budget. When it runs out, LiteLLM returns HTTP 429 with a description.
Layer 2 — Policy & Quota Plane: what each tenant can do
The gateway is where enforcement happens. Policy is what gets enforced. Five axes of multi-tenant policy:
Technical quotas
- TPM (tokens per minute): the hard consumption limit. For a Llama 3 70B at TP=5, ~3000 sustained output tokens/s = 180K aggregate TPM. If you have 10 tenants, assign 18K each as the ceiling.
- RPS / RPM: load control, not consumption control. A 4K-token session counts as one request; so does a batch of 100 mini-completions. Useful against abuse.
- Concurrency: how many simultaneous active requests per tenant. Important for latency SLAs: 100 RPS with concurrency=50 works out at 2 seconds per request.
Economic budgets
- Monthly per tenant: a hard cap in USD.
- Daily and hourly: soft caps to avoid a runaway in a single day.
- Per project / API key: fine granularity within a single tenant.
LiteLLM has a max_budget field at every level of the hierarchy (organization, team, user, api key). Budgets are inherited and constrained downwards.
Model whitelist and blacklist
Tenants with critical workloads → only stable models (llama-3-70b, gpt-4o). Research tenants → access to experimental models as well.
Priority classes
Not all requests are equal. Three typical classes:
- Guaranteed: workloads with an SLA, latency respected even under pressure.
- Best-effort: normal workloads without a strict SLA.
- Spot: batches that can wait, evictable if a guaranteed one arrives.
The Token Management in Multi-Tenant AI Inference Platforms paper (2026) formalises this with a model of token pools per priority class that has started to be adopted in production. It maintains guaranteed P99 latency for guaranteed workloads even under overload, with selective throttling of spot.
Admission control
Before accepting a request: is there capacity? If not, return 429 immediately instead of queueing and degrading everyone. It is the most underrated operational discipline. A cluster with admission control done properly has predictable latency; without it, catastrophic degradation when the peak arrives.
The typical pattern in 2026
# Conceptual policy for a "soporte-chat" tenant
tenant: soporte-chat
quotas:
tpm: 50000
rpm: 500
max_concurrency: 30
budget:
monthly_usd: 800
alert_thresholds: [0.5, 0.8, 0.95] # warn when you get there
models_allowed:
- llama-3-70b
- qwen3-32b
priority: guaranteed
fallback_on_overload:
- qwen3-32b # if guaranteed fills up, fall back
- gpt-4o-mini # last resort, external model
Layer 3 — Isolation Plane: isolating workloads physically
This is the technically densest layer. You have a node with several H100 SXM GPUs interconnected by NVLink. How do you partition them between tenants?
Three NVIDIA mechanisms for sharing a GPU
MIG (Multi-Instance GPU) is the strongest isolation. It partitions the GPU into up to 7 instances with physically separate HBM memory and dedicated compute units (SMs). Tenants in different MIG instances cannot touch each other: one workload does not consume memory another needs, one does not degrade another’s throughput. Hardware isolation. Available on A100, H100, B100 and B200.
MPS (Multi-Process Service) is soft. Several processes share the GPU concurrently and NVIDIA distributes SMs according to usage. Good performance if all the processes are yours and you trust them. Worse for multi-tenant setups between customers who do not know each other, because a noisy process can degrade the others.
Time-slicing is the simplest: the GPU is assigned alternately, slot by slot, to different processes. Much worse latency (waits between slots); not recommended for production workloads with an SLA.
The choice for multi-tenant in 2026
According to the enterprise adoption survey: 80% use MIG for untrusted multi-tenant (different customers who do not know each other) and MPS for trusted environments (processes from the same team) where you want to maximise throughput. Time-slicing is only used in dev/staging so that every developer can touch a GPU without the cost of exclusivity.
An important limitation of MIG: it isolates compute and HBM memory, but the PCIe path remains shared. For PCIe-bound workloads (a lot of host↔device traffic), tenants in different MIG instances can still affect each other. For LLM inference the main path is HBM, so this is rarely a problem. But it is worth knowing.
MIG partitions on the H100
An H100 (80GB HBM3) can be partitioned into fixed profiles:
| Profile | SM | Memory | Max instances per GPU |
|---|---|---|---|
| 1g.10gb | 14 | 10 GB | 7 |
| 1g.20gb | 14 | 20 GB | 4 |
| 2g.20gb | 28 | 20 GB | 3 |
| 3g.40gb | 42 | 40 GB | 2 |
| 7g.80gb | 98 | 80 GB | 1 (the whole GPU) |
For a mid-scale cluster with NVLink, MIG has a fundamental problem: when you partition with MIG, NVLink between GPUs is disabled. An H100 in MIG mode does not take part in multi-GPU tensor parallel. If you are going to serve a large model with tensor parallel (Llama 3 70B with TP=4 or TP=8, for instance), those GPUs have to be whole, without MIG.
That defines the architectural decision. There are two main approaches:
Approach A — A shared large model with quotas at the gateway
All the node’s GPUs serve a single large model with tensor parallel spanning the whole node. All tenants share that instance. Isolation happens at the gateway layer (quotas, rate limiting) and the policy layer (priority classes). The cluster’s kernel is one enormous vLLM instance with --max-num-seqs=128 or similar; internally, vLLM shares GPU time between the active requests with continuous batching.
Advantages: you use all the GPUs to the full, NVLink stays active, better KV cache utilisation. Disadvantages: soft isolation. A tenant that saturates does not degrade the others directly (vLLM batches), but it does compete for batch slots. You need serious priority classes.
Approach B — Dedicating GPUs per model / tenant
You split the GPUs into pools dedicated to different models. Examples on an 8-GPU node:
- 4 GPUs: a large 70B model with TP=4.
- 2 GPUs: a mid-sized 32B model replicated (2 independent instances) for tenants with a strict SLA.
- 2 GPUs: miscellaneous workloads (smaller models, experimentation).
Advantages: physical isolation between critical models / tenants. Disadvantages: worse aggregate utilisation; some GPUs idle while others saturate.
Approach C (advanced) — MIG on some GPUs plus dedication for the rest
If you have small workloads (4B, 7B models), you can use MIG on 1-2 GPUs to serve them and dedicate the rest to tensor parallel for the large model. It combines strong isolation for the small workloads with full use of NVLink for the large model.
The operational choice: start with A, move up to C if you need to
In most deployments, Approach A (a shared large model plus quotas) is the right starting point. Utilisation is better, operation is simpler, and the gateway’s soft isolation works for reasonable workloads.
When there is a tenant with a strict SLA that cannot tolerate competing with others, you move to Approach B for that tenant in particular (dedicating GPUs to an instance of the model just for them), keeping the rest of the cluster shared.
Approach C is for when you have 10+ tenants with very heterogeneous profiles.
Isolation at the Kubernetes level
Independently of GPU isolation, pod-level isolation is applied in K8s:
- Namespaces per tenant:
tenant-soporte,tenant-legal, and so on. - ResourceQuotas and LimitRanges: CPU/memory limits per namespace.
- NetworkPolicies: tenant A cannot talk to tenant B’s namespaces.
- K8s PriorityClasses: classes with a numeric value defining preemption order if a more critical pod arrives.
- PodDisruptionBudgets: how many pods of each deployment can go down simultaneously.
Layer 4 — Observability Plane: seeing what happens per tenant
The fourth layer: observability with a tenant dimension. Without it you cannot do cost attribution, you cannot debug incidents for a single tenant, you cannot show dashboards to stakeholders.
The four mandatory properties
1. tenant_id on every span. The AI gateway resolves the API key and attributes a tenant_id. That ID is propagated via params._meta or OTel headers to every downstream component (vLLM, retrieval, MCP servers, tools). Any span in any system carries that label. It is what lets you reconstruct tenant-specific traces.
2. Metrics labelled per tenant. gen_ai.usage.input_tokens{tenant="soporte-chat"} or equivalents. Prometheus, Grafana, groupable by tenant.
3. Real cost attribution. The sum of tokens × cost/token per tenant gives the cost. For self-hosted vLLM, the cost is per GPU hour plus the proportional share of tokens (you can compute an equivalent cost per 1k tokens).
4. An immutable audit log. Every API key used, every model invoked, every quota change, every budget exceeded. For compliance.
Showback vs chargeback
An important FinOps distinction that gained clarity in 2026:
Showback: visibility without consequence. “Support team, you have consumed 623 USD this month on LLMs”. Information, not an invoice. It lets you spot abuse without penalising anyone before the team understands what is going on.
Chargeback: the cost is charged to the team’s budget. When it runs out, it runs out. It changes behaviour.
The practice that works: 6-18 months on showback while tags are calibrated, misattributions are identified and teams are trained. Then chargeback, once the numbers are credible. Launching chargeback on day 1 when the costs are still dirty creates an immediate political fight; launching showback prepares the ground so that chargeback lands in an orderly way.
Only 14% of organisations have chargeback active according to a recent survey, which indicates this is still mostly showback in real production.
Tools
- Kubecost: cost allocation per namespace, deployment and pod on Kubernetes. For the cost of the shared GPU, allocate proportionally to the tokens consumed per tenant.
- Finout: a FinOps platform that combines cloud bills and LLM API costs in a unified view with virtual tagging.
- Langfuse: already covered. Cost tracking per trace, groupable by user or session metadata.
- LiteLLM native tracking: LiteLLM’s master DB keeps running spend per team, user and API key, accessible via the API or the UI.
The minimum multi-tenant dashboard
Any platform should have:
- Summary per tenant: monthly spend, current RPS, TPM consumed, % of budget spent, active sessions.
- Top users within each tenant (for detecting internal abuse).
- p95 latency per tenant: SLA tracking.
- 429 / 503 errors: how many requests are being rate-limited or rejected because of overload.
- Cost trend: the monthly trajectory with a projection.
- Drift per tenant (from the post-tracing series): if a tenant starts getting worse results, raise an alert.
Sizing on mid-scale GPU clusters: concrete decisions
Let us get down to hardware. As a reference we take a node with N H100 SXM (between 4 and 8) with NVLink/NVSwitch, 80 GB HBM3 each. That gives between 320 GB and 640 GB of aggregate VRAM. Inter-GPU connectivity is 900 GB/s (NVLink 4) or 600 GB/s (NVLink 3) depending on generation. HBM bandwidth per GPU is 3.35 TB/s.
Default decisions
Start with Approach A: all the node’s GPUs serving a single large 70B model in BF16 with tensor parallel = N. Expected real capacity (computed for a standard 8-GPU HGX node as an example; it scales roughly linearly with N):
- Model VRAM (70B BF16): ~140 GB (≈ 17.5 GB/GPU at TP=8).
- vLLM overhead + activations VRAM: ~10 GB/GPU.
- VRAM free for KV cache: ~52 GB/GPU. On an 8-GPU node that is ~416 GB aggregate; on a 4-GPU one, ~210 GB.
- With
--kv-cache-dtype=fp8and a 70B GQA model: ~320 KB/token. - Aggregate cache capacity (8-GPU node): ~1.3M tokens to distribute between simultaneous sessions.
That translates into throughput and concurrency (indicative figures for an 8-GPU node):
| Simultaneous sessions | Average context per session | Aggregate throughput (tokens/s) |
|---|---|---|
| 32 | 16K | ~5000 |
| 64 | 8K | ~8000 |
| 128 | 4K | ~12000 |
Typical latencies: TTFT ~150ms at low traffic, TPOT ~15-20 ms/tok. Under high concurrency, TTFT rises to ~500ms if the queue is saturated.
An example tenant scheme
A cluster with 4 tenants and a research pool:
| Tenant | TPM cap | RPM cap | Concurrency | Budget | Priority | Models |
|---|---|---|---|---|---|---|
| Support chat | 80K | 800 | 50 | 1500 USD/month | Guaranteed | llama-3-70b, qwen3-32b |
| Legal RAG | 30K | 200 | 15 | 600 USD/month | Guaranteed | llama-3-70b |
| Code agent | 50K | 300 | 25 | 1200 USD/month | Best-effort | llama-3-70b, qwen-coder |
| Data extr. batch | 40K | 1000 | 40 | 400 USD/month | Spot | llama-3-70b, qwen3-32b |
| Research / notebooks | 10K | 100 | 5 | 200 USD/month | Spot | all |
TPM total: 210K. Aggregate cluster capacity: ~180K sustained TPM. It is overcommitted by about 15%, assuming not every tenant hits the ceiling at the same time. That is normal and desirable; if they all do it at once, the priority classes degrade in an orderly way.
When to add hardware
Signals that the node has become too small:
- Sustained p95 TTFT > 500 ms during peak hours → the queue is building up.
vllm:num_requests_waitingconstantly > 20 → admission control starting to reject.- Sustained GPU utilisation > 80% at critical hours without dropping in quiet hours → there is no headroom.
- 429 rate on guaranteed tenants > 1% → the platform is breaking its SLA in production.
When several of these hold, the natural next step is to add another HGX node with internal NVLink and stand up a second vLLM instance of the same model. The gateway load-balances between the two instances. Aggregate throughput doubles; latency stays the same.
Common operational traps
A gateway without auth: a backdoor into the cluster
Your vLLM sits on a ClusterIP Service and the main app talks to it. Some tenant discovers the endpoint directly and hits it without going through the gateway. Quotas and costs are silently evaded. Use a strict NetworkPolicy: only the gateway can talk to the vLLM Services; the rest of the cluster cannot.
MIG and NVLink are incompatible
You enable MIG on a GPU thinking you will get isolation plus multi-GPU; you discover that MIG disables NVLink. Any large model with TP becomes unusable. Decide MIG vs NVLink globally per cluster, not per individual GPU.
Quotas pinned to the cluster’s ceiling
You add up the TPM of all the tenants and it comes to exactly the cluster’s capacity. When two tenants peak at the same time, both wait or one gets rejected. An overcommit of 10-20% is healthy (it assumes they do not all peak at once); more than that is dangerous.
No multi-tenant observability from day 1
You launch with quotas and isolation but without tenant_id on spans. Three months later, your CFO asks “how much does the support agent cost versus the legal one?” and you cannot answer. OTel with a mandatory tenant_id from the first version, even if there are no dashboards yet; having the data is worth more than having perfect dashboards with no data.
Showback that never reaches chargeback
You have been on showback for 18 months, the teams know the numbers, nobody changes behaviour. Without the pressure of real chargeback, the incentive dilutes. Set an explicit calendar for the transition to chargeback, with an owner and a deadline.
Non-whitelisted models eating the budget
A team discovers that LiteLLM has gpt-4o configured. They use it without permission. The budget burns on an external API when the idea was to use the cheap self-hosted one. Keep an explicit per-team whitelist of accessible models.
Badly calibrated priority classes
Everyone declares themselves “guaranteed”. At the first peak, there is nothing left to degrade and everything suffers. Priority classes only for critical cases, with justification. The majority should be best-effort.
No failover from the gateway
Your vLLM goes down. The gateway has no fallback configured and returns 503 to every tenant. Configure a fallback to another model, ideally an external one (OpenAI) for guaranteed workloads, even if it costs more per hour. Availability is worth more than cost per hour.
An operational roadmap for getting started
If you start from scratch with an empty GPU node, the minimum order is as follows. Each milestone is a day’s work with slack, not a tight one:
Day 1-2 — Base K8s infrastructure. NVIDIA GPU Operator + nvidia-device-plugin + dcgm-exporter + cluster-default NetworkPolicies. Validation: a basic pod with nvidia.com/gpu: 1 gets scheduled.
Day 3 — vLLM with a large model and tensor parallel across the whole node. The vLLM Production Stack Helm chart (or bare vLLM manifests). Model weights on a shared PVC (CephFS or NFS). Validation: a curl request against the internal Service responds.
Day 4 — AI Gateway: LiteLLM. Helm chart, Postgres for budgets, master key, a first model_list pointing at vLLM. Validation: an OpenAI-compatible request through LiteLLM responds with the same content as vLLM directly.
Day 5 — Basic multi-tenancy. Create teams, API keys, budgets, model whitelists. Test with two teams. Validation: the second team, using the model it does not have whitelisted, gets a 403.
Day 6 — Minimum observability. Prometheus + Grafana scraping vLLM and LiteLLM. A dashboard with TTFT, TPOT, throughput, num_requests_waiting and budget_consumed_per_team. Validation: visible in Grafana with real data.
Day 7-8 — Pilot customer. One real tenant (ideally a controlled internal one) starts using it. Measure real latencies, discover the first operational incidents.
Day 9-10 — Tuning. Adjust --max-num-seqs, --gpu-memory-utilization, priority classes and quotas based on what the pilot taught you.
Day 11-14 — Onboarding the second tenant plus iteration. Repeat. Every new tenant onboarded reveals new cases.
After two weeks you have an operational platform with two real tenants and data to decide whether it is ready for more. The line of progress from here on is horizontal (more tenants) until you saturate; from then on, vertical (more hardware).
What we have not covered (upcoming posts)
- Continuous fine-tuning in production (post 6, already decided): LoRA/QLoRA/DPO, dataset curation, eval gates, A/B versioning with real traffic between model versions.
- Constitutional AI and alignment at runtime: an option still on the table.
- Edge LLMs: when an H100 cluster is too expensive for a specific workload, distilled models running on NPUs or consumer GPUs.
- GPU networking deep dive: NCCL, InfiniBand, GPUDirect, RDMA. For multi-node clusters with cross-host tensor parallel.
References
Multi-tenancy and GPU isolation:
- Multitenant GPU Infrastructure: 4 Powerful Design Rules — survey of enterprise patterns.
- Run Multiple LLMs on One GPU: MIG, Time-Slicing, and MPS Guide (Spheron).
- A Practical Guide to GPU Partitioning with MIG (Medium).
- GPU Partitioning for AI Workloads: NVIDIA MIG with SUSE Virtualization (KubeCon EU 2026).
- Predictable LLM Serving on GPU Clusters (arxiv 2508.20274).
- Token Management in Multi-Tenant AI Inference Platforms (arxiv 2603.00356) — paper on priority + admission control.
AI Gateways:
- LiteLLM — Multi-Tenant Architecture.
- LiteLLM — Budgets and Rate Limits.
- Portkey AI Gateway.
- Kong AI Gateway — LLM Cost Management.
- AI Gateway Setup 2026: LiteLLM, Portkey, Kong (Spheron).
- Stop Juggling LLM APIs: 8 Gateways Ranked 2026 (TECHSY).
Multi-tenant FinOps:
- The Death of Chargeback in the Kubernetes and AI Era (DigiUsher).
- How to Actually Track Kubernetes Costs in 2026 (Medium).
- LLM Cost Management: AI Showback and Chargeback (Kong).
- Kubecost — cost allocation.
- Finout — FinOps + AI costs.
Cross-references:
- Previous posts in series 4: MLOps for LLMs overview, RAG over Kafka, The six-stage pipeline, PostgreSQL + Qdrant.
- Relevant posts from the inference series: vLLM on Kubernetes — the multi-GPU HGX node scenario we develop here. LLM operators on K8s — the vLLM Production Stack and OME that the gateway can direct.
- Observability: Evals, MCP observability, eBPF + drift.