3 points par GN⁺ 2026-03-02 | 1 commentaires | Partager sur WhatsApp
  • 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 Value suit 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

 
GN⁺ 2026-03-02
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

    • Ce genre de chose peut facilement être réalisé avec un modèle bien plus léger
      Il suffit de jeter un œil au tutoriel PyTorch char_rnn
    • Je n’ai aucun lien avec le créateur du site, mais c’est une ressource très utile pour apprendre la structure interne des LLM
      Tokenisation, embeddings, attention, loss et gradients, entraînement, inférence, comparaison avec un vrai GPT : tout est bien expliqué
    • Dire que ça a été « modifié » revient en pratique surtout à remplacer la liste de prénoms anglais par des prénoms coréens
      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

    • J’ai implémenté une rétropropagation explicite sans autodiff, et c’était 8 fois plus rapide qu’en Python
  • 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

    • Le modèle peut certes rapporter la confidence de sa distribution de sortie, mais cela ne veut pas dire qu’elle est réellement bien calibrée
      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
    • Un score de confiance n’a pas de sens si on ne connaît pas la méthode d’échantillonnage des données d’entraînement
      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
    • En pratique, un LLM renvoie bien une distribution de probabilité, puis échantillonne dedans pour générer des tokens
      Mais cette probabilité n’est pas la « probabilité que ce soit vrai », c’est la « probabilité que je produise ce token dans cette situation »
    • Il peut produire quelque chose, mais comme il ne connaît pas la “vraie distribution”, cette confiance n’a pas vraiment de sens
    • Des phrases comme « je n’en suis pas sûr, mais ça doit être ça » n’apparaissent pas dans la sortie, mais existent bien dans le processus de raisonnement interne
  • 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

    • Stocker les dérivées dans la structure des poids est assez hacky, mais c’est ce que fait la plupart des gens
    • Moi aussi, j’aimerais essayer de l’implémenter dans un autre langage
  • 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 code source annoté de Backbone a été généré avec Docco
      Le projet Docco est lui aussi un excellent outil du même auteur
    • C’est vraiment un bel exemple de programmation lettrée (literate programming)
      Il existe aussi une version HTML du code
    • Il y a également le billet de walkthrough de Karpathy
      Blog microgpt
    • Certains suggèrent simplement de demander à un LLM performant de l’expliquer
  • 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

    • Moi aussi, je vais essayer de l’expliquer de façon intuitive
      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

    • Moi aussi, ça m’étonne. C’est surprenant qu’un projet aussi cool n’ait atteint la page d’accueil de HN qu’après deux semaines
      Fils associés : lien 1, lien 2
    • En fait, il avait déjà été posté auparavant — ancien post
  • 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

    • Il est dit qu’après l’entraînement, le modèle génère des noms comme « kamon », « karai », « anna », « anton »,
      mais en réalité, ces quatre noms sont tous déjà présents dans le dataset
    • Ce billet mériterait d’être posté comme article à part entière sur HN
    • En général, je suis plutôt critique envers les blogs écrits avec l’aide d’un LLM, mais ici c’est un vraiment excellent exemple
    • Même en tant que débutant en ML, j’ai trouvé cette ressource aussi utile que l’original de Karpathy
    • Vraiment un super travail
  • 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

    • Mais ici, c’est un micro-modèle à vocation éducative plutôt qu’une vraie application
  • 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