Learn how vLLM uses PagedAttention and continuous batching to increase LLM serving throughput while reducing GPU memory waste.

TL;DR: vLLM is an open-source inference engine that accelerates LLM serving with PagedAttention and continuous batching. It can deliver up to 24x higher throughput while exposing OpenAI-compatible APIs for models such as Llama, Mistral, and Qwen.
vLLM is a high-throughput, memory-efficient inference and serving engine for large language models, developed at UC Berkeley and released as open source in 2023. The project emerged from research identifying that traditional LLM serving systems waste 60-80% of GPU memory on fragmented key-value (KV) cache storage, creating an artificial bottleneck that limits batch sizes and throughput even when computational resources remain available.
The core innovation is PagedAttention, a memory management technique inspired by virtual memory and paging in operating systems. By storing attention KV caches in non-contiguous memory blocks and dynamically allocating them on demand, vLLM eliminates the memory fragmentation that plagues conventional serving systems. This single architectural change enables serving workloads to achieve 2-4x higher throughput at the same latency, or alternatively, reduce per-request latency while maintaining throughput.
For production teams, vLLM matters because it directly translates to infrastructure cost reduction. A deployment serving 1000 requests per minute might consolidate from 8 GPUs to 2-4 GPUs with vLLM, while maintaining the same quality-of-service guarantees. The engine has become the de facto standard for self-hosted LLM inference, with adoption spanning startups building conversational AI products to enterprises replacing OpenAI API calls with on-premise models for compliance or cost optimization.
PagedAttention solves the memory fragmentation problem by treating attention computation like an operating system treats memory: allocate in fixed-size blocks, allow non-contiguous storage, and maintain a mapping table. Traditional LLM inference pre-allocates contiguous memory for the maximum possible sequence length for each request, resulting in severe internal and external fragmentation as actual sequence lengths vary.
The mechanism works in three steps:
Block allocation: The KV cache for each sequence is divided into fixed-size blocks (typically 16-32 tokens). Rather than allocating a contiguous array for max_seq_length, vLLM allocates blocks on demand as the sequence grows. A sequence with 100 tokens might use 4 blocks scattered across GPU memory rather than a single 2048-token buffer.
Block table management: Each sequence maintains a block table that maps logical KV cache positions to physical memory blocks, exactly analogous to a page table in virtual memory systems. When computing attention for token position 47, vLLM looks up which physical block holds that position's KV cache and indexes into it.
Memory sharing: Multiple sequences can share the same physical blocks when their KV caches are identical, which occurs frequently in prefix sharing scenarios (many prompts starting with the same system message) and beam search (multiple candidate sequences diverging from a common prefix). This sharing is implemented via reference counting and copy-on-write semantics.
The result is near-zero memory waste. Experiments on production traces show PagedAttention achieves 95%+ memory utilization versus 20-40% for traditional serving systems. This headroom translates directly into larger batch sizes, which amortizes the fixed cost of memory bandwidth and computation across more requests, increasing throughput.
Continuous batching is the scheduling policy that maximizes GPU utilization by dynamically adding and removing requests from the active batch between generation steps. Traditional static batching waits for all requests in a batch to complete before starting the next batch, leaving GPUs underutilized whenever sequence lengths vary significantly.
The vLLM scheduler operates at iteration granularity rather than batch granularity. After generating one token for all sequences in the current batch, the scheduler:
This approach maintains GPU occupancy even when request arrival is bursty and sequence lengths are heterogeneous. In workloads where 90th percentile latency is 5x the median (common in production), static batching forces 90% of requests to wait for the slowest 10%. Continuous batching decouples them, allowing fast requests to complete and free resources for pending work.
The efficiency gain compounds with PagedAttention. Static batching must reserve memory for the longest possible sequence in the batch, while continuous batching with PagedAttention allocates memory adaptively as each sequence grows. A batch of 32 requests might fit in memory with vLLM where only 8 would fit with static batching, directly multiplying throughput.
The current GPU installation guide supports Linux with Python 3.10-3.13 and
publishes separate paths for NVIDIA CUDA, AMD ROCm, and other accelerators.
Use a clean environment and let vLLM select a compatible PyTorch backend:
Check the official GPU installation guide
before pinning CUDA, ROCm, or PyTorch versions because the compatibility matrix
changes between releases. For production deployments, pin a tested release tag or image digest
instead of relying indefinitely on latest:
Starting a server is a single command:
Key configuration parameters:
vLLM provides both synchronous and asynchronous Python APIs for embedding inference directly into applications:
For batch workloads where latency doesn't matter and throughput is paramount:
For serving applications where requests arrive continuously:
Once the server is running, any OpenAI client library works without modification:
This compatibility enables gradual migration: point your existing OpenAI integration at a vLLM endpoint, observe parity, then switch production traffic with a single configuration change.
Large models that exceed single-GPU memory require distributed inference across multiple GPUs or nodes. vLLM supports two parallelism strategies, often combined:
Tensor parallelism splits individual layers across GPUs. A linear layer with weight matrix W is partitioned column-wise or row-wise, with each GPU computing a portion of the matrix multiplication. The engine automatically inserts collective communication operations (all-reduce, all-gather) to synchronize activations between partitions.
Tensor parallelism has low communication overhead (only activations, not weights) but requires high-bandwidth interconnects (NVLink, NVSwitch). It is most effective within a single node or across nodes with fast networking (InfiniBand, EFA).
Pipeline parallelism assigns consecutive layers to different GPUs. A 48-layer model on 4 GPUs would allocate layers 0-11 to GPU 0, 12-23 to GPU 1, and so on. Activations flow through the pipeline sequentially.
Pipeline parallelism tolerates slower interconnects but introduces pipeline bubbles (idle time while GPUs wait for activations). vLLM mitigates this through micro-batching: splitting each batch into smaller micro-batches that flow through the pipeline in an overlapped fashion.
Production deployments of 70B+ models typically combine both:
This configuration forms 4 pipeline stages, each stage distributed across 4 GPUs with tensor parallelism. The model is effectively split into 16 shards, with efficient intra-stage communication and sequential inter-stage communication.
Quantization reduces model size and increases throughput by representing weights and activations with lower-precision data types. vLLM integrates multiple quantization backends:
AWQ quantizes weights to 4-bit integers while preserving activation patterns that matter most for accuracy. It achieves near-FP16 quality with 3-4x memory reduction:
AWQ requires pre-quantized model weights (available on HuggingFace for popular models) and works best for inference-only workloads where slight accuracy degradation is acceptable.
GPTQ performs layer-wise quantization with error compensation, achieving 2-4x compression at 4-bit precision:
GPTQ models trade some accuracy for substantially larger batch sizes. A 70B GPTQ model fits in the same memory footprint as a 13B FP16 model, enabling 5-6x throughput improvements on memory-constrained GPUs.
SqueezeLLM uses sensitivity-aware quantization and dense-and-sparse decomposition to push to 3-bit precision with minimal accuracy loss:
This is the frontier of practical quantization — further reduction (2-bit, 1-bit) shows measurable quality degradation in most benchmarks.
For H100 and newer GPUs with hardware FP8 support, vLLM can leverage native low-precision computation:
FP8 quantization provides nearly lossless compression (2x memory reduction) with hardware-accelerated computation, making it ideal when targeting cutting-edge hardware.
Modern AI applications increasingly use agents that make multiple LLM calls per task. vLLM integrates seamlessly with major agent frameworks through both API compatibility and native integrations:
LangChain's vLLM integration uses the OpenAI-compatible endpoint:
For production deployments running vLLM servers separately:
LlamaIndex uses vLLM for both query engines and retrieval-augmented generation:
For production-scale deployments with horizontal scaling and load balancing:
This pattern enables autoscaling based on queue depth, A/B testing between model versions, and canary deployments — capabilities critical for production agent infrastructure.
Despite significant advantages, vLLM introduces tradeoffs that influence when to use it versus alternatives:
PagedAttention's block allocation adds fixed overhead (block table storage, memory management metadata) that becomes proportionally significant for very short sequences (under 50 tokens). For workloads dominated by single-turn queries with output lengths under 100 tokens, the PagedAttention benefit may not exceed its overhead. In such cases, simpler serving systems or direct inference without continuous batching can achieve comparable performance.
Continuous batching trades predictable per-request latency for higher aggregate throughput. A request arriving when the batch is full must wait for the next iteration's slot, introducing queueing delay. The 95th percentile latency can be 2-3x the median in high-utilization scenarios. Applications with strict latency SLOs (sub-100ms response time for real-time features) may need to operate at lower utilization or use dedicated capacity.
While vLLM supports dozens of architectures (Llama, Mistral, GPT, OPT, Qwen, BLOOM, Falcon, MPT), cutting-edge models may lack immediate support. Custom architectures, non-standard attention mechanisms, or newly released models require manual integration. The project's velocity is high, but expect a 2-4 week lag for very new releases.
The engine's aggressive memory optimization and dynamic scheduling make debugging harder than static batching systems. A performance regression might stem from memory fragmentation in a specific request pattern, continuous batching scheduling decisions, or subtle interactions between parallelism strategies. Built-in observability is limited to high-level metrics (throughput, latency distributions); understanding per-request behavior requires custom instrumentation.
vLLM assumes homogeneous GPUs within a tensor-parallel group. Mixed GPU types (e.g., A100 + V100 in the same deployment) or heterogeneous network topologies can lead to stragglers dominating synchronization points, effectively throttling the system to the slowest component. Cloud deployments should use instance types with identical GPUs and predictable network performance.
The LLM serving landscape includes multiple engines, each optimizing for different priorities:
TensorRT-LLM (NVIDIA) compiles models into highly optimized GPU kernels, achieving the lowest per-token latency for supported models. It excels in single-request latency (20-30% faster than vLLM) but has limited batching flexibility. Use TensorRT-LLM when minimizing latency for individual requests matters more than throughput, and when your model is well-supported by NVIDIA's toolchain. Use vLLM when serving hundreds of concurrent requests where aggregate throughput dominates cost.
TGI (HuggingFace) provides production-ready serving with focus on ease of deployment and HuggingFace ecosystem integration. It supports continuous batching and quantization but lacks PagedAttention's memory efficiency. Benchmarks show vLLM achieving 2-4x higher throughput on identical hardware for memory-constrained workloads. Use TGI when rapid experimentation with HuggingFace models matters more than peak throughput, or when production monitoring and observability from HuggingFace's ecosystem are requirements.
DeepSpeed-MII (Microsoft) optimizes multi-GPU and multi-node inference with focus on massive models (100B+ parameters). It provides lower-level control over parallelism strategies but requires more manual configuration. Use DeepSpeed-MII for extremely large models where fine-grained control over distributed execution justifies the complexity. Use vLLM for models under 100B parameters where automated parallelism decisions and ease of use are priorities.
Ray Serve is a general-purpose model serving framework that can wrap any inference engine (including vLLM). It provides horizontal scaling, A/B testing, and load balancing but doesn't optimize LLM-specific concerns. The pattern of using Ray Serve to orchestrate vLLM engines (shown earlier) combines the best of both: vLLM's inference efficiency and Ray's deployment flexibility.
The decision often comes down to hardware constraints (memory pressure favors vLLM), latency requirements (ultra-low latency favors TensorRT-LLM), and operational preferences (managed services vs self-hosted, ecosystem lock-in vs flexibility).
Reduce cost by increasing useful tokens per GPU-hour while staying inside
latency and quality limits. Benchmark a fixed workload before changing engine
settings, then track time to first token (TTFT), time per output token (TPOT),
request and token throughput, queue time, KV-cache utilization, prefix cache hit rate,
error rate, and GPU-hours. Cost per successful request is a business
metric; raw throughput alone can hide timeouts, low-quality quantization, or
long queues.
Use vLLM's /metrics endpoint and serving benchmark output as the measurement
source. Make one change at a time, keep a fixed evaluation set, and roll back
when the gain in tokens per GPU-hour comes with unacceptable task-success or
tail-latency loss. The evaluation dimensions in
LangSmith vs Langfuse vs Phoenix
provide the quality side of that cost decision.
Official references:
Lessons from production vLLM deployments at scale:
Set --gpu-memory-utilization to 0.90 for shared infrastructure (leaving headroom for PyTorch operations and system processes) and 0.95 for dedicated inference nodes. Monitor OOM events — if they occur regularly, reduce the utilization factor rather than increasing --swap-space. Swapping to CPU is slower than maintaining lower GPU utilization.
Instrument these metrics at minimum:
Use OpenTelemetry to export traces and Prometheus for metrics. vLLM's /metrics endpoint exposes Prometheus-compatible stats.
Configure --max-num-batched-tokens to bound per-iteration latency, preventing a single massive batch from blocking new arrivals. A reasonable value is max_model_len × max_concurrent_requests × 0.2. For bursty workloads, operate at 60-70% average GPU utilization to absorb spikes without queueing delays exceeding SLOs.
Use semantic versioning for model artifacts and implement blue-green deployment:
A rollback is changing the load balancer target, completing in seconds.
Profile your workload's sequence length distribution. If 80% of requests are under 512 tokens, configure --max-model-len 1024 instead of the model's native 4096 to reclaim memory for larger batch sizes. Use quantization (AWQ, GPTQ) aggressively — the quality degradation is usually undetectable in production while throughput gains are substantial.
For multi-tenant scenarios, consider per-tenant instances or priority queues to prevent noisy neighbor issues. vLLM's continuous batching makes it harder to guarantee latency for specific users when mixed with best-effort traffic.
vLLM is used for high-throughput serving of large language models in production environments, enabling self-hosted inference for applications like conversational AI, code generation, content creation, and AI agents. It replaces managed API services (OpenAI, Anthropic) when cost, latency, data privacy, or model customization requirements favor self-hosting. Typical use cases include: chatbots handling thousands of concurrent users, batch processing workloads (document analysis, code review), RAG pipelines requiring low-latency embedding and generation, and multi-agent systems making hundreds of LLM calls per task.
vLLM achieves 2-24x higher throughput than HuggingFace Transformers baseline depending on the workload. Memory-constrained scenarios with long sequences (1000+ tokens) and high batch sizes show the largest gains (10-24x), as PagedAttention eliminates memory fragmentation that prevents traditional systems from batching effectively. For short sequences with low concurrency, the improvement is more modest (2-4x), primarily from continuous batching rather than memory optimization. Single-request latency is comparable to optimized baselines — vLLM's advantage is aggregate throughput under realistic multi-user load.
vLLM supports AMD GPUs via ROCm (install with pip install vllm+rocm573) and runs on CPUs as of version 0.4.0, though CPU performance is substantially lower than GPU (typically 10-50x slower depending on model size and CPU core count). CPU deployment is practical only for development/testing or very low-throughput production use cases (under 10 requests/hour). For production inference, NVIDIA GPUs (A100, H100, L4, L40S) remain the most cost-effective option, with AMD MI250/MI300 competitive on a performance-per-dollar basis.
vLLM supports tensor parallelism (splitting layers across GPUs) and pipeline parallelism (assigning layer ranges to GPUs), configurable via --tensor-parallel-size and --pipeline-parallel-size flags. Tensor parallelism requires high-bandwidth interconnects (NVLink, InfiniBand) for efficient all-reduce communication and works best within a single node or across closely connected nodes. Pipeline parallelism tolerates slower interconnects but introduces pipeline bubbles mitigated through micro-batching. Production deployments of 70B+ models typically use hybrid parallelism (4-way tensor × 4-way pipeline = 16 GPUs).
vLLM supports 50+ model architectures including Llama (1, 2, 3, 3.1), Mistral (7B, 8x7B, 8x22B), Qwen (1.5, 2, 2.5), GPT (GPT-2, GPT-J, GPT-NeoX), OPT, BLOOM, Falcon, MPT, Phi, StableLM, DeepSeek, Mixtral, and vision-language models like LLaVA and Fuyu. The engine auto-detects architecture from HuggingFace model configs in most cases. Custom architectures require manual integration by registering attention and layer implementations. Check the official compatibility matrix for newly released models, as support typically arrives 2-4 weeks after public release.
vLLM exposes Prometheus metrics at /metrics endpoint covering throughput (tokens/sec, requests/sec), latency distributions (time-to-first-token, end-to-end latency), KV cache utilization, active batch size, and queue depth. For request-level tracing, integrate OpenTelemetry instrumentation to capture per-request spans showing queueing time, batching decisions, execution time, and preemption events. Monitor GPU metrics (SM utilization, memory bandwidth, temperature) via NVIDIA DCGM or nvidia-smi. Critical alerts: p99 latency exceeding SLO, queue depth sustained above capacity, OOM events, and GPU memory utilization above 95%.
Yes, vLLM provides OpenAI-compatible HTTP APIs for chat and text generation,
and it exposes an OpenAI-compatible embeddings endpoint when serving an
embedding model. Applications can point the OpenAI client at the vLLM base URL,
but compatibility is endpoint- and model-dependent rather than a promise that
every OpenAI API or request field is implemented. Check the
before migrating a workload. Output quality still depends on the model being
served; API compatibility does not create model-quality parity.
vLLM is the core inference engine implementing PagedAttention and continuous
batching, usable as a Python library (from vllm import LLM). The historical
term "vLLM-serving" refers to the HTTP server component that now ships in the
same project and is started with vllm serve "$MODEL_ID". Use the Python
library for in-process inference and the server when other applications need
an HTTP interface.
Aaron is an engineering leader, software architect, and founder with 18 years building distributed systems and cloud infrastructure. Now focused on LLM-powered platforms, agent orchestration, and production AI. He shares hands-on technical guides and framework comparisons at fp8.co.
Complete Python walkthrough of AgentCore Memory, Runtime, Code Interpreter, Browser, and Gateway. Build enterprise AI agents on AWS without managing infra.
AI Agents, Amazon Bedrock, Conversational AIAgent orchestration frameworks 2026 compared: LangChain, AgentCore, LangGraph, CrewAI, AutoGen and Strands on coordination, memory, cost and deployment.
AI Agent Development, Framework ComparisonMaster Model Context Protocol from architecture to implementation. Build MCP servers, understand the spec, and integrate with Claude Code and Cursor.
AI Development Tools, Model Context Protocol