Case study · AI infrastructure and cost

One GPU, many models: consolidating small AI models for an Indian multilingual marketplace

An Indian online marketplace served buyers and sellers in many Indian languages. Behind its search, listings and support sat a growing collection of small AI models: embedding models, rerankers, classifiers and fine-tuned language variants. Each had been given a whole GPU, most of which sat idle. As new GPU partitioning options reached mainstream cloud services, the company set out to serve the same models on far less hardware, without one model's traffic slowing another.

Case studyE-commerce · IndiaSumanta Mukhopadhyay9 min read
#ai#platform#kubernetes
CASE STUDY · CASE STUDY · AI INFRASTRUCTURE AND COST9 Nov 2026 · 15:50 GST
At a glance
SectorE-commerce · India
My roleFractional CTO and AI architect
EngagementAssessment, architecture and delivery leadership
ScopeModel inventory, GPU partitioning, shared base models with adapters, model-aware routing, evaluations, per-model cost
What changed
  • Small models served from partitions of shared GPUs instead of one GPU each
  • Language and task variants served as adapters on a shared base model where quality allowed
  • Hardware isolation between models whose traffic must not interfere
  • Offline work moved to batch queues, freeing real-time capacity
  • Cost and latency visible per model and per language, guiding further consolidation
NVIDIA Multi-Instance GPU partitionsKubernetes with GPU-aware schedulingInference gateway with model-aware routingShared base model with LoRA adaptersvLLM and lightweight model serversBatch queues for offline jobsPer-language evaluation setsOpenTelemetry and per-model cost reports

Anonymised composite. Client names, identifying details and confidential figures are withheld; public facts are cited in the references.

The situation

An Indian online marketplace connected buyers with small and mid-sized sellers across the country, in English and many Indian languages. Over several years its teams had added small AI models wherever they helped: embedding models and rerankers for search in each major language, classifiers for listing quality and support routing, language identification, and fine-tuned language models that helped sellers write listings. Each team had deployed its models independently, and the simplest way to get a model into production had been to give it its own GPU.

The result was a large GPU bill for hardware that was mostly idle. Many models needed only a fraction of a GPU's memory and compute, and traffic followed Indian daily patterns, with quiet nights and sharp peaks around sales. Adding support for another language meant another set of models and, by habit, more GPUs. Finance wanted the bill down; product wanted more languages.

Why now. GPU partitioning was moving into mainstream managed services. AWS added GPU partitioning to SageMaker AI real-time inference, using NVIDIA Multi-Instance GPU so one GPU can be split into isolated partitions, each with dedicated compute and memory12. At the same time, reports that Microsoft was winding down rented capacity on older GPUs underlined how quickly hardware choices age5. Using every GPU fully had become a design goal, not an afterthought.

What had to be true

  • Far fewer GPUs for the same models and traffic.
  • No noisy neighbours for latency-critical models such as search.
  • Quality held per language and task after any consolidation.
  • New languages cheap to add, without new hardware by default.
  • Cost visible per model and language, so decisions follow value.
  • Teams still independent: shared infrastructure, not a central bottleneck.

Architecture

Product
Searchembeddings, rerankersListingsquality, generationSupportrouting, language ID
Routing
Inference gatewaymodel and adapter awareBatch queuesoffline work
Serving
GPU partitionsisolated small modelsShared base modellanguage and task adaptersWhole GPUsonly where needed
Platform
KubernetesGPU-aware schedulingPartition profilesplanned per node pool
Evidence
Per-language evaluationsLatency per modelCost per model and language
Three ways to share a GPU, chosen per model: partitions, adapters on a shared base, or batch.

We sorted every model into one of three groups. Small, latency-critical models, such as search embeddings and rerankers, went onto Multi-Instance GPU partitions, which give each model its own slice of compute and memory with isolation enforced in hardware3. Language and task variants of the same base language model were rebuilt as LoRA adapters on one shared base model, where evaluations showed quality held. Offline work, such as re-embedding the catalogue or scoring listing quality overnight, moved to batch queues that filled spare capacity.

The data flow, end to end

  1. RequestA feature asks for a task in a language, such as "rerank results in Tamil"
  2. ResolveThe gateway maps the task and language to a model or adapter
  3. RouteIt picks a server with that model or adapter loaded and spare capacity
  4. ServeThe model runs on its partition or the shared base model
  5. RecordModel, adapter, language, latency and GPU share are recorded
  6. ReviewWeekly reports guide which models to consolidate next
Product features ask for tasks; the platform decides where they run.

The hard part: isolation, adapters and fixed partitions

Choosing the right kind of sharing. Not all GPU sharing is equal. Partitions give each model guaranteed memory and compute; looser sharing lets models contend for the same resources, so one model's spike or failure can affect others. We kept partitions for anything on the search path and accepted looser sharing only for internal and offline models.

Routing to the right adapter. Adapters only save money if requests reach a server that already has the right adapter loaded; otherwise servers spend time loading and evicting them. The gateway therefore routed by model and adapter as well as load, the pattern the Kubernetes Gateway API Inference Extension describes, where an endpoint picker considers queue length, memory and loaded adapters before choosing a server4.

Flowchart of an inference endpoint picker: apply a default filter, check whether the request is critical, prefer pods with the required LoRA adapter or with capacity, then filter by lowest waiting queue and lowest KV cache use before choosing a pod
Adapter- and load-aware scheduling: how requests reach a server that already has the right adapter loaded. Source: Kubernetes blog, Daneyon Hansen, Kaushik Mitra, Jiaxin Shan and Kellen Swain · CC BY 4.0

Living with fixed partition layouts. Partition profiles are set per GPU and changing them means draining the workloads on it. Rather than reshaping partitions on demand, we defined a small number of node pools, each with a fixed layout suited to a class of model, and let the scheduler place models on the right pool. Reshaping happened in planned maintenance, not in response to traffic.

The cheapest GPU is the one you already pay for. Before buying more, find out how much of each one your models actually use.

How it ran

Platform
  1. Usage measurement
  2. Partitioned node pools
  3. Gateway and batch queues
ML teams
  1. Model inventory
  2. Adapters where quality holds
  3. Per-language evaluations
Product and finance
  1. Latency targets per feature
  2. Language roadmap
  3. Cost per model and language
Platform made sharing safe, ML teams proved quality, product and finance set the targets.
Phase 1Measure
  • Inventory every model
  • GPU use per model
  • Latency targets
Phase 2Partition
  • Partitioned node pools
  • Move small models
  • Watch latency
Phase 3Adapt
  • Shared base model
  • Adapter-aware routing
  • Per-language evaluations
Phase 4Batch
  • Offline jobs to queues
  • Fill spare capacity
  • Retire idle GPUs
Measure before moving anything; the data showed which models could share and which could not.

Key decisions and trade-offs

DecisionAlternativeWhy
Hardware partitions for search modelsLooser GPU sharing everywhereSearch latency cannot depend on other models' traffic
Adapters on a shared base modelOne full model per languageLess memory, faster to add languages, if quality holds
Adapter-aware routingRound-robin load balancingAvoids constant adapter loading and eviction
Fixed partition layouts per node poolReshape partitions dynamicallyReshaping needs draining; stability beats perfect packing
Offline work in batch queuesRun everything on real-time serversUses spare capacity without hurting live traffic
Evaluations per languageOne overall quality scoreAverages hide regressions in smaller languages

What I'd do again, and differently

Again: measure real GPU use per model before changing anything. It showed most of the waste sat in a few teams' habits, not in the models themselves. Differently: build per-language evaluation sets before moving to adapters; the first adapter rollout exposed a regression in a smaller language that an overall score had hidden. Related: Kubernetes inference gateways, GPU scheduling with DRA, AI capacity contracts and the India page.

If your GPU bill is growing faster than your AI usage, see my AI architecture work, or analyse your challenge and bring the result to a call.

References
  1. 1
  2. 2
  3. 3
  4. 4
    Introducing Gateway API Inference ExtensionKubernetes blog · 5 Jun 2025
  5. 5
FAQ

Common questions

What is GPU partitioning and when does it help?

Technologies such as NVIDIA Multi-Instance GPU split one physical GPU into several isolated instances, each with its own compute and memory. It helps when you serve many small models that each need far less than a full GPU.

Should every small model share a GPU?

No. Latency-critical models whose traffic must not interfere need hardware isolation, such as separate partitions. Models that tolerate some contention, or offline jobs, can share more aggressively or move to batch queues.

When are adapters on a shared base model better than separate models?

When variants differ mainly by language, domain or task and quality holds on evaluation sets. Serving adapters on one base model saves memory and simplifies operations, provided routing sends each request to a server with the right adapter loaded.

Keep reading

Related

Open to advisory, fractional CTO & select builds

Let's talk about what you're building.

The fastest route is a free 30-minute call. Prefer to write? Send a message and I'll reply personally within two business days.

Start a conversation

How would you like to reach me?

Book a 30-min callFastest. Pick any open slot on my calendar.→ Write in GmailOpens a pre-filled draft in your browser.→ Use my email appOutlook, Apple Mail or your default client.→

I reply personally within two business days. Time zones from the Americas and Europe to the Middle East and Asia-Pacific.