vLLM
Fields
engines/vllmNotes
Backend terms used here: 'cuda' = NVIDIA; 'rocm' = AMD ROCm/HIP builds; 'xpu' = Intel GPU (SYCL-based, vllm-xpu-kernels, Python 3.12 only, tensor parallel supported, pipeline parallel beta on a single node via mp); 'metal' only via the out-of-tree vLLM-Metal plugin, not upstream. Quantization support per hardware is transcribed from the docs' Implementation x Hardware table; the same page warns the chart changes as vLLM evolves, so treat per-cell support as of 2026-10-03. Supported AMD gfx targets listed by the docs: MI200s (gfx90a), MI300 (gfx942), MI350 (gfx950), Radeon RX 7900 (gfx1100/1101), Radeon RX 9000 (gfx1200/1201), Ryzen AI MAX / AI 300 (gfx1151/1150). ||| MAINTENANCE (dated fact, GitHub API, 2026-10-04): last commit 2026-10-04 (0 months ago), latest release v0.30.0 published 2026-09-22, 3632 contributors (distinct committers incl. anonymous), open_issues_count 8443, NOT archived, 93173 stars, 8443 open issues+PRs. Among the most actively developed engines in this repo. CAVEAT on the issue count: it is GitHub's open_issues_count, which INCLUDES open pull requests - see [[ev-github-open-issues-count-includes-pull-requests]]. DEPLOYMENT (graded claim): the only graded-YES deployment evidence found for any engine besides [[sglang]] - see [[ev-production-evidence-is-scarce-and-nearly-always-single-site]]. vLLM issue #56700 (2026-09-13, open) is a 3-day bring-up of DeepSeek-V4.1-Flash (769B total, MXFP4 experts, Engram memory) on 8x RTX PRO 6000 96 GB consumer Blackwell, self-described field data, with configuration and version pinned (vLLM 0.1.dev20904 deepseekv41-flash-0909, torch 2.13.0+cu130, CUDA 13.0, TP=8, --kv-cache-dtype fp8, --block-size 128, --gpu-memory-utilization 0.85, 1M context). It publishes one throughput figure - 4584 tok/s prefill on the pure-torch eager fallback path - and that figure is deliberately recorded as a FALLBACK-path number, not the optimized production path, because flashinfer sparse-MLA SM120 instantiations were missing. It also contains the single most operationally important correctness finding found for this engine: the FP8 KV-cache block layout is '[64tok x 128B fp8 | 64tok x 4B fp32 scale]' (block-appended, not per-token interleaved) and misreading it 'passes short-prompt smoke tests and only fails at >=100K needle retrieval - silent numerical corruption'. BUILD COST: three distinct costs, see [[ev-build-cost-is-three-separate-builds]] for the taxonomy and the numbers. Engine compile: issue #13281 (2025-02-14) measures 'at least 3 hours on A100' for a Docker build at torch_cuda_arch_list=9.0+PTX, max_jobs=32, single SM 9.0 target, vLLM 0.7.2; RFC #17419 (2025-04-29, STILL OPEN) says the uncached CI wall clock 'exceeds 5 hours' and notes 95% of the last year's commits did not touch csrc. The vendor's own install docs say only 'can take several minutes', which is a warm figure - the reconciliation is in the gotcha. Documented mitigations: ccache/sccache (with CCACHE_NOHASHDIR=true required under pip install -e), VLLM_USE_PRECOMPILED=1, MAX_JOBS, and a dated reproducible datapoint for the arm64 GH200 image at ~15GB RAM and ~1475s / ~25 min with max_jobs=66, nvcc_threads=2. Runtime JIT: default VLLM_ENGINE_READY_TIMEOUT_S of 600 s is INSUFFICIENT on a cold FlashInfer cache for a large MoE on a new architecture - ~85 sm_121a CUTLASS kernels dominate startup, first attempt fails at ~599 s with a misleading empty error, second attempt succeeds in ~7 min (issue #48031); workaround is VLLM_ENGINE_READY_TIMEOUT_S=1800 plus a persistent cache dir. FEATURE AXES (filled from vendor docs 2026-10-04): speculative decoding has THIRTEEN published methods (EAGLE, LiLiCorr, MTP, Draft Model, PARD/Parallel Draft Model, MLP speculator, N-gram, Suffix decoding, Hidden State Extraction, Custom Proposer Backend, Dynamic Speculative Decoding, Adaptive Verification, Per-Request Acceptance Metrics) with the docs' own graded table (EAGLE and MTP High/Medium-high; Draft model High/Medium; PARD High/Medium-high; MLP Medium/Medium-high; N-gram and Suffix Low-medium/Medium) and the caution 'Real gains depend on your model family, traffic pattern, hardware, and sampling settings'; pipeline parallelism is not composable with spec decode as of vllm<=0.15.0. Structured output uses xgrammar and guidance backends, on by default in the OpenAI-compatible server, selectable per request via choice/regex/json/grammar/structural_tag, with --structured-outputs-config.backend default 'auto' - and an UPGRADE HAZARD the record should carry: guided_json, guided_regex, guided_choice, guided_grammar, guided_whitespace_pattern, structural_tag and guided_decoding_backend were all removed in v0.12.0. Disaggregated prefilling is explicitly EXPERIMENTAL per its own docs page, supports 9 named connector types, and the docs carry the caveat 'Disaggregated prefill DOES NOT improve throughput' plus the concession that production-level disagg relies on third-party connectors. Multimodal covers image and video (image_pil, video_url) and the record should now carry the SSRF guidance: --allowed-media-domains plus VLLM_MEDIA_URL_ALLOW_REDIRECTS=0, 'especially important if you run vLLM in a containerized environment'. Quantization implementation list is now recorded in full. CAUTION: speculative decoding being SUPPORTED is not a benefit - [[ev-vllm-mtp-regression-qwen3-next-80b-a3b]] measures MTP making latency 76.5% worse on Qwen3-Next-80B-A3B-Instruct-FP8 at TP=4 on 4x H100, and 82.2% worse when combined with prefix caching. tracing_support set to per-request on 2026-10-04: vLLM emits exactly one server span named llm_request per request, started at the frontend arrival timestamp with the extracted parent trace context, and prefill and decode appear as ATTRIBUTES on that one span (gen_ai.latency.time_to_first_token, time_in_queue, time_in_model_prefill, time_in_model_decode, time_in_model_inference, time_in_model_forward, e2e, gen_ai.usage.prompt_tokens, gen_ai.usage.completion_tokens, gen_ai.request.id) rather than as child spans. A default trace is 2 spans (client + llm_request) per obs-vllm-otel-poc-readme. This is why the value is per-request and not per-phase: the phase numbers are readable, but there is no phase timeline to put them on. OTel packages are bundled with the wheel and configured with --otlp-traces-endpoint.
Cross-references
This record references no other records — it is a leaf. It is cited by 582.