Chapter 7.9
In this chapter · 5 sections
Terms in this chapter (54)
- CUDA
- ROCm
- XLA (Accelerated Linear Algebra)
- Collective
- JAX
- MFU (Model FLOPs Utilization)
- TensorRT-LLM
- Scale-up
- HBM (High-Bandwidth Memory)
- FP4
- TFLOPS (trillion floating-point operations per second)
- NVLink
- GPU (Graphics Processing Unit)
- TPU (Tensor Processing Unit)
- Trainium
- Inferentia
- Goodput
- NCCL (NVIDIA Collective Communications Library)
- Quantization
- RCCL (ROCm Communication Collectives Library)
- PyTorch
- InferenceX
- FLOPS (Floating-Point Operations Per Second)
- MI300X
- H100
- SemiAnalysis
- MI355X
- SGLang
- B200
- FP8
- KV cache (Key-Value cache)
- vLLM
- SLO (Service Level Objective)
- UALink
- NVL72
- Rubin
- Kyber
- Checkpoint
- CoWoS (Chip-on-Wafer-on-Substrate)
- LPX
- Decode
- SRAM (static random-access memory)
- LPU (Language Processing Unit)
- ASIC (Application-Specific Integrated Circuit)
- TrendForce
- Maia
- MTIA (Meta Training and Inference Accelerator)
- Merchant
- Depreciation
- Commissioning (Cx)
- All-reduce
- All-gather
- InfiniBand (IB)
- Spectrum-X
Software Ecosystems & Lock-In
Buying an accelerator commits you to CUDA, ROCm, XLA or Neuron. Kernel ports, collective tuning and continuing releases are switching costs the datasheet never priced, so measure them against the useful output of the path you will actually run.
ThreadsPower-boundGoodputDensity ramp
What you'll decide here
- Which regime to commit to (CUDA, ROCm, XLA/JAX or Neuron): which workloads earn revenue on day one, and which wait for a port.
- Whether the quoted system’s measured useful output pays for acquisition, porting and continuing support, using MFU only with a named compute denominator.
- How much to write against portable layers (Triton, MLIR, torch.compile, OpenAI-compatible serving APIs) or vendor-native ones (CUDA C++, cuDNN, TensorRT-LLM), setting exit cost years ahead.
- Whether the kernel language, collective library, serving framework or scale-up fabric binds you; each has a different exit cost and erosion rate.
- Whether to run one vendor for simplicity or several for supply leverage and price discipline; if several, who owns the second toolchain.
Chapter 7.1 through Chapter 7.8 compared accelerators on hardware: HBM capacity, FP4 PFLOPS, NVLink bandwidth, dollars per GPU. That comparison is incomplete in a way that costs real money. An accelerator also commits you to a runtime, a kernel language, a collective library, a compiler, a serving stack and a fabric. That stack decides how much of the silicon's peak you ever see, how fast a new model lands on the box, and how much it costs to leave. Four stacks matter in 2026: CUDA (NVIDIA), ROCm (AMD), XLA (Google TPU, via JAX/TensorFlow) and Neuron (AWS Trainium/Inferentia). Each is a distinct lock-in regime.
Three questions follow: which regime, which portability posture, which fleet composition. Each carries a downstream cost: the porting project that delays revenue, the realized-MFU gap that erases a price advantage, the kernel you write yourself because no library shipped it, or a model whose NVIDIA path ships before a required operation is supported on the alternative release. Ignore the software stack at purchase and you do not avoid the bill. You defer it to the day the cluster is live and the delivered goodput misses the acceptance target.
The four regimes, and what each one actually locks
These four ecosystems are not "CUDA, plus three challengers." Each locks a different layer of the stack, erodes at a different rate and charges a different exit cost, so the useful way to sort them is by what each one holds captive.
CUDA is the deepest and broadest moat, and it is mostly a library and tooling moat rather than a language one. The language (CUDA C++) is replaceable. What is hard to replace is two decades of accreted libraries (cuDNN, cuBLAS, CUTLASS, NCCL, TensorRT-LLM), the profilers and debuggers, and the fact that nearly every new model, attention variant and quantization scheme ships and is tuned on NVIDIA first. The lock-in is subtler than "you cannot leave": on NVIDIA the kernel you need already exists and is tuned, and everywhere else you write it or wait for it.
ROCm is the open challenger. As of 2026 it has gone from "unusable for production" to "feature-matched on the workloads AMD chooses to fund." ROCm mirrors CUDA layer for layer: HIP for the language, MIOpen and rocBLAS for the math, RCCL for collectives. The porting tax is genuinely low for code written against PyTorch rather than raw CUDA. The residual lock-in is coverage: the long tail of custom kernels and bleeding-edge model architectures that are tuned on CUDA months before ROCm catches up. The exit cost is asymmetric. Coming from CUDA-portable PyTorch is cheap; coming from hand-written CUDA C++ is not.
XLA (the compiler behind JAX and TensorFlow on TPU) inverts the model. The lock is not the absence of a kernel language: JAX's Pallas lets you hand-write TPU kernels, as AWS's Neuron Kernel Interface does on Trainium. XLA is a graph compiler that takes a whole-program traced computation and emits TPU machine code, so the lock-in is that your code is written in JAX against XLA's compilation model rather than in a portable imperative GPU style. The upside is that XLA is genuinely multi-target, since it compiles to GPU too, so the regime locks the programming model more than the silicon. The downside is that the ecosystem of pretrained checkpoints, third-party kernels and community tooling around JAX/TPU is narrower than CUDA's. Supply is also single-source. TPUs are mostly rented through Google Cloud; since Q2 2026 Google also delivers TPU systems to select customers' own data centers.
Neuron (AWS's SDK for Trainium and Inferentia) is the most vertically integrated of the four and the most tied to one supplier. Neuron compiles PyTorch or JAX down to the Trainium ISA. PyTorch reaches it through the native TorchNeuron backend, available on Trn2 and Trn3 since Neuron 2.27 (December 2025). The lock-in is the whole stack plus the fact that Trainium is available only from AWS, in its regions or as AWS-operated AI Factories in a customer's own data center. The trade is explicit: AWS reports customers cutting training and inference costs by up to 50% (a vendor figure with no stated baseline), paid for with a Neuron porting project and the loss of any exit to another cloud. → Chapter 7.4.
| Regime | Vendor / silicon | Primary lock-in layer | Day-0 model availability | Exit cost (dominant term) | Erosion vector |
|---|---|---|---|---|---|
| CUDA | NVIDIA GPUs | Libraries + tooling (cuDNN, NCCL, TensorRT-LLM, CUTLASS) | Day 0 for most models, which are tuned here first | Rewriting hand-tuned CUDA C++ kernels with no portable equivalent | Triton/MLIR/torch.compile abstract the kernel layer away |
| ROCm | AMD Instinct GPUs | Kernel coverage (the custom-kernel long tail) | Days-to-weeks on funded workloads; longer on the tail | Re-tuning + closing the realized-MFU gap on your specific model | HIP source-compat + PyTorch upstreaming + InferenceX-style benchmarking |
| XLA / JAX | Google TPU (also compiles to GPU) | Programming model (whole-program graph compilation) | Strong for Google/JAX-native models; thinner third-party tail | JAX-native code: dependence on Google as sole supplier. PyTorch code: proving PyTorch/XLA, or Google's TorchTPU backend once it is public, works on your model | JAX-on-GPU; TorchTPU for native PyTorch on TPU (introduced April 2026 to replace PyTorch/XLA once public; check release status and operator coverage) |
| Neuron | AWS Trainium / Inferentia | Full vertical stack + single-cloud availability | Anchor-tenant models day 0; general tail lags | Neuron port + no supplier other than AWS | Native PyTorch through TorchNeuron (Neuron 2.27, Dec 2025), NKI kernels, managed model hubs |
The realized-MFU gap: where paper FLOPS go to die
A costly misconception in accelerator procurement is that two chips with similar peak FLOPS deliver similar work. They do not. The gap reflects software, memory, fabric and the model. Model-FLOPS utilization is the useful floating-point work your model actually performs (its model FLOPs) divided by the chip's matching dense peak over the same wall-clock. Fix the model, precision, FLOP-count convention and device count before you compare two chips. Then profile the difference in the kernels, the fused attention path, the collective-communication overlap and the compiler's ability to keep the tensor cores fed.
This is where ROCm's story changed in 2026, and the direction of travel matters more than any single snapshot. The historical knock on AMD was a severe realized gap. The MI300X carried roughly 1.3x the paper FLOPS of an H100 but, on real inference, showed workload-specific shortfalls on the tested kernels and serving stack at the reported model, precision and release (SemiAnalysis AMD-vs-NVIDIA inference benchmark, May 2025). By mid-2026 the gap was closed for some models and still open for others. In May 2026, MI355X running GLM-5 on ROCm and SGLang matched B200's recipe for FP8 KV cache and the same MLA path. FP4 with MTP was not yet at parity, and MI355X had no disaggregated or wide-EP recipe. Across roughly 10 to 77 tok/s per user, MI355X was cheaper per million tokens by up to about 29%. At the point where its lead was widest, about 18 tok/s per user, B200 cost 1.41 times as much: $0.30 against $0.22 per million tokens, rounded. B200 pulled ahead at about 90 tok/s per user (SemiAnalysis InferenceX, May 2026). SemiAnalysis's InferenceX dashboard in October 2026 set the best published run on each chip side by side, in an agentic scenario. On that view, Qwen3.5 397B ran 58% cheaper per token on MI355X than on B200, and DeepSeek V4 Pro ran 51% dearer. The lesson is not "AMD won" or "NVIDIA won." The realized-MFU gap is a moving target set by software investment, workload by workload, and a procurement decision made on last quarter's gap may be wrong this quarter.
The consequence for the buyer is structural. A hardware-price advantage only counts if the quotes are matched and useful output, porting and recurring support are measured on the same boundary. In the illustration, a chip priced 20% lower that delivers 40% less matched useful output costs 0.8/0.6 ≈ 1.3 times as much per unit of output, before other costs. It breaks even only when its useful output reaches 80% of the reference; below that, the cheaper chip buys a more expensive cluster. Compare the full cash flows in Chapter 1.8, in cost per token or cost per useful FLOP. Flip it around and the same logic favors the challenger: on a workload where ROCm has reached parity and the complete service costs less, it wins on cost per token.
Scope & caveats
GLM-5 FP8, ISL 8192/OSL 1024, single node, SGLang v0.5.12 images on both chips. Best point is 18 tok/s/user with MTP, where SemiAnalysis puts B200 at 1.41x MI355X's cost per million tokens, so MI355X is about 29% lower ($0.30 vs $0.22 per million tokens, rounded). The advantage holds from about 10 to 77 tok/s/user; B200 is ahead at about 90. The article headline's '40% cheaper' is the 1.41x ratio, not a 40% saving.
One model and one workload, not a general ROCm-vs-CUDA result. On SemiAnalysis's October 2026 dashboard MI355X costs 51% more on DeepSeek V4 Pro and 58% less on Qwen3.5 397B (best published run per chip; configurations differ).
Scope & caveats
Savings AWS reports for named Trainium adopters (Anthropic, Karakuri, Metagenomi, NetoAI, Ricoh, Splash Music; Decart at 'half the cost of GPUs'). Vendor-reported 'up to' figures with no stated baseline.
Vendor-reported best case; no independent like-for-like benchmark.
Scope & caveats
Forecast of ASIC-based AI-server system-unit shipments, not accelerator chips, revenue or workload share. April revision of TrendForce's January 2026 forecast of 27.8%.
Portability layers: paying the option premium up front
If lock-in is a contract, portability layers are the clause that lets you exit, and you pay for that clause whether or not you exercise it. The strategic decision is how much of your stack to write against a portable abstraction versus a vendor-native one, and you make it years before you would ever switch. Three layers matter in 2026, at three different altitudes.
The framework layer (PyTorch / JAX). The most important portability decision most teams make is simply to write models in PyTorch (or JAX) rather than in raw CUDA. PyTorch is the great equalizer. Idiomatic PyTorch can target CUDA and ROCm. It reaches TPU today through PyTorch/XLA. In April 2026 Google introduced TorchTPU, a native, eager-first PyTorch backend with torch.compile and DTensor support; the PyTorch/XLA project says it will replace PyTorch/XLA once it is public, so check its release status and operator coverage for your model. Trainium is reached through TorchNeuron (Neuron 2.27, December 2025). Operator coverage, numerical behavior, compilation, performance and distributed-runtime support must still be validated per backend. That is why ROCm's porting tax is low for PyTorch code and high for hand-written CUDA: the abstraction already exists, and AMD invests heavily in keeping its backend upstreamed. The lock-in you create by dropping into vendor-native kernels for the last 10% of performance is the lock-in you will pay to undo.
The kernel layer (Triton / MLIR). Below the framework sits the kernel, and this is where CUDA's deepest moat is being abstracted away. Triton, the kernel language built on MLIR, offers multiple backends, but a kernel is portable only across the specific devices, operators, layouts, numerical behavior and performance targets validated in CI. Since PyTorch 2.0 it has been the default code generator inside torch.compile's TorchInductor. The project now lives in the community triton-lang repository, with major contributions from NVIDIA, AMD, Intel and Meta. NVIDIA and AMD GPUs are supported in tree, and Intel maintains its own GPU backend. A custom Triton kernel can reduce porting work, but it is not automatically portable or performance-equivalent across vendors; the same kernel written in CUDA C++ with wgmma and tensor-memory-accelerator intrinsics is not portable at all. This is the layer where the CUDA moat is most actively eroding, and where your kernel-authoring policy directly sets your future switching cost.
The serving layer (OpenAI-compatible APIs). For inference, the cheapest portability you can buy is an OpenAI-compatible HTTP surface in front of whatever engine you run. vLLM and SGLang (which run on both CUDA and ROCm) and NVIDIA's TensorRT-LLM all expose a near-identical OpenAI-compatible request API, so the application above never learns which silicon it is talking to. That makes the inference fleet the easiest place to be heterogeneous: route traffic to whichever accelerator delivers the best cost per token this quarter, behind a stable API. The lock-in at this layer is shallow by design.
| Layer | Portable choice | Vendor-native choice | Option premium of portable | When native is right |
|---|---|---|---|---|
| Framework | PyTorch / JAX (multi-backend) | CUDA C++ application code | Model- and backend-specific; test operator coverage, numerics, compilation and distributed behavior | Almost never; reserve for a profiled hot path |
| Kernel | Triton / MLIR (NVIDIA + AMD in tree; Intel backend) | CUDA C++ + cuDNN / CUTLASS | Often single-digit % on the hottest kernels | Frontier kernels where the last 10% pays for itself at scale |
| Collectives | NCCL-API-compatible (RCCL, oneCCL) | NCCL tuned to one fabric | Low at the API; tuning differs per fabric | When fabric-specific tuning is the bottleneck |
| Serving | OpenAI-compatible API over vLLM/SGLang | Vendor-locked inference microservice | API syntax may be small; semantics, tokenizer, batching, errors, observability and SLO behavior require validation | When the native service's validated semantics or performance justify the switching cost |
| Scale-up fabric | UALink / Ethernet-based open fabric | NVLink (proprietary; NVIDIA-controlled, licensed via NVLink Fusion) | Bandwidth/latency gap vs the leader, today | When you want the densest, fastest scale-up domain now |
Quantifying the switching cost
Lock-in is only actionable once you put a number on it. The number is the total cost of switching regimes, which is not one cost but four, paid at different times.
The porting cost is the engineering time to make your stack run at all on the new regime. For PyTorch-native training and inference it is genuinely modest: days to weeks, mostly dependency and container work. For a codebase laced with hand-written CUDA kernels, custom NCCL tuning or TensorRT-LLM-specific serving paths, it is a quarters-long project staffed by scarce specialists. The cost scales with how much vendor-native code you wrote in the first place, which is why the kernel-authoring policy of two years ago is today's switching cost.
The realized-MFU recovery cost is the larger and more often ignored term. Getting your model to run on the new regime is not getting it to run well. Between first light and tuned throughput you pay for silicon at a fraction of its peak while engineers chase the missing MFU: re-tuning kernels, fixing collective overlap, matching the serving framework's batching to the new memory system. On an immature stack this recovery can take longer than the port itself, and during it your cost per token is underwater.
The window is measurable. On DeepSeek V4 (April 2026), MI355X ran at 1–2 tokens per second per user on day 0 and improved more than 100x within a month. Over the same period B200 gained about 1.7x in tokens per megawatt from software alone, at 50 tok/s per user (SemiAnalysis, June 2026). A benchmark taken in a model's first month measures the software date more than the silicon. Record the software date with every result, and re-test a new model within weeks.
The day-0 coverage cost is the opportunity cost of not being on the regime where new models land first. Most new architectures, attention variants and quantization schemes ship and are tuned on CUDA first. The exceptions are labs that co-develop with another stack: Google on TPU, and DeepSeek V4, which launched day-0 on Huawei's CANN as well as CUDA. On ROCm, Neuron and XLA, third-party models arrive days to weeks later, after community or vendor porting. For a frontier lab that must serve the newest model the hour it drops, that lag is lost revenue and a competitive gap, and it is a recurring tax, not a one-time switching cost.
The operational-complexity cost is the standing overhead of running a heterogeneous fleet: two toolchains, two driver and firmware matrices, two sets of failure modes, two on-call playbooks. It is paid every day, not once, and it is why many operators stay single-vendor despite a price advantage elsewhere. The second toolchain needs an owner, and that owner is a headcount.
The port takes 12 × 8 + 40 + 40 + 24 = 200 hours, or $30,000 at $150/h. Sustaining costs 20 h × 12 months × $150/h = $36,000 in the first year. Twelve months of $8,000 savings bring in $96,000, leaving a first-year surplus of $30,000 after both costs. The two costs total $66,000, so the decision flips at a gross saving of $5,500/month; at $5,000/month the first year loses $6,000. Benchmark the untouched baseline separately from the tuned manifest. The hours engineers spend closing the gap between the two are the realized-MFU recovery cost from earlier in this chapter. Count them as a switching cost on top of the port, not as a ROCm tax to be written off.
Scope & caveats
Hypothetical inputs from Chapter 7.9's worked example: 200 port hours at $150/h, 20 h/month sustaining, $8,000/month gross saving for 12 months, with the ROCm release assumed to match CUDA's quality, latency and recovery gates. Not a measured result or a market estimate.
In this scenario, fund the port, and accept it only on the complete combination of hardware, software release and model. The release has to pass quality, p99 latency, collective scale, checkpoint recovery and rollback on that exact manifest; an API-compatible NCCL/RCCL call proves none of them. Below the $5,500 threshold, keep the incumbent unless a separately funded continuity requirement pays the difference.
Deep dive: why the CUDA moat is libraries, not the language — and what that means for erosion
The popular framing is "CUDA is a programming language and that is the moat." It gets the mechanism wrong and so mispredicts where the moat erodes. The CUDA language (a C++ dialect with a launch syntax) is the least defensible part of the stack. HIP source-translates it almost mechanically, and most production code never touches it directly because it lives one or two layers up in PyTorch. The actual moat is the library and tooling estate: cuDNN's hand-tuned convolution and attention kernels, cuBLAS and CUTLASS for the matrix math, NCCL for collectives that overlap with compute on NVLink, TensorRT-LLM for serving, plus Nsight profilers and a debugger ecosystem. Above all it is the network effect: most researchers prototype on NVIDIA, so most new techniques are born CUDA-tuned.
This diagnosis predicts where the moat erodes. It does not erode by someone cloning the CUDA language. It erodes through abstractions that make the library estate irrelevant, and two are doing exactly that. PyTorch hoists the application above the library layer, so a model is portable even when the kernels beneath it are not, and AMD and Intel invest to keep their backends upstreamed. Triton/MLIR attacks the kernel layer itself: a fused kernel written once compiles to PTX and AMDGCN in tree, and to Intel GPU code through Intel's own backend, and because Triton is the default inside torch.compile, ordinary PyTorch users generate portable kernels without knowing it. The moat does not fall; it gets routed around, one layer at a time, on the workloads the ecosystem chooses to fund. The practical reading for a buyer: the moat is strongest exactly where you are still writing vendor-native kernels, and weakest where you have already moved up to PyTorch + Triton. Your switching cost is, to first order, a measure of how much vendor-native code you let accumulate. → precision and quantization kernels in Chapter 7.10.
Single-vendor vs heterogeneous fleets
Fleet composition is a strategy decision that reaches you disguised as a procurement one. A single-vendor fleet buys operational simplicity: one toolchain, one driver matrix, one set of failure modes, one on-call playbook, and the deepest day-0 model coverage if that vendor is NVIDIA. It pays for that simplicity with price exposure, because you are a captive buyer with no credible alternative to walk to, and with supply exposure, because a single allocation queue gates your entire build (→ Chapter 7.6 on the HBM/CoWoS upstream gate).
Single vendor no longer guarantees a single toolchain. Alongside the GPU racks, NVIDIA's Vera Rubin platform now includes Groq 3 LPX racks for latency-sensitive decode, each holding 256 SRAM-only LPUs (a vendor spec). NVIDIA took a non-exclusive licence to Groq's technology in December 2025, announced full production of LPX in August 2026, and uses its Dynamo software to split the work between GPUs and LPUs. The LPUs do not run CUDA natively. NVIDIA positions them as an accelerator attached to the CUDA stack on NVL72. Put LPX racks in an all-NVIDIA fleet and you run a second silicon family with its own compiler and its own failure domain, all bought from the same vendor, so it adds work without adding price leverage. Before sizing decode around LPX, find out which models and serving frameworks that path supports.
A heterogeneous fleet inverts both exposures, price and supply. Running NVIDIA for the bleeding edge and AMD, TPU or Trainium for the steady-state workloads where they have reached parity buys price discipline, a real outside option in every negotiation, and supply diversity across multiple allocation queues. The cost is the operational complexity above: two toolchains that each need an owner, and a routing layer (best built at the serving API) that sends each workload to the silicon with the best current cost per token. The strategy is most defensible at the inference layer, where an OpenAI-compatible API keeps the calling application unchanged across the swap, and where the porting, throughput-recovery and operating costs separated above are what you actually pay. It is least defensible at frontier training, where day-0 coverage and the deepest scale-up domain still favor a single vendor.
The forecast rise of ASIC-based systems to about 27% of 2026 AI-server shipments (TrendForce, April 2026) puts this question on every roadmap. Every Maia, MTIA, TPU and Trainium is, by construction, a non-CUDA software regime, and the hyperscalers building them have already paid the heterogeneity tax internally because the cost-per-token and supply-control upside justified it at their scale. Whether everyone smaller can capture the same upside, or whether the operational-complexity cost eats it, depends on their workload mix and the depth of their engineering bench. → the merchant-silicon disruption in Chapter 7.5; the qualified configuration from Chapter 7.11 enters the lifecycle cost model in Chapter 1.8.
Deep dive: the collective-communication library as a hidden lock-in (NCCL vs RCCL)
Buyers obsess over the kernel and the framework and forget the layer that most directly gates multi-node training MFU: the collective-communication library. NCCL (NVIDIA) implements all-reduce, all-gather and reduce-scatter tuned to NVLink and the InfiniBand/Spectrum-X fabric, overlapping communication with compute to reduce exposed gradient-sync time. Dependencies and network contention can still stall the tensor cores. On a large synchronous training run, a poorly overlapped collective can leave substantial compute time exposed, and it is invisible on the datasheet.
The portability story here is real but incomplete. RCCL (AMD) is API-compatible with NCCL, so PyTorch's distributed layer calls it transparently and the supported call surface can stay unchanged; custom extensions and build dependencies still need verification. But tuning is fabric-specific. The topology-aware algorithms, buffer sizes and ring-versus-tree selection that NCCL has accreted over years on NVLink are not automatically optimal on AMD's Infinity Fabric or a UALink topology. API compatibility can reduce porting work; it does not establish realized collective bandwidth, and the tuning cost folds straight back into the software budget. That is why a multi-node training benchmark, not a single-GPU one, is the only honest way to compare regimes for training: the lock-in lives in the spaces between the GPUs as much as on them. → fabric topology and collectives in Chapter 8.2.
Cite this chapter
Fehn, J. (2026). Software Ecosystems & Lock-In (Chapter 7.9). The Definitive Guide to AI Data Centers. https://aidatacenterguide.com/part-7-compute-silicon-and-system-integration/7-9-software-ecosystems-and-lock-in (accessed 2026-10-25).
@misc{aidc-7-9,
author = {Fehn, Jacob},
title = {Software Ecosystems & Lock-In (Chapter 7.9)},
howpublished = {The Definitive Guide to AI Data Centers},
year = {2026},
url = {https://aidatacenterguide.com/part-7-compute-silicon-and-system-integration/7-9-software-ecosystems-and-lock-in},
note = {Accessed 2026-10-25}
}