<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Ai-Infra on vishctl</title><link>https://vishctl.dev/tags/ai-infra/</link><description>Recent content in Ai-Infra on vishctl</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Tue, 15 Sep 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://vishctl.dev/tags/ai-infra/index.xml" rel="self" type="application/rss+xml"/><item><title>Why vLLM Is Dominating the AI Inference Market</title><link>https://vishctl.dev/posts/why-vllm-is-dominating-ai-inference-market/</link><pubDate>Tue, 15 Sep 2026 00:00:00 +0800</pubDate><guid>https://vishctl.dev/posts/why-vllm-is-dominating-ai-inference-market/</guid><category>vllm</category><category>inference</category><category>ai-infra</category><category>kubernetes</category><description>How PagedAttention, continuous batching, hardware portability, and an open ecosystem made vLLM the default engine for high-throughput LLM serving.</description><content:encoded><![CDATA[<p>In January 2026, the maintainers of vLLM launched a company called Inferact and raised a <a href="https://techcrunch.com/2026/01/22/inference-startup-inferact-lands-150m-to-commercialize-vllm/">$150 million seed round at an $800 million valuation</a>, co-led by Andreessen Horowitz and Lightspeed.</p>
<p>That is a remarkable outcome for a project that began with a memory-management idea in a UC Berkeley research paper. It also says something about where the industry believes the next bottleneck sits. Training gets the headlines. Inference gets the bills.</p>
<p>vLLM is not the fastest engine in every benchmark, on every model, on every chip. Its dominance is broader than that: it has become the open serving layer that model builders, cloud platforms, accelerator vendors, and Kubernetes stacks increasingly meet in the middle.</p>
<p>The reasons start deep inside the KV cache.</p>
<h2 id="the-problem-wasted-gpu-memory">The problem: wasted GPU memory</h2>
<p>During generation, a transformer stores the attention keys and values for every token it has already processed. That <strong>KV cache</strong> prevents the model from recomputing the entire sequence for every new token, but it grows with the request.</p>
<p>Traditional serving systems handled that growth by reserving one contiguous region for the request&rsquo;s maximum possible sequence length. A chat that uses 200 tokens could therefore hold a slot sized for 4,096. With many requests in flight, most of the most expensive memory in the system could be reserved but empty.</p>
<figure class="mermaid-figure">
  <div class="mermaid">flowchart LR
    R1["Request A<br/>200 tokens"] --> A1["used"] --> A2["reserved"] --> A3["reserved"] --> A4["reserved"]
    R2["Request B<br/>900 tokens"] --> B1["used"] --> B2["used"] --> B3["reserved"] --> B4["reserved"]
    R3["Request C<br/>2,700 tokens"] --> C1["used"] --> C2["used"] --> C3["used"] --> C4["reserved"]

    classDef request fill:#13264a,stroke:#38bdf8,color:#e6f6ff,stroke-width:2px;
    classDef used fill:#173f59,stroke:#22d3ee,color:#ecfeff,stroke-width:2px;
    classDef waste fill:#281d48,stroke:#7c6aa8,color:#b9add8,stroke-dasharray:5 4;
    class R1,R2,R3 request;
    class A1,B1,B2,C1,C2,C3 used;
    class A2,A3,A4,B3,B4,C4 waste;</div>
  <figcaption>Contiguous allocation reserves for the worst case, so short requests strand most of their KV-cache slots.</figcaption>
</figure>

<p>The problem is not only the empty space at the end. Contiguous regions also fragment as requests of different lengths start and finish. Enough memory may be free in total while no single region is large enough for the next request.</p>
<p>That caps concurrency. Fewer requests per GPU means more GPUs for the same traffic, which pushes up cost per token.</p>
<h2 id="pagedattention-virtual-memory-for-the-kv-cache">PagedAttention: virtual memory for the KV cache</h2>
<p>vLLM borrowed the answer from operating systems. Instead of storing each request in one contiguous allocation, <strong>PagedAttention</strong> divides the KV cache into fixed-size blocks. A logical sequence can point to physical blocks anywhere in GPU memory, and the engine allocates another block only when the sequence needs it.</p>
<figure class="mermaid-figure">
  <div class="mermaid">flowchart LR
    subgraph Logical["Logical token sequences"]
        A["Request A<br/>pages 1, 2"]
        B["Request B<br/>pages 3, 4, 5"]
        C["Request C<br/>pages 6, 7"]
    end

    T["Block table"]

    subgraph Physical["Shared physical KV-cache pool"]
        P4["B · 4"]
        P1["A · 1"]
        P6["C · 6"]
        P3["B · 3"]
        P2["A · 2"]
        P7["C · 7"]
        P5["B · 5"]
        F["free"]
    end

    A --> T
    B --> T
    C --> T
    T --> P1
    T --> P3
    T --> P6

    classDef request fill:#13264a,stroke:#38bdf8,color:#e6f6ff,stroke-width:2px;
    classDef table fill:#281d48,stroke:#a78bfa,color:#f1edff,stroke-width:2px;
    classDef page fill:#173f59,stroke:#22d3ee,color:#ecfeff,stroke-width:2px;
    classDef free fill:#302410,stroke:#fbbf24,color:#fff3cf,stroke-dasharray:5 4;
    class A,B,C request;
    class T table;
    class P1,P2,P3,P4,P5,P6,P7 page;
    class F free;</div>
  <figcaption>PagedAttention maps each logical sequence to small physical KV-cache blocks, allocating capacity as tokens arrive.</figcaption>
</figure>

<p>A short request consumes only the blocks its actual tokens require. When it finishes, those blocks return to the common pool and can immediately serve another sequence. The last block can still contain a little unused space, but external fragmentation disappears and over-reservation drops sharply.</p>
<p>This was not a small tuning trick. The original <a href="https://arxiv.org/abs/2309.06180">PagedAttention paper</a> reported near-zero KV-cache waste and <strong>2–4× higher throughput at comparable latency</strong> than the serving systems it evaluated, including FasterTransformer and Orca.</p>
<p>PagedAttention also makes block sharing practical. Parallel samples and shared prompt prefixes can point at the same physical blocks instead of duplicating them. That matters for chat histories, agent prompts, and any workload where many requests begin with the same long context.</p>
<h2 id="continuous-batching-no-empty-seats">Continuous batching: no empty seats</h2>
<p>Efficient memory creates room for more requests. Continuous batching keeps that room busy.</p>
<p>Static batching waits for a group of requests, runs them together, and often holds the group until its slowest sequence finishes. A request generating 20 tokens can occupy a batch slot while another request in that batch runs for 500.</p>
<p>Continuous batching schedules at the level of a generation step. When one sequence finishes, the scheduler removes it and admits a waiting request for the next step. The batch changes shape while the model is running.</p>
<figure class="mermaid-figure">
  <div class="mermaid">flowchart LR
    subgraph S1["Step 1"]
        A1["A"]
        B1["B"]
        C1["C"]
    end
    subgraph S2["Step 2"]
        A2["A"]
        B2["B"]
        C2["C · done"]
    end
    subgraph S3["Step 3"]
        A3["A"]
        B3["B"]
        D3["D · admitted"]
    end
    subgraph S4["Step 4"]
        A4["A · done"]
        B4["B"]
        D4["D"]
    end

    A1 --> A2 --> A3 --> A4
    B1 --> B2 --> B3 --> B4
    C1 --> C2 --> D3 --> D4

    classDef active fill:#173f59,stroke:#22d3ee,color:#ecfeff,stroke-width:2px;
    classDef done fill:#302410,stroke:#fbbf24,color:#fff3cf,stroke-width:2px;
    classDef incoming fill:#281d48,stroke:#a78bfa,color:#f1edff,stroke-width:2px;
    class A1,A2,A3,B1,B2,B3,B4,C1,D4 active;
    class C2,A4 done;
    class D3 incoming;</div>
  <figcaption>Continuous batching refills a GPU slot as soon as a request completes instead of waiting for the longest sequence.</figcaption>
</figure>

<p>The restaurant analogy is useful: seat a new table when one leaves instead of waiting for the whole dining room to empty. Paired with PagedAttention, it lets vLLM absorb the uneven prompt lengths, output lengths, and arrival times typical of real API traffic.</p>
<h2 id="a-different-lane-from-llamacpp-and-ollama">A different lane from llama.cpp and Ollama</h2>
<p><a href="https://github.com/ggml-org/llama.cpp">llama.cpp</a> and <a href="https://ollama.com/">Ollama</a> optimize for a different center of gravity: local execution, straightforward model packaging, quantized models, and a good single-user developer experience. They are excellent fits for a laptop, workstation, homelab, or local application.</p>
<p>vLLM is designed around shared serving: many callers, many in-flight sequences, and GPUs that need to stay saturated behind an API. Its scheduling and memory-management advantages become more valuable as concurrency rises.</p>
<p>So the meaningful question is not “which tool wins?” It is “what workload am I serving?” For local model use, the operational simplicity of Ollama or llama.cpp often matters more. For a high-concurrency endpoint, vLLM&rsquo;s architecture starts paying rent.</p>
<h2 id="open-portable-and-easy-to-adopt">Open, portable, and easy to adopt</h2>
<p>The other half of vLLM&rsquo;s lead is strategic. It offers an <a href="https://docs.vllm.ai/en/stable/serving/openai_compatible_server/">OpenAI-compatible server</a>, which lets many applications switch their backend without rewriting the client integration. It supports hundreds of model architectures and a broad set of hardware backends.</p>
<p>The current <a href="https://docs.vllm.ai/en/stable/getting_started/installation/">vLLM installation documentation</a> covers NVIDIA CUDA, AMD ROCm, Intel XPU, Apple Silicon, x86 and Arm CPUs, with plugins extending the project to Google TPUs, Intel Gaudi, Huawei Ascend, and other accelerators.</p>
<p>That portability matters. TensorRT-LLM can be an excellent choice when the target is a tightly optimized NVIDIA deployment. vLLM offers a different bargain: a common serving interface and scheduler across a heterogeneous fleet, without making the application layer care which accelerator sits underneath.</p>
<p>Hardware vendors have a reason to meet vLLM where its users already are. The <a href="https://vllm.ai/events/vllm-conference/2026">2026 vLLM Conference program</a> includes sessions from Google on TPU acceleration and AMD on upstream ROCm collaboration. That is the ecosystem loop in action: users attract hardware support, hardware support attracts more users.</p>
<h2 id="the-enterprise-math">The enterprise math</h2>
<p>Inference optimization has direct unit economics. If an engine safely serves more concurrent tokens from the same accelerator, the saving repeats for every request, every hour, across the lifetime of the deployment.</p>
<p>One market estimate puts model-inference optimization tools at <a href="https://www.precedenceresearch.com/press-release/model-inference-optimization-tools-market">$4.2 billion in 2025 and projects $48.82 billion by 2035</a>. The exact forecast matters less than the direction: inference is becoming its own infrastructure market rather than an implementation detail after training.</p>
<p>Enterprises also rarely live in one environment forever. Teams mix managed APIs with self-hosted models, use different clouds by region, and change accelerators when capacity or pricing changes. A common open serving layer makes that hybrid strategy less painful. A proprietary endpoint cannot follow a workload outside its vendor&rsquo;s walls; vLLM can.</p>
<h2 id="real-competition-is-a-good-sign">Real competition is a good sign</h2>
<p>vLLM is not unopposed. SGLang has its own strong scheduler and RadixAttention prefix-cache design. TensorRT-LLM remains formidable on NVIDIA hardware. New engines keep attacking specific layers of the serving stack, from kernels and speculative decoding to KV-cache transport.</p>
<p>That competition validates the size of the problem. It also clarifies vLLM&rsquo;s moat: not one permanent benchmark win, but a compounding ecosystem. More contributors bring earlier model support, more production experience improves the scheduler, and more surrounding infrastructure, including routers, Kubernetes operators, autoscalers, and observability, assumes vLLM as a default target. The official project now describes a community of <a href="https://docs.vllm.ai/en/stable/">more than 2,000 contributors</a>.</p>
<p>A competitor can beat a feature. Beating an integration surface that the rest of the market already builds around is harder.</p>
<h2 id="where-it-is-headed">Where it is headed</h2>
<p>The next architectural shift is <strong>disaggregated serving</strong>: moving prompt processing, or prefill, onto a different hardware pool from token generation, or decode.</p>
<p>The two phases stress hardware differently. Prefill processes many prompt tokens in parallel and is generally compute-bound. Decode produces tokens one step at a time and is usually constrained by memory bandwidth. Running both on the same GPU fleet forces one resource profile to compromise for the other.</p>
<p>vLLM&rsquo;s <a href="https://docs.vllm.ai/projects/production-stack/en/latest/use_cases/disaggregated-prefill.html">disaggregated-prefill stack</a> lets operators scale and tune those pools independently, then transfer the KV cache from prefill workers to decode workers. The immediate goal is better control over time to first token and inter-token latency, not a magical throughput boost in every configuration.</p>
<p>That nuance is the larger story of vLLM. It did not win attention with a flashy model launch. It solved a boring, expensive systems problem: wasted GPU memory. Then it paired that solution with a scheduler, a familiar API, broad hardware support, and an open community.</p>
<p>The market is not standardizing on vLLM because it wins every microbenchmark. It is standardizing on vLLM because it is becoming the place where the whole inference ecosystem connects.</p>
<h2 id="run-vllm-yourself">Run vLLM yourself</h2>
<p>Want to move from architecture to implementation? Read my hands-on guide to <a href="https://vishctl.dev/posts/vllm-on-wsl2-minikube/">running vLLM on Kubernetes with Minikube, WSL2, and an NVIDIA GPU</a>.</p>
]]></content:encoded></item></channel></rss>