If you've been building production LLM systems in the last two years, you know the pain. A model works beautifully in the demo, the stakeholders sign off, and then reality hits: inference costs are astronomical, latency numbers are embarrassing, and your GPU budget just became your CFO's favourite argument against AI adoption.
For most of 2023 through 2025, the industry's answer was software-level optimization — quantize the model, batch smarter, optimize the attention kernel, and pray the math works out. And to be fair, it worked remarkably well for a while. But we've hit a ceiling. The marginal returns on software-only tuning are shrinking, and the conversation in 2026 has fundamentally shifted. The new frontier is hardware-software co-design — building silicon and software together, from the ground up, to squeeze every last cycle out of inference workloads.
Let me walk you through this evolution, what it means for enterprise teams in Southeast Asia (particularly those betting on Azure), and how to think about your next infrastructure decision.
The Software-First Era: What We Got Right
Let's give credit where it's due. The software optimization toolkit that emerged between 2023 and 2025 was transformative. Before diving into the new paradigm, it's worth understanding what got us here.
Quantization: Making Models Smaller Without Breaking Them
The journey from FP32 to FP16 was table stakes. The real breakthrough was pushing further — INT8, INT4, and nuanced approaches like GPTQ and AWQ that preserved model quality while slashing memory requirements. By 2025, FP8 had become the default serving precision for many production deployments on NVIDIA hardware, roughly halving memory bandwidth pressure versus FP16 with minimal quality degradation on most workloads.
What made quantization powerful wasn't just the memory savings. It was the secondary effect: smaller models fit on less expensive hardware, which meant you could serve more requests per dollar. For enterprise teams watching their Azure spend, this was existential.
Batching Strategies: Squeezing More From the Same GPUs
Dynamic batching, continuous batching (popularized by vLLM's PagedAttention), and smarter request scheduling were the unsung heroes. The idea that you could manage KV cache memory like virtual memory pages — allocating GPU memory to whichever requests needed it most — was a genuine paradigm shift in throughput.
I remember working with a financial services client in Kuala Lumpur who went from needing 8 A100 GPUs to serving the same workload on 4, just by moving from static batching to continuous batching with PagedAttention. That's a 50% cost reduction with zero model changes.
FlashAttention: When the Kernel Matters
Then came FlashAttention and its successors. The insight was elegant: the bottleneck in transformer inference isn't compute — it's memory bandwidth. By restructuring how attention is computed to minimize HBM (High Bandwidth Memory) accesses, FlashAttention cut attention's memory footprint from quadratic to linear in sequence length and ran up to 3x faster than standard PyTorch attention, with each subsequent generation pushing further. Kernel-level engineering was clearly still able to unlock massive gains.
Speculative Decoding: Trading Compute for Latency
Speculative decoding offered another clever trick: use a smaller, faster model to draft tokens, then verify them in parallel with the larger model. Lower latency without sacrificing output quality. For interactive applications — chatbots, coding assistants, real-time translation — this was a game-changer.
These techniques collectively made LLM inference commercially viable. But here's the uncomfortable truth: we've been optimizing the software stack on hardware that was designed for general-purpose GPU computing, not for LLM inference specifically. And that mismatch is now the binding constraint.
Why Software-Only Optimization Has Hit Its Ceiling
There are three structural limits that pure software approaches can't overcome.
1. The Memory Bandwidth Wall
LLM token generation is fundamentally memory-bandwidth-bound, not compute-bound. When you're generating tokens one at a time, the GPU spends most of its time waiting for weights to arrive from HBM. Software can reduce how much data needs to move — through caching, compression, and scheduling — but it can't change the physics of the memory bus. On an H100, you get 3.35 TB/s of HBM3 bandwidth. On a B200, you get 8 TB/s of HBM3e. That's a hardware improvement, not a software one.
2. The Kernel Fragmentation Problem
Every software optimization introduces complexity. FlashAttention has its kernels. Mixture-of-experts routing has another. Sliding-window attention, state-space models, multi-head latent attention — each new architecture adds specialized kernels, each with its own launch overhead and memory access pattern. The software stack becomes a Rube Goldberg machine of workarounds, and every model family needs its own tuning effort.
3. The Diminishing Returns Curve
Quantization from FP32 to INT4 gave us roughly 8x compression. Going below INT4 buys a little more at a devastating quality cost. Batch size and scheduling optimizations follow a similar curve — each increment helps less than the last. We've picked the low-hanging fruit.
The path forward requires rethinking the problem at a deeper level: what if the hardware itself was designed to run LLM inference natively?
Enter Hardware-Software Co-Design
This is where the industry is heading in 2026, and it's happening faster than most enterprise teams realize.
Hardware-software co-design means jointly optimizing the silicon architecture, the compiler stack, and the runtime as a single system for LLM workloads. It's not about faster GPUs. It's about purpose-built systems where the memory hierarchy, the interconnect, and the instruction set are all designed with transformer inference in mind.
Custom Silicon: Purpose-Built for Transformers
The most visible examples:
- NVIDIA GB200 NVL72: A rack-scale system with 36 Grace CPUs and 72 Blackwell GPUs connected over NVLink. NVIDIA claims up to 30x inference performance for real-time LLM inference on large mixture-of-experts models versus an 8-GPU H100 HGX system. Read that number carefully: the rack contains nine times the GPUs, so the per-GPU gain is far more modest than the headline. The real architectural shift is the NVLink domain letting 72 GPUs behave as one inference unit, plus native FP4 support in the second-generation Transformer Engine.
- Google TPU v6e (Trillium): Google's sixth-generation TPU delivers roughly 4x peak compute performance versus TPU v5e, more than doubles HBM capacity and bandwidth, and improves energy efficiency by about 67% — a combination that matters enormously for inference economics at scale.
- Microsoft Maia 100: Microsoft's first custom AI accelerator, built on TSMC 5nm with over 100 billion transistors, liquid-cooled, and deployed in Azure datacenters for first-party and OpenAI workloads. The strategic signal matters more than the spec sheet: hyperscalers no longer believe general-purpose GPUs are the end of their inference cost curve.
- Cerebras CS-3: The wafer-scale design keeps model weights on-chip and sidesteps the memory bottleneck entirely. Cerebras's hosted inference service has published token generation rates on Llama models that are an order of magnitude faster than conventional GPU serving for latency-critical workloads — a radical architectural bet that is starting to pay off in specific niches.
Fused Kernels: Combining Operations at the Silicon Level
One of the most impactful co-design patterns is kernel fusion — but not the software-level fusion we've been doing with tools like Triton. Hardware-level fusion means the silicon executes multi-operation sequences (attention + activation + projection) without round-tripping to memory between steps.
On Blackwell, the second-generation Transformer Engine dynamically manages precision — including FP4 — across operations, and combined with CUDA's fused kernel libraries, much of the attention block's forward pass executes without writing intermediate results back to HBM. Pure software stacks on older hardware cannot replicate this, because it requires the hardware to manage precision and data movement jointly.
Compiler-Driven Optimization
The other half of co-design is the compiler. Tools like CUTLASS and Triton showed that kernel authoring doesn't have to be a manual, artisanal process. The new generation of AI compilers takes a model specification and generates kernels optimized for a specific hardware configuration, reasoning about memory layout, tensor core utilization, and operation fusion simultaneously.
This matters for enterprise teams because it means you don't need a bench of CUDA kernel experts to get good performance. Co-design pushes the complexity into the toolchain, making it accessible to ordinary application developers.
What This Means for Azure-First Enterprise Teams
So what does this mean if you're an Azure-first enterprise in Southeast Asia deploying LLM workloads today? Let me break it down practically.
The Infrastructure Decision Has Never Been More Complex
In 2024, the calculus was straightforward: rent GPU VMs on Azure, optimize your model, done. In 2026, you're choosing between four fundamentally different deployment models:
| Option | Control | Optimization ceiling | Ops burden | Best for |
|---|---|---|---|---|
| Azure AI Foundry / Azure OpenAI (managed) | Low | Platform-defined | Minimal | Most enterprises |
| Self-managed vLLM/SGLang on ND-series VMs | Full | Limited by your team | High | Teams with systems expertise |
| Serverless endpoints (pay-per-token) | Low | Platform-defined | Minimal | Spiky or low-volume workloads |
| Edge/hybrid (small local model + cloud offload) | Medium | Split across tiers | Medium | Latency-critical first-pass responses |
The right choice depends on your workload characteristics, latency requirements, and team capabilities — not just the sticker price.
Cost Optimization Has a New Dimension
Hardware-software co-design changes the cost equation fundamentally. When a new generation delivers materially more tokens per second per dollar, that translates directly to fewer accelerators for the same workload. For a typical enterprise deployment serving high request volumes at a P95 latency target, the gap between an H100-era stack and a co-optimized Blackwell-era stack can be significant in infrastructure cost — roughly 40-60% in our illustrative modeling, but validate against your own workload before planning any budget.
But here's the catch: extracting those gains requires the entire stack to be co-optimized. Running an H100-era software stack on Blackwell hardware won't get you the generational improvement. You need to:
- Use hardware-native inference frameworks (recent vLLM or SGLang builds with Blackwell backends)
- Enable FP4 or FP8 precision where your quality evaluations allow
- Leverage NVLink-topology-aware scheduling for multi-GPU configurations
- Use the Transformer Engine's dynamic precision management
This is the "co-design" part. The hardware and software have to speak the same language.
The Skills Gap Is Real
I'll be honest with you: finding engineers who understand both the hardware architecture and the software stack is difficult. In Southeast Asia, this challenge is amplified. The talent pool is growing — universities in Singapore, Malaysia, and Thailand are ramping up AI systems programs — but the intersection of systems engineering and AI is still rare.
My advice: don't try to build this expertise entirely in-house. Lean on managed services where the co-design has already been done for you (Azure AI Foundry is a strong option). Invest your engineering talent in the application layer — retrieval pipelines, evaluation frameworks, agent orchestration — where you can actually differentiate. Let the platform handle the hardware-software integration.
Regional Considerations for Southeast Asia
A few things I've observed working with teams across the region:
- Data sovereignty matters. Many Southeast Asian enterprises have data residency requirements. Azure's Southeast Asia (Singapore), East Asia (Hong Kong), and Malaysia West regions are where to check accelerator availability first. Plan your inference architecture around regional capacity, not global announcements.
- Network latency is a real constraint. A 10-20ms round trip between Kuala Lumpur and Singapore adds up fast when you're streaming tokens. Consider whether a small local model for first-pass responses plus cloud offload for complex reasoning is the right architecture.
- Cost sensitivity is higher. Enterprise budgets in Southeast Asia tend to be tighter than in the US or Europe. The efficiency gains from co-optimized stacks aren't nice-to-haves — they're what make AI deployment financially viable.
A Decision Framework for 2026
If you're evaluating inference infrastructure this year, here's the framework I use with clients.
Step 1: Profile your workload. Latency requirements (sub-100ms real-time, 100-500ms interactive, or batch-tolerant)? Throughput needs and burstiness? Model complexity — single dense model or mixture-of-experts? What precision is acceptable?
Step 2: Match to the right optimization layer. If latency is critical, co-optimized stacks or managed endpoints give the best tail numbers. If throughput per dollar matters most, managed services with automatic batching and scaling usually win. If you need maximum control, self-managed vLLM/SGLang on GPU VMs gives full visibility at a higher engineering cost.
Step 3: Plan for the transition. Hardware generations now ship roughly yearly. Design your serving layer to be hardware-agnostic behind an API, keep reservation terms short enough to ride the refresh cycle, and budget for a software stack upgrade whenever you migrate hardware.
Step 4: Measure what matters. Track cost per million tokens end-to-end, time to first token (TTFT), inter-token latency (ITL), throughput at your P95 latency target, and actual accelerator utilization.
Practical: Deploying and Benchmarking on Azure
Theory is cheap; here's what the work actually looks like. These examples reflect the patterns I use with clients.
Check GPU capacity before you commit
Quota, not money, is usually the first bottleneck. Check what's actually available in your region:
# What ND-series (GPU) capacity exists in Southeast Asia?
az vm list-skus --location southeastasia \
--resource-type compute --all \
--query "[?contains(name, 'ND')].{Name:name, vCPUs:capabilities.vCPUs}" \
--output table
# Request quota early — GPU quota approvals are not instant
az vm list-usage --location southeastasia \
--query "[?contains(name.value, 'NDS')]" --output table
Managed route: serverless model endpoint (Azure AI Foundry)
For most enterprises, this is where you should start — Microsoft owns the hardware-software co-design problem:
# Deploy a serverless endpoint for an open model
az ml serverless-endpoint create \
--name ep-llm-inference \
--resource-group rg-ai-prod \
--workspace-name aif-hub-01 \
--model-id "Llama-3.3-70B-Instruct"
# Query it — same OpenAI-compatible surface your app already uses
az ml serverless-endpoint invoke --name ep-llm-inference \
--resource-group rg-ai-prod --workspace-name aif-hub-01 \
--input-data '{"messages":[{"role":"user","content":"Explain KV cache"}]}'
Self-managed route: infrastructure as code
When you need full control of the serving stack, define the accelerator VM in code. Terraform first:
resource "azurerm_linux_virtual_machine" "vllm_inference" {
name = "vm-nd-gpu-01"
resource_group_name = azurerm_resource_group.ai.name
location = "southeastasia"
size = "Standard_ND96isr_H200_v5"
admin_username = "azureuser"
network_interface_ids = [azurerm_network_interface.gpu_nic.id]
admin_ssh_key {
username = "azureuser"
public_key = file("~/.ssh/id_rsa.pub")
}
os_disk {
caching = "ReadWrite"
storage_account_type = "Premium_LRS"
disk_size_gb = 1024 # models are large; don't undersize this
}
source_image_reference {
publisher = "microsoft-dsvm"
offer = "ubuntu-hpc"
sku = "2204"
version = "latest"
}
}
And the equivalent Bicep for the managed-services side — an AI Services account locked down the way a security review will demand:
param location string = resourceGroup().location
resource aiServices 'Microsoft.CognitiveServices/accounts@2024-10-01' = {
name: 'ais-inference-001'
location: location
kind: 'AIServices'
sku: { name: 'S0' }
properties: {
customSubDomainName: 'ais-inference-001'
disableLocalAuth: true // Entra ID only — no shared keys
publicNetworkAccess: 'Disabled' // private endpoint only
}
}
Benchmark what actually matters: TTFT and ITL
Vendor demos measure cherry-picked prompts. Measure your own workload with a streaming client:
import time
from openai import OpenAI
client = OpenAI(
base_url="https://ep-llm-inference.southeastasia.inference.ai.azure.com/v1",
api_key="<entra-token-or-key>", # never hardcode in real life
)
def measure(prompt: str, model: str) -> dict:
t0 = time.perf_counter()
ttft = None
tokens = 0
stream = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": prompt}],
stream=True,
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
if ttft is None:
ttft = time.perf_counter() - t0
tokens += 1
total = time.perf_counter() - t0
itl = (total - ttft) / max(tokens - 1, 1)
return {
"ttft_ms": round(ttft * 1000, 1), # latency users *feel*
"itl_ms": round(itl * 1000, 1), # reading-speed constraint
"tokens": tokens,
}
Run this across your real prompt distribution — short and long contexts, batch and interactive — before any hardware decision.
Serve with a modern stack and watch utilization
On the self-managed VM, launch vLLM with the features that matter, then verify the silicon is actually working:
# Continuous batching + prefix caching + FP8 — the 2026 baseline
vllm serve meta-llama/Llama-3.3-70B-Instruct \
--tensor-parallel-size 8 \
--enable-prefix-caching \
--max-num-seqs 256 \
--quantization fp8
# Is the GPU saturated, or is your pipeline starving it?
nvidia-smi dmon -s u -c 60 # 60 samples of SM + memory utilization
If utilization sits below ~50% under load, your bottleneck is upstream — batching config, request size, or CPU-side preprocessing — not the accelerator.
Pitfalls I See Repeatedly
Six mistakes show up in nearly every inference engagement I touch.
- New silicon, old stack. Teams rent Blackwell-class hardware and deploy an H100-era container image. They pay rack prices for Hopper-class tokens per second. Pin your framework versions to your hardware generation, and re-benchmark after every upgrade.
- Optimizing the wrong latency metric. TTFT and ITL have different drivers: prefill optimization helps TTFT, decode-side tuning helps ITL. A chat UI cares about ITL; a RAG pipeline cares about total time. Decide which metric your users actually experience before tuning anything.
- Quantizing without an evaluation gate. FP4 and INT4 regressions are task-dependent — fine for summarization, sometimes catastrophic for structured extraction. Run your evaluation suite before and after any precision change, not just perplexity.
- Ignoring KV cache in capacity planning. Long-context workloads eat HBM through the KV cache, not just weights. A model that "fits" on paper can still collapse under concurrent long-context load. Tune
--max-num-seqsagainst your real context-length distribution.
- Vendor peak claims treated as capacity planning numbers. "Up to 30x" headline figures assume large MoE models, ideal batch sizes, and best-case precisions. Your workload is not the demo workload. Budget on your own benchmarks, with margin.
- Reservations that outlive the hardware generation. GPU generations now move roughly yearly. A 3-year reservation on last generation's accelerator can strand you paying above-market rates for below-market performance. Match commitment length to refresh cycles.
Looking Ahead
The co-design trend will only accelerate. NVIDIA's Rubin platform is on the roadmap for late 2026 with Rubin Ultra following in 2027, and competitors are pushing the same thesis from different angles — AMD's Instinct MI400 series targets 2026 availability, and custom silicon players like Cerebras, SambaNova, and Groq each attack a different corner of the latency-throughput-cost triangle.
For enterprise teams, the message is clear: the era of treating inference hardware as a commodity black box is ending. Understanding the hardware-software interaction — even at a high level — is becoming essential for sound infrastructure decisions. You don't need to write CUDA kernels, but you do need to understand why FP4 on Blackwell behaves differently than FP4 on Hopper, and what that means for your deployment strategy.
The teams that thrive won't be the ones with the biggest GPU budgets. They'll be the ones that align their workload characteristics with the right hardware-software stack. And in 2026, that alignment requires a fundamentally different approach than the one we used two years ago.
Key Takeaways
- Software-only optimization has reached diminishing returns. Quantization, batching, and kernel tuning delivered massive gains in 2023-2025, but the memory bandwidth wall and kernel fragmentation mean further gains require hardware-level change.
- Hardware-software co-design is the new paradigm. Purpose-built systems (GB200 NVL72, TPU v6e, Maia 100), fused kernels, and compiler-driven optimization deliver generational improvements that pure software approaches cannot match — but read vendor headline numbers critically.
- The infrastructure decision is now a stack decision. It's not which GPU to rent — it's whether the entire stack (framework, runtime, precision, interconnect) is co-optimized for that hardware. Managed services like Azure AI Foundry absorb that complexity for you.
- For Southeast Asian enterprises, co-optimized stacks are a cost imperative. Tighter budgets, data sovereignty requirements, and regional latency make efficiency gains necessary, not optional.
- Profile your workload before chasing hardware. Measure TTFT, ITL, cost per million tokens, and utilization on your real traffic. Start with the workload profile, then match to the stack — never the other way around.
Have questions about optimizing your inference stack? Reach out via wenfeng.my — I'd love to hear what your team is building.