?
GuideavancéVérifié le 2025-05

GPU optimization : maximiser le throughput

Techniques pour saturer vos GPUs : batching, KV cache, speculative decoding.

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

Sources

infraGPUperformance