Bienvenue sur Hikube, le blog

Rejoignez notre écosystème de partenaires et développez votre activité avec le cloud souverain suisse.
GPU

Optimiser l'utilisation GPU en production : le guide complet (2026)

Introduction

Métriques, frameworks et stratégies pour maximiser le ROI de vos GPU

Temps de lecture : 6 minutes

Le coût des GPU en production génère une pression économique croissante sur les organisations. Un GPU H100 coûte entre 2 et 10 CHF par heure selon le provider, soit 17'500 à 87'600 CHF par an pour une instance unique en fonctionnement continu. Pourtant, selon une étude AI Infrastructure Alliance de 2024, seulement 7% des organisations atteignent plus de 85% d'utilisation GPU en charge de pointe. Les 93% restants gaspillent entre 15 et 60% de leur capacité GPU, représentant des dizaines de milliers de francs annuels par GPU.

Cette inefficience résulte de trois facteurs techniques : pipelines de données sous-optimisés qui laissent les GPU en attente, configurations de batching inadaptées qui limitent le throughput, et absence de monitoring granulaire qui empêche l'identification des bottlenecks. Cet article expose les quatre leviers d'optimisation GPU en production, détaille les métriques critiques à surveiller, et propose un framework de monitoring basé sur DCGM et Prometheus.

L'objectif : transformer les GPU sous-utilisés en actifs performants générant un ROI mesurable.

 

Diagnostiquer les inefficiences en 4 métriques

L'optimisation GPU commence par la mesure. Quatre métriques clés permettent d'identifier précisément les sources d'inefficience et de quantifier les gains potentiels.

 

GPU Utilization : la métrique fondamentale

L'utilisation GPU (GPU Utilization) mesure le pourcentage de temps durant lequel au moins un kernel s'exécute sur le GPU. Cette métrique, accessible via nvidia-smi ou DCGM, constitue l'indicateur de premier niveau. Une utilisation inférieure à 60% signale un problème d'optimisation, tandis qu'une utilisation supérieure à 85% peut indiquer une saturation nécessitant un scale-up.

GPU Utilization cible = 60-80%

Interprétation :
- < 40% : Sous-utilisation sévère, pipeline de données ou batching inadapté
- 40-60% : Optimisation nécessaire, gains significatifs possibles
- 60-80% : Zone optimale, bon équilibre performance/coût
- > 85% : Saturation potentielle, vérifier latence P95/P99

Attention : un GPU affichant 100% d'utilisation n'est pas nécessairement optimal. Cette métrique ne distingue pas entre des kernels compute-intensive et memory-bound. Un GPU saturé par des accès mémoire affichera 100% d'utilisation mais délivrera des performances non optimales.

 

Memory Bandwidth : détecter les bottlenecks

La bande passante mémoire (Memory Bandwidth Utilization) mesure le pourcentage de la bande passante théorique effectivement utilisée. Pour un A100 80GB avec 2'039 GB/s de bande passante HBM2e, une utilisation à 30% signale que seulement 612 GB/s sont exploités. Ce delta révèle soit un problème de pipeline de données, soit des kernels mal optimisés nécessitant trop de calculs par byte transféré.

Les workloads d'inférence LLM sont typiquement memory-bound : le GPU passe plus de temps à attendre les données qu'à calculer. Sur ces workloads, l'optimisation de la bande passante mémoire via quantization (FP16, INT8) ou via des kernels optimisés (FlashAttention) génère des gains de 2 à 3× en throughput.

 

Throughput vs théorique : mesurer l'écart

Le throughput réel se mesure en tokens par seconde pour les modèles de langage, ou en inférences par seconde pour les modèles de vision. Cette métrique se compare au throughput théorique calculé à partir des spécifications constructeur. Un écart supérieur à 40% entre théorique et réel indique des optimisations manquantes.

Exemple calcul throughput théorique (LLM inférence) :

Throughput théorique = (TFLOPS GPU × Précision) / (Paramètres modèle × 2)

A100 80GB, modèle 13B en FP16 :
= (312 TFLOPS × 0.5) / (13B × 2)
= 156 / 26 = ~6 tokens/seconde (ordre de grandeur)

Si throughput mesuré < 4 tokens/s → optimisation requise

 

Latence P50/P95/P99 : garantir la qualité de service

La latence se mesure en percentiles, pas en moyenne. La latence P50 (médiane) indique l'expérience utilisateur typique, tandis que P95 et P99 révèlent les cas dégradés qui affectent 5% à 1% des requêtes. Pour les applications interactives (chatbots, assistants), une latence P99 supérieure à 1 seconde dégrade significativement l'expérience utilisateur.

Métrique Description Cible production Outil de mesure
GPU Utilization % temps avec kernel actif 60-80% nvidia-smi, DCGM
Memory Bandwidth % bande passante utilisée > 50% (memory-bound) DCGM, nvprof
Throughput Tokens/sec ou inf/sec > 60% du théorique Application logs
Latence P50 Médiane temps de réponse < 200ms (interactif) Prometheus, Grafana
Latence P95 95e percentile < 500ms Prometheus, Grafana
Latence P99 99e percentile < 1000ms Prometheus, Grafana

 

Les 4 leviers d'optimisation technique

Une fois les métriques de base établies, quatre leviers techniques permettent d'améliorer significativement les performances GPU en production.

 

1. Batch size dynamique : maximiser le throughput

Le batch size détermine combien de requêtes sont traitées simultanément. Un batch size trop faible sous-utilise le GPU (30-40% utilization), tandis qu'un batch size trop élevé sature la VRAM et provoque des Out-Of-Memory (OOM). La formule de calcul optimal prend en compte la VRAM disponible, la taille du modèle et la longueur de séquence.

Batch size optimal = (VRAM disponible - Taille modèle) / Mémoire par séquence

Exemple : A100 80GB, modèle 13B FP16, séquences 512 tokens

Taille modèle FP16 : 13B × 2 bytes = 26 GB
Mémoire par séquence : 512 tokens × 13B × 2 bytes / 1e9 ≈ 13 GB (approximation KV cache*)
VRAM disponible : 80 - 26 = 54 GB

Batch size optimal ≈ 54 / 13 ≈ 4 requêtes simultanées

Les frameworks modernes comme vLLM implémentent le continuous batching (ou in-flight batching), qui fusionne dynamiquement les nouvelles requêtes dans un batch en cours de génération. Cette technique améliore le throughput de 2,2 à 3,5× par rapport au batching statique selon les benchmarks vLLM sur LLaMA.

*Cette estimation fournit un ordre de grandeur, mais ne modélise pas fidèlement la consommation mémoire réelle. En pratique, celle-ci est dominée par le KV cache, la longueur de contexte et les optimisations du moteur d’inférence, et nécessite une validation empirique pour être dimensionnée correctement.

 

2. Précision et quantization : FP32 → FP16 → INT8

La réduction de précision arithmétique diminue les besoins VRAM et accélère le calcul. La précision FP32 (32-bit floating point) constitue le standard d'entraînement mais s'avère sur-dimensionnée pour l'inférence. La précision FP16 divise par deux l'utilisation mémoire avec une perte de qualité généralement inférieure à 1%. La quantization INT8 (8-bit integer) divise par quatre l'usage VRAM, avec une dégradation de 2 à 5% selon les modèles.

Précision VRAM (modèle 13B) Throughput relatif Perte qualité Use case
FP32 52 GB 0% Entraînement
FP16 26 GB 1.8-2× < 1% Inférence standard
INT8 13 GB 2.5-3× 2-5% Inférence haute densité
INT4* 6.5 GB 3-4× 5-10% Edge, mobile

*INT4 nécessite une validation cas par cas, pertes de qualité variables selon la tâche

L'implémentation pratique de la quantization passe par des frameworks spécialisés : AWQ (Activation-aware Weight Quantization), GPTQ, ou les kernels FP8 des GPU Hopper (H100). Le H100 intègre un Transformer Engine qui exécute nativement en FP8, améliorant le throughput de 20 à 50% sur les architectures transformer par rapport à FP16.

 

3. Frameworks d'inférence optimisés : vLLM, TensorRT-LLM, SGLang

Les frameworks d'inférence spécialisés implémentent des optimisations impossibles à reproduire avec PyTorch ou TensorFlow standard. Trois frameworks dominent le marché en 2025, chacun avec des compromis performance-complexité distincts.

vLLM se positionne comme le framework de référence pour la production. Son innovation clé, PagedAttention, traite la mémoire KV cache comme de la mémoire virtuelle, éliminant la fragmentation et permettant de servir plus de requêtes concurrentes. Selon les benchmarks Cerebrium 2024, vLLM affiche le meilleur Time To First Token (TTFT) de 123ms sur LLaMA 3.1 70B avec H100, et atteint 4'741 tokens/seconde à 100 requêtes concurrentes selon Clarifai. Son intégration native avec Hugging Face et son API compatible OpenAI facilitent l'adoption.

TensorRT-LLM de NVIDIA cible les déploiements exigeant les performances maximales. Basé sur TensorRT, il compile les modèles en kernels CUDA optimisés et exploite les Tensor Cores au maximum. Les benchmarks LMSYS 2024 montrent que TensorRT-LLM égale ou surpasse vLLM en latence à faible concurrence (35-50ms TTFT), mais dégrade à haute charge. Sa complexité de setup (compilation par modèle, conteneur Docker obligatoire) le réserve aux équipes disposant d'expertise CUDA.

SGLang introduit RadixAttention, une structure de partage de préfixes via arbre radix. Cette approche excelle sur les workloads avec forte réutilisation de contexte : chat multi-tours, few-shot prompting, agents. Les benchmarks LMSYS montrent que SGLang atteint jusqu'à 3,1× le throughput de vLLM sur LLaMA-70B avec réutilisation intensive de préfixes. Pour les applications RAG ou les agents avec prompts répétitifs, SGLang génère des gains substantiels.

Guide de sélection framework inférence :

  • vLLM : Production généraliste, haute concurrence (>50 req/s), intégration Hugging Face requise
  • TensorRT-LLM : Performance maximale, latence ultra-faible (<50ms), équipes avec expertise NVIDIA
  • SGLang : RAG, agents, chat multi-tours avec forte réutilisation contexte
  • Ollama : Prototypage rapide, développement local, pas pour adapté à la production à grande échelle

 

4. Optimisation du pipeline de données

Les inefficiences du pipeline de données constituent la cause principale de sous-utilisation GPU. Selon Clarifai, les pipelines mal optimisés gaspillent jusqu'à 40% des cycles GPU. Trois optimisations critiques éliminent ces pertes.

Premièrement, la localisation des données. Stocker les datasets dans la même région que les GPU réduit la latence de transfert de 80 à 200ms à 5 à 15ms. Pour les données froides rarement accédées, utiliser du stockage archive (S3 Glacier, Azure Archive) plutôt que du stockage haute performance réduit les coûts de 70 à 90% sans impact sur les données chaudes.

Deuxièmement, les formats compressés. Stocker les données en Parquet ou ORC plutôt qu'en CSV réduit la taille de 60 à 80% et accélère la lecture grâce à la compression columnar. Le temps de décompression est négligeable face aux gains de transfert réseau et disque.

Troisièmement, le prefetching et le caching. Charger le batch N+1 pendant que le GPU traite le batch N élimine les temps d'attente. PyTorch DataLoader implémente cette fonctionnalité via le paramètre num_workers. Une règle empirique : num_workers = 2 × nombre_gpu pour équilibrer parallélisme et overhead.

 

Stack de monitoring recommandé

Un monitoring GPU efficace repose sur trois couches : collecte des métriques bas niveau, agrégation et stockage time-series, visualisation et alerting. L'architecture recommandée combine DCGM, Prometheus et Grafana.

 

DCGM : collecte des métriques NVIDIA

NVIDIA Data Center GPU Manager (DCGM) constitue la couche de collecte de référence pour les GPU datacenter. Contrairement à nvidia-smi conçu pour les checks ponctuels, DCGM expose un flux continu de métriques via API. Le DCGM Exporter transforme ces métriques en format Prometheus, accessible via endpoint HTTP sur le port 9400.

Installation DCGM Exporter (Docker) :

docker run -d \
  --gpus all \
  --cap-add SYS_ADMIN \
  --network host \
  --name dcgm-exporter \
  --restart unless-stopped \
  nvcr.io/nvidia/k8s/dcgm-exporter:3.3.8-3.6.0-ubuntu22.04

# Vérification
curl localhost:9400/metrics | grep DCGM_FI_DEV_GPU_UTIL

DCGM expose plus de 50 métriques incluant : utilisation GPU (DCGM_FI_DEV_GPU_UTIL), utilisation VRAM (DCGM_FI_DEV_FB_USED), température GPU et mémoire (DCGM_FI_DEV_GPU_TEMP, DCGM_FI_DEV_MEMORY_TEMP), consommation électrique (DCGM_FI_DEV_POWER_USAGE), fréquences SM et mémoire (DCGM_FI_DEV_SM_CLOCK, DCGM_FI_DEV_MEM_CLOCK), et compteurs d'erreurs PCIe (DCGM_FI_DEV_PCIE_REPLAY_COUNTER).

 

Prometheus : stockage time-series

Prometheus scrape les métriques DCGM Exporter à intervalles réguliers (typiquement 15 secondes) et les stocke dans sa base time-series. La configuration Prometheus définit les targets à scraper et la rétention des données.

Configuration Prometheus (prometheus.yml) :

scrape_configs:
  - job_name: 'dcgm-exporter'
    static_configs:
      - targets: ['localhost:9400']
    scrape_interval: 15s
    scrape_timeout: 10s

Pour les déploiements Kubernetes, DCGM Exporter se déploie via Helm ou comme partie du NVIDIA GPU Operator, avec service discovery automatique. Prometheus détecte automatiquement les pods DCGM Exporter via les labels Kubernetes.

 

Grafana : visualisation et alerting

Grafana consomme les métriques Prometheus et génère des dashboards interactifs. NVIDIA fournit un dashboard pré-configuré (ID 12239) visualisant les métriques GPU essentielles. Les panels critiques incluent : utilisation GPU over time (moyenne cluster + per-GPU), utilisation de la VRAM avec lignes de seuil à 70% et 90%, température GPU et mémoire, consommation électrique instantanée et cumulée, latence P50/P95/P99 des requêtes applicatives.

Les alertes Grafana déclenchent des notifications Slack, PagerDuty ou email selon des seuils configurables. Alertes recommandées : utilisation GPU < 40% pendant 30 minutes (sous-utilisation), VRAM > 90% pendant 5 minutes (risque OOM), température GPU > 80°C pendant 10 minutes (risque throttling), erreurs PCIe > 0 (problème matériel).

 

Les 5 erreurs qui dégradent les performances

1. Négliger le monitoring continu

Symptôme : Déployer des GPU sans monitoring granulaire, se fier uniquement à nvidia-smi ponctuel ou aux métriques cloud provider agrégées.

Impact : L'absence de visibilité empêche d'identifier les inefficiences. Une étude Spheron 2025 montre que sans monitoring, les organisations découvrent des GPU tournant à moins de 30% d'utilisation pendant des semaines, gaspillant des dizaines de milliers de francs. Les bottlenecks (pipeline de données, batch size inadapté) restent invisibles jusqu'à ce que les utilisateurs se plaignent de latence élevée.

Solution : Implémenter DCGM Exporter + Prometheus + Grafana dès le premier GPU déployé. Coût overhead : ~5% de performance GPU, largement compensé par les optimisations identifiées. Définir des dashboards avec alertes sur utilisation <40%, VRAM >90%, latence P95 >500ms. Révision hebdomadaire des métriques avec équipe engineering pour identifier opportunités d'optimisation.

2. Utiliser PyTorch/TensorFlow standard en production

Symptôme : Servir des modèles directement avec PyTorch ou TensorFlow sans framework d'inférence spécialisé.

Impact : PyTorch et TensorFlow sont optimisés pour l'entraînement, pas l'inférence production. L'absence de continuous batching, de gestion optimisée du KV cache et de kernels spécialisés réduit le throughput de 2 à 4× par rapport à vLLM ou TensorRT-LLM. Pour un service recevant 1000 requêtes/jour, cela signifie servir 250 à 500 requêtes au lieu de 1000 avec le même GPU, nécessitant 2 à 4 GPU au lieu d'un seul. Coût annuel supplémentaire : 35'000 à 105'000 CHF pour des A100.

Solution : Migrer vers vLLM pour production généraliste (setup en 1-2 jours), TensorRT-LLM pour latence critique (setup 1-2 semaines), ou SGLang pour RAG/agents. Benchmark avant/après migration pour quantifier gains réels. Dans 90% des cas, vLLM offre le meilleur rapport performance/complexité.

3. Ignorer la quantization

Symptôme : Servir tous les modèles en FP32 ou FP16 sans évaluer INT8 ou techniques de quantization avancées.

Impact : La quantization INT8 divise par deux les besoins VRAM par rapport à FP16 avec une perte de qualité de 2 à 5%. Pour un modèle 13B passant de 26 GB (FP16) à 13 GB (INT8), on peut soit doubler le batch size (×2 throughput), soit servir deux modèles sur le même GPU. L'absence de quantization = gaspillage de 40 à 50% de capacité GPU.

Solution : Évaluer systématiquement INT8 pour inférence production. Tester sur datasets représentatifs, mesurer dégradation qualité (accuracy, F1, BLEU selon tâche). Si dégradation <5% et acceptable pour use case, déployer en INT8. Utiliser AWQ ou GPTQ pour quantization optimale. Pour GPU Hopper (H100), exploiter FP8 natif via frameworks supportés (vLLM, TensorRT-LLM).

4. Sous-dimensionner le batch size

Symptôme : Utiliser batch size=1 ou batch size statique trop faible par défaut, sans optimisation.

Impact : Un batch size de 1 sous-utilise massivement le GPU (utilization 20-40%). Le GPU passe plus de temps en attente entre requêtes qu'en calcul. Un batch size optimal (calculé selon VRAM disponible et taille séquence) améliore le throughput de 3 à 5× sans augmenter la latence médiane. Batch size inadapté = 60 à 80% de capacité GPU gaspillée.

Solution : Calculer batch size optimal via formule (VRAM disponible - Taille modèle) / Mémoire par séquence. Pour applications production, utiliser continuous batching (vLLM, TGI) qui ajuste dynamiquement. Monitorer GPU utilization : si <60%, augmenter batch size jusqu'à 70-80%. Mesurer impact sur latence P95/P99 : si augmentation acceptable (<20%), valider nouveau batch size.

5. Négliger le coût énergétique

Symptôme : Optimiser uniquement pour performance sans considérer la consommation électrique.

Impact : Un H100 peut consommer jusqu'à 700W en charge maximale, soit 16,8 kWh/jour ou 6'132 kWh/an. En Suisse (électricité ~0,20 CHF/kWh incluant refroidissement), cela représente 1'226 CHF/an par GPU. Un GPU sous-optimisé tournant à 100% utilization inutilement (au lieu de 70% avec optimisations) gaspille 30% de cette énergie soit 368 CHF/an. Sur un cluster 10 GPU, 3'680 CHF/an de surcoût électrique évitable.

Solution : Monitorer consommation électrique via DCGM (DCGM_FI_DEV_POWER_USAGE). Optimiser pour performance par watt, pas seulement performance brute. Techniques : quantization (réduit consommation 20-30%), batch size optimal (évite sous-utilisation), schedules d'arrêt automatique (environnements dev/test off hors heures), choix GPU adapté au workload (L40S 350W vs H100 700W pour inférence pure). Calculer TCO incluant électricité sur 36 mois pour arbitrages GPU.

 

Cas pratique : optimiser un chatbot RAG

Prenons un cas concret : chatbot RAG interne pour entreprise suisse, 500 employés, ~2000 requêtes/jour, modèle LLaMA-2 13B, déployé initialement sur A100 40GB.

État initial : Modèle servi avec PyTorch standard en FP16, batch size=1, pas de monitoring détaillé. Métriques observées : GPU utilization 35%, throughput 1,2 tokens/seconde, latence P95 800ms, coût GPU 3'200 CHF/mois (provider cloud).

Optimisations appliquées :

  1. Migration vers vLLM avec continuous batching → GPU utilization 72%, throughput 3,8 tokens/seconde (+217%)
  2. Quantization INT8 via AWQ → Réduction VRAM 26 GB à 13 GB, permettant batch size optimal de 8 au lieu de 3
  3. Implémentation DCGM + Prometheus + Grafana → Visibilité complète, alertes sur anomalies
  4. Pipeline de données optimisé → Prefetching activé, datasets en Parquet, stockage même région

Résultats mesurés :

  • GPU utilization : 35% → 68% (+94%)
  • Throughput : 1,2 → 4,1 tokens/seconde (+242%)
  • Latence P95 : 800ms → 320ms (-60%)
  • Possibilité downgrade A100 40GB → L40S 48GB : coût 3'200 → 1'800 CHF/mois (-44%)
  • Économie annuelle : 16'800 CHF

Ce cas illustre le ROI des optimisations GPU : investissement temps ~40 heures engineering (migration framework, tests, monitoring), retour sur investissement <3 mois via les économies d'infrastructure.

 

 

En résumé : 3 points clés

Le monitoring transforme les coûts GPU en actifs optimisables

L'implémentation de DCGM + Prometheus + Grafana révèle instantanément les inefficiences invisibles sans instrumentation. Les quatre métriques critiques — GPU utilization (cible 60-80%), memory bandwidth (>50% pour workloads memory-bound), throughput (>60% du théorique) et latence P95/P99 — identifient précisément où optimiser. L'overhead du monitoring (~5% performance GPU) est négligeable face aux gains : selon l'étude AI Infrastructure Alliance 2024, seulement 7% des organisations atteignent >85% d'utilization sans monitoring structuré. Les 93% restants gaspillent 15 à 60% de capacité, soit des dizaines de milliers de francs annuels par GPU. Le monitoring n'est pas un coût mais un investissement à ROI immédiat.

Les frameworks d'inférence spécialisés multiplient les performances par 2 à 4

PyTorch et TensorFlow standard ne sont pas conçus pour l'inférence production. Les frameworks spécialisés (vLLM, TensorRT-LLM, SGLang) implémentent continuous batching, gestion optimisée du KV cache, et kernels CUDA spécialisés générant des gains de 2 à 4× en throughput. vLLM atteint 4'741 tokens/seconde à 100 requêtes concurrentes contre ~1'500 avec PyTorch standard selon benchmarks Clarifai 2024. Pour production généraliste, vLLM offre le meilleur compromis : setup 1-2 jours, API compatible OpenAI, intégration Hugging Face native. TensorRT-LLM cible latence ultra-faible (<50ms TTFT) mais nécessite expertise CUDA. SGLang excelle sur RAG/agents avec réutilisation intensive du contexte (gains 3× via RadixAttention). Le choix du framework dépend du use case, pas d'une hiérarchie absolue.

La quantization libère 40 à 50% de capacité sans dégradation significative

La quantization INT8 divise par deux les besoins VRAM versus FP16 avec pertes de qualité de 2 à 5% généralement acceptables en production. Un modèle 13B passe de 26 GB (FP16) à 13 GB (INT8), permettant soit de doubler le batch size (×2 throughput), soit de servir deux modèles sur le même GPU. Les techniques avancées (AWQ, GPTQ) optimisent le compromis performance-qualité. Pour GPU Hopper (H100), la précision FP8 native via Transformer Engine améliore le throughput de 20 à 50% sur architectures transformer. L'évaluation systématique de la quantization sur datasets représentatifs révèle fréquemment que INT8 délivre 95 à 98% de la qualité FP16 pour une fraction du coût. Non-utilisation de la quantization en production = gaspillage de 40 à 50% de capacité GPU achetée.

Articles similaires