24 novembre 2021

La beauté des réseaux neuronaux efficaces

Les contributeurs
Mats Uytterhoeven
Ingénieur en machine learning
Lucas Desard
Ingénieur en machine learning
S'abonner à la newsletter
Partager cet article

Les modèles d'apprentissage automatique SotA deviennent si volumineux qu'il est impossible pour le matériel de suivre. Quels sont les symptômes de ce problème croissant et existe-t-il un antidote ?
Dans cet article de blog, nous commencerons par discuter de la sémantique des modèles efficaces et des raisons pour lesquelles vous voudriez les utiliser. Nous nous pencherons ensuite sur les techniques que vous pouvez utiliser pour obtenir des modèles d'apprentissage automatique plus petits, plus rapides et plus durables.

Source : unsplash.com/alina.grubnyak

Efficacité et modèles d'apprentissage automatique

Un modèle d'apprentissage automatique est plus efficace si nous pouvons atteindre un ou plusieurs des objectifs suivants :

  • réduire l'empreinte mémoire
  • diminuer la quantité de calcul nécessaire

sans entraîner de baisse significative des performances. La réduction de l'empreinte mémoire ou du calcul peut se faire au moment de l'apprentissage, de l'inférence ou des deux. Il est important de noter que ces améliorations ne vont pas toujours de pair. Il est par exemple possible qu'un modèle ait besoin de plus de calculs pour s'entraîner, mais qu'il occupe moins de mémoire et soit plus rapide au moment de l'inférence.

Pourquoi en avons-nous besoin ?

Une première raison découle de l'observation de la croissance de la taille des modèles d'apprentissage automatique de SotA. En comparant GPT à DeepSpeed, on constate que le nombre de paramètres d'un modèle a été multiplié par 10 000 en l'espace de deux ans seulement.

Taille des modèles NLP de la SotA au fil du temps(images tirées du tutoriel de l'EMNLP sur le NLP à haute performance)

Ainsi, la taille des modèles augmente si rapidement qu'il est impossible pour le matériel de suivre. Cette situation présente un certain nombre d'inconvénients. Tout d'abord, cela impose une barrière financière aux modèles, ce qui les rend moins accessibles aux personnes disposant d'un matériel ordinaire. Un récent sondage sur Twitter suggère que même la plupart des chercheurs titulaires d'un doctorat ne disposent que d'un matériel de base.

En outre, lorsque vous entraînez votre modèle, vous pouvez vous attendre à disposer de GPU très puissants. Cependant, en production, vous serez souvent contraint par les limites du matériel cible. Ceci est particulièrement important lorsque l'objectif est de déployer le modèle d'apprentissage automatique sur site ou en périphérie.

Il existe de nombreuses raisons d'investir du temps dans l'optimisation de votre modèle pour plus d'efficacité. Par exemple, lorsque votre modèle est trop volumineux pour le matériel cible et qu'il ne tient pas dans la mémoire, vous pouvez utiliser des techniques de compression de modèle pour réduire la taille de votre fichier de poids. Cette technique est particulièrement utile pour les installations sur site et en périphérie, car si vous parvenez à compresser votre modèle, vous pourrez continuer à utiliser l'état de l'art sans avoir à mettre à niveau votre matériel. Un autre cas d'utilisation consiste à accélérer le temps d'inférence de votre modèle. Les techniques de modélisation les plus efficaces réduisent le nombre de calculs nécessaires pour effectuer une prédiction ou les rendent moins coûteux. Enfin, elles peuvent réduire de manière significative l 'énergie consommée par un modèle, ce qui peut diminuer les coûts d'exécution à long terme des modèles dans le nuage ou améliorer sensiblement la durée de vie de la batterie pour les appareils périphériques.

Élagage

L'élagage est une famille de méthodes qui se concentre sur la suppression des éléments redondants tout en n'ayant qu'un impact minimal sur les performances.

L'élagage est un concept assez ancien, déjà utilisé dans les années 80 pour tenter de réduire la taille des arbres de décision. Il n'est donc pas surprenant qu'il existe de nombreux types d'élagage, que l'on peut différencier de la manière suivante :

  • Les critères d'élagage, c'est-à-dire comment décider ce qu'il faut élaguer ?

La sélection peut être basée sur n'importe quelle fonction simple ou complexe des poids, des activations, des gradients ou d'une combinaison de ceux-ci. De nombreuses recherches ont été effectuées sur ce sujet au cours des dernières années et un bon document de synthèse sur le sujet, récemment publié par Uber, peut être consulté ici. Cependant, ne nous perdons pas dans les détails, en général le critère d'élagage le plus populaire consiste simplement à supprimer les plus petits poids en termes de valeur absolue.

  • Ce qui est élagué, par exemple les connexions, les canaux ou des couches entières.

L'élagage des connexions, des canaux et des couches se réfère à la plus petite unité qui peut être élaguée en une seule étape, sur la base des critères d'élagage. Le choix de la méthode d'élagage est un compromis entre la réduction de la taille et l'amélioration de la vitesse. Avec l'élagage des connexions, vous pouvez supprimer davantage de connexions sans baisse significative de la précision, car vous ne supprimez que les connexions qui contribuent le moins à l'élaboration d'une prédiction. Avec une approche plus structurée, telle que l'élagage des canaux ou des couches, vous devrez respectivement choisir les canaux ou les couches les moins importants à élaguer, qui contiendront inévitablement des connexions plus importantes, ce qui vous permettra d'élaguer moins de connexions avant de subir une baisse significative de la précision.

D'autre part, l'élagage des connexions n'introduira qu'un grand nombre de 0 dans les multiplications de la matrice, mais comme les multiplications doivent toujours être effectuées, elles n'auront qu'un impact minime sur la vitesse d'inférence. Avec l'élagage des canaux, des multiplications matricielles entières peuvent être sautées, et avec l'élagage des couches, même des étapes entières de la passe avant. Ces deux dernières méthodes auront donc un impact plus important sur le temps d'inférence.

  • Le moment où l'élagage a lieu, par exemple avant ou après la formation.

L'approche standard consiste à former d'abord un grand réseau neuronal, puis à élaguer les composants inutiles sur la base des résultats du processus de formation. Le Saint-Graal de l'élagage consiste toutefois à trouver ces structures de réseau plus petites avant la formation, car cela peut réduire considérablement les coûts de formation. Cette hypothèse, mieux connue sous le nom de "lottery ticket hypothesis", est un sujet de recherche brûlant depuis son introduction en 2018. Cependant, une technique généralisable et facilement applicable doit encore être développée, et pour l'instant, l'élagage après l'entraînement reste donc la voie à suivre.

  • Le nombre de fois où nous taillons.

Ici, les choix sont uniques ou itératifs. En général, l'approche itérative avec une étape de réglage fin entre les deux donne les meilleurs résultats, comme le montre la figure ci-dessous. Toutefois, cette approche n'est pas gratuite, car c'est aussi celle qui prend le plus de temps et qui nécessite le plus de calculs.

Résultats de l'élagage tirés de cet article, avec ou sans réentraînement, et en une seule fois ou par itération.

Conseils pratiques pour la taille

Et si vous voulez essayer d'élaguer vous-même ? Cela dépend si vous utilisez TensorFlow ou PyTorch.
Pour le moment, TensorFlow ne prend en charge qu'un seul type d'élagage, l'élagage des connexions. Il offre la possibilité de n'élaguer que certains types de couches, par exemple uniquement les couches denses. D'autres méthodes d'élagage sont prévues sur leur feuille de route, mais pour l'instant il n'y a pas de méthodes d'élagage disponibles qui vous aideront à accélérer votre modèle.
PyTorch cependant, supporte à la fois les méthodes d'élagage structurées et non structurées et fournit une classe d'élagage facilement extensible qui vous donne le pouvoir d'implémenter vos propres méthodes d'élagage si jamais vous le souhaitez. En plus des méthodes d'élagage standard fournies par PyTorch, vous pouvez trouver de nombreux outils d'élagage open-source qui offrent encore plus d'options. En ce qui concerne l'élagage, PyTorch remporte donc la palme.

Quantification

Une deuxième technique bien connue et très puissante est la quantification. L'idée de base est étonnamment simple : il s'agit d'une réduction de la précision des nombres utilisés pour représenter les poids d'un modèle. Supposons par exemple que nous ayons un modèle dans lequel les poids sont enregistrés sous forme de flottants de 32 bits. En les convertissant en entiers de 8 bits, nous obtenons déjà une réduction de taille de 4 fois et une amélioration de la vitesse d'au moins 50 %. C'est assez surprenant si l'on pense au fait que l'on peut représenter 2²⁴ plus de nombres avec 32 bits qu'avec 8 bits. Mais apparemment, les modèles ML ne s'en soucient pas tant que ça, puisque la plupart du temps, nous pouvons atteindre des performances similaires.

On peut distinguer la quantification uniforme et la quantificationnon uniforme (
)
. Uniforme signifie que les niveaux de quantification sont espacés de manière égale, non-uniforme s'ils sont espacés de manière inégale.
La quantification uniforme est la plus facile des deux, car vous n'avez qu'un seul degré de liberté, à savoir le nombre de bits que je vais utiliser pour représenter les poids après la quantification.
Cependant, avec la quantification non uniforme, vous disposez d'un degré de liberté supplémentaire : comment allez-vous diviser les niveaux de quantification ?
Une approche intéressante, qui a été couronnée de succès dans la recherche, consiste à effectuer une recherche des plus proches voisins et à diviser les niveaux de quantification en conséquence. Cette méthode présente l'avantage que de nombreuses connexions partagent le même poids, ce qui permet une forte compression du réseau d'origine. Toutefois, en raison de certains problèmes d'optimisation, des recherches supplémentaires sont nécessaires pour que cette approche soit applicable dans la nature.

Une autre astuce intelligente que nous pouvons utiliser est la formation tenant compte de la quantification, qui simule la quantification du temps d'inférence pendant la formation dans les passes avant. Cela induit une certaine erreur de quantification qui est accumulée dans la perte totale du modèle et ils essaient de la réduire en ajustant les paramètres en conséquence. Cela rend notre modèle plus robuste à la quantification par la suite.
TensorFlow et PyTorch prennent tous deux en charge la quantification et l'apprentissage tenant compte de la quantification.

Distillation des connaissances

L'une des principales observations à l'origine de la distillation des connaissances est qu'il y a une différence dans les exigences pendant la formation et l'inférence. Dans de nombreux cas, l'objectif de la formation est d'apprendre et d'extraire des structures à partir de grandes quantités de données. C'est là que les grands modèles, le "professeur", dotés d'une grande capacité peuvent briller. Cependant, au moment de l'inférence, ces grands modèles sont difficiles à utiliser (en raison des exigences généralement plus strictes en matière de latence et de mémoire) et des modèles plus petits, l'"élève", conviendraient beaucoup mieux.

Dans la distillation des connaissances, l'objectif est de combiner le meilleur des deux mondes. Dans un premier temps, un grand modèle est entraîné sur une grande quantité de données. Dans un second temps, les connaissances capturées par les grands modèles sont "distillées" dans un modèle beaucoup plus petit. Mais qu'entendons-nous par "connaissance" ? Et comment pouvons-nous "distiller" ces connaissances dans un modèle plus petit ?

Lorsque l'on parle de connaissances dans le contexte de la distillation des connaissances, on parle de la relation apprise entre les vecteurs d'entrée et de sortie. Cette relation peut nous en apprendre beaucoup sur la manière dont un modèle se généralise à des données inédites (l'une des raisons pour lesquelles les grands modèles sont généralement plus performants que les petits est qu'ils sont capables de mieux se généraliser).
Prenons l'exemple de la classification. Bien que la probabilité de sortie de la classe cible soit de loin la plus élevée, les probabilités de sortie des autres classes contiennent encore beaucoup d'informations. Ce sont précisément ces différences relatives entre les petites probabilités des classes incorrectes qui peuvent fournir beaucoup d'informations sur la manière dont le modèle se généralise.

Enfin, les connaissances acquises par l'enseignant doivent être transférées d'une manière ou d'une autre à l'étudiant. Pour ce faire, on ajoute un terme de perte supplémentaire à la fonction de perte habituelle, appelé perte de distillation. En reprenant l'exemple de la classification, nous ne nous intéressons pas seulement à l'étiquette dure (c'est-à-dire le vecteur codé à un coup représentant la classe), mais aussi à l'étiquette souple générée par l'enseignant (afin d'amplifier les petites différences entre les probabilités de classes incorrectes, un paramètre de température est ajouté à la couche softmax finale : plus la température est élevée, plus la distribution de sortie est douce).

La distillation des connaissances utilise un terme supplémentaire de perte de distillation dans la fonction de perte (aucun chien n'a été blessé pendant la distillation).

Trucs d'optimisation intelligents

Les approches précédentes ont toutes en commun de modifier le réseau d'une manière ou d'une autre (suppression de certaines parties, réduction de la précision des poids ou même formation d'un réseau plus petit). Les deux techniques présentées ci-dessous ne modifient pas vraiment le réseau lui-même, mais elles rendent la procédure d'optimisation plus efficace en termes de quantité de mémoire requise au moment de l'apprentissage.

Point de contrôle du gradient

Dans le cas du gradient checkpointing, nous réduisons la quantité de mémoire nécessaire au prix d'une augmentation de la puissance de calcul nécessaire. Ce compromis est d'autant plus utile qu'il est généralement plus facile d'attendre un peu plus longtemps que votre modèle soit formé que d'obtenir un peu plus de VRAM.
La méthode de vérification du gradient consiste à ne pas conserver toutes les activations en mémoire en permanence, mais à ne conserver que des points de contrôle entre deux activations. Lorsque certaines activations sont à nouveau nécessaires (par exemple, lors du calcul des gradients dans la passe arrière), il suffit de les recalculer à partir du point de contrôle le plus proche.

Sans contrôle du gradient, toutes les activations sont conservées en mémoire (visualisation tirée de cet article de blog).
Avec le gradient checkpointing, les activations ne sont stockées qu'à certains points de contrôle et sont recalculées si nécessaire (visualisation tirée de cet article de blog).

Accumulation de gradients

Si vous avez déjà essayé d'affiner un modèle de transformateur relativement grand (par exemple BERT, T5, ...) sur un GPU modeste, vous avez sans aucun doute rencontré votre part d'exceptions hors mémoire. Le problème est que dans de nombreux cas, vous souhaitez affiner ces modèles en utilisant des tailles de lots plus importantes que celles que vous pouvez contenir en mémoire. C'est là qu'intervient l'accumulation de gradient. Comme son nom l'indique, elle vous permet d'accumuler les gradients pour un certain nombre d'étapes d'apprentissage avant de procéder à la mise à jour des poids. Vous pouvez ainsi simuler des lots plus importants sans avoir besoin de la mémoire nécessaire pour les intégrer dans la mémoire.

Les gradients sont accumulés et les mises à jour des poids ne sont effectuées qu'après un certain nombre d'étapes d'apprentissage, ce qui permet de simuler des lots plus importants en utilisant moins de mémoire.

Au-delà des techniques générales

Toutes les techniques abordées dans les sections précédentes sont (du moins en théorie) généralement applicables à n'importe quelle architecture de réseau neuronal, mais des gains d'efficacité supplémentaires peuvent être obtenus en se concentrant sur des architectures spécifiques.
Un exemple très pertinent est l'architecture de transformateur qui domine l'état de l'art dans de nombreux domaines (en particulier le NLP) depuis quelques années maintenant et continue de repousser les limites en termes de taille des modèles.

C'est bien beau si vous travaillez pour Google ou OpenAI, mais pour beaucoup de gens, les exigences matérielles sont très lourdes. Vous ne serez donc pas surpris d'apprendre que de nombreuses recherches ont été menées pour tenter de rendre l'architecture du transformateur (et plus particulièrement le mécanisme d'auto-attention) plus efficace. Un aperçu détaillé de ces techniques n'entre pas dans le cadre de ce billet de blog, mais la conférence sur le traitement du langage naturel à haute performance à l'EMNLP 2020 est une excellente ressource pour se plonger dans ce sujet.

Postes connexes

Voir tout le contenu
Aucun résultat n'a été trouvé.
Il n'y a pas de résultats correspondant à ces critères. Essayez de modifier votre recherche.
Grand modèle linguistique
Modèles de fondation
Entreprise
Personnes
Données Structurées
Chat GPT
Durabilité
Voix et son
Développement frontal
Protection des données et sécurité
IA responsable/éthique
Infrastructure
Hardware et capteurs
MLOps
IA générative
Natural Language Processing
Vision par ordinateur