microgpt
(karpathy.github.io)- Une architecture de modèle de langage minimaliste qui implémente l’ensemble du processus d’entraînement et d’inférence d’un modèle GPT dans un fichier unique en pur Python de 200 lignes
- Inclut l’ensemble : jeu de données, tokenizer, moteur d’autodifférentiation, réseau de neurones de type GPT-2, optimiseur Adam, ainsi que les boucles d’entraînement et d’inférence
- Entraîne un jeu de données de prénoms pour générer de nouveaux noms, et met en lumière les principes fondamentaux de GPT grâce à une implémentation maison de l’autograd et de l’architecture Transformer
- Contrairement aux LLM à grande échelle, fonctionne en pur Python sans dépendances en ne conservant que l’essence algorithmique
- Comprendre microgpt permet de comprendre la structure algorithmique fondamentale des grands modèles comme ChatGPT
Aperçu de microgpt
- microgpt est une implémentation GPT minimaliste écrite en 200 lignes de code Python, sans dépendance à des bibliothèques externes
- Elle inclut le jeu de données, le tokenizer, l’autodifférentiation, une architecture proche de GPT-2, l’optimiseur Adam, ainsi que les boucles d’entraînement et d’inférence
- Il s’agit d’un projet artistique créé par Karpathy pour simplifier les LLM jusqu’à leur essence, dans la continuité de micrograd, makemore et nanogpt
- Le code complet est disponible sur GitHub Gist, sur une page web et dans Google Colab
Jeu de données
- Utilise un fichier texte contenant environ 32 000 noms, un par ligne
- Chaque nom est considéré comme un document, et le modèle apprend ce motif pour générer de nouveaux noms
- Exemples de génération après entraînement : kamon, ann, karai, jaire, vialan
Tokenizer
- Un tokenizer simple basé sur les caractères qui attribue un identifiant entier à chaque caractère unique
- Inclut les lettres a–z et le token BOS (beginning of sequence), soit 27 tokens au total
- Chaque document est encadré sous la forme
[BOS, e, m, m, a, BOS]pour l’entraînement
Autodifférentiation (Autograd)
- La classe
Valuesuit des valeurs scalaires et leurs gradients tout en construisant un graphe d’opérations - Elle stocke les dérivées locales (local gradient) des opérations de base comme l’addition, la multiplication, la puissance, le logarithme, l’exponentielle et ReLU
- La méthode
backward()exécute la rétropropagation en appliquant la règle de la chaîne - Le même algorithme que
.backward()de PyTorch est implémenté manuellement au niveau scalaire
Initialisation des paramètres
- Le modèle possède environ 4 192 paramètres
- Ils comprennent la table d’embedding, les poids d’attention, les poids du MLP et la projection de sortie
- Chaque paramètre est initialisé avec des valeurs aléatoires suivant une distribution gaussienne
Architecture du modèle
- Une forme simplifiée de l’architecture GPT-2, utilisant RMSNorm, ReLU et des connexions résiduelles (residual connection)
- Principaux composants :
- Étape d’embedding : addition des embeddings de tokens et de position
- Attention multi-tête : calcul des vecteurs Q, K, V puis utilisation des informations des tokens passés via le cache KV
- Bloc MLP : réseau feedforward à 2 couches pour le calcul local
- Étape de sortie : génération des logits pour la taille de vocabulaire (27)
- Le cache KV reste actif même pendant l’entraînement, et la rétropropagation traverse le cache
Boucle d’entraînement
- À chaque étape, un document est sélectionné puis tokenisé sous la forme
[BOS, ... , BOS] - Le modèle prédit la probabilité du token suivant et calcule la perte d’entropie croisée
- Après calcul des gradients avec
loss.backward(), les paramètres sont mis à jour avec l’optimiseur Adam - Le taux d’apprentissage suit une décroissance linéaire (linear decay)
- En 1 000 étapes, la perte diminue d’environ 3,3 → 2,37
Inférence
- Une fois l’entraînement terminé, de nouveaux noms sont générés en commençant par le token BOS
- À chaque étape, le token suivant est échantillonné selon les probabilités softmax
- La valeur de temperature permet d’ajuster la créativité (plus basse = plus conservatrice, plus élevée = plus variée)
- Exemples de sortie : kamon, ann, karai, jaire, vialan, karia, yeran, anna
Exécution
- L’exécution est possible avec Python seul (
python train.py) - L’entraînement se termine en environ une minute, avec affichage de la perte à chaque étape
- Exécution identique également possible dans un notebook Colab
Étapes d’évolution du code
- Extension progressive de
train0.pyàtrain5.py- Bigram → MLP → Autograd → Attention → Multi-head → Adam
- Chaque étape peut être consultée dans les révisions de build_microgpt.py du Gist
Différences avec les vrais LLM
- Données : microgpt utilise 32K noms, contre des milliers de milliards de tokens pour les vrais LLM
- Tokenizer : au niveau caractère vs. sous-mots basés sur BPE
- Autograd : Python scalaire vs. opérations sur tenseurs GPU
- Architecture : 4K paramètres vs. des centaines de milliards de paramètres
- Entraînement : répétition sur document unique vs. entraînement à grande échelle en batch et en précision mixte
- Optimisation : Adam simple vs. hyperparamètres et scheduling finement optimisés
- Post-traitement : évolution vers une forme type ChatGPT via des étapes SFT et RL
- Infrastructure d’inférence : distribution GPU, gestion du cache KV, quantification, speculative decoding, etc.
Résumé de la FAQ
- Le modèle est une fonction mathématique qui transforme des tokens d’entrée en probabilités du token suivant
- Il n’y a pas de véritable « compréhension », seulement une apprentissage de règles statistiques pour effectuer des prédictions
- La même boucle de prédiction de tokens que ChatGPT est implémentée ici sous une forme réduite
- Les « hallucinations » sont un résultat naturel de l’échantillonnage probabiliste
- C’est lent, mais cela reproduit intégralement l’algorithme central des LLM
- Pour de meilleurs résultats, on peut ajuster le nombre d’étapes d’entraînement, la taille du modèle et le jeu de données
- En remplaçant le jeu de données, il est possible d’apprendre divers motifs comme des noms de villes, des noms de Pokémon ou de la poésie
microgpt est un modèle pédagogique et expérimental qui implémente tous les algorithmes essentiels des LLM à leur plus petite échelle, et constitue un exemple qui révèle entièrement le principe de fonctionnement des grands modèles de langage.
1 commentaires
Réactions sur Hacker News
Quelqu’un a modifié microgpt pour créer un petit GPT qui génère des prénoms coréens
Il y a aussi une page web qui visualise tout le processus — on peut explorer l’ensemble du pipeline, de la tokenisation à l’inférence
Essai direct possible sur English GPT lab
Il suffit de jeter un œil au tutoriel PyTorch char_rnn
Tokenisation, embeddings, attention, loss et gradients, entraînement, inférence, comparaison avec un vrai GPT : tout est bien expliqué
Le site lui-même ressemble davantage à une visualisation générée par IA basée sur le billet de blog d’origine
J’ai porté microgpt en C++
Lien vers le code
Il y a deux fois plus de lignes de code, mais c’est 10 fois plus rapide
La partie la plus difficile a été de représenter la classe Value en C++, et j’ai finalement utilisé shared_ptr
Je me demandais ce qu’était exactement une « hallucination »
Le modèle ne fait qu’échantillonner des tokens à partir d’une distribution de probabilité, il n’a aucune notion de vérité
Du coup, je me suis demandé si un LLM pouvait avoir un score de confiance sur sa propre réponse
Les modèles préentraînés sont calibrés, mais cela se dégrade après le suivi d’instructions (post-training)
Recherches associées : papier 1, papier 2
Comme un intervalle de confiance en statistique quand la population est inconnue, les probabilités d’un LLM n’ont pas de lien direct avec le monde réel
Au fond, un LLM ressemble à quelqu’un qui n’a fait que lire des livres sans jamais faire l’expérience du monde
Mais cette probabilité n’est pas la « probabilité que ce soit vrai », c’est la « probabilité que je produise ce token dans cette situation »
J’ai converti microgpt en Rust pour apprendre
microgpt-rs
Le plus délicat a été d’exprimer la structure du graphe autograd avec le système de types de Rust
Je suis en train de l’adapter pour qu’il tourne dans le navigateur via WebAssembly, et je prévois d’en faire un billet de blog
Le code de Karpathy a une conception vraiment poétique et concise
Le code est beau et facile à lire, mais j’aimerais qu’il y ait une explication commentée ligne par ligne, à la manière de backbone.js
Voir la documentation Backbone
Le projet Docco est lui aussi un excellent outil du même auteur
Il existe aussi une version HTML du code
Blog microgpt
Grâce aux vidéos et au code de Karpathy, j’ai l’impression d’avoir enfin vraiment compris pour la première fois la descente de gradient, la rétropropagation et la règle de la chaîne
En ne regardant que les maths, j’étais perdu, mais avec le code c’est devenu clair
Personnellement, ça m’a donné un sentiment proche d’un accomplissement de vie
Comme le dit Karpathy, pour vraiment comprendre, il faut essayer de l’enseigner à quelqu’un d’autre
Je suis surpris que ce projet n’arrive sur HN que maintenant
J’ai créé une version JS en 35 lignes appelée PicoGPT, ainsi qu’une version Python,
exécutable directement sur le web
C’est même un LLM ultra-minuscule exécutable via un QR code
Fils associés : lien 1, lien 2
J’ai transformé le code de microgpt en billet de blog visuel
Lien du blog
Il montre le déroulé du code de manière interactive
mais en réalité, ces quatre noms sont tous déjà présents dans le dataset
En ce moment, la tendance du « micro » dans l’IA est intéressante
Au lieu de simplement grossir les modèles, on gagne davantage en efficacité avec des modèles petits et ciblés
J’utilise justement Gemini Flash pour l’analyse de domaine, et le rapport vitesse/coût est bien meilleur
Rien que la différence de latence change le type de produits qu’on peut construire
Vu qu’il est plus petit que nanogpt, je trouve que picogpt serait un nom plus approprié que microgpt
Cela dit, le projet reste très cool