IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

GigaGPT : Modèles de taille GPT-3 en 565 lignes de code qui soulève des questions sur la robustesse,
Et l'adoption de normes établies dans la communauté de l'apprentissage profond

Le , par Bruno

16PARTAGES

4  0 
GigaGPT se présente comme l'implémentation par Cerebras du nanoGPT d'Andrei Karpathy, vantant sa simplicité et compacité avec seulement 565 lignes de code. Cette version promet de pousser les limites en matière de taille de modèle, dépassant les 100 milliards de paramètres sans recourir à des ajouts de code ou à des frameworks tiers. Cela est rendu possible grâce à l'utilisation de la mémoire et de la puissance de calcul du matériel Cerebras, permettant un entraînement à grande échelle sur le code vanille torch.nn, sans nécessiter de modifications.

Cependant, il est important de prendre du recul et d'examiner de plus près cette déclaration. Bien que la réduction du nombre de lignes de code puisse sembler attrayante, la véritable mesure de l'efficacité réside dans la facilité d'utilisation, la stabilité et les performances réelles du modèle. Le fait que GigaGPT n'introduise aucun ajout de code ou n'utilise aucun framework tiers peut être perçu comme un avantage, mais cela soulève également des questions sur la robustesse et l'adoption de normes établies dans la communauté de l'apprentissage profond. De plus, la dépendance exclusive à la mémoire.


En dépit des affirmations de l'équipe en charge, il est important de souligner que l'approche de GigaGPT souligne les difficultés liées à l'entraînement de grands transformateurs sur un grand nombre de GPU. L'argument selon lequel les modèles GPT vanille manquent de mémoire au-delà de quelques milliards de paramètres sur les GPU les plus récents est souligné, ce qui nécessite une distribution complexe des modèles sur plusieurs GPU avec la coordination de la charge de travail entre les travailleurs. Bien que GigaGPT prétende éviter cette complexité en exploitant les capacités matérielles de Cerebras, il est essentiel de rester critique quant à la facilité d'utilisation et à l'efficacité réelle de cette approche par rapport aux cadres de mise à l'échelle LLM bien établis tels que Megatron, DeepSpeed, NeoX, Fairscale et Mosaic Foundry.


Le déploiement d'un modèle de petite taille comme nanoGPT est présenté comme nécessitant seulement 639 lignes de code, tandis que l'implémentation d'un modèle de 20 milliards de paramètres avec le modèle Megatron de Nvidia serait complexe, nécessitant 20 507 lignes de code, soit une augmentation de complexité de 32 fois. Bien que cette comparaison puisse sembler éloquente, il est crucial d'adopter une perspective critique. La simplification du code n'est pas toujours synonyme de facilité d'utilisation, de stabilité ou de performance effective du modèle.

L'assertion selon laquelle gigaGPT offre le « meilleur des deux mondes » en combinant une base de code compacte et la capacité d'entraîner des modèles de taille GPT-3 soulève des interrogations. La dépendance exclusive au matériel Cerebras pour l'entraînement à grande échelle peut limiter la portabilité du modèle sur d'autres architectures, et la pertinence pratique de modèles dépassant les 100 milliards de paramètres demeure incertaine.

Quant à la mise en œuvre concrète de gigaGPT, les déclarations sur son alignement avec nanoGPT, l'utilisation d'enchâssements de position appris, d'une attention standard et de biais dans l'ensemble du modèle soulèvent des questions sur la diversité des architectures et des approches explorées. La validation de gigaGPT semble axée sur la correction fonctionnelle plutôt que sur des critères plus holistiques tels que la convergence, les performances en aval ou d'autres mesures significatives. La comparaison avec d'autres modèles GPT qui évoluent de millions à des centaines de milliards de paramètres sans recourir à des techniques de parallélisation spécialisées peut sembler impressionnante, mais la question de la nécessité réelle de telles échelles reste ouverte.

Bien que l'équipe en charge présente gigaGPT comme une avancée notable, il est crucial d'approcher ces affirmations avec prudence et de maintenir une perspective critique sur la complexité réelle, la performance et la pertinence des choix faits dans le développement de ce modèle.

Exploration des Limites : GigaGPT et les Enjeux de l'Échelle

Après avoir validé le modèle 70B, une tentative d'exploration des limites de l'échelle de gigaGPT a été entreprise en modifiant les dimensions du modèle pour correspondre à celles rapportées dans l'article original de GPT-3. Bien que les résultats de convergence aient été peu concluants après quelques étapes d'entraînement, le modèle a maintenu une utilisation similaire à celui de la configuration 70B. Cependant, il est important de noter que la notion de « limites de l'échelle » reste sujette à des interprétations variables et que la pertinence de dépasser les 1 000 milliards de paramètres suscite des réserves.

En ce qui concerne le fonctionnement de gigaGPT, l'absence de techniques de sharding ou de pipelining est soulignée comme un choix, car le modèle s'intègre entièrement dans la mémoire système du matériel Cerebras. Les explications sur l'architecture des clusters Cerebras Wafer Scale, MemoryX, et SwarmX donnent un aperçu technique, mais il est important de rester critique sur la généralisation de l'efficacité de cette approche à d'autres scénarios ou architectures.

La présentation de gigaGPT comme étant composé principalement de model.py et train.py, avec un code ennuyeux et des différences cosmétiques par rapport à nanoGPT, suscite des questions sur l'originalité et l'innovation réelles apportées par cette implémentation. De plus, la description du code comme « assez similaire aux implémentations concises de GPT écrites pour les GPUs » souligne la nécessité de comprendre les compromis et les implications de performance associés à cette simplicité.

La mention du paquet cerebras_pytorch comme la solution simplificatrice pour l'entraînement sur un énorme cluster mérite un examen approfondi. Bien qu'il soit présenté comme la clé de la simplicité du code de gigaGPT, une évaluation critique de la pertinence de cette solution dans des contextes différents et la compréhension de ses limites sont essentielles. En résumé, bien que la présentation du fonctionnement interne de gigaGPT soit détaillée, il est impératif de considérer ces déclarations avec prudence et de rester conscient des nuances et des implications potentielles.

Code : Sélectionner tout
1
2
3
4
5
6
for step, batch in enumerate(executor, start=global_step + 1): 
        if step > config.num_steps: 
            break 
        loss = training_step(batch) 
        log_loss(loss, step) 
        save_checkpoint(step)
Examinons initialement de manière approfondie l'exécuteur mentionné précédemment :

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
dataloader = cstorch.utils.data.DataLoader( 
        get_dataloader, 
        data_path, 
        config.sequence_length, 
        config.batch_size, 
        config.seed, 
    ) 
    executor = cstorch.utils.data.DataExecutor( 
        dataloader, 
        num_steps=config.num_steps - global_step, 
        checkpoint_steps=config.checkpoint_steps, 
        cs_config=cs_config, 
        writer=writer, 
    )
Pour les exécutions sur le système Cerebras, des nœuds CPU dédiés sont en charge du chargement des données et de leur acheminement vers le modèle. L'utilisation de cstorch.utils.data.DataLoader vise à définir l'instance du dataloader qui s'exécutera sur chacun de ces nœuds de travail. Cette fonction prend en paramètre une fonction renvoyant une instance de dataloader, facilitant ainsi la mise en place de dataloaders indépendants et correctement shardés sur chaque nœud travailleur. L'objet cstorch.utils.data.DataLoader résultant est ensuite transmis à un DataExecutor, qui assume la responsabilité de la coordination au plus haut niveau de toutes les tâches indépendantes nécessaires à l'exécution.

En poursuivant, examinons de plus près les composants impliqués dans la définition d'une étape d'entraînement unique. En interne, l'utilisation de cerebras_pytorch repose sur PyTorch LTC pour tracer le graphe de calcul associé à la tâche de formation et le convertir en opérations exécutables sur le Cerebras Wafer Scale Engine (WSE). Par conséquent, la première étape dans l'établissement de la logique de formation est la création de l'instance du modèle de manière à permettre son retracement ultérieur. Ce processus est effectué par le code situé au début de train.py::main.

Code : Sélectionner tout
1
2
3
4
5
6
7
backend = cstorch.backend(config.backend, use_cs_grad_accum=True) 
    … 
 
    with backend.device: 
        model = GPTModel(model_config) 
 
    compiled_model = cstorch.compile(model, backend)
Avec cette définition de modèle, ainsi qu'un optimiseur et un planificateur de taux d'apprentissage créés avec des API qui reflètent directement les API de PyTorch, il est possible de définir la logique d'une étape d'apprentissage de base.

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
@cstorch.trace 
    def training_step(batch): 
        input_ids, labels = batch 
        loss = compiled_model(input_ids, labels) 
        loss.backward() 
        torch.nn.utils.clip_grad_norm_(list(all_params), config.max_gradient_norm) 
        optimizer.step() 
        lr_scheduler.step() 
        optimizer.zero_grad() 
        return loss
Le corps de cette fonction est un code de formation assez standard. La seule partie intéressante est le décorateur @cstorch.trace. Il signale au framework que le code de la fonction est destiné à être tracé et exécuté sur le système CS. Aucun tenseur ne peut être exécuté avec empressement dans cette portée, ce qui signifie que le code ici ne peut pas inclure de fonctionnalité de journalisation ou de conditionnalité python. Pour cela, un décorateur différent est cecessaire :

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
@cstorch.step_closure 
    def log_loss(loss, step): 
        rate = executor.profiler.rate() 
        global_rate = executor.profiler.global_rate() 
 
        logger.info( 
            f"| Step={step}, " 
            f"Loss={loss.item():.5f}, " 
            f"Rate={rate:.2f} samples/sec, " 
            f"GlobalRate={global_rate:.2f} samples/sec" 
        ) 
        writer.add_scalar("loss", loss.item(), step) 
        writer.add_scalar("samples_per_second", global_rate, step)
Ce code de journalisation nécessite l'exécution impatiente de valeurs tensorielles et n'a pas besoin de s'exécuter sur le WSE, donc il est enveloppé dans un décorateur @cstorch.step_closure. Le code de vérification fonctionne de la même manière, sauf que pour s'assurer qu'il ne s'exécute que tous les checkpoint_steps pour n'importe quelle valeur de checkpoint_steps passée dans le DataExecutor ci-dessus. Pour cela, nous avons le décorateur @cstorch.checkpoint_closure. Les fonctions enveloppées dans ce décorateur peuvent être appelées à tout moment mais ne s'exécuteront que si l'étape courante est une étape de point de contrôle.

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
@cstorch.checkpoint_closure 
    def save_checkpoint(step): 
        checkpoint_path = out_dir.joinpath(f"checkpoint_{step}.mdl") 
        state_dict = { 
            "model": model.state_dict(), 
            "optimizer": optimizer.state_dict(), 
            "lr_scheduler": lr_scheduler.state_dict(), 
            "global_step": step, 
            "model_config": asdict(model_config), 
        } 
        cstorch.save(state_dict, checkpoint_path) 
        logger.info(f"Saved checkpoint to {checkpoint_path}")
Les fonctions employées dans la boucle d'entraînement principale ont été établies. Après l'ajout de quelques lignes de code pour remédier aux lacunes liées au chargement des points de contrôle, à la gestion de la configuration, etc., le résultat est un train.py qui, en un total de 156 lignes de code, prétend être capable de gérer de manière transparente la coordination des tâches d'entraînement à travers des clusters distribués de grande envergure.

Cependant, il est crucial de prendre du recul et d'examiner attentivement la validité de cette affirmation. La prétention de coordonner sans heurts des tâches d'entraînement à travers d'énormes clusters distribués en si peu de lignes de code soulève des interrogations quant à la complexité réelle de la mise en œuvre et à la prise en compte des divers défis et nuances inhérents à une telle opération à grande échelle. Une évaluation approfondie de la qualité du code, de sa robustesse et de sa soutenabilité à long terme est nécessaire pour une évaluation précise de ces déclarations.

Source : Cerebras

Et vous ?

À votre avis, la simplicité revendiquée par GigaGPT en 565 lignes de code ne compromet pas la stabilité et la performance réelle du modèle ?

Quels sont les avantages et les inconvénients de l’utilisation de GigaGPT par rapport à d’autres modèles de langage naturel ?

Quels peuvent être les risques potentiels associés à l’utilisation de GigaGPT pour l’entraînement à grande échelle de modèles de langage naturel ?

La dépendance exclusive à la mémoire du matériel Cerebras constitue-t-elle un avantage réel pour GigaGPT, ou cela pourrait-il poser des problèmes de portabilité sur d'autres architectures ?

Voir aussi :

GPT-3, le système de génération de texte d'OpenAI, serait aussi performant qu'un humain de neuf ans dans les tests standard de la théorie de l'esprit, selon un psychologue

La nouvelle alternative open-source ChatGPT de Microsoft permet aux entreprises de déployer des chatbots privés et personnalisables avec des garanties de confidentialité

Les conservateurs affirment que ChatGPT est devenu "woke" et s'inquiètent à propos de la partialité du chatbot d'OpenAI, ils accusent également le chatbot de défendre les "valeurs de gauche"

Une erreur dans cette actualité ? Signalez-nous-la !