Modèles et plateformes d’IA
TensorRT-LLM : Un guide complet pour optimiser l’inférence des modèles de langage à grande échelle pour une performance maximale
Alors que la demande de modèles de langage à grande échelle (LLM) continue de croître, assurer une inférence rapide, efficace et évolutivité est devenu plus crucial que jamais. NVIDIA’s (NVDA ) TensorRT-LLM intervient pour relever ce défi en fournissant un ensemble d’outils et d’optimisations puissants spécifiquement conçus pour l’inférence LLM. TensorRT-LLM offre une gamme impressionnante d’améliorations de performances, telles que la quantification, la fusion de noyaux, le traitement par lots en vol et le support multi-GPU. Ces progrès permettent d’atteindre des vitesses d’inférence jusqu’à 8 fois plus rapides que les méthodes traditionnelles basées sur le processeur, transformant la façon dont nous déployons les LLM en production.
Ce guide complet explorera tous les aspects de TensorRT-LLM, de son architecture et de ses fonctionnalités clés à des exemples pratiques pour déployer des modèles. Que vous soyez un ingénieur en intelligence artificielle, un développeur de logiciels ou un chercheur, ce guide vous donnera les connaissances nécessaires pour exploiter TensorRT-LLM pour optimiser l’inférence LLM sur les GPU NVIDIA.
Accélération de l’inférence LLM avec TensorRT-LLM
TensorRT-LLM apporte des améliorations spectaculaires des performances d’inférence LLM. Selon les tests de NVIDIA, les applications basées sur TensorRT affichent des vitesses d’inférence jusqu’à 8 fois plus rapides que les plateformes basées uniquement sur le processeur. Il s’agit d’une avancée cruciale dans les applications en temps réel telles que les chatbots, les systèmes de recommandation et les systèmes autonomes qui nécessitent des réponses rapides.
Comment ça marche
TensorRT-LLM accélère l’inférence en optimisant les réseaux de neurones pendant le déploiement en utilisant des techniques telles que :
- Quantification : Réduit la précision des poids et des activations, réduit la taille du modèle et améliore la vitesse d’inférence.
- Fusion de couches et de tenseurs : Fusionne des opérations telles que les fonctions d’activation et les multiplications matricielles en une seule opération.
- Ajustement du noyau : Sélectionne les noyaux CUDA optimaux pour le calcul sur GPU, réduisant le temps d’exécution.
Ces optimisations garantissent que vos modèles LLM fonctionnent efficacement sur une large gamme de plateformes de déploiement, des centres de données hyperscale aux systèmes intégrés.
Optimisation des performances d’inférence avec TensorRT
Construit sur le modèle de programmation parallèle CUDA de NVIDIA, TensorRT fournit des optimisations hautement spécialisées pour l’inférence sur les GPU NVIDIA. En rationalisant des processus tels que la quantification, l’ajustement du noyau et la fusion des opérations de tenseurs, TensorRT garantit que les LLM peuvent fonctionner avec une latence minimale.
Certaines des techniques les plus efficaces incluent :
- Quantification : Cela réduit la précision numérique des paramètres du modèle tout en maintenant une grande précision, accélérant ainsi l’inférence.
- Fusion de tenseurs : En fusionnant plusieurs opérations en un seul noyau CUDA, TensorRT minimise les frais généraux de mémoire et augmente le débit.
- Ajustement automatique du noyau : TensorRT sélectionne automatiquement le meilleur noyau pour chaque opération, optimisant l’inférence pour un GPU donné.
Ces techniques permettent à TensorRT-LLM d’optimiser les performances d’inférence pour les tâches d’apprentissage automatique telles que le traitement du langage naturel, les moteurs de recommandation et l’analyse vidéo en temps réel.
Accélération des charges de travail d’IA avec TensorRT
TensorRT accélère les charges de travail d’apprentissage automatique en intégrant des optimisations de précision telles que INT8 et FP16. Ces formats de précision réduite permettent une inférence nettement plus rapide tout en maintenant la précision. C’est particulièrement précieux dans les applications en temps réel où la faible latence est une exigence critique.
Les optimisations INT8 et FP16 sont particulièrement efficaces dans :
- Diffusion vidéo : Les tâches de traitement vidéo basées sur l’IA, comme la détection d’objets, bénéficient de ces optimisations en réduisant le temps nécessaire pour traiter les trames.
- Systèmes de recommandation : En accélérant l’inférence pour les modèles qui traitent de grandes quantités de données utilisateur, TensorRT permet une personnalisation en temps réel à grande échelle.
- Traitement du langage naturel (NLP) : TensorRT améliore la vitesse des tâches NLP telles que la génération de texte, la traduction et la synthèse, les rendant adaptées aux applications en temps réel.
Déploiement, exécution et mise à l’échelle avec NVIDIA Triton
Une fois votre modèle optimisé avec TensorRT-LLM, vous pouvez facilement le déployer, l’exécuter et le mettre à l’échelle en utilisant NVIDIA Triton Inference Server. Triton est un logiciel open source qui prend en charge le traitement par lots dynamique, les ensembles de modèles et un débit élevé. Il fournit un environnement flexible pour gérer les modèles d’IA à grande échelle.
Certaines des fonctionnalités clés incluent :
- Exécution de modèles concurrents : Exécutez plusieurs modèles simultanément, maximisant ainsi l’utilisation du GPU.
- Traitement par lots dynamique : Combinez plusieurs requêtes d’inférence en un seul lot, réduisant la latence et augmentant le débit.
- Entrées audio/vidéo en continu : Prend en charge les flux d’entrée en temps réel pour les applications telles que l’analyse vidéo en direct ou les services de reconnaissance vocale.
Cela rend Triton un outil précieux pour déployer des modèles optimisés par TensorRT-LLM dans des environnements de production, garantissant une grande évolutivité et une efficacité.
Fonctionnalités clés de TensorRT-LLM pour l’inférence LLM
API Python open source
TensorRT-LLM fournit une API Python hautement modulaire et open source, simplifiant le processus de définition, d’optimisation et d’exécution des LLM. L’API permet aux développeurs de créer des LLM personnalisés ou de modifier des LLM prêts à l’emploi pour répondre à leurs besoins, sans nécessiter une connaissance approfondie de CUDA ou des frameworks d’apprentissage automatique.
Traitement par lots en vol et attention paginée
L’une des fonctionnalités les plus remarquables de TensorRT-LLM est le traitement par lots en vol, qui optimise la génération de texte en traitant plusieurs requêtes de manière concurrente. Cette fonctionnalité minimise le temps d’attente et améliore l’utilisation du GPU en traitant dynamiquement les séquences.
De plus, l’attention paginée garantit que l’utilisation de la mémoire reste faible même lors du traitement de longues séquences d’entrée. Au lieu d’allouer une mémoire contiguë pour tous les jetons d’une séquence (ce qui peut entraîner une fragmentation de la mémoire), l’attention paginée divise les données de cache en “pages” de mémoire qui peuvent être réutilisées dynamiquement, prévenant ainsi la fragmentation de la mémoire et améliorant l’efficacité.
Inférence multi-GPU et multi-nœud
Pour les modèles plus importants ou les charges de travail plus complexes, TensorRT-LLM prend en charge l’inférence multi-GPU et multi-nœud. Cette capacité permet de distribuer les calculs de modèle sur plusieurs GPU ou nœuds, améliorant ainsi le débit et réduisant le temps d’inférence global.
Prise en charge de FP8
Avec l’avènement de FP8 (8 bits à virgule flottante), TensorRT-LLM tire parti des dernières innovations matérielles de NVIDIA dans l’architecture H100 Hopper. FP8 réduit l’empreinte mémoire des LLM en stockant les poids et les activations dans un format à virgule flottante 8 bits, ce qui entraîne une computation plus rapide sans sacrifier beaucoup de précision. TensorRT-LLM compile automatiquement les modèles pour utiliser des noyaux FP8 optimisés, accélérant ainsi encore les temps d’inférence.
Cela rend TensorRT-LLM un choix idéal pour les déploiements à grande échelle nécessitant des performances et une efficacité énergétique de premier plan.
Architecture et composants de TensorRT-LLM
Comprendre l’architecture de TensorRT-LLM vous aidera à mieux utiliser ses capacités pour l’inférence LLM. Décomposons les composants clés :
Définition du modèle
TensorRT-LLM vous permet de définir des LLM en utilisant une API Python simple. L’API construit une représentation graphique du modèle, facilitant ainsi la gestion des couches complexes impliquées dans les architectures LLM comme GPT ou BERT.
Associations de poids
Avant de compiler le modèle, les poids (ou paramètres) doivent être associés au réseau. Cette étape garantit que les poids sont intégrés dans le moteur TensorRT, permettant une inférence rapide et efficace. TensorRT-LLM permet également la mise à jour des poids après la compilation, ajoutant de la flexibilité pour les modèles nécessitant des mises à jour fréquentes.
Appariement de motifs et fusion
La fusion d’opérations est une autre fonctionnalité puissante de TensorRT-LLM. En fusionnant plusieurs opérations (par exemple, des multiplications matricielles avec des fonctions d’activation) en un seul noyau CUDA, TensorRT minimise les frais généraux associés à de multiples lancements de noyau. Cela réduit les transferts de mémoire et accélère l’inférence.
Modules complémentaires
Pour étendre les fonctionnalités de TensorRT, les développeurs peuvent écrire des modules complémentaires – des noyaux personnalisés qui effectuent des tâches spécifiques comme l’optimisation des blocs d’attention multi-tête. Par exemple, le module complémentaire Flash-Attention améliore considérablement les performances des couches d’attention des modèles basés sur les transformateurs.
Benchmark : Gains de performances de TensorRT-LLM
TensorRT-LLM démontre des gains de performances significatifs pour l’inférence LLM sur divers GPU. Voici une comparaison de la vitesse d’inférence (mesurée en jetons par seconde) en utilisant TensorRT-LLM sur différents GPU NVIDIA :
| Modèle | Précision | Longueur d’entrée/sortie | H100 (80GB) | A100 (80GB) | L40S FP8 |
|---|---|---|---|---|---|
| GPTJ 6B | FP8 | 128/128 | 34,955 | 11,206 | 6,998 |
| GPTJ 6B | FP8 | 2048/128 | 2,800 | 1,354 | 747 |
| LLaMA v2 7B | FP8 | 128/128 | 16,985 | 10,725 | 6,121 |
| LLaMA v3 8B | FP8 | 128/128 | 16,708 | 12,085 | 8,273 |
Ces benchmarks montrent que TensorRT-LLM offre des améliorations de performances considérables, en particulier pour les séquences plus longues.
Pratique : Installation et construction de TensorRT-LLM
Étape 1 : Créer un environnement de conteneur
Pour une utilisation facile, TensorRT-LLM fournit des images Docker pour créer un environnement contrôlé pour la construction et l’exécution de modèles.
docker build --pull \ --target devel \ --file docker/Dockerfile.multi \ --tag tensorrt_llm/devel:latest .
docker run --rm -it \
--ipc=host --ulimit memlock=-1 --ulimit stack=67108864 --gpus=all \
--volume ${PWD}:/code/tensorrt_llm \
--workdir /code/tensorrt_llm \
tensorrt_llm/devel:latest
Étape 2 : Exécuter le conteneur
Étape 3 : Construire TensorRT-LLM à partir de la source
À l’intérieur du conteneur, compilez TensorRT-LLM avec la commande suivante :
python3 ./scripts/build_wheel.py --trt_root /usr/local/tensorrt pip install ./build/tensorrt_llm*.whl
Étape 4 : Lier le runtime C++ de TensorRT-LLM
Lors de l’intégration de TensorRT-LLM dans vos projets C++, assurez-vous que les chemins d’inclusion de votre projet pointent vers le répertoire cpp/include. Ce répertoire contient les en-têtes d’API stables et pris en charge. Les bibliothèques TensorRT-LLM sont liées dans le cadre de votre processus de compilation C++.
Par exemple, la configuration CMake de votre projet peut inclure :
include_directories(${TENSORRT_LLM_PATH}/cpp/include)
link_directories(${TENSORRT_LLM_PATH}/cpp/build/tensorrt_llm)
target_link_libraries(your_project tensorrt_llm)
Cette intégration vous permet de profiter des optimisations de TensorRT-LLM dans vos projets C++ personnalisés, garantissant une inférence efficace même dans les environnements de bas niveau ou à haute performance.
Fonctionnalités avancées de TensorRT-LLM
TensorRT-LLM est plus qu’une bibliothèque d’optimisation ; il inclut plusieurs fonctionnalités avancées qui aident à relever les défis des déploiements LLM à grande échelle. Voici quelques-unes de ces fonctionnalités en détail :
1. Traitement par lots en vol
Le traitement par lots traditionnel implique d’attendre jusqu’à ce qu’un lot soit entièrement collecté avant de le traiter, ce qui peut causer des retards. Le traitement par lots en vol change cela en démarrant dynamiquement l’inférence sur les requêtes terminées dans un lot tout en collectant d’autres requêtes. Cette fonctionnalité améliore le débit global en minimisant le temps d’inactivité et en améliorant l’utilisation du GPU.
Cette fonctionnalité est particulièrement précieuse dans les applications en temps réel telles que les chatbots ou les assistants vocaux, où le temps de réponse est critique.
2. Attention paginée
L’attention paginée est une technique d’optimisation de la mémoire pour la gestion de longues séquences d’entrée. Au lieu d’exiger une mémoire contiguë pour tous les jetons d’une séquence (ce qui peut entraîner une fragmentation de la mémoire), l’attention paginée permet au modèle de diviser les données de cache en “pages” de mémoire qui peuvent être allouées et libérées dynamiquement, optimisant ainsi l’utilisation de la mémoire.
L’attention paginée est cruciale pour la gestion de longueurs de séquence importantes et la réduction de la charge de mémoire, en particulier dans les modèles génératifs comme GPT et LLaMA.
3. Modules complémentaires personnalisés
TensorRT-LLM permet d’étendre ses fonctionnalités avec des modules complémentaires personnalisés. Les modules complémentaires sont des noyaux définis par l’utilisateur qui permettent des optimisations ou des opérations spécifiques non couvertes par la bibliothèque TensorRT standard.
Par exemple, le module complémentaire Flash-Attention est un noyau personnalisé bien connu qui optimise les couches d’attention multi-tête dans les modèles basés sur les transformateurs. En utilisant ce module complémentaire, les développeurs peuvent atteindre des accélérations considérables dans le calcul de l’attention – l’un des composants les plus gourmands en ressources des LLM.
Pour intégrer un module complémentaire personnalisé dans votre modèle TensorRT-LLM, vous pouvez écrire un noyau CUDA personnalisé et le registrar auprès de TensorRT. Le module complémentaire sera invoqué pendant l’exécution du modèle, fournissant ainsi des améliorations de performances personnalisées.
4. Précision FP8 sur NVIDIA H100
Avec la précision FP8, TensorRT-LLM tire parti des dernières innovations matérielles de NVIDIA dans l’architecture H100 Hopper. FP8 réduit l’empreinte mémoire des LLM en stockant les poids et les activations dans un format à virgule flottante 8 bits, ce qui entraîne une computation plus rapide sans sacrifier beaucoup de précision. TensorRT-LLM compile automatiquement les modèles pour utiliser des noyaux FP8 optimisés, accélérant ainsi encore les temps d’inférence.
Cela rend TensorRT-LLM un choix idéal pour les déploiements à grande échelle nécessitant des performances et une efficacité énergétique de premier plan.
Exemple : Déploiement de TensorRT-LLM avec Triton Inference Server
Pour les déploiements en production, le Triton Inference Server de NVIDIA fournit une plateforme robuste pour gérer les modèles à grande échelle. Dans cet exemple, nous allons démontrer comment déployer un modèle optimisé par TensorRT-LLM en utilisant Triton.
Étape 1 : Configurer le référentiel de modèles
Créez un référentiel de modèles pour Triton, qui stockera vos fichiers de modèles TensorRT-LLM. Par exemple, si vous avez compilé un modèle GPT2, votre structure de répertoire pourrait ressembler à ceci :
mkdir -p model_repository/gpt2/1 cp ./trt_engine/gpt2_fp16.engine model_repository/gpt2/1/
Étape 2 : Créer le fichier de configuration de Triton
Dans le même répertoire model_repository/gpt2/, créez un fichier de configuration nommé config.pbtxt qui indique à Triton comment charger et exécuter le modèle. Voici une configuration de base pour TensorRT-LLM :
name: "gpt2"
platform: "tensorrt_llm"
max_batch_size: 8
<p>input [
{
name: "input_ids"
data_type: TYPE_INT32
dims: [-1]
}
]</p>
<p>output [
{
name: "logits"
data_type: TYPE_FP32
dims: [-1, -1]
}
]</p>
Étape 3 : Lancer le serveur Triton
Utilisez la commande Docker suivante pour lancer Triton avec le référentiel de modèles :
docker run --rm --gpus all \ -v $(pwd)/model_repository:/models \ nvcr.io/nvidia/tritonserver:23.05-py3 \ tritonserver --model-repository=/models
Étape 4 : Envoyer des requêtes d’inférence à Triton
Une fois le serveur Triton en cours d’exécution, vous pouvez lui envoyer des requêtes d’inférence en utilisant HTTP ou gRPC. Par exemple, en utilisant curl pour envoyer une requête :
curl -X POST http://localhost:8000/v2/models/gpt2/infer -d '{
"inputs": [
{"name": "input_ids", "shape": [1, 128], "datatype": "INT32", "data": [[101, 234, 1243]]}
]
}'
Triton traitera la requête en utilisant le moteur TensorRT-LLM et retournera les logits en tant que sortie.
Meilleures pratiques pour optimiser l’inférence LLM avec TensorRT-LLM
Pour exploiter pleinement le potentiel de TensorRT-LLM, il est essentiel de suivre les meilleures pratiques pendant à la fois l’optimisation du modèle et le déploiement. Voici quelques conseils clés :
1. Profiler votre modèle avant l’optimisation
Avant d’appliquer des optimisations telles que la quantification ou la fusion de noyaux, utilisez les outils de profilage de NVIDIA (comme Nsight Systems ou TensorRT Profiler) pour comprendre les goulets d’étranglement actuels dans l’exécution de votre modèle. Cela vous permet de cibler des domaines spécifiques pour l’amélioration, conduisant à des optimisations plus efficaces.
2. Utiliser la précision mixte pour des performances optimales
Lors de l’optimisation des modèles avec TensorRT-LLM, l’utilisation de la précision mixte (une combinaison de FP16 et FP32) offre un gain de vitesse significatif sans perte majeure de précision. Pour un équilibre optimal entre vitesse et précision, envisagez d’utiliser FP8 lorsque cela est possible, en particulier sur les GPU H100.
3. Utiliser l’attention paginée pour les longues séquences
Pour les tâches qui impliquent de longues séquences d’entrée, telles que la synthèse de documents ou les conversations multi-tours, activez toujours l’attention paginée pour optimiser l’utilisation de la mémoire. Cela réduit la charge de mémoire et prévient les erreurs de mémoire insuffisante pendant l’inférence.
4. Ajuster le parallélisme pour les configurations multi-GPU
Lors du déploiement de LLM sur plusieurs GPU ou nœuds, il est essentiel d’ajuster les paramètres de parallélisme tensoriel et de parallélisme de pipeline pour correspondre à votre charge de travail spécifique. La configuration correcte de ces modes peut conduire à des améliorations de performances significatives en répartissant la charge de calcul de manière égale sur les GPU.
Conclusion
TensorRT-LLM représente un changement de paradigme dans l’optimisation et le déploiement des modèles de langage à grande échelle. Avec ses fonctionnalités avancées telles que la quantification, la fusion d’opérations, la précision FP8 et le support multi-GPU, TensorRT-LLM permet aux LLM de fonctionner plus rapidement et plus efficacement sur les GPU NVIDIA. Que vous travailliez sur des applications de chat en temps réel, des systèmes de recommandation ou des modèles de langage à grande échelle, TensorRT-LLM fournit les outils nécessaires pour repousser les limites de la performance.
Ce guide vous a montré comment configurer TensorRT-LLM, optimiser des modèles avec son API Python, déployer sur Triton Inference Server et appliquer les meilleures pratiques pour une inférence efficace. Avec TensorRT-LLM, vous pouvez accélérer vos charges de travail d’IA, réduire la latence et fournir des solutions LLM évolutives aux environnements de production.
Pour plus d’informations, consultez la documentation officielle de TensorRT-LLM et la documentation du serveur d’inférence Triton.












