1. A quoi sert le grand modèle
Jusqu'à présent, le grand modèle est principalement basé sur la PNL, car la PNL élimine le problème de la dépendance de la séquence RNN et adopte la structure Transformer de Attention is All you need, afin que la PNL puisse faire évoluer des modèles plus volumineux. Le domaine de l'image n'est pas en reste, et les grands modèles de CNN ont également commencé à émerger les uns après les autres.
-
Le modèle est fragmenté et le grand modèle fournit une solution de pré-formation. À l'heure actuelle, l'IA est confrontée à de nombreux secteurs et scénarios commerciaux, et la demande d'intelligence artificielle présente les caractéristiques de la fragmentation et de la diversification. Du développement, de l'ajustement des paramètres, de l'optimisation, de l'itération à l'application, les coûts de développement du modèle d'IA sont extrêmement élevés et il est difficile de répondre aux besoins de personnalisation du marché, de sorte que certaines personnes sur Internet diront que l'étape actuelle du développement du modèle d'IA est dans un manuel façon atelier. Fondamentalement, si une entreprise souhaite utiliser l'IA pour renforcer ses propres activités, elle doit plus ou moins recruter du personnel de R&D qui comprend l'IA. Afin de résoudre l'approche manuelle de type atelier du modèle d'usine, le grand modèle fournit une solution réalisable, qui est la méthode de "pré-formation du grand modèle + réglage fin des tâches en aval". La pré-formation à grande échelle peut capturer efficacement les connaissances à partir d'une grande quantité de données étiquetées et non étiquetées, et étendre considérablement la capacité de généralisation du modèle en stockant les connaissances dans un grand nombre de paramètres et en les affinant pour des tâches spécifiques. Par exemple, dans le domaine de la PNL, le grand modèle de pré-formation partage les paramètres de la tâche de pré-formation et de certaines tâches en aval, ce qui résout le problème général dans une certaine mesure et peut être appliqué à des tâches de langage naturel telles que la traduction, réponse aux questions et génération de texte. PS : Mode atelier manuel ==> mode usine, un gros modèle remplace des dizaines de petits modèles spécialisés.
-
Le grand modèle a la fonction d'apprentissage auto-supervisé, ce qui réduit le coût de la formation et de la recherche et développement. La méthode d'apprentissage auto-supervisé des grands modèles peut réduire l'étiquetage des données et résoudre dans une certaine mesure les problèmes de coût élevé, de cycle long et de faible précision de l'étiquetage manuel.
-
Les grands modèles devraient encore dépasser les limites de précision des structures de modèles existantes. À en juger par l'histoire des 10 premières années de développement de l'apprentissage profond, l'amélioration de la précision du modèle dépend principalement des changements structurels du réseau. Par exemple, d'AlexNet à ResNet50, puis à EfficientNet recherché par NAS, la précision d'ImageNet Top-1 est passée de 58 à 84. Cependant, à mesure que la technologie de conception de la structure du réseau neuronal mûrit progressivement et tend à converger, il est très difficile de briser la limitation de précision en optimisant la structure du réseau neuronal. Ces dernières années, avec l'augmentation continue de l'échelle des données et de l'échelle du modèle, la précision du modèle s'est encore améliorée. Des expériences de recherche ont montré que l'augmentation de l'échelle du modèle et des données peut en effet briser une limitation de la précision existante.
2. Qu'est-ce qu'un grand modèle
Pratique d'optimisation de la formation distribuée de TensorFlow dans le système de recommandation Avec le développement des activités de Meituan, la taille et la complexité du modèle de système de recommandation augmentent également rapidement, comme suit :
-
Données d'apprentissage : les échantillons d'apprentissage sont passés de 10 milliards à 100 milliards, soit une multiplication par près de 10.
-
Paramètres clairsemés : le nombre a également augmenté de près de 10 fois, passant de centaines à des milliers ; le nombre total de paramètres (c'est-à-dire tf.Variable) est passé de centaines de millions à des dizaines de milliards, soit une augmentation de 10 à 20 fois.
-
Complexité du modèle : à mesure qu'il devient de plus en plus complexe, le temps de calcul en une seule étape du modèle augmente de plus de 10 fois. Pour les services à trafic important, une expérience de formation est passée de quelques heures à quelques jours, et il est indispensable de conserver une expérience en une journée dans ce scénario.
Le statu quo et les futurs grands modèles d'apprentissage distribué en profondeur sont principalement divisés en deux catégories :
-
Les tâches de recherche, de recommandation et de publicité, qui se caractérisent par des échantillons massifs et des paramètres épars à grande échelle (sparse embeddings), conviennent à l'utilisation du mode serveur de paramètres CPU/GPU (PS) ; le mode serveur de paramètres a été proposé par la première génération d'Alex Smola en 2010 LDA (modèle d'allocation caché de Dirichlet dans le domaine du text mining), à DistBelief proposé par la deuxième génération de Jeff Dean, puis à l'architecture Parameter Server moderne relativement mature proposée par la troisième génération de Li Mu, puis au plus tard florissant : Horvod d'Uber, XDL d'Ali, PAI, DLRM de Meta, BytePs de Byte, les diverses adaptations de Meituan basées sur Tensorlow, etc. Les fonctions du serveur de paramètres deviennent de plus en plus parfaites, et les performances sont de plus en plus fortes, il existe des modes pur CPU, pur GPU et hétérogènes.
-
Les tâches CV et NLP sont caractérisées par des données d'échantillon régulières et des paramètres denses à grande échelle, qui conviennent au mode de communication collective GPU pur (Collectif). Le cadre de formation distribué basé sur le mode de communication collective GPU pur, ainsi que les itérations techniques de Nvidia, en particulier l'avancement de la technologie de communication GPU (GPU Direct RDMA), est devenu de plus en plus puissant.
Modèle distribué à grande échelle dans la recommandation publicitaire Pourquoi entend-on toujours parler de fonctionnalités à grande échelle pour des fonctionnalités d'une ou deux cents catégories ? Par exemple, la caractéristique dimensionnelle de l'ID utilisateur, s'il y a 100 millions d'utilisateurs dans le système, alors chaque identifiant peut en fait être traité comme une caractéristique indépendante. De cette façon, l'échelle des fonctionnalités augmentera. Ici, nous devons re-comprendre le concept d'intégration. Pour le modèle, l'identifiant vérifie la table d'intégration pour obtenir un vecteur, qui est entré pour le calcul, qui consiste à extraire les caractéristiques des données. Si l'analogie concerne la classification des images, extrayez les caractéristiques RVB à classer (une valeur devient 3 255)
Le nombre de paramètres a atteint cent billions ! Perse, le plus grand système de formation de recommandation dans l'histoire open source de l'équipe chinoise. l'ID utilisateur dans le système, croix Le nombre d'entités est très important et un modèle à plus grande échelle est nécessaire pour capturer les entités et la cartographie. Mais une couche d'encastrement plus grande nécessite aussi une plus grande mémoire à charger, je dois dire que le grand modèle est trop cher !
Avec l'intégration, le reste du travail est simple, concevez les couches suivantes pour s'adapter aux différentes tâches. Il n'occupe généralement que 0,1 % de l'ensemble du modèle, ne nécessite pas une grande mémoire et nécessite principalement un travail de calcul intensif.
en réalisation
-
Le service d'inférence accède également à ps (inférence distribuée) au moment de l'exécution et interroge le vecteur d'intégration correspondant en fonction de la fonction ID. Bien sûr, certains frameworks intègrent directement les fonctions du composant ps dans chaque worker.
-
Pour les scénarios où le grand modèle contient une couche d'intégration, la couche d'entrée et la couche d'intégration ne sont pas entièrement connectées, mais une opération embedding_lookup
-
Pour les modèles denses conventionnels, l'entrée est un vecteur unidimensionnel. Pour plusieurs entités d'identification, afin d'assurer l'alignement avec la couche d'entrée du modèle, l'entrée devient en fait une carte<chaîne, tenseur>, la clé est le nom de l'entité d'identification et la valeur est le tenseur correspondant à la valeur de la fonctionnalité d'identification.
Trois, où est la difficulté
-
mur de la mémoire. Pendant le processus de calcul, la convolution ou le calcul de connexion complète de chaque couche du modèle de réseau de neurones enregistrera le poids W_m pendant une longue période et l'utilisera comme mise à jour du paramètre de poids du réseau (mémoire statique). De plus, pour les optimiseurs tels qu'ADAM, des informations telles que la quantité de mouvement de l'optimiseur seront stockées pour le calcul de l'optimiseur (mémoire dynamique). Une puce AI avec une mémoire vidéo de 16 Go peut remplir un modèle avec un maximum de 2 milliards de paramètres, mais il n'y a pas d'espace supplémentaire pour le moment, ce qui le laisse pour une allocation de mémoire dynamique. La mémoire statique et la mémoire dynamique peuvent causer des problèmes avec les murs de mémoire.
-
mur des communications. Une fois que le grand modèle est segmenté dans le cluster d'IA via le parallélisme des modèles et le parallélisme des pipelines, la communication devient le principal goulot d'étranglement des performances. Avec l'expansion de l'échelle de la machine, la méthode d'agrégation de communication All Reduce basée sur la synchronisation provoquera un effet de seau en raison de la synchronisation fréquente entre un grand nombre de puces AI et de serveurs, c'est-à-dire la voie de communication la plus lente, qui déterminera la communication du ensemble AI cluster la hauteur de. Si la méthode d'agrégation de communication actuellement populaire Ring-AllReduce est utilisée, lorsque l'anneau de communication devient plus grand, l'extension de la communication sera continuellement étendue. De plus, les multiples méthodes de prise de contact du protocole réseau, de tels frais généraux empêcheront la formation d'utiliser efficacement la bande passante.
-
mur de performances. Le mur de performance fait principalement référence au problème d'utilisation des ressources informatiques. Avec l'introduction des grands modèles, la demande en puissance de calcul se fait plus pressante : en théorie, chaque carte est 1 minute plus rapide sur un cluster 4K, et la vitesse globale est 68 heures plus rapide. Un grand modèle augmentera la demande de puissance de calcul, mais comme le grand modèle introduit diverses technologies parallèles distribuées, il réduira l'utilisation des ressources informatiques.
-
Niveau opérateur (niveau opérateur) : il y a trop de petits opérateurs, qui peuvent être optimisés grâce à la fusion d'opérateurs ; la sous-implémentation n'est pas assez efficace, similaire aux opérateurs convolutionnels CONV pour les tailles de noyau 2x2 et 3x3, en utilisant l'algorithme Winograd à la place ; mémoire insuffisante localité, En analysant la surcharge des opérateurs et de la mémoire, les opérateurs de même forme peuvent être réutilisés lors du calcul.
-
Niveau graphique : comment rechercher et segmenter des sous-graphes avec une efficacité de calcul supérieure, et les distribuer à différentes machines pour le calcul ; comment augmenter le chevauchement de superposition entre la communication de données et la mémoire, et améliorer le taux de calcul global d'une seule carte.
-
Niveau de la tâche : Au niveau de la tâche, le goulot d'étranglement des performances est passé de l'informatique à la communication. Comment réduire le trafic de communication, réduire la taille du domaine de communication et masquer autant que possible les retards de communication dans l'informatique sont les principales préoccupations des entreprises à grande échelle. entraînement.
-
-
Réglage du mur. Par conséquent, sur un cluster avec des milliers de nœuds, il est nécessaire d'envisager d'améliorer l'efficacité du débogage distribué et du réglage des ingénieurs en algorithmes, et également d'envisager de réduire la difficulté de segmentation parallèle de grands modèles par les ingénieurs. Outre les considérations humaines, la gestion des clusters matériels doit garantir l'exactitude, les performances et la disponibilité des calculs. Si une machine est cassée, comment restaurer rapidement les paramètres en formation.
4. Scénarios CV et PNL
Discussion sur la formation distribuée dans l'industrie (1) En plus du grand volume de données mentionné ci-dessus, les points faibles de la formation distribuée dans différents scénarios sont plus importants pour les scénarios CV et NLP
-
Les modèles de scène CV et NLP sont complexes, et les exigences de performance d'une même machine sont élevées, par exemple, le temps de calcul de la convolution est dix à des dizaines de fois différent sur le CPU et le GPU. ==> L'industrie utilise principalement des GPU hautes performances pour les calculs et adopte la topologie de communication All-reduce pour la mise à jour synchrone des paramètres.
-
Le modèle est grand (partie DenseNet), comme le champ NLP, un modèle comme GPT-3 a jusqu'à 175 milliards de paramètres, et la mémoire vidéo occupe jusqu'à 2,8 To, ce qui ne peut pas être logé dans la mémoire d'une seule machine . Bien que Bert-Large n'ait qu'une échelle de paramètres de 340 millions, en raison de diverses utilisations de la mémoire, sur le 16G V100, seul le lot Size=8 peut être utilisé pour la formation. ==> Face à un grand modèle DenseNet tel que GPT-3, la mémoire monocarte Allreduce ne peut pas l'accueillir. Nous devons utiliser le parallélisme des modèles pour diviser le graphe de calcul en différents appareils afin de construire un graphe acyclique dirigé. (DAG) pour la formation distribuée, parmi lesquels Gpipe, Megatron, Oneflow et Whale proposent tous des solutions connexes pour le parallélisme des modèles. Par rapport au parallélisme des données, chaque travailleur n'a qu'une partie des données et chaque nœud utilise toutes les données sous le parallélisme des modèles.
-
Parallélisme intra-couche (Tensor Parallelism). Il s'agit principalement de diviser le calcul matriciel dans une couche de Layer sur différentes machines de calcul.Par exemple, dans la simple multiplication matricielle Y_1=W_1 X_1, nous divisons le paramètre de modèle W_1 ou les données d'entrée X_1 selon une certaine dimension.Distribué à différents appareils de calcul, tels que 1D Megatron.
-
Parallélisme inter-couches (Pipeline Parallelism). Cependant, le parallélisme inter-couches divisera les couches du modèle en différentes machines, et un transfert doit être effectué en série sur différentes machines, tandis que la méthode parallèle populaire divise la taille du lot en lots mirco plus petits. l'ensemble du processus informatique et en maximisant l'utilisation des ressources. Par exemple, dans un simple MLP à trois couches (Y_i = W_i X_i, i=1,2,3) il y aura trois multiplications matricielles W_i X_i, et le parallélisme du pipeline distribuera W_i X_i à trois machines pour le fonctionnement .
-
L'émergence de l'IA pour la science a fait de l'intégration du calcul haute performance et de l'IA une demande rigide :
-
Parallélisme des données. S'il y a deux nœuds dans l'ensemble du modèle, un modèle est le nœud 0 et l'autre modèle est le nœud 1, l'ensemble du modèle a été parallélisé et la moitié des données sera utilisée pour la formation et l'apprentissage, mais il convient de noter que ce n'est pas le résultat final après la formation, car Seule la moitié des données a été saisie. Par conséquent, AII-Reduce est nécessaire au milieu
-
Parallélisme des modèles. Coupez le modèle entier en deux, la moitié du nœud de modèle 0, la moitié du nœud de modèle 1, et toutes les données sont utilisées pour la formation. Le résultat après la formation n'est pas le résultat final, car seule la moitié du modèle est formée et AII-Gather est également utilisé pour la communication. Quelle méthode parallèle utiliser ? En fait, cela est lié à la structure de l'ordinateur. Si la communication entre chaque ordinateur est très rapide, vous pouvez utiliser le parallélisme des données ; si votre communication est lente, vous devez envisager le parallélisme des modèles. Dès lors, comment ces modèles correspondent-ils aux données et à la situation réelle de la machine ? Cela concerne le matériel et les logiciels
5. Enregistrez le modèle
La pratique consistant à étendre et à prendre en charge de grands modèles basés sur tensorflow
-
Lorsque le modèle est relativement petit, par exemple en dessous de 100G, le modèle peut être stocké sur une seule machine. La solution à l'heure actuelle est la formation distribuée tensorflow + modèle enregistré, la formation distribuée peut utiliser plusieurs ps (tensorflow est fourni avec) et la gestion des ressources peut utiliser du fil. L'utilisation de distribué est due au grand nombre d'échantillons, et plusieurs ps peuvent également accélérer l'apprentissage de manière asynchrone. Le modèle_sauvegardé est généralement sauvegardé par le travailleur principal, mais après sa sauvegarde, les traces de ps seront effacées, et le modèle sauvegardé est exactement le même que celui formé sur une seule machine.
-
Lorsque le modèle est relativement grand, le nombre d'échantillons requis à ce moment est également plus grand, et le modèle qui est vidé après la formation sera trop grand pour tenir sur une seule machine, en particulier la table d'intégration. Que devons-nous faire à ce moment ? Une façon naturelle de penser est de synchroniser une copie du ps pendant la formation avec le ps qui sert, et le ps fera le service en ligne. Notez que les ps servants mentionnés plus loin sont tous développés par nous-mêmes ou modifiés selon un logiciel open source (comme ps-lite). S'il s'agit d'un modèle au niveau du ciel, vous pouvez utiliser le travailleur natif de tensorflow et former ps, mais toujours utiliser la méthode du modèle enregistré pour stocker le modèle dans hdfs, puis lire un autre serveur ps à partir de hdfs. S'il s'agit d'un entraînement en temps réel, le PS de service doit être connecté au PS d'entraînement en temps réel et le processus de synchronisation du poids est résolu dans la mémoire.À ce stade, le PS natif de tensorflow ne peut pas être utilisé, car le PS natif PS n'implémente pas l'interface de synchronisation. Le ps a changé et les travailleurs doivent changer en conséquence. La plupart des travailleurs sont développés sur la base de l'interface sous-jacente C++ de tensorflow, et la couche sous-jacente utilise l'interface de session de tf.
6. Solutions
En réponse aux problèmes ci-dessus, les cadres de formation de divers grands fabricants ont effectué de nombreuses optimisations connexes.À l'heure actuelle, les deux points essentiels sont la conception de la topologie de communication distribuée et l'optimisation des performances de Embedding Lookup.
Tant qu'une seule carte peut être placée, le parallélisme des données, ps ou allreduce fonctionnera, et le coût de communication d'allreduce est inférieur. Si l'échelle devient plus grande
-
Modèle clairsemé, traitement spécial pour les paramètres clairsemés
-
Utilisez ps, ainsi qu'une optimisation de tenseur clairsemée, et transférez le fardeau de l'intégration du stockage et de la mise à jour vers ps
-
Paramètre dense tout réduire, trouver un moyen de résoudre les coûts de stockage et de communication du tenseur creux. Par exemple, dans l'architecture HybridBackend, les paramètres sont placés sur le worker : la réplication des paramètres denses est stockée, chaque worker en a une copie, et allreduce est effectué lorsque le gradient est mis à jour ; la partition des paramètres sparse est stockée, chaque worker n'a que certains fragments, et alltoall est exécuté lorsque le dégradé est mis à jour. allreduce et alltoall utilisent nccl pour la communication synchrone, ce qui est plus efficace. Lorsque hb effectue alltoall, il communique des gradients clairsemés au lieu de paramètres complets. Le volume de communication est cohérent avec ps, mais l'efficacité de la communication sera plus élevée.
-
-
Pour un modèle dense, une seule carte ne peut de toute façon pas être déposée, nous ne pouvons donc adopter que le parallélisme des modèles et certains schémas d'optimisation auxiliaires
Connaissant la réponse de Gao Zan - pourquoi est-il difficile de former de grands modèles ?
-
Découpage d'opérateur Une multiplication matricielle unique peut être divisée en deux appareils pour calculer Y = WX = [W1,W2]X = [W1X,W2X]. Ce que nous devons faire dans le projet est : le diviser en deux appareils, le copier sur deux appareils, puis effectuer une multiplication matricielle sur les deux appareils respectivement. Parfois, la segmentation apportera une communication supplémentaire. Par exemple, la multiplication matricielle est coupée à la dimension de réduction. Afin de garder la sémantique correcte, elle doit être suivie d'une communication AllReduce. La complication ici est que vous ne pouvez pas diviser tous les opérateurs sans réfléchir, car le fractionnement peut introduire des communications supplémentaires et réduire le débit global. Vous devez donc faire une analyse pour décider quels opérateurs diviser.La plupart des frameworks ne prennent pas en charge cette stratégie entièrement automatisée.Ils sont soit semi-automatiques, soit purement manuels, soit codés en dur pour un certain modèle. Nous ne pouvons donc que fabriquer des roues pour résoudre ce problème
-
Le parallélisme de pipeline ne coupe pas les opérateurs, mais divise différentes couches en différents appareils pour former une solution de pipeline. GPipe est une telle solution. Il propose de diviser un lot en plusieurs micro-lots, puis de pousser le temps de bulle peut être éliminé en entrant dans le Système de canalisation. Semblable à la division de l'opérateur, la charge de travail de la solution entièrement automatisée n'est pas petite. Par exemple, comment couper le pipeline afin que le volume de communication puisse être réduit et que le calcul puisse être égalisé. Cela nécessite une certaine quantité d'algorithmes et d'efforts d'ingénierie. .
Bénéficiez d'une formation sur les grands modèles
Nos modèles peuvent être volumineux ou la quantité de données peut être importante. L'utilisation d'une seule carte GPU peut même ne pas convenir au modèle, ou la taille du lot ne peut être définie que très petite, mais nous savons que dans certains cas, une grande taille de lot fournit souvent de meilleurs résultats.
-
Supposons que nous n'ayons qu'un seul GPU et que notre modèle ne puisse entrer des données qu'avec une taille de lot de 8 à la fois, alors comment implémenter une mise à jour avec une taille de lot de 32 ? Ensuite, il faut du temps pour changer d'espace, c'est-à-dire que nous entraînons 32/8 = 4 étapes pour mettre à jour le modèle, ce que l'on appelle l'accumulation de gradient.
-
Gradient-Checkpointing, et si votre GPU ne peut même pas fonctionner avec une taille de lot de 1 ? Lorsque nous formons le modèle d'apprentissage en profondeur, nous devons d'abord effectuer une propagation vers l'avant, puis stocker la valeur d'activation obtenue au milieu en mémoire, puis calculer le gradient en fonction de la valeur de perte et d'activation lors de la rétropropagation. C'est-à-dire que la consommation de mémoire est en fait linéairement liée au nombre de couches du modèle. Alors comment réduire cette consommation mémoire ? L'idée la plus simple est que je n'enregistre pas ces informations intermédiaires. Lors du calcul du gradient, je recalcule sa valeur d'activation à une certaine couche. Bien que cette méthode puisse rendre la consommation de mémoire constante, le temps d'exécution sera O(n^2) , ce qui est inacceptable. Ensuite, il y a une méthode de compromis. Je n'enregistre pas toutes les données intermédiaires, mais seulement une partie. Ensuite, nous n'avons pas besoin de calculer à partir de zéro lors du calcul du gradient. Nous avons seulement besoin de calculer à partir du point de contrôle le plus proche.
-
Nos modèles d'entraînement utilisent généralement des paramètres en simple précision (FP32), mais en fait nous utilisons également des paramètres en demi-précision (FP16). La demi-précision peut réduire la consommation de mémoire, entraînant ainsi des modèles plus grands ou utilisant des tailles de lots plus importantes ; en même temps, le temps de fonctionnement est limité par la mémoire et la bande passante arithmétique, et la demi-précision peut fournir une plus grande bande passante arithmétique sur certains GPU (cœurs Tensor) , améliorant ainsi l'efficacité de la formation et réduisant le temps d'inférence.