Comment optimiser une application d'inférence ?

L'optimisation de l'inférence vise à améliorer les performances et l'efficacité des modèles d'IA lors de leur exécution en production. À mesure que les grands modèles de langage (LLM) atteignent des dizaines ou des centaines de milliards de paramètres et que les architectures d'inférence deviennent plus complexes, la difficulté de concevoir et de gérer des applications ne fait que croître. L'optimisation consiste à gérer, surveiller et mettre à jour ces charges de travail gourmandes en ressources de calcul, ce qui permet d'obtenir des temps de réponse inférieurs à une seconde et un débit plus élevé à moindre coût.

Elle regroupe un ensemble de techniques, allant de la compression de modèles à la gestion avancée de la mémoire, qui déplacent l'attention de la simple "exécution d'un modèle" vers la "mise à l'échelle d'un service d'intelligence". Les développeurs peuvent ainsi créer des applications plus responsives tout en maintenant une empreinte d'infrastructure durable.

En pratique, l'optimisation de l'inférence est généralement appliquée de deux manières principales :

Optimisation au niveau de l'infrastructure : elle se concentre sur la façon dont le modèle est exécuté sur le matériel. Cela inclut l'utilisation d'environnements d'exécution optimisés (comme NVIDIA NIM ou vLLM), la gestion de la mémoire des GPU avec des techniques telles que PagedAttention et le traitement par lot en cours d'exécution pour traiter plusieurs requêtes simultanément. C'est souvent l'approche la plus pratique pour les développeurs qui utilisent des modèles Open Source ou propriétaires.

Optimisation au niveau du modèle : il s'agit de modifier le modèle lui-même pour réduire sa taille ou sa complexité. Des techniques comme la quantification (réduction de la précision de 16 bits à 4 bits), la distillation (entraînement d'un modèle "élève" plus petit pour imiter un modèle "enseignant" plus grand) et la parcimonie (élagage des paramètres non importants) peuvent réduire considérablement la mémoire et les ressources de calcul nécessaires pour chaque jeton.

Comprendre le fonctionnement du processus d'inférence

Le workflow au niveau du code

Pour optimiser efficacement l'inférence des LLM, vous devez comprendre les deux phases distinctes qu'elle comporte :

Phase

Description

Principale caractéristique

Préremplissage

Le modèle traite l'intégralité du prompt d'entrée pour calculer les états intermédiaires.

Hautement parallélisé ; lié au calcul (sature le GPU).

Decode

Le modèle génère les jetons de sortie un par un par régression automatique.

Séquentiel ; lié à la mémoire (limité par la vitesse de transfert des données).

Phase

Description

Principale caractéristique

Préremplissage

Le modèle traite l'intégralité du prompt d'entrée pour calculer les états intermédiaires.

Hautement parallélisé ; lié au calcul (sature le GPU).

Decode

Le modèle génère les jetons de sortie un par un par régression automatique.

Séquentiel ; lié à la mémoire (limité par la vitesse de transfert des données).

  1. Décrire l'objectif : vous commencez par un déploiement de modèle non optimisé.
  2. Appliquer la quantification : réduisez les pondérations du modèle (par exemple, à 4 bits) pour faire tenir des lots plus volumineux en mémoire.
  3. Optimiser l'attention : utilisez FlashAttention ou l'attention par requêtes groupées (GQA) pour minimiser les coûts de déplacement de la mémoire.
  4. Gérer la mémoire : implémentez PagedAttention pour stocker les caches KV dans des blocs non contigus afin d'éliminer la fragmentation.
  5. Exécuter et surveiller : effectuez le déploiement avec le traitement par lots en cours d'exécution pour lancer immédiatement de nouvelles requêtes à mesure que d'autres se terminent.

Optimisation de l'inférence et déploiement standard

Voici une comparaison entre l'inférence optimisée et la mise en service de modèle "naïve" traditionnelle :

Fonctionnalité

Déploiement standard

Inférence optimisée

Débit

Limité par la taille statique des lots et le temps d'inactivité.

Élevé ; utilise le traitement par lot en cours d'exécution et l'itération continue.

Latence

Croissance linéaire avec la longueur de la séquence ; délai d'émission du premier jeton (TTFT) élevé.

Optimisé ; utilise l'accélération du préremplissage et le décodage spéculatif.

Gestion de la mémoire

Allocation statique (surprovisionnement pour la longueur maximale).

Dynamique (pagination) ; gaspillage minimal grâce à PagedAttention.

Efficacité du matériel

Sous-utilisation fréquente des capacités de calcul des GPU/TPU

Maximisé ; utilise des kernels optimisés (TFE-IE, XLA).

Coût par requête

Plus élevé ; nécessite plus de matériel pour la même charge.

Plus faible ; regroupe davantage de requêtes dans la même infrastructure.

Fonctionnalité

Déploiement standard

Inférence optimisée

Débit

Limité par la taille statique des lots et le temps d'inactivité.

Élevé ; utilise le traitement par lot en cours d'exécution et l'itération continue.

Latence

Croissance linéaire avec la longueur de la séquence ; délai d'émission du premier jeton (TTFT) élevé.

Optimisé ; utilise l'accélération du préremplissage et le décodage spéculatif.

Gestion de la mémoire

Allocation statique (surprovisionnement pour la longueur maximale).

Dynamique (pagination) ; gaspillage minimal grâce à PagedAttention.

Efficacité du matériel

Sous-utilisation fréquente des capacités de calcul des GPU/TPU

Maximisé ; utilise des kernels optimisés (TFE-IE, XLA).

Coût par requête

Plus élevé ; nécessite plus de matériel pour la même charge.

Plus faible ; regroupe davantage de requêtes dans la même infrastructure.

Premiers pas : choisir votre environnement d'orchestration

Google Cloud propose une gamme d'outils conçus pour différents niveaux de compétences et besoins architecturaux.

Outil

Point de départ

Niveau de compétence

Méthode

Fonctionnalité clé

Cloud Run (avec des GPU)

Service d'IA léger basé sur des événements

Débutant

Sans serveur

Inférence avec scaling à zéro instance pour les charges de travail intensives à faible latence

Modèle OSS (Llama 3, par exemple)

Niveau débutant à intermédiaire

Géré/Low-code

Déploiement en un clic avec les environnements d'exécution vLLM ou NVIDIA NIM optimisés


Charges de travail de production hautes performances

Niveau intermédiaire à avancé

Inférence accélérée

Microservices prédéfinis avec des optimisations TensorRT-LLM de pointe

Infrastructure personnalisée à plusieurs modèles

Avancé

Cloud natif/personnalisé

Contrôle total sur la segmentation des GPU, l'orchestration et les serveurs d'inférence personnalisés

Développement à grande échelle privilégiant les TPU

Avancé

Optimisé pour les TPU/XLA

Adapté à XLA avec le traitement par lot continu et PagedAttention sur les Cloud TPU

Outil

Point de départ

Niveau de compétence

Méthode

Fonctionnalité clé

Cloud Run (avec des GPU)

Service d'IA léger basé sur des événements

Débutant

Sans serveur

Inférence avec scaling à zéro instance pour les charges de travail intensives à faible latence

Modèle OSS (Llama 3, par exemple)

Niveau débutant à intermédiaire

Géré/Low-code

Déploiement en un clic avec les environnements d'exécution vLLM ou NVIDIA NIM optimisés


Charges de travail de production hautes performances

Niveau intermédiaire à avancé

Inférence accélérée

Microservices prédéfinis avec des optimisations TensorRT-LLM de pointe

Infrastructure personnalisée à plusieurs modèles

Avancé

Cloud natif/personnalisé

Contrôle total sur la segmentation des GPU, l'orchestration et les serveurs d'inférence personnalisés

Développement à grande échelle privilégiant les TPU

Avancé

Optimisé pour les TPU/XLA

Adapté à XLA avec le traitement par lot continu et PagedAttention sur les Cloud TPU

Optimiser l'inférence avec Vertex AI Model Garden

Model Garden est le moyen le plus rapide de déployer des versions optimisées des principaux modèles ouverts comme Llama, Gemma et Mistral.

Étape 1 : Sélectionner et configurer votre modèle

Accédez à Model Garden et recherchez un modèle OSS compatible. Cliquez sur "Déployer". Dans la configuration, sélectionnez un environnement d'exécution optimisé tel que vLLM ou NVIDIA NIM.

Étape 2 : Appliquer la quantification

Choisissez une version quantifiée du modèle (par exemple, 4 bits ou 8 bits) pour réduire l'espace mémoire utilisé. Cela vous permet de diffuser des lots de plus grande taille sur le même GPU, ce qui augmente directement le débit.

Étape 3 : Activer la gestion avancée de la mémoire

Assurez-vous que le conteneur de service est configuré pour utiliser PagedAttention. Cette technique permet au modèle de stocker sa "mémoire" (cache clé-valeur) dans des blocs non contigus, ce qui évite le gaspillage de mémoire et permet d'utiliser des fenêtres de contexte plus longues.

Étape 4 : Déployer et surveiller

Une fois déployé, Vertex AI gère automatiquement le traitement par lot en cours, en traitant de nouvelles requêtes dès qu'une requête existante a terminé un jeton. Utilisez Vertex AI Model Monitoring pour suivre la latence et vous assurer que le style de la sortie reste de haute qualité.

Optimiser l'inférence avec GKE

Pour les équipes ayant besoin d'un contrôle précis sur l'orchestration et leurs kernels d'inférence personnalisés, GKE est le choix de référence.

Étape 1 : Initialiser votre cluster avec des GPU NVIDIA ou des Cloud TPU

Provisionnez un cluster GKE avec des nœuds GPU spécialisés (par exemple, L4 ou H100). Installez l'opérateur GPU NVIDIA pour gérer les pilotes et optimiser les performances automatiquement.

Étape 2 : Déployer un serveur d'inférence optimisé

Utilisez un moteur d'inférence conteneurisé comme vLLM ou Triton Inference Server. Ces serveurs sont compatibles avec le traitement par lots continu et le parallélisme des tenseurs, ce qui vous permet de segmenter de grands modèles sur plusieurs GPU. vLLM vous permet également de passer des TPU aux GPU, avec un minimum de code supplémentaire.

Étape 3 : Implémenter le décodage spéculatif

Pour les besoins de latence critiques, configurez le décodage spéculatif. Cette technique consiste à utiliser un modèle "brouillon" plus petit et plus rapide pour prédire des jetons, qui sont ensuite vérifiés en parallèle par votre modèle "cible" plus grand, ce qui permet souvent de multiplier la vitesse par deux ou trois.

Étape 4 : Simplifier le déploiement avec GKE Inference Quickstart

GKE Inference Quickstart sert de base de données préconfigurée pour les configurations de piles d'inférence testées. En spécifiant votre modèle, vos exigences de latence et vos priorités en termes de coûts, l'outil fournit un ensemble de recommandations basées sur les bonnes pratiques et les derniers benchmarks. Vous pouvez ainsi surveiller les métriques de performance spécifiques à l'inférence et affiner dynamiquement votre déploiement pour vous assurer qu'il s'exécute toujours sur une technologie optimisée.

Étape 5 : Effectuer le scaling avec la passerelle d'inférence GKE

La passerelle d'inférence GKE est désormais en disponibilité générale et propose deux fonctionnalités avancées pour gérer les applications d'IA générative complexes.

  • Routage tenant compte des préfixes : pour les applications telles que les chats multitours ou l'analyse de documents, cette fonctionnalité achemine les requêtes vers les accélérateurs qui disposent déjà du contexte en cache, ce qui améliore les temps de réponse.
  • Diffusion désagrégée : cette technique distingue la phase initiale de "préremplissage" (traitement des prompts) de la phase de "décodage" (génération de jetons). Comme ces étapes ont des besoins en ressources différents, vous pouvez les exécuter sur des pools de machines distincts et optimisés pour maximiser l'efficacité.

Étape 6 : Accélérer l'accès aux données avec Anywhere Cache

Anywhere Cache est un nouveau cache de lecture entièrement cohérent qui fonctionne avec les buckets Google Cloud Storage (GCS) existants afin de mettre en cache les données dans la même zone que vos accélérateurs. Cela réduit la latence de lecture jusqu'à 96 % et minimise les coûts réseau associés aux charges de travail intensives en lecture.

Étape 7 : Connecter des charges de travail mondiales avec Cloud WAN

L'ensemble de l'infrastructure est relié par Cloud WAN, un réseau mondial entièrement géré et basé sur l'infrastructure à l'échelle mondiale de Google. Cloud WAN connecte les ressources de calcul d'IA dans différentes régions, différents clouds et différents environnements sur site. Il améliore de 40 % l'expérience des applications d'inférence et réduit de 40 % le coût total de possession par rapport aux solutions WAN traditionnelles.

Relevez vos plus grands défis avec Google Cloud

Les nouveaux clients bénéficient de 300 $ de crédits à dépenser sur Google Cloud.

Passez à l'étape suivante

Commencez à créer sur Google Cloud avec 300 $ de crédits inclus et plus de 20 produits toujours sans frais.

Google Cloud