- nanochat d’Andrej Karpathy est un projet open source qui permet de construire soi-même un LLM conversationnel semblable à ChatGPT avec un budget de 100 $
- L’ensemble du pipeline (tokenisation, préentraînement, midtraining, fine-tuning, évaluation, inférence, service web) est implémenté de façon concise et hackable
- Sur un nœud GPU 8XH100, l’entraînement se termine en moins de 4 heures avec un seul script ; le modèle d26 visant un niveau GPT-2 coûte environ 300 $ pour 12 heures, et le palier à 1 000 $ demande 41,6 heures
- Avec une base de code extrêmement concise de 8 300 lignes et 44 fichiers pour 330 Ko, le projet fournit une baseline puissante, facile à lire et à forker, sans objets de configuration complexes ni model factories
- Le projet est développé comme projet de fin d’études du cours LLM101n d’Eureka Labs, avec pour objectif d’améliorer l’état de l’art des micro-modèles accessibles avec un budget inférieur à 1 000 $
Vue d’ensemble du projet nanochat
- nanochat est un projet open source conçu pour les développeurs qui veulent implémenter un LLM conversationnel proche de ChatGPT pour 100 $
- L’ensemble de la base de code est écrit de manière unifiée, lisible, légère en dépendances et concise, ce qui facilite les modifications et les expérimentations
- Il fournit un environnement permettant de gérer d’un seul tenant toutes les étapes, du pretraining au finetuning, à l’évaluation, à l’inférence et à la web UI
- Le script speedrun.sh permet d’exécuter automatiquement tout le pipeline, ce qui rend le démarrage facile même pour les débutants
- Conçu avec un minimum de dépendances et une structure hackable, il est particulièrement adapté à un objectif pédagogique, pour être facilement compris et modifié
- Le projet doit servir de capstone du cours LLM101n actuellement développé chez Eureka Labs
Démarrage rapide (Quick Start)
- Dans un environnement GPU, en particulier sur un nœud 8XH100, l’exécution de speedrun.sh met en place environ 4 heures d’entraînement et d’inférence
- Sur la base d’un nœud 8XH100 à 24 $/heure, le temps total est d’environ 4 heures
- Il est recommandé de l’exécuter dans une session
screen afin de pouvoir surveiller de façon stable les longues phases d’entraînement
- Utiliser la commande
screen -L -Logfile speedrun.log -S speedrun bash speedrun.sh
- Détacher avec
Ctrl-a d, puis suivre la progression avec tail speedrun.log
- Une fois l’entraînement terminé, il est possible de poser librement des questions au LLM via une web UI simple et de consulter les réponses dans l’interface de chat
python -m scripts.chat_web
- Le modèle de niveau 4e19 FLOPs offre des capacités conversationnelles comparables à celles d’un enfant de maternelle
- Il peut répondre à des demandes d’histoires ou de poèmes
- Il permet d’observer des phénomènes d’hallucination
- Il peut répondre à des questions simples, comme pourquoi le ciel est bleu
- Les résultats d’entraînement et différentes métriques de performance sont enregistrés dans
report.md
Rapport des résultats d’entraînement
- Le fichier
report.md contient le « bulletin » de l’exécution de l’entraînement
- Il fournit divers indicateurs et métriques d’évaluation
- Le tableau de synthèse final affiche les performances par étapes : BASE, MID, SFT et RL
- Statistiques de la base de code
- Nombre de caractères : 333 989
- Nombre de lignes : 8 304
- Nombre de fichiers : 44
- Nombre de tokens (approx.) : 83 497
- Dépendances (nombre de lignes dans
uv.lock) : 2 004
- Exemples de performances en benchmark
- CORE : 0.2219 (BASE)
- ARC-Challenge : 0.2875 (MID), 0.2807 (SFT)
- GSM8K : 0.0250 (MID), 0.0455 (SFT), 0.0758 (RL)
- HumanEval : 0.0671 (MID), 0.0854 (SFT)
- Temps total écoulé : 3 h 51 min
- Les performances du modèle restent inférieures à celles de ChatGPT, mais l’accent est mis sur l’expérience de mise en œuvre d’un LLM à petit budget
Modèles plus grands (Bigger Models)
- Avec 100 $, il n’est pas possible d’entraîner un clone ChatGPT haute performance ; les vrais LLM sont connus pour exiger des dépenses d’investissement de plusieurs millions de dollars
- Deux échelles supplémentaires méritent l’attention
- Palier d’environ 300 $ pour le modèle d26 (
depth=26) : environ 12 heures d’entraînement, avec un score CORE GPT-2 légèrement dépassé
- Palier à 1 000 $ : environ 41,6 heures, un chiffre rond et propre
- Modifications à apporter à
speedrun.sh pour entraîner le modèle d26
- Télécharger davantage de shards de données
- Calculer le nombre de tokens en multipliant le nombre de paramètres par 20
- Calculer le nombre de caractères en multipliant par 4,8
- Calculer le nombre de shards en divisant par 250 millions (environ 450 nécessaires)
- Utiliser l’option
--depth=26 et réduire device_batch_size de 32 à 16 pour éviter les OOM
- Il faut également utiliser le même
device_batch_size pendant l’étape de midtraining
Exigences de l’environnement de calcul
- Le projet peut aussi tourner sur un nœud GPU 8XA100, mais un peu plus lentement
- Il peut aussi fonctionner sur un seul GPU
- En omettant
torchrun, on obtient presque les mêmes résultats
- Le système bascule automatiquement vers la gradient accumulation
- Le temps nécessaire est environ 8 fois plus long
- Pour les GPU avec moins de 80 Go de VRAM, il faut ajuster les hyperparamètres
- Réduire
--device_batch_size de 32 (valeur par défaut) à 16, 8, 4, 2 ou 1 pour libérer de la mémoire
- Pour descendre sous 1, il faudra faire preuve de plus de créativité
- Basé sur du PyTorch vanilla, le projet peut prendre en charge divers environnements comme xpu ou mps
- Ce n’est pas fourni par défaut, donc quelques modifications sont nécessaires
Utilité et accessibilité
- Le plus grand avantage de nanochat est qu’il permet de regrouper tous les fichiers en un seul paquet pour interroger facilement d’autres LLM, des services de recherche documentaire, etc.
- Exemple d’utilisation de l’utilitaire files-to-prompt
- Inclut des fichiers
py, md, rs, html, toml, sh
- Exclut le dossier
rustbpe/target
- Sélectionne le format de sortie cxml
- Emballe environ 330 Ko (environ moins de 100 000 tokens), 45 fichiers et 8 000 lignes de code
- DeepWiki recommandé
- Il suffit de remplacer
github.com par deepwiki.com dans l’URL GitHub pour poser des questions sur le dépôt
- Fourni par Devin/Cognition
Contributions et orientation du projet
- nanochat est un projet encore inachevé
- Son objectif est d’améliorer l’état de l’art des micro-modèles qu’on peut construire de bout en bout avec un budget inférieur à 1 000 $
- L’accessibilité ne concerne pas seulement le coût, mais aussi la complexité cognitive
- Pas d’énormes objets de configuration, de model factories ou de code monstre en
if-then-else
- Ce n’est pas un « framework » LLM entièrement configurable
- Une base de code unifiée, cohérente, minimale, lisible, hackable et aussi facile à forker que possible, pensée comme une baseline puissante
- Conçue pour s’exécuter de bout en bout et produire un clone concret de ChatGPT ainsi que son bulletin de résultats
1 commentaires
Réactions sur Hacker News
Partage intéressant d’une expérience d’utilisation d’outils de codage IA
J’ai demandé un jour à Karpathy quelle part du code il avait écrite lui-même.
Karpathy : merci pour la question, et en pratique j’ai écrit la majeure partie du code à la main (avec l’autocomplétion par tabulation).
J’ai essayé les agents claude/codex quelques fois, mais leur précision était insuffisante, donc ils ne m’ont pas beaucoup aidé.
C’est peut-être parce que le repo que j’ai créé est trop éloigné de la distribution des données.
Lien vers l’échange original
Le fait que le « repo soit trop éloigné de la distribution des données » explique pourquoi les modèles d’IA ne m’ont jamais vraiment aidé.
Tout ce sur quoi je travaille est trop particulier, donc trop éloigné de la distribution.
C’est agréable d’entendre ça de la part de quelqu’un d’aussi fiable que Karpathy.
Ceux qui pensent que l’AGI va arriver très bientôt feraient sans doute mieux de modérer un peu leurs attentes.
Moi aussi, j’aime bien Claude Code.
Il m’arrive régulièrement d’avoir à écrire du code web, et comme la couverture des données d’entraînement y est excellente, Claude est de loin meilleur développeur web que moi.
Mais quand il faut creuser le cœur algorithmique de mes outils d’automatisation, Claude a beaucoup moins de matière exploitable et fait donc plus d’erreurs.
Malgré tout, le bilan reste positif, donc je paie volontiers pour l’utiliser.
Même si ça s’arrêtait à un simple assistant de développement web, ce serait déjà d’une grande aide.
Je pense au contraire que c’est un phénomène naturel.
On est dans une situation où l’on écrit du code nouveau et original.
Beaucoup critiquent la réponse de Karpathy, mais le simple fait qu’il ait essayé claude/codex suggère qu’à d’autres moments ces outils lui ont effectivement été utiles.
Un autre lien miroir du tweet de Karpathy ici
C’est impressionnant de voir que nanochat s’inspire de modded-nanoGPT.
La filiation est : nano-GPT de Karpathy → modded-nanoGPT de Keller Jordan (une version pour entraîner des modèles rapidement) → NanoChat.
Ce qui est remarquable avec modded-nanoGPT, c’est à quel point il entraîne vite de petits modèles GPT.
En particulier, il utilise l’optimizer Muon (développé par l’auteur lui-même) sur les linear layers au lieu d’AdamW.
modded-nanoGPT, présentation de l’optimizer Muon
Muon est un optimiseur que Keller Jordan a créé pour ce concours d’entraînement rapide, avec en plus des améliorations proposées par d’autres.
En moins d’un an, il est déjà largement utilisé comme SOTA pour l’entraînement de modèles.
C’est assez choquant de faire tourner un unique nœud d’inférence avec 8xH100.
Je me demande si les frontier LLM déployés en production tournent vraiment à cette échelle, ou s’ils consomment encore plus de VRAM et de calcul.
Environ 8 $ de l’heure, en supposant 5 secondes par requête, ça ferait dans les 700 requêtes possibles.
Donc environ 1 centime par requête.
Je me demande si mon calcul est faux.
L’entraînement est encore réellement en cours en ce moment même (il a commencé il y a 20 minutes).
Logs publics de l’expérience
Le modèle sera terminé dans 4 heures, puis partagé pour que tout le monde puisse tester l’inférence.
Le modèle final a été mis en ligne sur Hugging Face.
Je n’ai pas obtenu des résultats aussi bons que Karpathy (pas de chance avec le seed, peut-être ?).
Mais c’est quand même amusant à tester.
Par exemple, à la question « Combien de pattes a un chien ? »,
l’assistant répond : « C’est une question vraiment intéressante, et elle fait l’objet de discussions parmi les amateurs de chiens depuis des siècles. Il n’y a pas vraiment de “bonne réponse” (...) »
Dans le commentaire à côté du premier graphique,
« Mesure principale du progrès. Le bits per byte est, comme le dit Karpathy, “un indicateur bien meilleur que la cross-entropy loss classique. Il normalise la loss en nombre d’octets pour chaque token, ce qui permet des comparaisons indépendantes du tokenizer”. »
L’explication est tellement claire que j’ai presque honte de ne pas y avoir pensé quand j’expérimentais mon tokenizer sur tinystories.
J’ai envie de réanalyser à quel point mon tokenizer était réellement bon.
Ce serait bien d’avoir un petit guide pratique expliquant comment faire tourner cet entraînement du dépôt avec W&B.
Je me demande s’il serait possible de partager un pas-à-pas destiné à un programmeur qui n’a encore jamais suivi tout le flux d’entraînement d’un modèle.
C’est amusant !
Le générateur Shakespeare de Karpathy a été l’un des premiers projets sur lesquels j’ai expérimenté après ollama.
Je voulais comprendre le fonctionnement interne des LLM.
Depuis la semaine dernière, je suis à fond dedans et je construis depuis zéro deux systèmes d’entraînement/inférence avec deux backends :
rocm/pytorch me rebutent fortement parce que je les trouve pénibles.
Vulkan, en revanche, c’est bien. llama-cpp l’utilise aussi comme ça.
La semaine dernière, j’ai réussi à faire fonctionner les backends CPU et GPU, puis je me suis concentré sur des bugs du backend GPU.
J’ai refactorisé le code WGSL et amélioré son efficacité.
J’ai beaucoup utilisé les LLM dans ce processus, et ça a été un tournant étonnamment important.
Avec des prompts de refactorisation, on peut corriger les erreurs étape par étape et finir par obtenir du code qui passe même la vérification de types avec astral ty.
On peut difficilement faire un choix plus inefficace que ça.
J’ai essayé nanoGPT (lien) ce week-end.
C’est un projet assez ancien, mais c’est une excellente pratique pour construire et entraîner soi-même un petit GPT Shakespeare.
Je l’ai fait tourner sur CPU avec environ 0,8 M de paramètres.
Le résultat est globalement « pas terrible », à peu près comme prévu.
Mais on y ressent quand même quelque chose de magique.
Pour quelqu’un qui n’est pas spécialiste du deep learning et qui aime simplement expérimenter et bidouiller, c’est une porte d’entrée idéale.
Je n’ai pas encore fini d’écrire mon billet de blog sur cette expérience nanoGPT du week-end… sinon je l’aurais partagé ici, dommage.
C’est un exercice utile parce qu’il montre que de bonnes recherches en ML se valident aussi à petite échelle.
Ce nouvel exemple va plus loin : il couvre aussi l’instruction following, le tool use SFT et le RLVR.
Ça permet de produire une baseline plus utile.
En ajustant légèrement le code Shakespeare pour l’entraîner sur d’autres données, on arrive à générer assez correctement des decks commander pour Magic The Gathering.
« obtenu des conseils d’Alec Radford, chief LLM whisperer »
Si un podcast avec Alec et Andrej voyait le jour, il pourrait bien secouer le monde entier.
Passer de la grande époque de GPT1 à fabriquer aujourd’hui un GPT3 en 4 heures, c’est impressionnant.
Eureka Labs : lien GitHub
Andrej est quelqu’un de vraiment prolifique et impressionnant.
Rien que suivre son travail est déjà une expérience formidable.
J’ai toujours pensé que la meilleure manière de contribuer à l’humanité
était le produit du nombre de personnes qu’on aide et de la profondeur de cette aide.
Le travail open source de Karpathy est, dans ce sens, une approche au levier maximal.
Le monde d’aujourd’hui repose lui aussi sur des projets open source.
C’est grâce à la liberté offerte à n’importe qui, partout dans le monde, d’apprendre à coder gratuitement et de créer des logiciels.
J’espère que le domaine IA/LLM suivra lui aussi cette direction positive.
J’adore cette tradition du gratuit et du partage dans le logiciel,
mais pour les LLM, avec des coûts d’entraînement si élevés et la nécessité de matériel très puissant, j’ai l’impression qu’il sera difficile de préserver cette dynamique.
On risque d’aboutir à un monde où le développement logiciel lui-même devra payer un « loyer » aux hébergeurs de LLM.
Il est possible qu’on retrouve un moyen de rendre à nouveau l’inférence on-prem/local accessible à tous,
mais pour l’instant, à cause des coûts d’entraînement élevés, tout cela reste très incertain.
Et plus notre dépendance aux LLM augmentera,
plus je crains que la production de contenus « faits main », comme les tutoriels pour débutants en programmation, ne diminue.
(Un peu long, mais tout cela vient d’un vrai désir d’un monde meilleur.)
Cette perspective diffère un peu du sentiment « anti-IA » dominant.
Le concept de propriété intellectuelle consiste moins en une contribution directe à l’humanité qu’en une structure où certaines personnes accumulent la propriété de l’information puis la louent à l’ensemble de l’humanité.
Mais il faut aussi absolument que les créateurs individuels puissent gagner leur vie.
Je pense que non seulement Karpathy, mais aussi des milliers de créateurs sur YouTube apportent une grande contribution à la société dans leurs domaines respectifs.
En revanche, le fait que tant de gens doivent dépendre du sponsoring me laisse un goût amer.
Il y a aussi Patreon, mais ce n’est pas idéal.
Je suis d’accord pour dire que tous ces efforts constituent une contribution importante à la société.
Récemment, dans le Daily Show, Jon Stewart a décrit l’entraînement de l’IA comme du strip mining appliqué au savoir humain.
L’entraînement de l’IA est parfois présenté unilatéralement comme une forme de vol, alors qu’en réalité les points de vue sont très variés.
Cette dynamique pourrait au final renforcer une structure de propriété du savoir hyper-capitaliste,
où la propriété des idées se concentrerait de plus en plus entre les mains d’un petit nombre.
Ce phénomène n’aide pas vraiment le monde dans son ensemble et ne profite qu’à certains groupes.
Même le commerce des droits de propriété intellectuelle finit, avec le temps, par se concentrer davantage entre quelques mains.
Je pense qu’il est indispensable d’avoir un débat adapté à la société moderne et de nouvelles interprétations.
Je trouve dommage que le fatalisme du type « ceux d’en haut bloqueront ça de toute façon, inutile d’en discuter » empêche souvent le débat.
Il est important de discuter librement de la manière de faire émerger de meilleures solutions.
Je recommande souvent sa série de vidéos ANN/LLM from scratch.
Ses cours sont très clairs, et son style de code est pythonique, concis et facile à lire,
(même si les parties sur la vectorisation pytorch sont complexes, mais c’est juste un domaine difficile)
et rien que pour apprendre ce style en regardant ses vidéos, c’est déjà d’une grande aide pour tout le monde.
Je me demande s’il serait possible d’entraîner un modèle sur tous les livres, ressources, rapports et articles de psychologie que je possède réellement,
puis d’utiliser un nœud 1xH100 (lien) pour faire de l’inférence sur des questions spécialisées quand j’en ai besoin.
C’est faisable en pratique, mais les performances seraient extrêmement mauvaises.
Dans ce cas, il vaut bien mieux prendre un petit modèle préentraîné et le fine-tuner sur mes données,
ou utiliser un workflow RAG (Retrieval Augmented Generation), voire une combinaison des deux.
Oui, c’est possible.
Mais utiliser un modèle généraliste et injecter mes documents dans le contexte de travail via différentes méthodes (par exemple : RAG, les hierarchical memories d’Apple, etc. lien vers l’article) pourrait donner de meilleurs résultats.
On peut le faire,
mais comme mon dataset lui-même est très petit, les performances seraient bien inférieures à celles d’un modèle préentraîné + fine-tuning, ou d’un petit modèle + RAG.
Non.
Ce projet est vraiment stimulant !
J’aimerais bien connaître des exemples concrets de performance sur de vrais prompts ou des résultats de test.
quelqu’un signale ici qu’il existe une capture d’écran d’un vrai prompt.