Ismail Ben Alla

Tiny LLM

GPT-2 réimplémenté de zéro

IA générative · août 2023 · Terminé

Un modèle de langage de type GPT-2 reconstruit ligne par ligne pour comprendre son fonctionnement

Construit avecPyTorchLoRAOpenWebTexttiktokenHugging Face TransformersNumPyKaggle

Tiny LLM — vue d’ensemble

Présentation

Les grands modèles de langage sont faciles à appeler et difficiles à comprendre. Pendant mon stage chez 3D Smart Factory, je voulais savoir exactement ce qui se passe à l'intérieur de GPT-2, alors j'ai reconstruit un modèle de type GPT-2 de zéro en PyTorch avec une petite équipe de stagiaires.

J'ai implémenté l'auto-attention causale à la main avec un chemin rapide via le noyau Flash Attention de PyTorch, des blocs décodeurs pré-LayerNorm, des embeddings d'entrée et de sortie liés, et mes propres couches LoRA pour un fine-tuning économe en paramètres. Le modèle peut aussi charger les poids officiels de GPT-2 dans la même architecture.

J'ai tokenisé environ 5 millions de fichiers d'OpenWebText, soit à peu près un quart du corpus, avec le tokenizer GPT-2 r50k, publié ce jeu de données sur Kaggle et entraîné le modèle sur les GPU de Kaggle. Les pertes d'entraînement et de validation ont baissé ensemble, d'environ 6.4 à moins de 4. C'est mon dépôt le plus étoilé, et il a été construit pour comprendre, pas pour atteindre une perplexité de l'état de l'art.

La question

Puis-je réimplémenter de zéro les rouages de GPT-2 avec des améliorations modernes (Flash Attention, pré-LN) et entraîner réellement un modèle cohérent ?

Fonctionnalités clés

Comment ça marche

  1. Préparer les données

    Environ un quart d'OpenWebText est tokenisé avec le tokenizer GPT-2 r50k et stocké sous forme de flux binaires de tokens mappés en mémoire pour l'entraînement et la validation.

  2. Embedder les tokens

    Les embeddings de tokens et de positions sont additionnés ; l'embedding de tokens partage ses poids avec la couche de sortie.

  3. Empiler les blocs décodeurs

    Chaque bloc pré-LayerNorm applique une auto-attention causale puis un MLP, chacun avec une connexion résiduelle.

  4. Entraîner

    Entropie croisée sur le token suivant avec AdamW, warmup et décroissance du taux d'apprentissage, accumulation de gradient et précision mixte sur les GPU de Kaggle.

  5. Affiner avec LoRA

    Les poids de base sont gelés et seules de petites matrices de rang faible sont entraînées, puis refusionnées dans les poids.

Exemples

Pertes d'entraînement et de validation sur le sous-ensemble d'OpenWebText : toutes deux passent d'environ 6.4 à moins de 4 en à peu près 2 250 itérations, en restant proches l'une de l'autre.
Pertes d'entraînement et de validation sur le sous-ensemble d'OpenWebText : toutes deux passent d'environ 6.4 à moins de 4 en à peu près 2 250 itérations, en restant proches l'une de l'autre.

Stack technique

Ce que j’ai appris

Limites