Un modèle de langue français qui tient sur une disquette, tourne sans OS et sans virgule flottante. La démarche technique.
Le modèle
Un réseau récurrent (GRU) au niveau caractère, entraîné par distillation sur les cinq tomes des Misérables. Génération autorégressive.
• 261 000 paramètres, 588 Ko, vocabulaire de 46 caractères
• GRU plutôt que transformer : l'attention est quadratique et gourmande. Le GRU comprime le contexte dans un état de 384 nombres — mémoire constante. Sous contrainte disquette, c'est l'architecture rationnelle.
Contrainte n°1 : arithmétique entière pure
Un 386 n'a pas d'unité flottante. Tout le forward est en Q12 (entiers ×4096) :
• zéro flottant sur tout le chemin d'inférence
• tanh/sigmoïde en tables précalculées
• zéro division 64 bits — toutes forcées en 32 bits
• accumulateurs int64 obligatoires : les sommes de ~480 termes atteignent ~4,4 milliards, le double de la limite int32. Un accumulateur 32 bits déborde en silence et détruit la sortie.
Le calcul entier a été prouvé argmax-identique à la référence flottante, de Python jusqu'au binaire 32 bits. Déterministe, reproductible au bit près — ce qu'une inférence flottante sur GPU ne garantit pas.
Contrainte n°2 : pas d'OS
Le modèle s'amorce depuis le secteur de boot. Difficulté : 588 Ko dépassent les 640 Ko de mémoire basse du mode réel. Solution : « unreal mode » (386+), qui adresse au-delà de 1 Mo tout en restant en mode réel. Compilation freestanding, contrôle systématique de l'absence de flottant dans le binaire.
Contrainte n°3 : le boot sur matériel réel
L'émulation valide la chaîne ; le vrai matériel révèle d'autres pièges. Sur un lecteur de disquette USB émulé par le BIOS :
• activation A20 par le BIOS (int 15h) plutôt que par le port 0x92 brut
• chargement du noyau en mode réel pur (l'int 13h supporte mal un segment à limite 4 Go)
• lecture par pistes : les lecteurs USB-FDD décrochent sur des lectures unitaires répétées ; lire des pistes entières divise par ~18 le nombre d'appels disque
Positionnement
Min-IA n'est pas un mini-LLM. C'est un modèle récurrent, entièrement entier et autonome, qui explore la question inverse des grands modèles : non pas « jusqu'où monter en échelle ? », mais « jusqu'où réduire un modèle de langue en le gardant réel et fonctionnel ? ».
Reconstruire une chose avec presque rien reste la meilleure façon d'en comprendre les fondamentaux.
C’est aussi pour le Fun !!! 🤘