Cybercrime

un outil d’optimisation pour les grands modèles de langage (LLM/Large Language Models) – Sophos News

Les grands modèles de langage (LLM) ont le potentiel d’automatiser et de réduire les charges de travail à plusieurs niveaux différents, notamment celles des analystes en cybersécurité et des experts en réponse aux incidents. Mais les LLM génériques ne disposent pas des connaissances spécifiques au domaine nécessaires pour bien gérer ces tâches. Même s’ils ont été construits à partir de données d’entraînement incluant certaines ressources liées à la cybersécurité, celles-ci sont souvent insuffisantes pour entreprendre des tâches plus spécialisées qui nécessitent des connaissances plus récentes et, dans certains cas, des connaissances exclusives pour bien fonctionner, à savoir des données non disponibles pour les LLM lors de l’entraînement en question.

Il existe plusieurs solutions existantes pour paramétrer les LLM “Stock” (non modifiés) pour exécuter des types spécifiques de tâche. Malheureusement, ces solutions se sont avérées insuffisantes pour les différents types d’utilisation des LLM que Sophos X-Ops tente de mettre en œuvre. Pour cette raison, SophosAI a assemblé un framework qui utilise DeepSpeed, une bibliothèque développée par Microsoft qui peut être utilisée pour entraîner et optimiser l’inférence d’un modèle avec (en théorie) des milliards de paramètres en augmentant la puissance de calcul et la quantité de GPU (Graphics Processing Units) utilisées pendant l’entraînement. Le framework est sous licence open source et peut être trouvé dans notre référentiel GitHub.

Bien que de nombreuses parties du framework ne soient pas nouvelles et exploitent les bibliothèques open source existantes, SophosAI a synthétisé plusieurs des composants clés pour en faciliter l’utilisation. Nous continuons, d’ailleurs, à travailler à l’amélioration des performances du framework.

Les alternatives (insuffisantes)

Il existe plusieurs approches existantes pour adapter les LLM Stock aux connaissances spécifiques à un domaine. Chacun d’eux a ses propres avantages et limitations.

 

Approche : Techniques appliquées Limitations
Génération augmentée de récupération (Retrieval Augmented Generation/RAG)
  • La base de connaissances requise pour la tâche est « fragmentée », intégrée et stockée dans une base de données vectorielle.
  • Le bloc de données le plus pertinent pour la tâche est transmis au modèle Stock avec les informations à analyser.
  • La maintenance de l’infrastructure pour la mise à disposition des modèles et la base de données vectorielles est non négligeable.
  • La fragmentation n’est pas parfaite, le texte avec la même logique pouvant être décomposé en morceaux distincts.
  • Le modèle renverra une réponse très similaire aux informations récupérées : il n’aura pas de contexte plus large, spécifique au domaine, qui pourrait lui permettre de raisonner et de faire des connections entre les idées et les sujets.
  • Il ne peut être appliqué qu’à des tâches basées sur des informations et non à celles basées sur des connaissances.

 

Entraînement continu
  • Un LLM Stock est entraîné pour prédire le prochain jeton sur des données spécifiques au domaine.
  • Les données peuvent être non formatées (pré-entraînement continu) ou formatées sous la forme d’un ensemble d’instructions, telles que des questions et des réponses (optimisation des instructions).

 

  • Nécessite du hardware GPU étendu
Optimisation efficace des paramètres
  • Un sous-ensemble d’entraînement continu qui effectue une optimisation précise uniquement sur un sous-ensemble des paramètres du modèle.
  • Le paramétrage peut être effectué sur plusieurs, voire sur un seul GPU de type grand public.
  • “Hypothèse d’alignement superficiel” : les capacités et les connaissances d’un modèle sont imprégnées presque entièrement pendant le pré-entraînement et les ajustements ultérieurs permettront tout au plus d’aligner le format et le style de sortie du modèle sur les préférences de l’utilisateur. Ainsi, plus un domaine est éloigné des données de pré-entraînement du LLM, moins l’optimisation, et en particulier l’optimisation efficace des paramètres, aura d’impact.

 

 

 

Pour être pleinement efficace, un LLM expert du domaine nécessite un pré-entraînement de tous ses paramètres pour acquérir les connaissances propriétaires d’une entreprise. Cette entreprise peut avoir besoin de beaucoup de ressources et de temps. C’est pourquoi nous nous sommes tournés vers DeepSpeed pour notre framework d’entraînement, que nous avons implémenté en Python. La version du framework que nous publions en open source peut être exécutée dans le service de machine learning Amazon Web Services SageMaker, mais elle pourrait être adaptée à d’autres environnements.

Les frameworks d’entraînement (notamment DeepSpeed) vous permettent d’étendre les tâches d’entraînement des grands modèles grâce au parallélisme. Il existe trois principaux types de parallélisme : Données (Data), Tenseur (Tensor) et Pipeline.

Figure 1 : une illustration des trois principaux types de parallélisme au niveau de l’entrainement des modèles.

Dans le parallélisme de type ‘Données’, chaque processus travaillant sur la tâche d’entraînement (essentiellement chaque GPU ou Graphics Processor Unit) reçoit une copie des pondérations complètes du modèle mais ne dispose, par contre, que d’un sous-ensemble de données, appelé minibatch. Une fois le forward-pass des données (pour calculer la perte ou le degré d’inexactitude des paramètres du modèle utilisé pour l’entraînement) et le backward-pass (pour calculer le gradient de la perte) sont terminés, les gradients résultants sont synchronisés.

Dans le parallélisme de type ‘Tenseur’, chaque couche du modèle utilisé pour l’entraînement est répartie entre les différents processus disponibles. Chaque processus calcule une partie du fonctionnement de la couche en utilisant l’ensemble complet des données d’entraînement. Les sorties partielles de chacune de ces couches sont synchronisées entre les processus pour créer une matrice à sortie unique.

Le parallélisme de type ‘Pipeline‘ divise le modèle différemment. Au lieu d’effectuer le parallélisme en fragmentant les couches du modèle, chaque couche reçoit son propre processus. Les minibatchs de données sont divisés en microbatchs et envoyés séquentiellement dans le “Pipeline“. Une fois qu’un processus termine un microbatch, il en reçoit un nouveau. Cette méthode peut rencontrer des “bulles (bubbles)” où un processus est inactif, en attente de la sortie des processus hébergeant des couches de modèle antérieures.

Ces trois techniques de parallélisme peuvent également être combinées de plusieurs manières différentes et se trouvent dans la bibliothèque d’entraînement DeepSpeed.

Comment utiliser DeepSpeed ?

DeepSpeed ​​effectue le parallélisme des données fragmentées. Chaque couche de modèle est divisée de sorte que chaque processus puisse recevoir un fragment et chaque processus un minibatch distinct en entrée. Lors du forward-pass, chaque processus partage son fragment de couche avec les autres processus. A la fin de cette communication, chaque processus dispose désormais d’une copie de la couche complète du modèle.

Chaque processus calcule la sortie de la couche pour son minibatch. Une fois que le processus a terminé le calcul pour la couche donnée et son minibatch, le processus supprime les parties de la couche qu’il ne contenait pas à l’origine.

Le backward-pass des données d’entraînement s’effectue de la même manière. Comme pour le parallélisme de type ‘Données’, les gradients sont accumulés à la fin de la backward-pass et synchronisés entre les processus.

Les performances des processus d’entraînement sont plus limitées par la mémoire que par la puissance de traitement. De plus le recours à davantage de GPU dotés de mémoire supplémentaire pour gérer un batch trop volumineux pour la propre mémoire du GPU peut également entraîner des coûts de performances importants en raison de la vitesse de communication entre les GPU, comme le coût de l’utilisation de plus de processeurs que ce qui serait normalement nécessaire pour exécuter le processus. L’un des éléments clés de la bibliothèque DeepSpeed ​​est son Zero Redundancy Optimizer (ZeRO), un ensemble de techniques d’utilisation de la mémoire qui permettent de réaliser efficacement l’entraînement de très grands modèles de langage. ZeRO peut réduire la consommation de mémoire de chaque GPU en partitionnant les états du modèle (optimiseurs, gradients et paramètres) entre des processus de données mis en parallèle au lieu de les dupliquer dans chaque processus.

L’astuce consiste à trouver la bonne combinaison d’approches et d’optimisations en matière d’entraînement pour respecter vos contraintes de budget en termes de calcul. Il existe trois niveaux de partitionnement sélectionnables dans ZeRO :

  • ZeRO Stage 1 fragmente l’état de l’optimiseur.
  • Stage 2 fragmente l’optimiseur + les gradients.
  • Stage 3 fragmente l’optimiseur + les gradients + les pondérations du modèle.

Chaque étape a ses propres avantages relatifs. ZeRO Stage 1 sera par exemple plus rapide, mais nécessitera plus de mémoire que le Stage 2 ou 3.  Il existe deux approches d’inférence distinctes dans la boîte à outils DeepSpeed :

  • DeepSpeed ​​Inference : moteur d’inférence avec des optimisations telles que l’injection dans le noyau ; il a une latence plus faible mais nécessite plus de mémoire.
  • ZeRO Inference : permet de décharger les paramètres dans la mémoire CPU ou NVMe pendant l’inférence ; il a une latence plus élevée mais consomme moins de mémoire GPU.

Notre contribution

L’équipe Sophos AI a mis au point une boîte à outils basée sur DeepSpeed ​​qui permet de simplifier son utilisation. Bien que les différents composants de la boîte à outils elle-même ne soient pas nouvelles, ce qui est nouveau est l’efficacité de la synthèse de plusieurs composants clés pour en faciliter l’utilisation.

Au moment de sa création, ce référentiel d’outils était le premier à combiner l’entraînement et les deux types d’inférence DeepSpeed ​​(DeepSpeed ​​Inference et ZeRO Inference) dans un seul script configurable. Il s’agissait également du premier référentiel à créer un conteneur personnalisé pour exécuter la dernière version de DeepSpeed ​​sur SageMaker d’Amazon Web Service. C’était aussi le premier référentiel à effectuer une inférence DeepSpeed ​​basée sur un script distribué qui n’était pas exécuté en tant que système endpoint sur SageMaker. Les méthodes d’entraînement actuellement prises en charge comprennent un pré-entraînement continu, une paramétrage précis et supervisé et enfin une optimisation des préférences.

Le référentiel et sa documentation peuvent être trouvés en visitant la page dédiée sur le GitHub de Sophos.

Billet inspiré de DeepSpeed: a tuning tool for large language models, sur le Blog Sophos.

Leave a Reply

Your email address will not be published. Required fields are marked *

Back to top button