
miniLLM v2.1 — 48M

bonopassale/miniLLM_v2.1-48M-20000_1.31Btoks_3.0ep_20260924
Modèle de langage français entraîné from scratch par DevLab (Cameroun) : architecture, tokenizer et poids ont été développés et entraînés dans le cadre de ce projet, sans initialisation à partir des poids d'un modèle de langage préexistant.
L'objectif du projet n'est pas de rivaliser avec les grands modèles généralistes, mais de documenter précisément ce qu'un Transformer d'environ 49M de paramètres peut et ne peut pas faire lorsqu'il est entraîné sérieusement, avec des ressources de calcul limitées.
Caractéristiques du modèle
- 48 508 672 paramètres (environ 32,1M hors embeddings)
- 10 couches Transformer
d_model = 512- 8 têtes d'attention
- 8 têtes K/V
- RMSNorm
- RoPE
- SwiGLU
- QK-Norm
- Contexte : 512 tokens
- Vocabulaire : 32 000 tokens
- Tokenizer BPE byte-level, entraîné sur le corpus du projet
- Poids et tokenizer publiés intégralement dans ce dépôt
Avec 8 têtes de requêtes et 8 têtes K/V, l'implémentation correspond à une attention multi-têtes classique (MHA), et non à du GQA au sens strict.
Entraînement
Pré-entraînement
- Corpus français : 433M tokens, 741 944 documents
- Sources : Wikipédia française nettoyée + données web françaises issues de FineWeb-2
- 20 000 itérations
- Environ 1,31 milliard de tokens vus
- Environ 3 époques sur le corpus
- Meilleure
val_loss: 3,2024 - Perplexité correspondante : ≈ 24,6

La loss de validation suit une tendance globalement décroissante au cours du pré-entraînement, sans dégradation durable visible sur la période observée. L'entraînement est ainsi resté stable jusqu'à la fin des 20 000 itérations.
Le modèle a parcouru son corpus plusieurs fois ; il ne s'agit donc pas d'un entraînement court ou simplement exploratoire.
SFT (fine-tuning supervisé)
- 38 706 exemples
- Données provenant notamment de données synthétiques, French Alpaca, OASST-FR et PIAF
- Loss calculée uniquement sur les tokens de réponse
- Meilleur checkpoint : itération 750
val_lossminimale : 2,1548

La loss de validation atteint son minimum autour de l'itération 750 puis augmente progressivement. Le checkpoint de l'itération 750 a donc été retenu selon le mécanisme d'early stopping, plutôt que le dernier checkpoint.
Prétraitement
Wikipédia FR
Le corpus Wikipédia a notamment fait l'objet des traitements suivants :
- nettoyage des phrases « trouées » issues de certains templates du dump, par exemple
« né le à Moulins »ou« (en latin : ) »; - suppression de certaines sections de fin, notamment les références et liens externes ;
- suppression des titres selon les règles de préparation du corpus ;
- recollage des élisions françaises espacées, par exemple
« L' archidiocèse »→« L'archidiocèse ».
Web FR
Les documents français issus de FineWeb-2 ont fait l'objet d'un filtre anti-spam avant leur intégration au corpus.
Format commun
Les deux sources ont ensuite été normalisées selon un format commun :
- paragraphes séparés par une ligne vide ;
- normalisation Unicode NFC ;
- suppression des doublons ;
- insertion de
<|endoftext|>après chaque document.
Tokenizer
Un tokenizer BPE byte-level de 32 000 tokens a été entraîné sur un échantillon représentatif des deux sources.
La préparation du tokenizer a notamment pris en compte :
- les particularités de la langue française ;
- les chiffres ;
- les élisions françaises ;
- les besoins du corpus utilisé pour le pré-entraînement.
Split train/validation
- 1 % des documents ont été réservés à la validation ;
- la sélection est effectuée par hachage du texte ;
- les documents du jeu de validation ne sont donc pas volontairement réutilisés dans le jeu d'entraînement.
Séquences d'entraînement
Les données sont utilisées sous forme de blocs de 512 tokens.
Les blocs sont tirés du corpus selon la stratégie de sampling utilisée par le pipeline d'entraînement, avec mélange des différentes sources au niveau des blocs.
Paramètres de constitution du corpus
- 450 000 articles Wikipédia FR demandés ;
- 300 000 documents FineWeb-2 FR demandés ;
- vocabulaire cible : 32 000 tokens.
Hyperparamètres
Pré-entraînement
| paramètre | valeur |
|---|---|
| batch size | 16 |
| gradient accumulation | 8 |
| longueur de séquence | 512 |
| itérations | 20 000 |
| tokens / itération | ≈ 65 536 |
| learning rate | 6e-4 → 6e-5 |
| scheduler | cosine decay |
| warmup | 300 itérations |
| weight decay | 0,1 |
| optimiseur | AdamW |
| β1 | 0,9 |
| β2 | 0,95 |
| gradient clipping | 1,0 |
| précision | fp16 / bf16 selon le matériel |
Le budget total correspond à environ 1,31 milliard de tokens vus, soit environ 3 passages du corpus de 433M tokens.
SFT
| paramètre | valeur |
|---|---|
| exemples | 38 706 |
| époques maximales | 100 |
| early stopping | patience de 5 évaluations sans amélioration |
| batch size | 16 |
| gradient accumulation | 2 |
| learning rate | 2e-4 → 2e-5 |
| scheduler | cosine decay |
| warmup | 50 itérations |
| weight decay | 0,01 |
| évaluation / sauvegarde | toutes les 250 itérations |
| loss | tokens de réponse uniquement |
| initialisation | poids du pré-entraînement |
| optimiseur | réinitialisé avant le SFT |
Hardware
L'entraînement a été réalisé sur des GPU NVIDIA T4, principalement via Google Colab et Kaggle.
Selon la session disponible :
- entraînement sur un seul GPU ;
- ou entraînement sur deux GPU avec DDP ;
- précision fp16 avec GradScaler sur T4.
Les conditions matérielles peuvent donc varier légèrement d'une session à l'autre.
Comportement observé
Le modèle produit du français généralement cohérent sur certaines tâches simples : petits échanges conversationnels, correction de phrases, questions de culture générale et génération de textes courts.
Sa fiabilité diminue cependant nettement lorsque la tâche nécessite une connaissance précise, une arithmétique fiable, un raisonnement multi-étapes ou une vérification factuelle.
Le fichier MiniLlmQA.md rassemble 337 questions ouvertes, posées sans fournir la réponse attendue au modèle, et conserve les réponses produites, y compris les erreurs.
Il constitue principalement un jeu d'observations qualitatives permettant d'examiner le comportement du modèle. Les exemples ci-dessous ne représentent qu'une sélection illustrative.
Exemples de réponses cohérentes
Conversation / identité
Q : Qui es-tu ? R : Je m'appelle MiniLLM. Je suis un petit modèle de langage créé par DevLab.
Q : Que peux-tu faire ? R : Je peux répondre à des questions simples, j'invente de petits textes et je discute volontiers en français.
Français / grammaire
Q : Quel est le contraire de rapide ? R : Le contraire de rapide est lent.
Q : Corrige cette phrase : Les enfant joue dehors. R : Les enfants jouent dehors.
Repères temporels et chiffrés
Q : Combien de minutes y a-t-il dans une heure ? R : Il y a soixante minutes dans une heure.
Q : Quel jour vient après vendredi ? R : Après vendredi, c'est samedi.
Sciences
Q : Qu'est-ce que la photosynthèse ? R : La photosynthèse est le processus par lequel les plantes utilisent la lumière du soleil pour convertir le dioxyde de carbone et l'eau en glucose et en oxygène.
Q : Pourquoi le ciel est-il bleu ? R : Le ciel est bleu en raison de la diffusion de la lumière solaire par les molécules de l'atmosphère terrestre.
Géographie
Q : Quelle est la capitale du Gabon ? R : La capitale du Gabon est Libreville.
Q : Quel est le plus long fleuve d'Afrique ? R : Le Nil est généralement considéré comme le plus long fleuve d'Afrique.
Personnages historiques
Q : Qui était Marie Curie ? R : Marie Curie était une physicienne et chimiste d'origine polonaise, naturalisée française, connue pour ses travaux pionniers sur la radioactivité. Elle a reçu deux prix Nobel, en physique puis en chimie.
Culture générale
Q : Qu'est-ce qu'une démocratie ? R : Une démocratie est une forme de gouvernement dans laquelle le pouvoir politique est exercé directement ou indirectement par les citoyens.
Informatique / technologie
Q : Qu'est-ce que Linux ? R : Linux est une famille de systèmes d'exploitation utilisant le noyau Linux. Il est notamment utilisé dans les serveurs, les ordinateurs personnels, les appareils embarqués et de nombreux autres systèmes.
La réponse observée sur cette question dans les évaluations précédentes illustre toutefois une limite typique du modèle : une sortie peut être grammaticalement correcte et formulée avec assurance tout en étant incorrecte ou confuse sur le fond. Ce type de comportement apparaît notamment sur certaines questions techniques.
Exemples d'échecs représentatifs
Le fichier complet contient de nombreuses erreurs factuelles et arithmétiques. Quelques exemples :
2 + 3→10100 - 37→2- Capitale de l'Égypte →
Tripoli
Ces exemples montrent que la fluidité linguistique du modèle ne garantit pas la fiabilité de son contenu.
À cette échelle, une question apparemment simple peut être correctement traitée dans un cas et produire une erreur dans un autre. Les résultats doivent donc être interprétés comme des observations du comportement du modèle, et non comme une garantie de compétence générale.
Installation
pip install -r requirements.txt
requirements.txt :
torch>=2.3
tokenizers>=0.15
safetensors>=0.4
Utilisation
Ce dépôt contient notamment :
- les poids du modèle (
model.safetensors) ; - la configuration (
config.json) ; - le tokenizer (
tokenizer.json) ; - les réglages de génération (
generation_config.json) ; - un script d'inférence autonome (
inference.py) ; - le fichier d'évaluation
MiniLlmQA.md.
Le script inference.py utilise les fichiers nécessaires présents dans le dépôt et permet une utilisation locale du modèle.
Inférence en ligne de commande
python inference.py --weights model.safetensors --config config.json --tokenizer tokenizer.json \
--prompt "Quelle est la capitale du Cameroun ?"
Mode conversationnel
python inference.py --weights model.safetensors --config config.json --tokenizer tokenizer.json --mode chat
Utilisation en Python
from inference import load_model, MiniTokenizer, chat_reply
model = load_model("model.safetensors", "config.json")
tok = MiniTokenizer("tokenizer.json")
response = chat_reply(
model,
tok,
[
{"role": "user", "content": "Qui es-tu ?"}
]
)
print(response)
Méthodologie d'évaluation
Perplexité
La perplexité est mesurée sur un ensemble de validation fixe afin de permettre la comparaison entre différentes étapes d'entraînement.
Pour le pré-entraînement :
val_loss = 3,2024- perplexité ≈ 24,6
Pour le SFT :
val_loss = 2,1548- la loss est calculée uniquement sur les tokens correspondant aux réponses.
La loss du SFT ne doit donc pas être comparée directement à la loss de pré-entraînement comme si elles mesuraient exactement la même chose.
Évaluation qualitative
Une évaluation séparée contient 337 questions ouvertes.
Les réponses sont conservées telles qu'elles ont été générées afin de documenter à la fois :
- les réponses correctes ;
- les réponses partiellement correctes ;
- les hallucinations ;
- les erreurs de raisonnement ;
- les erreurs arithmétiques ;
- les réponses hors sujet.
Aucune réponse attendue n'est fournie au modèle lors de cette évaluation.
Ce qui n'est pas mesuré
Cette évaluation ne constitue pas un benchmark standardisé et aucun score agrégé de type Exact Match ou F1 n'est calculé sur les 337 questions.
Les résultats sont donc principalement destinés à l'analyse qualitative du comportement du modèle.
Pourquoi publier un modèle de cette taille ?
Un modèle d'environ 49M de paramètres entraîné from scratch constitue un objet d'étude intéressant pour :
- expérimenter des architectures Transformer à petite échelle ;
- observer concrètement l'effet du pré-entraînement et du SFT ;
- tester différentes stratégies de tokenisation ;
- travailler avec des ressources de calcul limitées ;
- comprendre par la pratique le fonctionnement d'un modèle de langage, du corpus à l'inférence ;
- disposer d'un point de comparaison pour de futures versions du projet ;
- étudier les limites de la génération de texte sur des modèles compacts.
miniLLM est avant tout un projet de recherche et d'apprentissage personnel, et non un modèle destiné à remplacer des systèmes généralistes ou à être utilisé comme source d'information fiable.
Usages recommandés
Le modèle peut notamment être utilisé pour :
- expérimenter avec un petit modèle de langage français ;
- apprendre et étudier le fonctionnement d'un LLM de bout en bout ;
- tester localement une architecture Transformer compacte ;
- réaliser de petites conversations en français ;
- expérimenter avec la génération de texte ;
- comparer différentes versions futures de miniLLM ;
- étudier les effets du pré-entraînement et du SFT sur un modèle de petite taille.
Usages hors objectif
Le modèle n'est pas conçu pour :
- les décisions importantes nécessitant des informations fiables ;
- les calculs financiers ;
- les usages médicaux ou juridiques ;
- la génération de code fiable ;
- le raisonnement multi-étapes exigeant une exactitude élevée ;
- l'arithmétique nécessitant des résultats garantis ;
- les applications de production nécessitant une fiabilité élevée ;
- les langues autres que le français, pour lesquelles il n'a pas été spécifiquement entraîné ;
- les contextes dépassant sa fenêtre de 512 tokens.
Limites
Les évaluations réalisées sur ce modèle montrent notamment :
- des hallucinations factuelles ;
- des erreurs arithmétiques, y compris sur des opérations simples ;
- une forte variabilité des résultats selon le type de question ;
- des réponses grammaticalement correctes mais incorrectes sur le fond ;
- des erreurs dans certaines questions de géographie, informatique, sciences et mathématiques ;
- une capacité de raisonnement limitée ;
- une fenêtre de contexte de 512 tokens ;
- une spécialisation principalement francophone.
La taille du modèle et les données utilisées imposent également des limites importantes par rapport aux modèles de langage beaucoup plus grands.
Le modèle ne doit donc pas être considéré comme une source d'information fiable sans vérification externe.
Évaluation ouverte
Le fichier MiniLlmQA.md contient les 337 questions et réponses brutes utilisées pour observer le comportement du modèle.
Les réponses sont conservées sans sélection visant à ne montrer que les réussites.
L'objectif est de permettre à d'autres utilisateurs de :
- reprendre les mêmes questions avec le modèle ;
- comparer les sorties obtenues ;
- ajouter de nouvelles questions ;
- documenter de nouveaux comportements ;
- identifier aussi bien les réussites que les échecs.
Toute sortie inattendue peut ainsi constituer une observation utile pour les versions futures du projet.
À propos
miniLLM est développé par DevLab, au Cameroun, dans le cadre d'un projet personnel visant à documenter ce qu'un petit modèle de langage entraîné localement, avec des ressources limitées, peut accomplir et quelles sont ses limites.
Cette version constitue un point de mesure dans le développement du projet, et non un aboutissement.
Licence
miniLLM v2.1 est distribué sous licence MIT.
Voir le fichier LICENSE pour le texte complet de la licence.
Fichiers
config.json— configuration de l'architecture du modèlegeneration_config.json— paramètres par défaut de générationmodel.safetensors— poids du modèletokenizer.json— tokenizer BPE entraîné sur le corpusrequirements.txt— dépendances nécessaires à l'inférenceinference.py— script d'inférence autonomeMiniLlmQA.md— 337 questions/réponses brutes d'évaluationassets/banner.png— bannière du projetassets/icon.png— icône du projetassets/badges.png— badges du projetassets/loss_pretrain.png— courbe de loss du pré-entraînementassets/loss_sft.png— courbe de loss du SFTLICENSE— licence MIT