
Le vrai trafic est compliqué. De nouvelles demandes arrivent alors que d'autres sont de moyenne génération. Le traitement par lots continu est particulièrement important pour l'inférence de grands modèles de langage (LLM) et d'autres modèles d'IA utilisés dans les applications du monde réel, où l'efficacité des services et l'utilisation des ressources sont essentielles. Si votre serveur attend la fin d'un lot complet avant de démarrer le suivant, les GPU restent inactifs et les utilisateurs attendent.
Le traitement par lots continu permet à la file d'attente de bouger, de sorte que le GPU ne fait que rarement des pauses, ce qui est crucial pour une génération de texte efficace. Il peut améliorer le débit jusqu'à 23 fois par rapport au traitement par lots naïf dans les scénarios d'inférence LLM. En outre, les charges par lots continues modélisent les pondérations au niveau du jeton plutôt qu'au niveau de la demande, ce qui améliore encore l'efficacité.
Les systèmes continus peuvent traiter les matériaux 24 heures sur 24 afin de maximiser le rendement et d'accélérer la production. Le dosage continu permet aux fabricants d'atteindre des volumes de production élevés tout en garantissant un contrôle précis des ratios d'ingrédients et de la qualité du mélange pour les différentes formulations.
La mesure et le stockage des ingrédients peuvent être effectués dans une trémie située en amont au-dessus du mélangeur, ce qui permet de préparer le lot suivant pendant que le précédent est en train de mélanger.
Pré-remplissage est la première passe où le modèle lit l'entrée complète ou la séquence d'entrée (en plus de l'invite) et crée le cache clé/valeur. Décoder est la génération étape par étape qui produit des jetons pour chaque séquence d'entrée ou requête.
Lors du préremplissage, les jetons d'entrée sont traités en parallèle, tandis que les séquences sont gérées étape par étape lors du décodage. Prefill aime les gros travaux en parallèle ; le décodage bénéficie de nombreuses petites étapes groupées. Les bons planificateurs les traitent différemment.
Le traitement par lots continu ne nécessite aucune modification du modèle et permet des optimisations avancées de la mémoire. Par exemple, PagedAttention alloue de la mémoire dans des pages de taille fixe, ce qui permet un stockage en cache KV non contigu afin d'améliorer l'efficacité de la mémoire. PagedAttention réduit la fragmentation interne en allouant des emplacements de mémoire GPU à la demande plutôt qu'à l'avance.
Le traitement par lots continu permet également de gérer efficacement les poids des modèles lors de l'inférence. Le débit et la latence sont améliorés à tous les percentiles lors de l'utilisation du traitement par lots continu dans l'inférence LLM. L'inférence LLM est liée à la mémoire et non au calcul, ce qui signifie qu'il faut plus de temps pour charger des données sur le GPU que pour effectuer des calculs.
Cependant, la fabrication en continu nécessite généralement d'importants investissements en capital et le processus est plus complexe que les systèmes par lots traditionnels. Dans la fabrication de médicaments, le dosage continu permet de surveiller la qualité en temps réel tout en définissant des lots spécifiques pour répondre aux exigences réglementaires.
La fabrication en continu dans les produits pharmaceutiques peut intégrer le traitement par lots pour des segments tels que la synthèse en plusieurs étapes où les intermédiaires sont isolés et validés avant de poursuivre en flux continu.
De plus, le dosage continu implique une technologie d'automatisation avancée et des systèmes de contrôle complexes nécessitant une expertise spécialisée. Les opérations séquentielles du dosage en continu impliquent le chargement du lot pré-pesé suivant dans le mélangeur pendant le déchargement du lot en cours, créant ainsi un flux de travail fluide. La mise en œuvre d'un système de traitement par lots continu nécessite des investissements importants dans l'infrastructure matérielle et logicielle.
Cette section décrit les principales étapes à suivre pour créer une configuration de traitement par lots efficace pour vos modèles.
Commencez par les valeurs par défaut, puis modifiez une chose à la fois :
Pour une validation complète, il est recommandé d'exécuter ces tests sur plusieurs itérations, en utilisant différentes itérations et plusieurs itérations pour couvrir une gamme de scénarios. Par exemple, vous pouvez faire varier la longueur des invites ou les niveaux de simultanéité à chaque exécution pour observer le comportement du système.
Suivez-les au minimum :
Le traitement par lots en continu n'est pas magique. C'est un moyen pratique d'occuper les GPU et de satisfaire les utilisateurs lorsque le trafic est irrégulier. Commencez par des bouchons sûrs, mesurez le TTFT et le TPS, et ajustez les limites de lots là où les chiffres l'indiquent.
Essayez Compute dès aujourd'hui
Lorsque vous êtes prêt, lancez un Point de terminaison vLLM sur ordinateur. Choisissez le matériel, définissez des majuscules et obtenez une URL HTTPS qui fonctionne avec les SDK OpenAI.
Prefill lit l'intégralité de l'invite une seule fois pour configurer la mémoire. Decode génère des jetons étape par étape à l'aide de cette mémoire.
Suffisamment grand pour occuper le GPU pendant le décodage sans provoquer de saturation du cache. Testez avec vos vraies instructions et plafonnez le nombre maximum de jetons.
Généralement, la mémoire est sollicitée ou les sorties sont surdimensionnées. Réduisez les invites, plafonnez les sorties et vérifiez le taux de réussite du cache.
Oui Le streaming est le mode par défaut pour de nombreux serveurs. Les utilisateurs voient des jetons pendant que le planificateur continue d'admettre d'autres demandes.
Non Les nœuds à GPU unique en tirent de nombreux avantages. Le multiprocesseur graphique est utile lorsque les besoins en mémoire ou en débit dépassent une carte.
ChatGPT génère généralement des jetons à un débit dépendant du matériel et de la charge sous-jacents, mais les débits courants vont de centaines à des milliers de jetons par seconde sur des serveurs optimisés.
En moyenne, 1 000 jetons correspondent à environ 750 mots, mais cela peut varier en fonction de la langue et de la méthode de tokenisation.
Un jeton est une unité de texte utilisée dans le traitement du langage naturel, souvent un mot ou un sous-mot que le modèle traite lors de l'inférence ou de la formation.
Les humains lisent généralement entre 200 et 300 mots par minute, ce qui correspond à peu près à 250 à 400 jetons par minute, soit environ 4 à 7 jetons par seconde.
TTFT signifie Time To First Token, la latence mesurée entre la réception d'une demande et le moment où le premier jeton de la sortie du modèle est généré.
Le TTFT est mesuré en chronométrant l'intervalle entre le moment où un serveur de modèles reçoit la première demande et le moment où il émet le premier jeton, souvent suivi dans des scripts d'analyse comparative.
Le TPOT (Tokens Per Operation Time) est une métrique de performance indiquant le nombre de jetons générés par un modèle par unité de temps de traitement, utile pour évaluer le débit.
TPS signifie Tokens par seconde, une mesure du débit du modèle pendant l'inférence, indiquant combien de jetons sont générés chaque seconde.
Le cache KV fait référence au cache clé-valeur qui stocke les tenseurs de clé et de valeur intermédiaires calculés pendant le mécanisme d'attention afin d'accélérer la génération ultérieure de jetons.
Le cache GPU KV est le stockage de paires clé-valeur dans la mémoire GPU utilisées lors de l'inférence de modèles pour optimiser les calculs d'attention et réduire les calculs redondants.
Dans les grands modèles de langage, le cache KV contient les vecteurs de clé et de valeur mis en cache des jetons précédents afin de calculer efficacement l'attention portée aux nouveaux jetons sans recalculer les états antérieurs.
Un cache de stockage clé-valeur est une méthode de stockage de données dans laquelle les données sont stockées sous forme de paires de clés et de valeurs correspondantes, ce qui permet une récupération rapide ; dans les LLM, ce concept s'applique à la mise en cache de calculs intermédiaires.
Le traitement par lots dynamique regroupe les demandes d'inférence entrantes en lots de manière dynamique en fonction des heures d'arrivée et des limites de taille des lots, en exécutant les lots soit lorsqu'ils sont pleins, soit après un délai d'attente pour équilibrer la latence et le débit.
Le traitement par lots statique attend qu'un lot soit complètement rempli avant d'être traité, ce qui peut augmenter la latence, tandis que le traitement par lots dynamique traite les lots une fois qu'ils sont pleins ou après une durée définie, améliorant ainsi la latence et l'utilisation des ressources. Le traitement par lots statique est particulièrement approprié lorsque la latence n'est pas un problème. Le traitement par lots statique peut augmenter considérablement la latence, limitant ainsi ses cas d'utilisation. Le traitement par lots statique nécessite une file de requêtes bien gérée pour alimenter efficacement le modèle. Le traitement par lots statique peut augmenter considérablement la latence, limitant ainsi ses cas d'utilisation. Le traitement par lots statique traite les demandes une fois qu'un nombre défini de demandes a été reçu.
Dans le domaine de l'expédition, le traitement par lots consiste à regrouper plusieurs commandes ou expéditions afin d'optimiser l'efficacité du transport et de réduire les coûts.
Dans Unity, le traitement par lots dynamique est une technique d'optimisation du rendu qui combine de manière dynamique plusieurs petits maillages en un seul appel de dessin afin d'améliorer les performances graphiques.