Benchmarking des stacks LLM : charges réalistes et patterns de production

Vous avez configuré votre serveur d'inférence, choisi le bon GPU, optimisé les paramètres de batch, et pourtant, dès que vous mettez votre modèle en production, la latence explose ou le débit chute. Pourquoi ? Parce que les benchmarks synthétiques ne reflètent pas la réalité du terrain. Le benchmarking des stacks de serving LLM n'est pas juste une question de vitesse brute ; c'est l'art de simuler le chaos réel des utilisateurs pour éviter les surprises coûteuses.

Si vous cherchez à déployer un grand modèle de langage (LLM) sans ruiner votre budget cloud ni frustrer vos utilisateurs, vous devez comprendre comment mesurer ce qui compte vraiment. Oubliez les chiffres marketing. Plongeons dans les méthodes concrètes pour évaluer vos infrastructures sous des charges réalistes.

Pourquoi les benchmarks classiques échouent souvent

La plupart des développeurs commencent par envoyer des requêtes simples, identiques, en boucle. C'est facile, mais c'est trompeur. En production, personne n'envoie la même phrase de 10 tokens 100 fois de suite. Les vraies charges sont irrégulières, avec des contextes variables et des pics de trafic soudains.

Il faut distinguer deux approches complémentaires :

  • Le test de charge (Load Testing) : Il vise à voir combien de requêtes simultanées votre serveur peut absorber avant de s'effondrer. Il révèle les limites matérielles, les problèmes de réseau et l'efficacité de l'autoscaling.
  • Le benchmarking de performance : Il isole l'efficacité pure du modèle et de sa configuration logicielle (comme vLLM ou TensorRT-LLM). Il mesure le temps par token, pas seulement le temps total.

Si vous ne combinez pas les deux, vous obtenez une image floue. Un serveur peut avoir un excellent débit théorique mais une latence désastreuse sous charge réelle à cause de la gestion de la mémoire KV cache.

Les métriques vitales : au-delà du simple "vitesse"

Quand on parle de serving LLM, trois indicateurs dominent les décisions d'architecture. Si vous ignorez l'un d'eux, votre déploiement sera inefficace.

Comparaison des métriques clés pour le benchmarking LLM
Métrique Définition technique Pourquoi ça compte en prod Cible typique (L40S/H100)
TTFT (Time To First Token) Temps écoulé entre l'envoi de la requête et l'apparition du premier mot. Influence directement la perception de réactivité par l'utilisateur. < 500ms pour P90
TPOT (Time Per Output Token) Latence moyenne pour générer chaque token supplémentaire après le premier. Détermine la fluidité de la lecture en streaming. < 30ms
QPS (Queries Per Second) Nombre total de requêtes traitées par seconde. Métrique économique : plus le QPS est haut, plus le coût par requête baisse. Varie selon la taille du contexte

Le TTFT est souvent le tueur silencieux. Une longue période de préremplissage (prefill) due à un prompt complexe fait attendre l'utilisateur dans le vide. À l'inverse, un TPOT élevé rend la réponse hachée. Votre objectif doit être d'équilibrer ces deux courbes.

Côté client vs côté serveur : où placer vos sondes ?

C'est une erreur fréquente : lancer le script de benchmark depuis votre machine locale vers un serveur distant. Vous mesurez alors la latence réseau, pas la performance de votre GPU.

Voici la règle d'or établie par les experts en infrastructure :

  • Benchmarking côté serveur : Exécutez le script sur la même machine que le serveur d'inférence. Cela supprime la variable réseau. Utilisez cette méthode pour comparer des configurations matérielles ou logicielles pures (ex: vLLM vs SGL).
  • Benchmarking côté client : Simulez l'utilisateur final depuis une autre zone géographique. Cela inclut la latence réseau, le TLS handshake et les timeouts. C'est indispensable pour valider l'expérience utilisateur réelle (UX).

Ne confondez jamais les deux résultats. Une différence de 50ms entre les deux est normale si vous traversez l'Atlantique, mais catastrophique si vous êtes dans la même région AWS.

Trois orbes lumineux en argile représentant les métriques TTFT, TPOT et QPS autour d&#039;un serveur.

Simuler des charges réalistes : la méthode TensorMesh

Comment créer une charge qui ressemble à la vraie vie ? Les outils comme TensorMesh ou GenAI-Perf proposent des méthodologies avancées qui vont bien au-delà du simple envoi de requêtes aléatoires.

Une approche efficace utilise le motif de "tiling" (mosaïque) :

  1. Cyclez séquentiellement à travers différents contextes (prompts longs, courts, mixtes).
  2. Ajoutez des questions aléatoires à chaque contexte pour casser la mise en cache naïve.
  3. Maintenez un nombre maximal de requêtes en vol (inflight requests) pour saturer le pipeline.
  4. Forcez des évictions de cache pour tester la robustesse de la gestion mémoire.

N'oubliez pas d'ignorer les premières secondes. Le "cold start" (chargement des poids, initialisation CUDA) fausse les moyennes. Attendez que le système atteigne un état stable (steady state), généralement après plusieurs rotations complètes de contexte, avant de commencer à enregistrer vos données.

Outils et frameworks pour le terrain

Le paysage change vite. Voici ce qui fonctionne actuellement en 2026 :

  • vLLM : Toujours la référence open-source pour son efficacité avec la gestion PagedAttention. Idéal pour maximiser le throughput.
  • SGL (Structured Generation Language) : Un nouveau venu qui montre des performances supérieures sur certains scénarios de génération structurée, surpassant parfois vLLM grâce à une meilleure planification des tâches.
  • NVIDIA GenAI-Perf : L'outil officiel pour ceux qui utilisent des GPUs NVIDIA. Il calcule le TPS (transactions per second) en excluant les phases de chauffe et refroidissement, offrant des chiffres très précis.
  • Locust ou Gatling : Pour la simulation de charge côté client. Ils permettent de modéliser des comportements utilisateurs complexes (pauses, erreurs, retries).

Si vous utilisez DeepSpeed ou Hugging Face Transformers, assurez-vous que votre couche de serving est séparée de la logique métier. Sinon, vous mesurez aussi la lenteur de votre code Python, pas celle de l'inférence.

Ingénieur en argile surveillant des graphiques tandis qu&#039;un bras robotique automatise les tests.

L'itération continue : raccourcir la boucle de feedback

Le benchmarking n'est pas un événement ponctuel. C'est un processus itératif. Vous allez ajuster la taille du batch, changer le parallélisme tensoriel (TP) ou le parallélisme de pipeline (PP), et relancer des tests des dizaines de fois.

Pour accélérer ce cycle, automatisez tout. Créez un script `startup_and_benchmark.sh` qui :

  • Vérifie si les poids sont déjà téléchargés (évitez de recharger 70GB à chaque fois).
  • Lance le serveur en arrière-plan.
  • Attend que le port soit ouvert.
  • Lance le benchmark.
  • Kille le serveur proprement.

Plus votre boucle de feedback est courte, plus vous pouvez explorer l'espace des configurations. Une attente de 5 minutes par test devient vite un goulot d'étranglement psychologique qui vous empêche d'optimiser finement.

Interpréter les résultats : pièges courants

Attention aux faux positifs. Voici trois pièges fréquents :

  1. Le biais de l'overhead : Dans les scénarios à faible concurrence, la préparation de la requête et le stockage de la réponse peuvent représenter jusqu'à 33% du temps total. Assurez-vous que votre outil de benchmark isole bien le temps GPU pur.
  2. La négligence de la mémoire : Un pic de débit peut masquer une fuite de mémoire lente. Surveillez l'utilisation VRAM sur plusieurs heures, pas juste pendant 5 minutes.
  3. Ignorer les queues : Si votre serveur traite les requêtes rapidement mais qu'elles attendent 2 secondes dans la file d'attente avant d'être prises en charge, votre TTFT réel est désastreux. Mesurez toujours la latence de bout en bout (end-to-end).

Enfin, documentez tout. Comparez vos résultats non seulement avec les benchmarks publics, mais surtout avec vos propres historiques. Une régression de 5% peut sembler anodine, mais multipliée par des millions de requêtes, elle impacte directement votre facture cloud.

Quelle est la différence entre QPS et TPS dans le contexte LLM ?

Le QPS (Queries Per Second) mesure le nombre de requêtes complètes traitées par seconde. Le TPS (Tokens Per Second) mesure le volume de texte généré. Pour les prompts courts et réponses longues, le TPS est plus pertinent pour évaluer la capacité de calcul. Pour les API de chat avec beaucoup de petites interactions, le QPS est souvent la métrique commerciale clé.

Dois-je utiliser le benchmarking côté serveur ou côté client pour choisir mon GPU ?

Utilisez le benchmarking côté serveur pour choisir le GPU et la configuration logicielle optimale, car il élimine le bruit du réseau. Une fois la configuration choisie, validez-la avec un benchmarking côté client pour garantir que l'expérience utilisateur finale respecte vos SLA.

Pourquoi mon TTFT est-il si élevé avec de longs prompts ?

Le TTFT dépend fortement de la phase de préremplissage (prefill), où le modèle traite l'intégralité du prompt. Plus le prompt est long, plus cette phase prend de temps. Optimiser cela nécessite souvent l'utilisation de techniques comme le Flash Attention ou l'augmentation de la précision numérique (FP8) si le matériel le permet.

Comment gérer les variations de charge dans mes benchmarks ?

N'utilisez pas une charge constante. Implémentez des modèles de distribution Poissonienne ou des traces de trafic réelles (replay logs) pour simuler les pics et les creux naturels. Des outils comme Locust permettent de définir des profils de charge dynamiques qui montent et descendent progressivement.

Les métriques changent-elles si j'utilise le quantization (INT8/FP8) ?

Oui, significativement. La quantization réduit généralement le TTFT et augmente le débit global en réduisant la bande passante mémoire nécessaire. Cependant, elle peut augmenter légèrement le TPOT sur certaines architectures CPU/GPU mal optimisées pour les opérations INT8. Testez toujours le compromis précision/performance spécifiquement pour votre cas d'usage.