vLLM (Virtual Large Language Model)
vLLM est un moteur d’inférence et de serving open source pour LLM, conçu pour maximiser le throughput et l’efficacité mémoire sur GPU. Son innovation fondatrice, PagedAttention, gère le cache KV comme un système de mémoire paginée, éliminant la fragmentation mémoire et permettant de servir significativement plus de requêtes concurrentes avec la même VRAM.
Développé initialement au Sky Computing Lab de UC Berkeley, vLLM est devenu un projet communautaire massif avec des contributions de l’industrie et du monde académique. C’est le moteur d’inférence LLM le plus adopté en production. Il offre une API compatible OpenAI, supporte une très large gamme de modèles et de formats de quantification, et fonctionne sur NVIDIA, AMD, Intel, et d’autres plateformes via un système de plugins matériels.
- Type
- Moteur d’inférence et de serving pour LLM
- Origine
- Sky Computing Lab, UC Berkeley
- Version stable
- v0.17.1 (11 mars 2026)
- Licence
- Apache 2.0
- Innovation clé
- PagedAttention (gestion paginée du cache KV)
- Quantifications supportées
- GPTQ, AWQ, FP8, INT8 W8A8, INT4 W4A16, GGUF, bitsandbytes, TorchAO
- Matériel
- NVIDIA (CUDA), AMD (ROCm), Intel (XPU), TPU (expérimental), Huawei Ascend, IBM Spyre
- API
- Compatible OpenAI (REST + gRPC), Python (LLM / AsyncLLM)
- Modèles
- Llama, Mistral, Qwen, DeepSeek, Gemma, Phi, modèles multimodaux (LLaVA, Qwen-VL, InternVL), etc.
PagedAttention : l’innovation fondatrice
Le cache KV (Key-Value) est le composant qui stocke les états d’attention pour chaque requête en cours. Dans un serving LLM classique, chaque requête alloue un bloc contigu de mémoire pour son cache KV, dimensionné pour la longueur de contexte maximale. Le problème : cette allocation statique gaspille de la mémoire (la plupart des requêtes n’utilisent pas le contexte maximal) et crée de la fragmentation.
PagedAttention, l’innovation clé de vLLM, s’inspire de la mémoire virtuelle des systèmes d’exploitation. Au lieu d’allouer un bloc contigu par requête, le cache KV est découpé en petits blocs (pages) de taille fixe. Chaque requête reçoit les pages dont elle a besoin, et les pages inutilisées sont recyclées. Résultat : quasi zéro fragmentation mémoire et une utilisation bien plus efficace de la VRAM pour le cache.
L’impact en production est concret : à VRAM égale, vLLM peut servir significativement plus de requêtes concurrentes qu’un serving naïf. Combiné au continuous batching, cela se traduit par un throughput nettement supérieur et des coûts d’inférence réduits.
Histoire et évolution
vLLM a été créé par Woosuk Kwon et ses collaborateurs au Sky Computing Lab de UC Berkeley. Le papier fondateur, « Efficient Memory Management for Large Language Model Serving with PagedAttention », a été publié en 2023 et a immédiatement attiré l’attention de la communauté pour son approche élégante au problème de la gestion mémoire dans le serving LLM.
Le projet a évolué rapidement, passant d’un projet académique à un outil de production largement adopté. L’écosystème s’est structuré avec des releases mensuelles, une roadmap publique par trimestre (avec des SIGs thématiques : model performance, multi-modality, torch.compile, large-scale serving, etc.), et des contributions de NVIDIA, AMD, Intel, Hugging Face, Red Hat, et de nombreuses startups IA.
Les jalons majeurs récents incluent le moteur V1 (alpha en janvier 2025, défaut en 2025-2026), le support gRPC, l’API Realtime WebSocket pour l’audio, l’intégration RLHF native, et le support NVFP4 pour les GPU Blackwell. La version stable actuelle est v0.17.1 (11 mars 2026).
Compatibilité matérielle
vLLM se distingue par le support matériel le plus large de tous les moteurs de serving LLM :
| Plateforme | Backend | Support FP8 | Notes |
|---|---|---|---|
| NVIDIA Turing (RTX 20xx, T4) | CUDA | Non | INT8/INT4 supportés. GPU d’entrée de gamme pour le serving |
| NVIDIA Ampere (A100, RTX 30xx) | CUDA | Non (pas de Tensor Cores FP8) | Kernels Marlin pour GPTQ/AWQ. Excellent rapport prix/performance |
| NVIDIA Ada (L40, RTX 40xx) | CUDA | Oui (Ada FP8) | FP8 supporté. Marlin disponible |
| NVIDIA Hopper (H100, H200) | CUDA | Oui (natif Transformer Engine) | Plateforme de référence pour la production. FP8 optimal |
| NVIDIA Blackwell (B200, RTX 50xx) | CUDA | Oui + NVFP4 | Support FP4 natif. Fixes récents pour MoE NVFP4 sur RTX Blackwell |
| AMD Instinct (MI250, MI300) | ROCm | Variable | Support fonctionnel, en développement actif |
| Intel Arc / Data Center Max | XPU (vllm-xpu-kernels) | Non | IPEX déprécié, migration vers vllm-xpu-kernels |
| Google TPU | XLA | Non | Expérimental |
| Huawei Ascend | CANN (vllm-ascend) | Non | Plugin communautaire actif, moteur V1 supporté |
--dtype fp8 sur un A100 provoquera une erreur ou un fallback silencieux vers FP16. Pour les A100, utilisez INT8 W8A8 (SmoothQuant) ou INT4 (AWQ/GPTQ) avec Marlin. Vérifiez toujours les logs vLLM pour confirmer le mode de précision actif.
L’architecture V1
Le moteur V1, devenu le moteur par défaut dans les releases 2025-2026, représente une ré-architecture majeure des composants cœur de vLLM :
EngineCore isolé. L’architecture V1 utilise le multiprocessing avec ZeroMQ pour isoler la boucle d’exécution principale (scheduler + model executor) des tâches CPU (tokenisation, traitement des entrées multimodales, détokenisation, streaming des réponses). Cela maximise l’overlap entre le GPU et le CPU.
Scheduler unifié. V1 supprime la distinction traditionnelle entre les phases « prefill » et « decode ». Les tokens d’entrée (prompt) et les tokens générés sont traités uniformément. Les décisions de scheduling sont représentées comme un simple dictionnaire {request_id: num_tokens}, ce qui simplifie considérablement le code et permet des optimisations plus agressives.
Async scheduling + Pipeline Parallelism. Le scheduling asynchrone, activé par défaut, overlap les décisions de scheduling du CPU avec l’exécution GPU. Combiné avec le pipeline parallelism (supporté depuis les versions récentes), cela produit des gains mesurables : 30,8 % d’amélioration du throughput end-to-end et 31,8 % d’amélioration du time-per-output-token dans les benchmarks internes.
Chunked prefill + disaggregated serving. Le chunked prefill découpe les longs prompts en morceaux qui s’entrelacent avec les batches de décodage, empêchant une requête long-contexte de monopoliser le GPU. Le disaggregated serving sépare physiquement les phases de prefill (compute-bound) et de decode (memory-bandwidth-bound), éliminant les pics de latence causés par le blocage mutuel.
Support de quantification
vLLM offre le support de quantification le plus large de tous les moteurs d’inférence LLM :
| Format | Méthode | Kernel recommandé | GPU supportés |
|---|---|---|---|
| GPTQ | PTQ poids (3-4-8 bits) | Marlin (2,6× plus rapide) | Ampere+ |
| AWQ | PTQ poids (4 bits) | Marlin (10,9× plus rapide) | Ampere+ |
| FP8 | Poids + activations | CUTLASS / natif | Hopper+ (H100, B200) |
| INT8 W8A8 | SmoothQuant + GPTQ | CUTLASS | Turing+ (RTX 20xx+) |
| INT4 W4A16 | LLM Compressor | Marlin | Ampere+ |
| NVFP4 | NVIDIA FP4 | Natif | Blackwell (B200, RTX 50xx) |
| GGUF | K-quants (Q4_K_M, etc.) | Expérimental | NVIDIA |
| bitsandbytes | NF4 / INT8 | Natif | NVIDIA |
| TorchAO | INT4 (PyTorch natif) | torch.compile | Variable |
Les kernels Marlin sont le facteur d’accélération le plus important pour les modèles quantifiés. Sur un Qwen2.5-32B avec H200, Marlin-AWQ atteint 741 tok/s contre 68 tok/s pour AWQ standard (10,9× plus rapide). Activez Marlin avec --quantization marlin.
Utilisation pratique
Serving (production)
# Serveur OpenAI-compatible (le plus courant)
vllm serve meta-llama/Llama-3.1-8B-Instruct
--gpu-memory-utilization 0.9
--max-model-len 8192
--port 8000
# Avec quantification AWQ + Marlin
vllm serve Qwen/Qwen2.5-32B-Instruct-AWQ
--quantization marlin
--tensor-parallel-size 2
--gpu-memory-utilization 0.92
# Avec FP8 sur H100/B200
vllm serve meta-llama/Llama-3.3-70B-Instruct
--dtype fp8
--tensor-parallel-size 2
--enable-chunked-prefill
--kv-cache-dtype fp8
Le flag --max-model-len auto (depuis v0.14) ajuste automatiquement la longueur de contexte à la mémoire GPU disponible, éliminant les erreurs OOM au démarrage.
API Python
from vllm import LLM, SamplingParams
llm = LLM(model="meta-llama/Llama-3.1-8B-Instruct")
sampling_params = SamplingParams(temperature=0.7, max_tokens=256)
outputs = llm.generate(["Explain PagedAttention in one paragraph."], sampling_params)
for output in outputs:
print(output.outputs[0].text)
Appeler vLLM comme un serveur OpenAI
curl http://localhost:8000/v1/chat/completions
-H "Content-Type: application/json"
-d '{
"model": "meta-llama/Llama-3.1-8B-Instruct",
"messages": [{"role": "user", "content": "Hello!"}],
"max_tokens": 256
}'
Toute application compatible avec l’API OpenAI fonctionne avec vLLM sans modification. C’est un avantage considérable pour la migration depuis les API cloud vers l’inférence locale ou self-hosted.
Fonctionnalités avancées
Décodage spéculatif. vLLM supporte le décodage spéculatif (y compris avec les structured outputs depuis les versions récentes) pour accélérer la génération token par token en utilisant un petit modèle draft.
Structured outputs. Enforcement de schémas JSON via guided decoding, critique pour les workflows d’agents et les appels d’outils (function calling).
Multimodal. Support natif des modèles images + texte (LLaVA, Qwen-VL, InternVL, Llama 4 Scout/Maverick), avec streaming des entrées multimodales.
Automatic prefix caching (APC). Quand plusieurs requêtes partagent un même préfixe (system prompt commun dans un chatbot), vLLM met en cache et réutilise les blocs KV de ce préfixe, réduisant le time-to-first-token pour les requêtes suivantes.
Realtime API. Un nouveau protocole WebSocket pour les interactions audio en streaming, construit sur l’infrastructure Voxtral realtime.
RLHF integration. APIs natives pour le weight syncing via NCCL, le rechargement par couche pour QeRL, et la pause/reprise du moteur avec préservation des requêtes en cours.
gRPC server. Une alternative au REST avec protocole binaire et multiplexage HTTP/2 pour les environnements à haute concurrence.
Parallélisme distribué
Pour les modèles qui ne tiennent pas sur un seul GPU, vLLM supporte trois stratégies de parallélisme :
Tensor Parallelism (TP). Divise chaque couche du modèle entre plusieurs GPU. C’est la stratégie la plus courante. Un modèle 70B en FP16 (~140 Go) peut être divisé sur 2 GPU H100 80 Go avec --tensor-parallel-size 2. La communication inter-GPU utilise NCCL et nécessite des connexions rapides (NVLink idéalement).
Pipeline Parallelism (PP). Assigne des couches entières à différents GPU, chaque GPU traitant un « étage » du pipeline. Mieux adapté aux configurations sans NVLink (communication inter-nœud), mais avec une latence plus élevée que le TP. Pleinement supporté avec l’async scheduling depuis les versions récentes.
Expert Parallelism (EP). Spécifique aux modèles MoE (Mixture of Experts) comme DeepSeek V3/R1 ou Mixtral. Distribue les experts sur différents GPU plutôt que de répliquer chaque expert. Particulièrement efficace pour les modèles MoE massifs où le nombre total de paramètres est très élevé mais seuls quelques experts sont actifs par token.
Les trois stratégies peuvent être combinées. Un déploiement typique de DeepSeek V3 sur un cluster multi-nœud utilise TP intra-nœud (entre les GPU connectés en NVLink), PP inter-nœud (entre les serveurs), et EP pour distribuer les experts MoE.
vLLM vs les alternatives
| Critère | vLLM | TensorRT-LLM | TGI | SGLang |
|---|---|---|---|---|
| Throughput GPU NVIDIA | Très élevé (Marlin) | Le plus élevé | Bon | Très élevé |
| Multi-matériel | NVIDIA, AMD, Intel, TPU, Ascend | NVIDIA uniquement | NVIDIA principalement | NVIDIA, AMD |
| Facilité de déploiement | Élevée | Moyenne (compilation) | Élevée | Élevée |
| Formats de quantification | Le plus large (9+) | FP8, FP4, INT4, INT8 | GPTQ, AWQ | GPTQ, AWQ, FP8 |
| Chunked prefill | Oui | Oui | Non | Oui |
| Support nouveaux modèles | Rapide (via HF Transformers) | Plus lent (réimplémentation) | Modéré | Rapide |
| Structured outputs | Oui (guided decoding) | Limité | Oui | Oui (co-design) |
| Licence | Apache 2.0 | Apache 2.0 | Apache 2.0 | Apache 2.0 |
Déploiement production : points clés
GPU memory utilization. Le paramètre --gpu-memory-utilization (par défaut 0.9) contrôle le pourcentage de VRAM alloué à vLLM. En production, 0.90-0.92 est recommandé. Laisser 8-10 % de marge évite les OOM sous charge.
Continuous batching. Activé par défaut. Les requêtes entrantes sont dynamiquement regroupées pour maximiser l’utilisation GPU. Nécessite des requêtes concurrentes pour être efficace : un seul utilisateur séquentiel ne bénéficiera pas du batching.
FP8 sur H100/B200. Le flag --dtype fp8 active la quantification FP8 pour un gain de throughput important. Vérifiez la compatibilité : FP8 nécessite des Tensor Cores FP8 (Hopper+). Sur A100 ou plus ancien, le flag sera ignoré ou causera une erreur.
KV cache quantifié. Indépendamment de la quantification des poids, --kv-cache-dtype fp8 quantifie le cache KV pour doubler la capacité de requêtes concurrentes à contexte long.
Pré-téléchargement des modèles. En production, téléchargez les modèles à l’avance avec huggingface-cli download et montez le répertoire local. Cela découple le téléchargement du démarrage du conteneur, réduisant les temps de déploiement.
Questions fréquentes sur vLLM
vLLM est-il gratuit ?
Oui. vLLM est entièrement open source sous licence Apache 2.0. Vous pouvez l’utiliser librement en production, y compris à des fins commerciales. L’installation se fait avec pip install vllm. NVIDIA publie aussi un conteneur Docker vLLM optimisé sur NGC, mis à jour mensuellement.
Faut-il un GPU NVIDIA pour utiliser vLLM ?
Non. vLLM supporte les GPU NVIDIA (CUDA), AMD (ROCm), Intel (XPU), les TPU Google (expérimental), et les accélérateurs Huawei Ascend et IBM Spyre via des plugins matériels. Cependant, le support NVIDIA est le plus mature et le plus performant. Pour les GPU AMD, vérifiez la compatibilité ROCm de votre modèle de carte.
Quelle est la différence entre vLLM et Ollama ?
vLLM est un moteur de serving haute performance pour la production (API OpenAI-compatible, continuous batching, multi-GPU, quantification avancée). Ollama est un outil d’inférence locale simplifié, basé sur llama.cpp/GGML, optimisé pour le téléchargement et l’exécution facile de modèles sur un poste de travail. Utilisez Ollama pour tester des modèles localement, vLLM pour les servir en production à de nombreux utilisateurs.
Comment choisir entre GPTQ, AWQ et FP8 dans vLLM ?
Si vous avez un GPU Hopper (H100) ou Blackwell (B200) : FP8 est le meilleur choix, il ne nécessite pas de quantification préalable et offre un throughput quasi doublé. Sur GPU Ampere ou Ada (RTX 30xx/40xx) : AWQ + Marlin pour la meilleure qualité à 4 bits, GPTQ + Marlin si un modèle AWQ n’est pas disponible. Les deux atteignent des performances similaires avec Marlin. Pour INT8 (qualité maximale) : W8A8 via LLM Compressor avec SmoothQuant.
vLLM est-il compatible avec les fichiers GGUF ?
Oui, de manière expérimentale (via --quantization gguf). Cependant, les performances sont généralement inférieures à celles des modèles GPTQ/AWQ avec Marlin pour le serving GPU. GGUF est optimisé pour llama.cpp/CPU, pas pour le serving GPU haute concurrence. Si vous êtes sur GPU et que vous voulez le meilleur throughput dans vLLM, préférez AWQ ou GPTQ.