Ys-17M
Un petit modèle de langage français, entraîné depuis zéro sur un seul GPU.
Ys-17M est le premier modèle publié par AmauryLC. Il compte 17 135 616 paramètres et a été préentraîné sur 500 millions de tokens de textes français. Ce projet de laboratoire sert à explorer concrètement l'apprentissage d'un modèle de langage : prédiction du prochain token, influence des données et évolution des résultats pendant l'entraînement.
Le nom 17M désigne la taille du réseau. Les 500M tokens correspondent à la quantité de tokens cibles effectivement utilisée pendant l'entraînement.
Ys-17M est un modèle de base destiné à compléter du texte. Cette version n'a pas reçu d'entraînement au dialogue ou au suivi de consignes. Ses générations restent expérimentales et peuvent être répétitives, incohérentes ou factuellement fausses.
Caractéristiques
| Élément | Valeur |
|---|---|
| Auteur | AmauryLC |
| Langue d'entraînement | Français |
| Architecture | Transformer causal de type GPT, décodeur seul |
| Initialisation | Poids aléatoires, entraînement depuis zéro |
| Paramètres | 17 135 616, avec partage des poids d'entrée et de sortie |
| Couches / têtes d'attention | 6 / 6 |
| Dimension cachée / MLP | 384 / 1 536 |
| Fenêtre de contexte | 512 tokens |
| Positions | Embeddings positionnels appris |
| Normalisation / activation | Pre-LayerNorm / GELU |
| Tokenizer | BPE ByteLevel, vocabulaire de 16 384 tokens |
| Tokens d'entraînement | 500 000 000 |
| Checkpoint publié | best.pt, étape 30 520, à 500 000 000 tokens |
| Format des poids | Checkpoint PyTorch personnalisé, tenseurs FP32, environ 68,6 Mo |
Les réglages complets sont dans config.json. Le code de l'architecture est fourni dans model.py.
Essayer le modèle
Le dépôt fournit generate.py, un script autonome qui charge le modèle avec PyTorch et son tokenizer. Il utilise les fichiers présents dans le même dossier et ne demande aucun corpus d'entraînement.
Dans un environnement Python, installer les dépendances, puis télécharger le dépôt dans un nouveau dossier :
python -m pip install "torch==2.10.0" "tokenizers==0.22.2" "huggingface_hub==1.31.0"
hf download AmauryLC/Ys-17M --local-dir Ys-17M
cd Ys-17M
python generate.py --prompt "Il était une fois" --max-new-tokens 80
Le script choisit automatiquement CUDA si disponible, sinon le CPU. Pour imposer le CPU ou essayer un décodage glouton :
python generate.py --device cpu --prompt "La mer était calme" --temperature 0 --max-new-tokens 40
Par défaut, la génération utilise temperature=0.8, top_k=50, top_p=0.95 et une graine de 42. Le texte affiché inclut l'amorce. La sortie peut varier selon le matériel et les versions des bibliothèques. Le chargement et la génération ont été vérifiés avec Python 3.12.2, PyTorch 2.10.0 et Tokenizers 0.22.2.
Le checkpoint utilise une implémentation PyTorch propre à ce projet : il ne se charge pas directement avec AutoModelForCausalLM.from_pretrained() ou pipeline() de Transformers. La génération ci-dessus est exécutée localement.
Données et tokenizer
Les données ont été lues progressivement depuis trois jeux de données Hugging Face. Les proportions sont définies en tokens d'entraînement :
| Source | Sous-ensemble | Part visée | Tokens effectivement appris |
|---|---|---|---|
| FineWeb2 — HuggingFaceFW | fra_Latn |
75 % | 375 000 064 |
| Wikipédia — Wikimedia | 20231101.fr |
20 % | 100 000 000 |
| French-PD-Books — PleIAs | default |
5 % | 24 999 936 |
| Total | 100 % | 500 000 000 |
Ces compteurs mesurent les tokens utilisés par le réseau ; les compteurs du cache peuvent être légèrement supérieurs en raison de la préparation en avance. Les révisions exactes des trois sources sont enregistrées dans config.json.
Le tokenizer a été appris séparément sur 5 millions de caractères, répartis en 3,75M pour FineWeb2, 1M pour Wikipédia et 0,25M pour les livres, puis figé pour l'entraînement du réseau. Sa provenance est décrite dans tokenizer_metadata.json.
Ses tokens spéciaux sont <|pad|> (0), <|bos|> (1), <|eos|> (2) et <|unk|> (3). Le pipeline d'entraînement exclut les documents de moins de 80 caractères et mélange les documents dans un tampon borné. Les documents longs sont traités par passages en conservant la suite du texte.
Entraînement
L'entraînement s'est déroulé en trois phases successives, avec prolongation du même modèle et conservation de son état d'apprentissage :
| Phase | Intervalle de tokens cumulés | Warmup enregistré |
|---|---|---|
| 1 | 0 → 100 000 000 | 2 000 000 tokens |
| 2 | 100 000 000 → 300 000 000 | 4 000 000 tokens |
| 3 | 300 000 000 → 500 000 000 | 4 000 000 tokens |
L'historique de cette expérience enregistre un taux maximal de 0.0006, suivi d'une décroissance cosinus vers 0.00006, dans chaque phase. Les prolongations repartent du taux atteint par la phase précédente, puis effectuent le warmup enregistré. Ce parcours diffère d'un calendrier unique planifié dès le départ sur 500M tokens.
| Réglage | Valeur |
|---|---|
| Objectif | Prédire le prochain token, entropie croisée |
| Optimiseur | AdamW, betas (0.9, 0.95) |
| Micro-lot / accumulation de gradients | 4 séquences / 8 micro-lots |
| Tokens par mise à jour complète | 16 384 (4 × 8 × 512) |
| Weight decay / dropout | 0,1 / 0,1 |
| Limite de norme des gradients | 1,0 |
| Graine | 42 |
| Matériel | 1 × NVIDIA GeForce RTX 4080 |
| Précision de calcul | Précision mixte BF16 |
| Environnement enregistré | Python 3.12.2, PyTorch 2.10.0+cu126, CUDA 12.6 |
| Durée cumulée enregistrée par la boucle | Environ 4 h 50 min (17 428 secondes) |
Cette durée est celle enregistrée par le programme ; elle ne représente pas le temps total de préparation du projet, des données et du tokenizer. Le rapport final est d'environ 29,18 tokens d'entraînement par paramètre.
Résultats de validation
Le checkpoint publié est celui sélectionné pour la plus faible loss de validation. Dans cette expérience, il correspond aussi à l'étape finale, après 500M tokens. Les valeurs ci-dessous proviennent de evaluation-best.json.
| Source de validation | Loss ↓ | Perplexité ↓ | Bits par octet ↓ | Précision du prochain token ↑ |
|---|---|---|---|---|
| FineWeb2 français | 3,5826 | 35,97 | 1,2802 | 34,30 % |
| Wikipédia français | 3,3681 | 29,02 | 1,2715 | 37,01 % |
| Livres français | 3,9912 | 54,12 | 1,7438 | 31,26 % |
| Agrégation à poids égaux par source | 3,6473 | 38,37 | 1,4318 | 34,19 % |
La validation porte sur 199 documents, 251 877 tokens de texte et 900 000 caractères, avec 300 000 caractères par source. Elle utilise des fenêtres de contexte de 512 tokens et un pas de 256 ; chaque token cible du texte est compté une fois. Le protocole est documents-bos-text-only-stride-v1, profil 1333bc2bf9c3a7cf0f4d.
Les scores agrégés donnent le même poids aux trois sources, indépendamment du mélange d'entraînement 75/20/5. La perplexité agrégée est l'exponentielle de la loss moyenne ; les bits par octet et la précision sont des moyennes par source. La précision mesure la proportion de prochains tokens correctement prédits en premier choix.
Les documents de validation et de test ont été réservés avant l'apprentissage du tokenizer et du réseau. Leur exclusion est vérifiée par empreinte du document complet après normalisation des espaces. Cette vérification ne détecte pas les quasi-doublons ni les reprises partielles de textes.
Ces résultats servent à décrire cette validation interne, utilisée pour sélectionner le checkpoint. Aucun résultat sur le jeu de test réservé ni sur un benchmark externe n'est publié dans cette version. Les perplexités ne sont comparables entre modèles qu'avec un tokenizer, des textes et un protocole identiques. Les textes d'évaluation et le programme d'entraînement complet ne sont pas inclus dans ce dépôt.
Usages et limites
Ys-17M peut servir à expérimenter la complétion de textes français, à étudier un petit Transformer ou à construire des expériences d'adaptation. Son intérêt est pédagogique et expérimental.
- La petite taille du réseau et son budget d'entraînement limitent la cohérence des textes longs. Des répétitions et des erreurs factuelles apparaissent dans les générations de suivi.
- Le modèle prolonge une amorce de texte ; il n'a pas été entraîné à tenir une conversation ou à répondre fidèlement à des instructions.
- La génération utilise au plus les 512 derniers tokens disponibles. Dépasser cette longueur fait perdre l'accès direct au début du texte.
- Les corpus web et les livres peuvent transmettre des biais, du contenu inapproprié et des erreurs de numérisation. Aucun entraînement spécifique de modération n'est documenté pour cette version.
- Les capacités de raisonnement, de programmation et les performances multilingues n'ont pas été évaluées. Les scores présentés ne constituent pas une mesure générale de fiabilité.
Fichiers du dépôt
| Fichier | Rôle |
|---|---|
| best.pt | Poids du checkpoint sélectionné et métadonnées associées |
| model.py | Implémentation PyTorch de l'architecture utilisée |
| generate.py | Script de génération autonome |
| tokenizer.json | Tokenizer figé |
| tokenizer_metadata.json | Paramètres et provenance de l'apprentissage du tokenizer |
| config.json | Architecture, sources, hyperparamètres et historique des phases |
| evaluation-best.json | Résultats et protocole de validation du checkpoint publié |
| latest_metrics.json | Dernières métriques et compteurs de l'entraînement |
best.pt ne contient pas l'état de l'optimiseur nécessaire à une reprise exacte de l'entraînement.
Licence et attribution
Aucune licence de réutilisation du modèle ou du code n'est précisée dans ce dépôt à ce stade. Les sources de données et leurs conditions respectives sont accessibles via les liens ci-dessus.
Pour référencer cette expérience : AmauryLC, « Ys-17M », 2026, en indiquant le dépôt Hugging Face et la révision utilisée.
- Downloads last month
- -