Créer un clone de ChatGPT pour 100 $ - Solution LLM full-stack en un seul fichier
Présentation détaillée du projet nanochat
Aperçu du projet
nanochat est un projet d'implémentation de Grand Modèle de Langage (LLM) full-stack, développé par le célèbre chercheur en IA Andrej Karpathy. Son concept central est de démontrer, avec le moins de code et le coût le plus bas possible, comment construire un chatbot similaire à ChatGPT de A à Z.
Slogan du projet : "The best ChatGPT that $100 can buy." (Le meilleur ChatGPT que 100 dollars peuvent acheter.)
Caractéristiques principales
1. Philosophie de conception minimaliste
- Une base de code unique, claire, minimale et modifiable
- Conception à faible dépendance
- Environ 8 300 lignes de code, 44 fichiers
- Totalisant environ 83 497 tokens (environ 334 Ko)
2. Processus complet de bout en bout
nanochat couvre toutes les étapes de la construction d'un LLM :
- Tokenisation
- Pré-entraînement (Pretraining)
- Affinage (Finetuning)
- Évaluation
- Inférence
- Service Web (Web Serving)
3. Entraînement à faible coût
- Version de base (environ 100 $) : Complétée en environ 4 heures sur un nœud 8×H100
- Version intermédiaire (environ 300 $) : Environ 12 heures, performances légèrement supérieures à GPT-2
- Version avancée (environ 1000 $) : Environ 41,6 heures
4. Positionnement éducatif
- Conçu comme le projet de fin d'études du cours LLM101n d'Eureka Labs
- Code hautement lisible, facilitant l'apprentissage et la compréhension
- Idéal pour les développeurs souhaitant approfondir le processus complet d'entraînement des LLM
Démarrage rapide
Exécuter le script d'entraînement rapide
Sur un nœud GPU 8×H100, exécutez :
bash speedrun.sh
Ou exécutez dans une session screen (recommandé) :
screen -L -Logfile speedrun.log -S speedrun bash speedrun.sh
Après environ 4 heures, un modèle LLM utilisable sera disponible.
Lancer l'interface Web
Une fois l'entraînement terminé, activez l'environnement virtuel et démarrez le service :
source .venv/bin/activate
python -m scripts.chat_web
Accédez ensuite à l'URL affichée (par exemple http://209.20.xxx.xxx:8000/) pour dialoguer avec votre propre LLM, comme vous le feriez avec ChatGPT.
Exemple de résultats d'entraînement
Après l'entraînement, un fichier report.md est généré, contenant les métriques d'évaluation du modèle :
Metric | BASE | MID | SFT | RL
---------------|--------|--------|--------|-------
CORE | 0.2219 | - | - | -
ARC-Challenge | - | 0.2875 | 0.2807 | -
ARC-Easy | - | 0.3561 | 0.3876 | -
GSM8K | - | 0.0250 | 0.0455 | 0.0758
HumanEval | - | 0.0671 | 0.0854 | -
MMLU | - | 0.3111 | 0.3151 | -
ChatCORE | - | 0.0730 | 0.0884 | -
Total wall clock time: 3h51m
Remarque : Le modèle entraîné pour 100 $ a des performances limitées (environ 4e19 FLOPs), équivalant à une capacité linguistique de "niveau maternelle", mais suffisante pour démontrer le processus d'entraînement complet.
Extension aux modèles plus grands
Pour entraîner des modèles plus grands (comme le modèle d26 de niveau GPT-2), il suffit de modifier légèrement speedrun.sh :
# 1. Télécharger plus de fragments de données
python -m nanochat.dataset -n 450 &
# 2. Augmenter la profondeur du modèle, réduire la taille du lot pour s'adapter à la mémoire
torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- --depth=26 --device_batch_size=16
# 3. Maintenir la même configuration pour l'entraînement intermédiaire
torchrun --standalone --nproc_per_node=8 -m scripts.mid_train -- --device_batch_size=16
Exigences de l'environnement d'exécution
Configuration recommandée
- Nœud GPU 8×H100 80 Go (environ 24 $/heure)
- Fournisseur suggéré : Lambda GPU Cloud
Compatibilité
- GPU 8×A100 : Fonctionne, mais plus lentement
- GPU unique : Fonctionne, mais le temps d'entraînement est multiplié par 8
- GPU à petite mémoire (<80 Go) : Nécessite d'ajuster le paramètre
--device_batch_size(de 32 à 16, 8, 4, 2 ou 1) - Autres plateformes : Basé sur PyTorch, supporte théoriquement xpu, mps, etc., mais nécessite une configuration supplémentaire
Pile technologique
- Cadre d'apprentissage profond : PyTorch
- Entraînement distribué : torchrun
- Gestion des paquets : uv
- Jeux de données : HuggingFace Fineweb, Smoltalk
- Tokeniseur : Implémentation Rust personnalisée (rustbpe)
Exploration du code avec l'IA conversationnelle
Étant donné la simplicité de la base de code (~330 Ko), il est possible de compresser l'ensemble du projet et de le fournir à un LLM pour analyse :
files-to-prompt . -e py -e md -e rs -e html -e toml -e sh --ignore "*target*" --cxml > packaged.txt
Ou utilisez DeepWiki pour explorer directement la base de code en ligne.
Tests
Le projet inclut des tests unitaires, notamment pour le tokeniseur :
python -m pytest tests/test_rustbpe.py -v -s
Positionnement et objectifs du projet
nanochat n'est pas :
- Un cadre LLM complet
- Une usine de modèles hautement configurable
- Une solution de niveau production
nanochat est :
- Une implémentation de référence à vocation éducative
- Une base solide, modifiable et forkable
- Destiné à la recherche sur les micro-modèles avec un budget inférieur à 1000 $
- Conçu pour réduire la complexité cognitive du développement de LLM
Historique du projet et remerciements
Sources d'inspiration :
- nanoGPT - Le projet de pré-entraînement initial de Karpathy
- modded-nanoGPT - Une variante gamifiée de nanoGPT
Remerciements :
- HuggingFace - Pour avoir fourni les jeux de données fineweb et smoltalk
- Lambda - Pour avoir fourni la puissance de calcul nécessaire au développement
- Alec Radford - Conseiller principal en LLM
Licence open source
Licence MIT
Format de citation
@misc{nanochat,
author = {Andrej Karpathy},
title = {nanochat: The best ChatGPT that $100 can buy},
year = {2025},
publisher = {GitHub},
url = {https://github.com/karpathy/nanochat}
}
État du projet
Le projet est toujours en développement actif, visant à améliorer continuellement l'état de l'art des micro-modèles et à permettre à davantage de personnes de vivre l'expérience complète de l'entraînement des LLM à un coût abordable.
Adresse GitHub : https://github.com/karpathy/nanochat