L'enjeu du throughput GPU
Les GPUs sont le poste de coût principal en inférence LLM. Maximiser le throughput (tokens/seconde) revient à réduire le coût par requête. Les techniques modernes permettent de multiplier le débit par 3-10x.
Continuous Batching
Contrairement au batching statique (attendre N requêtes), le continuous batching insère de nouvelles requêtes dès qu'un slot se libère :
Batch statique: [req1, req2, req3] → attendre que toutes finissent
Continuous: [req1, req2, req3] → req1 finit → [req4, req2, req3]vLLM implémente cette technique nativement, augmentant le throughput de 2-4x par rapport au batching naïf.
KV Cache et PagedAttention
Le KV Cache stocke les clés et valeurs des couches d'attention pour éviter de recalculer les tokens précédents. PagedAttention (innovation de vLLM) gère ce cache comme de la mémoire virtuelle :
- Allocation non-contiguë en blocs (pages)
- Partage de cache entre requêtes avec le même préfixe
- Réduction du gaspillage mémoire de 60-80%
# vLLM avec PagedAttention
from vllm import LLM, SamplingParams
llm = LLM(
model="meta-llama/Llama-3-70b-instruct",
tensor_parallel_size=4, # 4 GPUs
gpu_memory_utilization=0.9,
max_model_len=8192
)
params = SamplingParams(temperature=0.7, max_tokens=1024)
outputs = llm.generate(prompts, params)Speculative Decoding
Utiliser un petit modèle rapide (draft model) pour générer des candidats, puis les vérifier en batch avec le grand modèle :
- Le draft model génère 5-10 tokens rapidement
- Le grand modèle vérifie en un seul forward pass
- Speedup de 2-3x sans perte de qualité
# Avec vLLM
llm = LLM(
model="meta-llama/Llama-3-70b-instruct",
speculative_model="meta-llama/Llama-3-8b-instruct",
num_speculative_tokens=5
)Quantization
Réduire la précision des poids pour utiliser moins de mémoire GPU :
- FP16 : Standard, bonne qualité
- INT8 : 2x moins de mémoire, perte minimale
- INT4 (GPTQ/AWQ) : 4x moins de mémoire, légère dégradation
- GGUF : Format optimisé pour Ollama et llama.cpp
Tensor Parallelism vs Pipeline Parallelism
- Tensor Parallel : Divise chaque couche entre les GPUs (meilleur pour la latence)
- Pipeline Parallel : Assigne des couches entières à chaque GPU (meilleur pour le throughput)
Métriques à surveiller
- Throughput : Tokens/seconde total
- Time to First Token (TTFT) : Latence du premier token
- Inter-Token Latency (ITL) : Temps entre chaque token
- GPU utilization : Viser >80% en continu
- KV Cache utilization : Gaspillage mémoire