Train Your Own LLM From Scratch - atelier pratique pour entraîner son propre LLM depuis zéro
(github.com/angelos-p)- Train Your Own LLM From Scratch est un atelier pratique où l’on écrit soi-même chaque élément du pipeline d’entraînement de GPT afin de comprendre ce que fait chaque composant et pourquoi il est nécessaire
- L’objectif est de générer un texte dans le style de Shakespeare avec un modèle GPT entraîné depuis zéro sur un notebook, et le modèle a été réduit à environ 10M de paramètres pour pouvoir être terminé en une seule session d’atelier
- Alors que nanoGPT vise à reproduire GPT-2 avec 124M de paramètres, ce projet ne conserve que l’essentiel et a été conçu pour pouvoir être entraîné sur un notebook en moins d’une heure
- Les composants à écrire soi-même sont le tokenizer, l’architecture de modèle basée sur Transformer, la boucle d’entraînement et la génération de texte ; à la fin, on complète directement
model.py,train.pyetgenerate.py - Les prérequis se limitent à être à l’aise avec la lecture de code Python ; aucune expérience en machine learning n’est nécessaire, et Python 3.12+ est requis
- L’environnement d’exécution prend en charge les notebooks et ordinateurs de bureau sur Mac, Linux et Windows, et l’entraînement utilise automatiquement MPS sur GPU Apple Silicon, CUDA sur GPU NVIDIA, ou le CPU
- Pour l’installation en local, le flux recommandé consiste à exécuter
uv syncavec uv ; sans environnement local, il est possible d’importer les fichiers dans Google Colab et d’exécuter!python train.py - L’atelier couvre successivement un tokenizer au niveau des caractères, les embeddings, la self-attention, LayerNorm, les blocs MLP, la fonction de perte, AdamW, le gradient clipping, le scheduling du taux d’apprentissage, ainsi que l’échantillonnage avec temperature et top-k
- L’architecture de base convertit le texte d’entrée en IDs de tokens au niveau des caractères, le fait passer par des embeddings de tokens et de position, puis à travers plusieurs blocs Transformer avant de produire les logits servant à calculer les probabilités du token suivant
- Les configurations de modèle proposées sont Tiny avec environ 0.5M de paramètres et environ 5 minutes sur un M3 Pro, Small avec environ 4M et environ 20 minutes, et la valeur par défaut Medium avec environ 10M et environ 45 minutes d’entraînement
- Toutes les configurations utilisent une tokenisation au niveau des caractères avec
vocab_size=65etblock_size=256, adaptées à de petits jeux de données d’environ 1 Mo comme Shakespeare - La tokenisation BPE est également abordée : avec un vocabulaire volumineux comme les 50,257 tokens de GPT-2, la plupart des bigrammes de tokens deviennent trop rares sur un petit jeu de données, ce qui rend l’apprentissage des motifs difficile ; le passage au BPE est envisagé pour des jeux de données plus grands
- Parmi les principales références figurent nanoGPT, build-nanogpt video lecture, Karpathy's microgpt, nanochat, Attention Is All You Need (2017), GPT-2 paper (2019) et le TinyStories paper
1 commentaires
Commentaires sur Hacker News
Si ce contenu vous intéresse, je recommande aussi vivement le cours CS336 de Stanford. Il couvre un programme similaire, mais beaucoup plus en profondeur, et présente aussi bien l’intuition théorique sur des sujets comme les lois de scaling que la perspective systèmes avec l’optimisation de noyaux et le profiling
Cela dit, il faut faire les devoirs soi-même : https://cs336.stanford.edu/
Petite autopromo : il existe une série de notebooks Jupyter qui expliquent le fonctionnement du machine learning depuis les bases
https://github.com/nickyreinert/DeepLearning-with-PyTorch-fr...
Et bien sûr, elle montre aussi comment construire un LLM à partir de zéro
https://github.com/nickyreinert/basic-llm-with-pytorch/blob/...
Je viens justement de commencer le dépôt/livre/cours de Sebastian Raschka, Build a Large Language Model (From Scratch). Devoir choisir entre plusieurs ressources d’apprentissage est sans doute un bon problème à avoir
[0] https://github.com/rasbt/LLMs-from-scratch
[1] https://www.manning.com/books/build-a-large-language-model-f...
[2] https://magazine.sebastianraschka.com/p/coding-llms-from-the...
Je fais ça depuis ma naissance. Le début a été difficile, mais je m’améliore progressivement
Je l’avais fait à l’époque où fast.ai était encore relativement nouveau, avec ULMFiT. BERT était probablement alors l’état de l’art du moment, et l’architecture permettait d’entraîner un modèle de base puis de le spécialiser avec une tête
Pour le modèle de base, on utilisait l’intégralité de Wikipedia, plus quelques Go de tweets récupérés via firehose. J’avais accès à un labo avec une vingtaine de machines destinées au développement de jeux, probablement de l’ordre de GTX 2080. Il fallait environ une demi-journée pour faire passer une version tokenisée de Wikipedia, donc je lançais des configurations différentes sur chaque machine pour faire du tuning d’hyperparamètres, puis le lendemain je repartais du meilleur résultat. C’était toujours amusant d’arriver le matin et de découvrir les résultats
L’ingénierie était affreuse et totalement improvisée, mais j’ai énormément appris. Les résultats étaient corrects sans plus, on faisait de la classification de tweets, mais cela m’a donné une idée de la quantité de puissance GPU et des difficultés d’ingénierie nécessaires pour faire ça sérieusement. Je n’avais pas complètement saisi le potentiel de la génération, mais je me suis bien amusé à rire devant les tweets que j’avais fait générer par curiosité
On dirait presque une transcription à l’écrit de cette vidéo d’Andrej Karpathy (https://youtu.be/kCc8FmEb1nY), non ? Ou bien j’ai raté quelque chose ?
En gros : « nanoGPT vise à reproduire GPT-2 (124 millions de paramètres) et couvre énormément de sujets. Ce projet en extrait l’essentiel et le réduit à un modèle d’environ 10 millions de paramètres, entraînable sur un notebook en moins d’une heure… »
Pour ajouter du contexte, c’est l’un des développeurs de MLX et un chercheur en machine learning compétent
Il est présenté comme un « atelier pratique où l’on écrit soi-même chaque brique du pipeline d’entraînement d’un GPT afin de comprendre ce que fait chaque composant et pourquoi il est nécessaire », mais comme torch apparaît dans les dépendances, j’imagine que les tenseurs et la rétropropagation ne sont pas implémentés à la main mais simplement pris comme acquis. Du coup, je ne suis pas sûr qu’on puisse vraiment parler de “from scratch”
J’ai fait quelque chose de similaire en Rust, avec un peu d’aide de l’IA, mais en me limitant strictement à la bibliothèque standard, sans dépendances. Du coup, il a fallu implémenter bien davantage : conception des tenseurs, notions de noyaux, un simple optimiseur par descente de gradient, un parseur JSON maison, une abstraction de parallélisme de données CPU façon rayon, etc. C’était très amusant une fois que tout a été relié et que ça fonctionnait. C’était extrêmement lent, mais ça marchait
Je ne suis plus très sûr qu’utiliser PyTorch puisse encore être considéré comme “from scratch”. Je ne dis pas qu’il faut pousser le raisonnement jusqu’à éviter même la bibliothèque standard, mais à partir du moment où l’on importe une bibliothèque parfaitement adaptée au besoin, ça ne donne plus vraiment l’impression de partir de zéro
« Entraîner un LM from scratch » serait peut-être plus exact. Je doute qu’ils aient les machines nécessaires pour construire quelque chose d’assez grand pour mériter le terme “Large”
Je ne dis pas que ça en vaut la peine, mais il n’est pas nécessaire d’acheter soi-même des GPU pour apprendre
Et j’ai aussi 48 cœurs processeur ! Pas d’AVX512, mais on peut quand même calculer
On devrait pouvoir entraîner un LLM suffisant. Ou du moins notre famille devrait pouvoir le faire… Il faudra peut-être que mon enfant reprenne le projet et le poursuive
Plus sérieusement, j’ai l’impression que soit tu rates l’essentiel, soit tu pinailles inutilement, soit tu te trompes. Ici, il s’agit d’apprendre les concepts, et le reste est largement secondaire
Si l’on part sur l’idée que c’est du pinaillage ou une erreur, quelle est la référence documentée pour décider ce qui mérite le qualificatif de “large” dans “large language model” ? GPT-2 était qualifié de “large language model” à l’époque, et l’est encore aujourd’hui, avec 1,5 milliard de paramètres. De nos jours, on peut trouver des GPU grand public capables d’entraîner ce genre de modèle pour environ 400 $